# Consumer prepaid debit cards Learn how to issue prepaid debit cards. Issue prepaid debit cards to give your users a way to instantly receive and spend money. Offer rewards, disburse earnings, or launch a branded card program. With consumer prepaid cards, you can: - Create consumer accounts and attach cards while outsourcing KYC obligations and ledger management to Stripe. - Offer virtual cards with push provisioning to digital wallets, or physical cards with production and shipping managed by Stripe. - Outsource disputes, complaints, and other specialized customer support inquiries to Stripe. For eligible platforms, Stripe offers revenue share on prepaid debit card interchange. ## Use cases | Use case | Description | | ------------- | -------------------------------------------------------------------------- | | Rewards | Send customers prepaid rewards cards, customized with your company’s logo. | | Disbursements | Instantly send money for insurance claims, rebates, or earnings. | | Branded cards | Launch a branded wallet and card. | ## Get started To establish your Consumer Issuing program, you need to: - Create and fund a financial account for your platform. - Create connected accounts and cardholders to represent your consumers. - Create cards that are attached to your cardholder’s financial account. - Fund your cardholder’s financial account from your platform’s financial account. (See full diagram at https://docs.stripe.com/issuing/consumer-prepaid-debit-cards) If you’re interested in getting early access to consumer prepaid debit cards, [contact our sales team](https://stripe.com/contact/embedded-finance). ## Create and fund your v2 Financial Account Use your v2 Financial Account to disburse funds to your consumer’s balance. A v2 Financial Account is separate from your payments balance. If you have access to consumer prepaid, we automatically create a v2 Financial Account for you. To fund the v2 Financial Account, follow the steps below. ### Retrieve your Financial Account ID Retrieve your v2 FinancialAccount to get its ID for use in later API requests. ```curl curl https://api.stripe.com/v2/money_management/financial_accounts \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-02-25.preview" ``` ### Create a v2 FinancialAddress To create funding credentials, create a [v2 FinancialAddress](https://docs.stripe.com/api/v2/money-management/financial-addresses/create.md?api-version=2026-01-28.preview&lang=curl). ```curl curl -X POST https://api.stripe.com/v2/money_management/financial_addresses \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview" \ --json '{ "financial_account": "{{FINANCIAL_ACCOUNT_ID}}", "type": "us_bank_account" }' ``` ### Retrieve funding credentials This request returns a routing number and an account number. Use the routing and account number to initiate funding from your external bank account. ```curl curl -G https://api.stripe.com/v2/money_management/financial_addresses \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview" \ -d "include[0]"="credentials.us_bank_account.account_number" ``` ### Retrieve your financial account balance Depending on the source you use to fund your financial account, it might take 1 business day for funds to become available. Use the [Financial Accounts API](https://docs.stripe.com/api/treasury/financial_accounts.md) to view your available balance. ```curl curl https://api.stripe.com/v2/money_management/financial_accounts/{{FINANCIAL_ACCOUNT_ID}} \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview" ``` Example response: ```json { "id": "fa_65NvTFNdpXXUx1kx1rB16NoTesLDSQ1IgNPigisRKq09iq", "object": "v2.money_management.financial_account", "balance": { "available": { "usd": { "value": 0, "currency": "usd" } }, "inbound_pending": { "usd": { "value": 0, "currency": "usd" } }, "outbound_pending": { "usd": { "value": 0, "currency": "usd" } } } } ``` ## Consumer onboarding Onboard each consumer by creating a connected account for them. Create an account for each consumer who wants a prepaid debit card on your platform, which we refer to as a connected account. The connected account stores know your customer (KYC) information about the consumer and enables features on the account. Request the `storage`, `card_creator`, and `recipient` capabilities for each consumer. > The onboarding flow uses the Stripe Accounts v2 API. Use the correct API documentation because some docs reference v1 account objects for backward compatibility. > > For existing v1 accounts, we provide projections to create consumer account configurations. ### Create an Account Create an `Account` object for your consumer. Use the resulting account ID in future API calls. ```curl curl -X POST https://api.stripe.com/v2/core/accounts \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-03-25.preview" \ --json '{ "configuration": { "storer": { "capabilities": { "consumer": { "holds_currencies": { "usd": { "requested": true }, } }, "outbound_transfers": { "bank_accounts": { "requested": true } } }, }, "card_creator": { "capabilities": { "consumer": { "lead": { "prepaid_card": { "requested": true } } } } }, "recipient": { "capabilities": { "stripe_balance": { "stripe_transfers": { "requested": true } } } } }, "contact_email": "jenny.rosen@example.com", "dashboard": "none", "defaults": { "currency": "usd", "profile": { "business_url": "https://accessible.stripe.com" }, "responsibilities": { "fees_collector": "application", "losses_collector": "application" } }, "display_name": "Third J", "identity": { "country": "US", "entity_type": "individual", "individual": { "email": "jenny.rosen@example.com", "given_name": "Jenny", "surname": "Rosen", "date_of_birth": { "day": 1, "month": 1, "year": 1901 }, "phone": "+15555550100", "address": { "line1": "1234 Main Street", "city": "San Francisco", "state": "CA", "postal_code": "94111", "country": "US" }, "id_numbers": [ { "type": "us_ssn_last_4", "value": "1234" } ] }, "include": [ "configuration.card_creator", "configuration.recipient" ] }' ``` ### Record terms of service Present the consumer with the terms of service. Collect acceptance, then record it using the `attestations` parameter on the v2 Accounts API. ```curl curl -X POST https://api.stripe.com/v2/core/accounts/{{CONNECTED_ACCOUNT_ID}} \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-03-25.preview" \ --json '{ "identity": { "country": "US", "entity_type": "individual", "individual": { "email": "jenny.rosen@example.com", "given_name": "Corgi", "surname": "Cannon", "date_of_birth": { "day": 1, "month": 1, "year": 1901 } }, "attestations": { "terms_of_service": { "account": { "date": "2026-02-20T00:00:00.000Z", "ip": "8.8.8.8", "user_agent": "Mozilla/5.0" }, "card_creator": { "consumer": { "account_holder": { "date": "2026-02-20T00:00:00.000Z", "ip": "8.8.8.8" }, "lead": { "prepaid_card": { "bank_terms": { "date": "2026-02-20T00:00:00.000Z", "ip": "8.8.8.8" }, "platform": { "date": "2026-02-20T00:00:00.000Z", "ip": "8.8.8.8" }, "financing_disclosures": { "date": "2026-02-20T00:00:00.000Z", "ip": "8.8.8.8" } } } } } } } } }' ``` ### Attach the Issuing Program ID to the account Retrieve the Issuing Program ID that the connected account uses. ```curl curl https://api.stripe.com/v1/issuing/programs \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview;issuing_program_beta=v2" ``` Attach the Issuing Program ID to the connected account. ```curl curl https://api.stripe.com/v1/issuing/programs \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview; issuing_program_beta=v2" \ -H "Stripe-Account: {{CONNECTED_ACCOUNT_ID}}" \ -d platform_program={{ISSUING_PROGRAM_ID}} \ -d is_default=true ``` ### Create a consumer v2 FinancialAccount Create a v2 FinancialAccount for the connected account to hold the balance for their card. Set `funds_usage_type` to `consumer` and pass the connected account ID in the `Stripe-Context` header. ```curl curl "$STRIPE_API_BASE/v2/money_management/financial_accounts" \ -u "$SK:" \ -H "Content-Type: application/json" \ -H "Stripe-Version: 2025-12-15.preview" \ -H "Stripe-Context: $CA_ID" \ --json '{ "type": "storage", "storage": { "holds_currencies": ["usd"], "funds_usage_type": "consumer" }, "display_name": "Consumer Wallet" }' ``` ### Close the account Close the account to remove access to the account and its associated resources. Pass all configurations on the account for this request to succeed. ```curl curl -X POST https://api.stripe.com/v2/core/accounts/{{CONNECTED_ACCOUNT_ID}}/close \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview; issuing_program_beta=v2" \ --json '{ "applied_configurations": [ "card_creator", "recipient" ] }' ``` ### Handle onboarding exception If a consumer can’t complete onboarding, we notify you through webhook events. Use these events to resolve requirements and inform your customer support team. - [Error enum](https://docs.stripe.com/connect/handling-api-verification.md?accounts-namespace=v2#requirement-errors) - [Document verification issues](https://docs.stripe.com/connect/handling-api-verification.md?accounts-namespace=v2#handle-document-verification-problems) - [Testing exceptions](https://docs.stripe.com/connect/testing-verification.md?accounts-namespace=v2#initial-requirements) ## Card issuing After you create an account and grant a reward to the consumer, issue a card. KYC verification happens asynchronously and might take a few minutes to complete. When you create a connected account, Stripe performs Know Your Customer (KYC) verification in the background. The required capabilities (for example, `card_creator`) don’t activate immediately. Calling the cardholder creation (`POST /v1/issuing/cardholders`) or card issuing (`POST /v1/issuing/cards`) APIs before the relevant capabilities are fully activated on the connected account can result in an error. To know when a capability is active, listen for the `v2.core.account[configuration.card_creator].capability_status_updated` webhook event before proceeding. > If you need to retry after the capability is active, you must use a new idempotency key. The Stripe v1 API caches error responses against the original idempotency key for at least 24 hours. Retrying with the same key within that window returns the same cached error, even if the capability has activated. Learn more about [advanced error handling](https://docs.stripe.com/error-low-level.md#idempotency). ### Create a cardholder First, create a cardholder. The `Cardholder` object lets you attach multiple cardholders to a single account (for example, a primary cardholder and a secondary cardholder). ```curl curl "https://api.stripe.com/v1/issuing/cardholders" \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview" \ -H "Stripe-Account: {{CONNECTED_ACCOUNT_ID}}" \ -d "type=individual" \ -d "name=Jenny Rosen" \ --data-urlencode "email=jenny.rosen@example.com" \ -d "status=active" \ -d "billing[address][line1]=1234 Main Street" \ -d "billing[address][city]=San Francisco" \ -d "billing[address][state]=CA" \ -d "billing[address][country]=US" \ -d "billing[address][postal_code]=94111" \ -d "individual[first_name]=Jenny" \ -d "individual[last_name]=Rosen" \ -d "individual[dob][day]=1" \ -d "individual[dob][month]=1" \ -d "individual[dob][year]=2000" \ -d "spending_controls[spending_limits][0][amount]=100000" \ -d "spending_controls[spending_limits][0][interval]=daily" ``` ### Issue a card Issue the card and specify the currency. Attach the consumer’s v2 FinancialAccount to the card. ```curl curl "https://api.stripe.com/v1/issuing/cards" \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview" \ -H "Stripe-Account: {{CONNECTED_ACCOUNT_ID}}" \ -d "cardholder={{CARDHOLDER_ID}}" \ -d "financial_account_v2={{CONSUMER_FINANCIAL_ACCOUNT_ID}}" \ -d "currency=usd" \ -d "type=virtual" ``` ### Activate the card Cards are inactive by default when Stripe creates them. To activate the card: ```curl curl "https://api.stripe.com/v1/issuing/cards/{{CARD_ID}}" \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview" \ -H "Stripe-Account: {{CONNECTED_ACCOUNT_ID}}" \ -d status=active ``` ## Funding Use [v2 Outbound Payments](https://docs.stripe.com/api/v2/money-management/outbound-payments.md?api-version=2026-01-28.preview&lang=curl) to transfer funds from the platform financial account to the connected account financial account. Funds in the connected account financial account fund card activity. If the connected account financial account has insufficient funds, authorizations decline. You can fund this account at any time, including before you create the card. ```curl curl -X POST https://api.stripe.com/v2/money_management/outbound_payments \ -H "Authorization: Bearer $STRIPE_SECRET_KEY" \ -H "Stripe-Version: 2026-01-28.preview" \ --json '{ "amount": { "value": 100, "currency": "usd" }, "from": { "currency": "usd", "financial_account": "{{PLATFORM_FINANCIAL_ACCOUNT_ID}}" }, "to": { "currency": "usd", "payout_method": "{{CONSUMER_FINANCIAL_ACCOUNT_ID}}", "recipient": "{{CONNECTED_ACCOUNT_ID}}" } }' ``` ## Digital wallets Stripe offers tokenization services for major wallet providers and can help you enable manual provisioning or in-app push provisioning. Use the following guides to get started: - [Manual provisioning](https://docs.stripe.com/issuing/cards/digital-wallets.md?platform=react-native#manual-provisioning) - [In-app provisioning](https://docs.stripe.com/issuing/cards/digital-wallets.md?platform=react-native#push-provisioning) ## Stripe Elements You can display card information for a virtual card using [Stripe Issuing Elements](https://docs.stripe.com/issuing/elements.md). This JavaScript and iframe-based implementation lets you display sensitive card information in your existing user interface with a **Copy** button. - Card number, also known as PAN ([virtual cards](https://docs.stripe.com/js/issuing_elements/create?type=issuingCardNumberDisplay) only) - CVC (virtual cards only) - Expiration date - PIN ## Check the consumer’s balance You can check the consumer’s balance using their Financial Account ID. ```curl curl $STRIPE_API_BASE/v2/money_management/financial_accounts/{{FINANCIAL_ACCOUNT_ID}} \ -u "$SK:" \ -H "Stripe-Context: $CA_ID" \ -H "Stripe-Version: 2025-12-15.preview" ``` Additionally, you can list the consumer’s transactions: ```curl curl -G $STRIPE_API_BASE/v2/money_management/transactions \ -u "$SK:" \ -H "Stripe-Context: $CA_ID" \ -H "Stripe-Version: 2026-03-25.preview" \ -d "financial_account=$FA_ID" ``` ## Submit dispute evidence Stripe offers a guided Dashboard process and an API to submit disputes and monitor them through to resolution. Learn how to [use Issuing to dispute transactions](https://docs.stripe.com/issuing/purchases/disputes.md). ## Enriched merchant data You can improve your users’ transaction history by including [enriched merchant data](https://docs.stripe.com/issuing/purchases/enriched-merchant-data.md), such as human-readable business names and standardized logos. You can also use enriched merchant data to improve spending controls by using consistent counterparty IDs across channels and storefronts.