Skip to main content
RapidDev - Software Development Agency
v0-integrationsNext.js API Route

How to Integrate Mint with V0

Mint (by Intuit) was permanently shut down in March 2024 and redirected users to Credit Karma. To build a personal finance dashboard in V0 by Vercel today, use Plaid for bank account aggregation, the Credit Karma API where available, or Yodlee FastLink — all connected via secure Next.js API routes with your credentials stored as Vercel environment variables.

What you'll learn

  • Why Mint was sunset and what replaced it for developers
  • How to integrate Plaid as a Mint replacement for real bank account data in V0 apps
  • How to create Next.js API routes that securely call the Plaid API
  • How to generate a personal finance dashboard UI with V0
  • How to store Plaid API credentials securely in Vercel environment variables
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate16 min read45 minutesOtherMarch 2026RapidDev Engineering Team
TL;DR

Mint (by Intuit) was permanently shut down in March 2024 and redirected users to Credit Karma. To build a personal finance dashboard in V0 by Vercel today, use Plaid for bank account aggregation, the Credit Karma API where available, or Yodlee FastLink — all connected via secure Next.js API routes with your credentials stored as Vercel environment variables.

Building Personal Finance Dashboards After Mint's Shutdown

Mint, Intuit's popular personal finance app, was shut down on March 23, 2024. Intuit redirected all Mint users to Credit Karma, which focuses primarily on credit score monitoring and credit card recommendations rather than the comprehensive budgeting and transaction tracking that Mint provided. For developers who want to build Mint-style personal finance features in their V0-generated applications, a different technical approach is needed.

The most capable replacement for Mint's core functionality — aggregating bank accounts and fetching transaction data — is Plaid. Plaid's API connects to thousands of financial institutions and provides standardized data for accounts, balances, transactions, and investments. Plaid offers a client-side Link widget that handles the secure bank authentication flow, and a server-side API that your Next.js API routes call to retrieve financial data after authorization. The architecture fits perfectly with V0's Next.js deployment on Vercel.

For teams that specifically need credit score data (what Credit Karma provides), Credit Karma does not offer a public developer API. The Credit Karma web experience is consumer-only. Developers building credit monitoring features should instead look at Experian API, Equifax Developer Platform, or TransUnion's TrueIdentity API — each of which requires a business agreement and compliance review. For most V0 app developers, Plaid remains the most accessible and complete path to building finance dashboard features that Mint's users would recognize.

Integration method

Next.js API Route

Since Mint no longer exists as an API-accessible service, building a personal finance dashboard in V0 requires choosing a replacement financial data API. The recommended path is Plaid for real bank account connectivity, which provides a client-side Link widget for account authentication and server-side API calls via Next.js API routes to fetch transactions, balances, and account details. All API credentials are stored as Vercel environment variables, never in client code.

Prerequisites

  • A Plaid account — sign up at dashboard.plaid.com for sandbox access (free for development)
  • A V0 account at v0.dev and a Vercel account for deployment
  • Plaid API keys: client_id and secret from your Plaid dashboard
  • Node.js and npm installed locally if you plan to run the project before deploying
  • Basic understanding that Plaid has a Sandbox environment for testing with fake bank accounts (no real bank credentials needed during development)

Step-by-step guide

1

Generate the Finance Dashboard UI with V0

Start by asking V0 to generate the frontend UI components for your personal finance dashboard. This step creates the visual shell before wiring up real data from Plaid. Working with mock data first lets you validate the design and user experience before dealing with API complexity. In V0's chat, describe the dashboard layout you want. A typical Mint-style dashboard includes a sidebar with linked accounts showing balances, a main content area with spending summaries, a transaction list, and budget progress indicators. V0 will generate these as React components with Tailwind CSS styling and mock data arrays that you will replace with real Plaid data in subsequent steps. Ask V0 to build the Plaid Link button component — a button that triggers the Plaid Link modal for connecting bank accounts. This button will call your API route to get a Plaid link_token, then open the Plaid Link widget. The V0 prompt should specify that this button needs to call a `/api/plaid/create-link-token` endpoint and handle the OAuth callback. V0 will generate a client component with the button logic and a placeholder for the Plaid Link SDK integration. Also generate a transaction list component with columns for date, merchant name, category (with color-coded badge), and amount (red for debits, green for credits). Ask V0 to make this list sortable and filterable by category and date range. This component will receive real data from your Plaid transactions API route once the full integration is complete.

