
Plaid Fintech
Implement Plaid Link, token exchange, transactions sync, Auth/ACH, webhooks, and compliance-minded fintech flows in your backend.
Overview
Plaid Fintech is an agent skill for the Build phase that provides Plaid API integration patterns for Link, tokens, transactions, Auth, webhooks, and fintech compliance practices.
Install
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill plaid-fintechWhat is this skill?
- Link token creation and public_token to access_token exchange patterns
- Transactions sync, identity verification, Auth for ACH, and balance checks
- Sandbox versus production PlaidEnvironments configuration
- Webhook handling guidance for ongoing financial data updates
- Fintech compliance-oriented implementation notes in patterns
Adoption & trust: 576 installs on skills.sh; 40.1k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need Plaid in production but keep mixing up link versus access tokens, webhooks, and ACH Auth flows across sandbox and live environments.
Who is it for?
Indie fintech or billing SaaS builders adding bank link and transaction data on Node/TypeScript backends.
Skip if: Products with no regulated financial data needs, or teams wanting a non-Plaid open-banking abstraction without API specifics.
When should I use this skill?
You are implementing Plaid Link, token lifecycle, transactions, identity, Auth, balances, or webhooks in a fintech product.
What do I get? / Deliverables
You implement typed server routes and client flows aligned with Plaid best practices so bank link, sync, and ACH paths are ready to harden in Ship security.
- Server route patterns for link token and token exchange
- Webhook and sync handling outline
- Environment configuration checklist for sandbox vs production
Recommended Skills
Journey fit
Plaid wiring is core product engineering during Build when you connect bank data and money movement—not distribution or ops tuning. Integrations subphase covers third-party financial APIs, webhooks, and environment-specific credentials.
How it compares
Skill-backed integration recipes for Plaid—not a hosted MCP server or no-code bank widget.
Common Questions / FAQ
Who is plaid-fintech for?
Solo and small-team developers building SaaS or apps that connect user bank accounts via Plaid on a custom backend.
When should I use plaid-fintech?
During Build integrations while implementing Link, token exchange, transaction sync, identity, Auth/ACH, balances, and webhooks—before Ship security review of secrets and PII handling.
Is plaid-fintech safe to install?
Treat it as guidance that will touch secrets and network calls in your app; review the Security Audits panel on this page and never commit Plaid secrets to the repo.
SKILL.md
READMESKILL.md - Plaid Fintech
# Plaid Fintech Expert patterns for Plaid API integration including Link token flows, transactions sync, identity verification, Auth for ACH, balance checks, webhook handling, and fintech compliance best practices. ## Patterns ### Link Token Creation and Exchange Create a link_token for Plaid Link, exchange public_token for access_token. Link tokens are short-lived, one-time use. Access tokens don't expire but may need updating when users change passwords. // server.ts - Link token creation endpoint import { Configuration, PlaidApi, PlaidEnvironments, Products, CountryCode } from 'plaid'; const configuration = new Configuration({ basePath: PlaidEnvironments[process.env.PLAID_ENV || 'sandbox'], baseOptions: { headers: { 'PLAID-CLIENT-ID': process.env.PLAID_CLIENT_ID, 'PLAID-SECRET': process.env.PLAID_SECRET, }, }, }); const plaidClient = new PlaidApi(configuration); // Create link token for new user app.post('/api/plaid/create-link-token', async (req, res) => { const { userId } = req.body; try { const response = await plaidClient.linkTokenCreate({ user: { client_user_id: userId, // Your internal user ID }, client_name: 'My Finance App', products: [Products.Transactions], country_codes: [CountryCode.Us], language: 'en', webhook: 'https://yourapp.com/api/plaid/webhooks', // Request 180 days for recurring transactions transactions: { days_requested: 180, }, }); res.json({ link_token: response.data.link_token }); } catch (error) { console.error('Link token creation failed:', error); res.status(500).json({ error: 'Failed to create link token' }); } }); // Exchange public token for access token app.post('/api/plaid/exchange-token', async (req, res) => { const { publicToken, userId } = req.body; try { // Exchange for permanent access token const exchangeResponse = await plaidClient.itemPublicTokenExchange({ public_token: publicToken, }); const { access_token, item_id } = exchangeResponse.data; // Store securely - access_token doesn't expire! await db.plaidItem.create({ data: { userId, itemId: item_id, accessToken: await encrypt(access_token), // Encrypt at rest status: 'ACTIVE', products: ['transactions'], }, }); // Trigger initial transaction sync await initiateTransactionSync(item_id, access_token); res.json({ success: true, itemId: item_id }); } catch (error) { console.error('Token exchange failed:', error); res.status(500).json({ error: 'Failed to exchange token' }); } }); // Frontend - React component import { usePlaidLink } from 'react-plaid-link'; function BankLinkButton({ userId }: { userId: string }) { const [linkToken, setLinkToken] = useState<string | null>(null); useEffect(() => { async function createLinkToken() { const response = await fetch('/api/plaid/create-link-token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId }), }); const { link_token } = await response.json(); setLinkToken(link_token); } createLinkToken(); }, [userId]); const { open, ready } = usePlaidLink({ token: linkToken, onSuccess: async (publicToken, metadata) => { // Exchange public token for access token await fetch('/api/plaid/exchange-token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ publicToken, userId }), }); }, onExit: (error, metadata) => {