V0 Prompt

Build a personal finance dashboard with a left sidebar showing 3 linked bank accounts (checking, savings, credit card) with their balances, a main area with a 'This Month' spending summary card showing $2,340 spent with a budget of $3,000 as a progress bar, a spending by category section with 5 categories shown as colored bars, and a recent transactions list with date, merchant, category badge, and amount. Use a clean design with a white background, slate-100 sidebar, and green-500 for positive/under-budget indicators.

Paste this in V0 chat

Pro tip: Ask V0 to generate the dashboard with TypeScript interfaces for Account, Transaction, and SpendingCategory types. This makes it easier to wire up real Plaid API responses which follow a similar data shape.

Expected result: A complete personal finance dashboard UI renders in V0's sandbox with mock data, including a linked accounts sidebar, spending summary, category breakdown, and transaction list. The UI shows where the Plaid Link button will trigger bank account connection.

2

Get Plaid API Credentials and Understand the Auth Flow

Since Mint no longer provides an API, Plaid is the best replacement for financial data aggregation. Before writing any code, you need to set up a Plaid account and understand how the authentication flow works — it is different from a typical REST API because it involves a three-step token exchange to protect user banking credentials. Go to dashboard.plaid.com and create a free account. Plaid provides a Sandbox environment where you can test with fake bank accounts using test credentials (username: `user_good`, password: `pass_good`) without needing real bank access. From your Plaid dashboard, navigate to Team Settings → Keys and note your `client_id` and `secret` for the Sandbox environment. The Plaid auth flow works like this: First, your server creates a short-lived `link_token` by calling the Plaid API with your credentials and the user's ID. Second, your client uses this `link_token` to open the Plaid Link widget — a modal that handles the bank login securely within Plaid's infrastructure (your app never sees the user's banking password). Third, after the user connects their account, Plaid returns a `public_token` to your client. Fourth, your client sends this `public_token` to your server, which exchanges it for a permanent `access_token` by calling the Plaid API. Fifth, your server stores this `access_token` (in your database) and uses it for all future API calls to fetch transactions, balances, etc. This token exchange architecture means your Next.js API routes need to handle four distinct operations: create link token, exchange public token, get accounts/balances, and get transactions. Each is a separate API route.

V0 Prompt

Add a 'Connect Bank Account' button to the personal finance dashboard that shows a modal dialog explaining that clicking it will open Plaid Link to securely connect their bank. The button should be prominently placed in the sidebar under the accounts list. When clicked, it should call /api/plaid/create-link-token, receive a link_token, and then show a placeholder where the Plaid Link SDK would open. Display a loading spinner while fetching the link token.

Paste this in V0 chat

.env.local
1// Install required packages:
2// npm install plaid react-plaid-link
3
4// .env.local (also set in Vercel Dashboard)
5// PLAID_CLIENT_ID=your_client_id_here
6// PLAID_SECRET=your_sandbox_secret_here
7// PLAID_ENV=sandbox (change to development or production when ready)

Pro tip: Plaid Sandbox is completely free and lets you test with up to 100 items. You only need to upgrade to Production when you want to connect real bank accounts, which requires a Plaid compliance review.

Expected result: You have Plaid sandbox credentials (client_id and secret) ready to use. You understand the five-step Plaid Link authentication flow and know which API routes you need to create.

3

Create the Plaid API Routes

Now create the Next.js API routes that handle secure communication with the Plaid API. All Plaid API calls must be server-side — your secret key must never reach the browser. You need four route handlers organized under `app/api/plaid/`. The first route (`create-link-token/route.ts`) accepts a POST request with a user ID, calls the Plaid API to create a link token, and returns it to the client. The link token is what initializes the Plaid Link widget on the frontend. It is short-lived (30 minutes) and can only be used once. The second route (`exchange-token/route.ts`) accepts the `public_token` that Plaid Link returns after the user connects their bank. It calls the Plaid API to exchange this temporary public token for a permanent `access_token` and the associated `item_id`. You should store both in your database (or temporarily in a secure HTTP-only cookie for simpler setups) — you will need the `access_token` for all future data fetches for this user. The third route (`accounts/route.ts`) uses the stored `access_token` to call Plaid's accounts endpoint and return account names, types, and current balances. This populates the sidebar account list in your dashboard. The fourth route (`transactions/route.ts`) fetches transaction history using the `access_token`. Plaid returns up to 500 transactions per request with pagination. Each transaction includes merchant name, amount, date, and Plaid's automatic category classification — which you can use to replicate Mint's category-based spending analysis. All routes read credentials from `process.env.PLAID_CLIENT_ID` and `process.env.PLAID_SECRET`, which you will add to Vercel Dashboard → Settings → Environment Variables before deploying.

V0 Prompt

Create a /api/plaid/transactions route that accepts a POST request with an access_token in the body, calls a mock financial data source and returns an array of 20 sample transactions. Each transaction should have: id, date (ISO string), merchant_name, amount (number, negative for debits), category (one of: Food, Transport, Entertainment, Utilities, Shopping), and account_id.

Paste this in V0 chat

app/api/plaid/create-link-token/route.ts
1// app/api/plaid/create-link-token/route.ts
2import { NextResponse } from 'next/server'
3import { Configuration, PlaidApi, PlaidEnvironments, Products, CountryCode } from 'plaid'
4
5const plaidConfig = new Configuration({
6 basePath: PlaidEnvironments[process.env.PLAID_ENV as keyof typeof PlaidEnvironments || 'sandbox'],
7 baseOptions: {
8 headers: {
9 'PLAID-CLIENT-ID': process.env.PLAID_CLIENT_ID,
10 'PLAID-SECRET': process.env.PLAID_SECRET,
11 },
12 },
13})
14
15const plaidClient = new PlaidApi(plaidConfig)
16
17export async function POST(request: Request) {
18 try {
19 const { userId } = await request.json()
20
21 const response = await plaidClient.linkTokenCreate({
22 user: { client_user_id: userId },
23 client_name: 'My Finance App',
24 products: [Products.Transactions],
25 country_codes: [CountryCode.Us],
26 language: 'en',
27 })
28
29 return NextResponse.json({ link_token: response.data.link_token })
30 } catch (error) {
31 console.error('Plaid link token error:', error)
32 return NextResponse.json({ error: 'Failed to create link token' }, { status: 500 })
33 }
34}
35
36// app/api/plaid/exchange-token/route.ts
37export async function POST(request: Request) {
38 try {
39 const { public_token } = await request.json()
40
41 const response = await plaidClient.itemPublicTokenExchange({ public_token })
42 const { access_token, item_id } = response.data
43
44 // In production: store access_token securely in your database
45 // Never return the access_token to the client
46 return NextResponse.json({ success: true, item_id })
47 } catch (error) {
48 return NextResponse.json({ error: 'Token exchange failed' }, { status: 500 })
49 }
50}
51
52// app/api/plaid/transactions/route.ts
53export async function POST(request: Request) {
54 try {
55 const { access_token } = await request.json()
56
57 const endDate = new Date().toISOString().split('T')[0]
58 const startDate = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0]
59
60 const response = await plaidClient.transactionsGet({
61 access_token,
62 start_date: startDate,
63 end_date: endDate,
64 })
65
66 return NextResponse.json({
67 transactions: response.data.transactions,
68 accounts: response.data.accounts,
69 })
70 } catch (error) {
71 return NextResponse.json({ error: 'Failed to fetch transactions' }, { status: 500 })
72 }
73}

Pro tip: Never return the Plaid access_token to the client browser. Store it server-side in your database associated with the user's account. When the dashboard loads, fetch data server-side using the stored access_token.

Expected result: Three working API routes exist under app/api/plaid/. Each route reads Plaid credentials from environment variables and communicates with the Plaid Sandbox API. Testing with a REST client like the Vercel preview URL should return valid mock bank data.

4

Add Environment Variables in Vercel and Deploy

Before deploying, configure your Plaid credentials as environment variables in the Vercel Dashboard. These credentials must never be committed to your GitHub repository or included in client-side code. Go to your Vercel project at vercel.com/dashboard, select your project, then navigate to Settings → Environment Variables. Add three variables: `PLAID_CLIENT_ID` with your Plaid client ID value, `PLAID_SECRET` with your Plaid sandbox secret, and `PLAID_ENV` with the value `sandbox`. Apply all three to Production, Preview, and Development environments. Click Save after adding each variable. Once variables are saved, push your code to GitHub (via V0's Git panel, or directly). Vercel will automatically trigger a new deployment that includes your environment variables. The deployment typically completes in 60-90 seconds for a Next.js app of this size. After deployment, test the Plaid Link flow using Plaid's sandbox test credentials: open your deployed app, click the Connect Bank Account button, and when the Plaid Link modal appears, use the institution 'Chase' (or any sandbox institution), enter username `user_good` and password `pass_good`. Complete the flow and verify that your dashboard displays the mock Plaid sandbox account balances and transactions. For production deployment with real bank accounts, you need to request Production access from Plaid, which involves a compliance review and billing setup. Until then, the Sandbox environment gives you a fully functional development and testing experience without real financial data.

V0 Prompt

Update the dashboard to show a loading state while fetching Plaid data, an error state if the API call fails with a retry button, and an empty state if no bank accounts are connected yet with a prominent 'Connect your first account' CTA button.

Paste this in V0 chat

app/components/plaid-link-button.tsx
1// Environment variables to add in Vercel Dashboard → Settings → Environment Variables:
2// PLAID_CLIENT_ID = your_client_id_from_plaid_dashboard
3// PLAID_SECRET = your_sandbox_secret_from_plaid_dashboard
4// PLAID_ENV = sandbox
5
6// Client-side Plaid Link integration
7// app/components/plaid-link-button.tsx
8'use client'
9import { useCallback, useState } from 'react'
10import { usePlaidLink } from 'react-plaid-link'
11
12interface PlaidLinkButtonProps {
13 userId: string
14 onSuccess: (itemId: string) => void
15}
16
17export function PlaidLinkButton({ userId, onSuccess }: PlaidLinkButtonProps) {
18 const [linkToken, setLinkToken] = useState<string | null>(null)
19 const [loading, setLoading] = useState(false)
20
21 const getLinkToken = useCallback(async () => {
22 setLoading(true)
23 const response = await fetch('/api/plaid/create-link-token', {
24 method: 'POST',
25 headers: { 'Content-Type': 'application/json' },
26 body: JSON.stringify({ userId }),
27 })
28 const data = await response.json()
29 setLinkToken(data.link_token)
30 setLoading(false)
31 }, [userId])
32
33 const { open, ready } = usePlaidLink({
34 token: linkToken,
35 onSuccess: async (publicToken) => {
36 const res = await fetch('/api/plaid/exchange-token', {
37 method: 'POST',
38 headers: { 'Content-Type': 'application/json' },
39 body: JSON.stringify({ public_token: publicToken }),
40 })
41 const data = await res.json()
42 if (data.item_id) onSuccess(data.item_id)
43 },
44 })
45
46 return (
47 <button
48 onClick={linkToken ? () => open() : getLinkToken}
49 disabled={!ready && !!linkToken}
50 className="w-full px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-500 transition-colors disabled:opacity-50"
51 >
52 {loading ? 'Loading...' : '+ Connect Account'}
53 </button>
54 )
55}

Pro tip: Plaid sandbox test credentials: username 'user_good', password 'pass_good' for any institution. Use 'user_transactions_dynamic' for richer transaction history in sandbox testing.

Expected result: The app is live on Vercel with Plaid credentials configured. The Plaid Link flow works end-to-end in sandbox mode: clicking 'Connect Account' opens the Plaid Link modal, entering test credentials connects a mock bank, and the dashboard populates with sandbox account balances and transactions.

Common use cases

Personal Budget Dashboard

A founder wants to build a personal finance app for their team or customers that shows bank account balances, monthly spending by category, and budget progress bars — the core Mint experience. They use Plaid for bank connectivity and V0 to generate the dashboard UI, deployed on Vercel.

V0 Prompt

Build a personal finance dashboard with a sidebar showing linked bank accounts and their current balances, a main area with a monthly spending breakdown by category (groceries, utilities, entertainment, dining) shown as a horizontal bar chart, and a transaction list showing the last 30 transactions with merchant name, amount, date, and category icon. Use a clean white background with green accent colors for positive figures.

Copy this prompt to try it in V0

Net Worth Tracker

A user wants to see all their financial accounts in one place — checking, savings, investment, credit card, and loans — to calculate and track their net worth over time. Plaid provides multi-institution account aggregation, and V0 generates the summary dashboard.

V0 Prompt

Create a net worth tracker dashboard with cards for each account type: Assets section with checking/savings/investment accounts and their balances, Liabilities section with credit cards and loans, and a large Net Worth total at the top calculated as assets minus liabilities. Show trend arrows indicating whether each account balance increased or decreased compared to last month.

Copy this prompt to try it in V0

Spending Category Analysis

A SaaS app wants to give users insight into their spending patterns by category over rolling 3-month periods, similar to Mint's spending pie charts. Transaction data from Plaid is categorized automatically, and V0 generates the analytics visualization components.

V0 Prompt

Build a spending analysis page with a donut chart showing spending percentage by category for the selected month, a month selector to go back up to 12 months, a ranked list of top merchants by total spend, and a comparison view showing this month vs last month by category with percentage change indicators.

Copy this prompt to try it in V0

Troubleshooting

INVALID_CREDENTIALS error when calling Plaid API

Cause: The PLAID_CLIENT_ID or PLAID_SECRET environment variable is incorrect, missing, or set for the wrong Plaid environment (sandbox vs development vs production).

Solution: Go to Vercel Dashboard → Settings → Environment Variables and verify both PLAID_CLIENT_ID and PLAID_SECRET match exactly what is shown in your Plaid dashboard at dashboard.plaid.com → Team Settings → Keys. Also verify PLAID_ENV matches the key type you are using (sandbox, development, or production).

Plaid Link modal does not open after clicking the Connect Account button

Cause: The link_token fetch failed (API route error) or the react-plaid-link package is not installed. Plaid Link also requires the page to be served over HTTPS — it will not work on http://localhost without specific configuration.

Solution: Check your browser console for errors. Ensure react-plaid-link is installed (npm install react-plaid-link). For local testing, use the Vercel preview deployment URL (https://) rather than localhost. Verify your create-link-token API route returns a valid link_token by testing it directly in a REST client.

typescript
1// Check if react-plaid-link is installed correctly
2// package.json should include:
3// "react-plaid-link": "^3.x.x",
4// "plaid": "^26.x.x"
5
6// Verify link token creation works by testing the route directly:
7// POST https://your-app.vercel.app/api/plaid/create-link-token
8// Body: { "userId": "test-user-123" }

PRODUCT_NOT_READY error when fetching transactions

Cause: Plaid's transactions product requires an initial data refresh that can take a few minutes after a new bank connection is established. The data is not immediately available.

Solution: Implement Plaid webhooks to receive a TRANSACTIONS_INITIAL_UPDATE notification when data is ready, rather than immediately fetching after token exchange. For sandbox testing, call the /sandbox/item/fire_webhook endpoint to simulate the webhook. Alternatively, add a brief delay and retry logic.

typescript
1// Plaid webhook handler for transaction ready notification
2// app/api/plaid/webhook/route.ts
3export async function POST(request: Request) {
4 const body = await request.json()
5 if (body.webhook_type === 'TRANSACTIONS' && body.webhook_code === 'INITIAL_UPDATE') {
6 const itemId = body.item_id
7 // Trigger a data refresh for this item in your database
8 // Then notify the client via WebSocket or Server-Sent Events
9 console.log('Transactions ready for item:', itemId)
10 }
11 return new Response('OK', { status: 200 })
12}

Mint integration tutorials or documentation result in 404 errors

Cause: Mint's developer APIs and developer.mint.com documentation were fully shut down in March 2024 alongside the consumer app. Any Mint API credentials or integration code from before 2024 no longer works.

Solution: Migrate to Plaid (plaid.com/docs) as the direct replacement for programmatic personal finance data access. Plaid offers accounts, balances, transactions, identity, assets, and investments products that cover everything Mint's API provided.

Best practices

  • Never return Plaid access_tokens to the client browser — store them server-side in your database and fetch financial data server-side or via server actions.
  • Use Plaid's Sandbox environment for all development and testing work — it provides realistic mock bank data with no real financial account exposure and is completely free.
  • Implement Plaid webhooks rather than polling for transaction data — Plaid sends TRANSACTIONS_INITIAL_UPDATE and TRANSACTIONS_DEFAULT_UPDATE events when data is ready or refreshed.
  • Store access_tokens encrypted in your database, associated with your user's account ID, not in localStorage, cookies, or session storage on the client.
  • Display clear privacy messaging to users about how their financial data is handled — this builds trust and is required by Plaid's terms of service for Production access.
  • Use Plaid's transaction categories rather than building your own classification — Plaid returns primary and detailed category labels for most transactions automatically.
  • When moving from Sandbox to Production, request access well in advance — Plaid's production approval process can take 1-2 weeks and requires compliance documentation.

Alternatives

Frequently asked questions

Is Mint coming back? Can I still use the Mint API?

No. Intuit permanently shut down Mint on March 23, 2024. The Mint app, website, and any developer APIs are no longer accessible. Intuit redirected Mint users to Credit Karma for credit monitoring. There is no Mint API to integrate with, and existing Mint API credentials stopped working at shutdown.

What is the best Mint replacement API for developers?

Plaid is the most widely used replacement. It connects to thousands of US and international financial institutions and provides accounts, balances, transactions, identity, investments, and liabilities data via a clean REST API. Plaid offers a free Sandbox environment for development and charges per API call in Production. For enterprise use cases, Yodlee and MX Data are also strong alternatives with different compliance and pricing models.

Does Credit Karma have a developer API I can use?

No. Credit Karma does not offer a public developer API. The Credit Karma platform is consumer-only — there is no way to programmatically access credit scores, credit card recommendations, or financial data from Credit Karma in your application. If you need credit score data for your app, look at Experian API, Equifax Developer Platform, or TransUnion's developer program, each of which requires a business agreement.

How much does Plaid cost for a personal finance app?

Plaid's Sandbox environment is completely free for development and testing. For Production, Plaid charges per API call and per connected item (bank account link). Pricing varies by product and volume, typically ranging from $0.50 to $1.50 per item per month depending on the products used. Contact Plaid for specific pricing — they work with startups and offer usage-based plans.

Can V0 generate the same kind of charts and visualizations that Mint had?

Yes. V0 can generate spending pie charts, monthly trend line charts, budget progress bars, and transaction category breakdowns using Recharts (a React charting library). Ask V0 specifically for the chart types you need — for example 'Build a donut chart showing spending by category using Recharts with custom colors matching my brand'. V0 will generate complete working chart components that you connect to your Plaid transaction data.

Is it safe to store Plaid access_tokens in Vercel environment variables?

No — Vercel environment variables are project-level configuration, not per-user storage. Plaid access_tokens are user-specific and must be stored in your application database (one per user who connected their bank). Use a database like Neon PostgreSQL via Vercel Marketplace or Supabase to store access_tokens encrypted, associated with each user's account ID. Never put user-specific access_tokens in Vercel env vars.

What happened to users' Mint data when it shut down?

Intuit allowed Mint users to export their data as a CSV file before the March 2024 shutdown deadline. The historical transaction data is no longer accessible through any Intuit service. Users who migrated to Credit Karma only transferred their credit monitoring profile, not Mint transaction history or budgets.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.