# 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. Some docs reference v1 objects for backward compatibility, but for existing v1 accounts, Stripe provides 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", "value": "000000000" } ] }, "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 exceptions 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 ``` ## Card 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). ## Regulated customer notices Stripe automatically sends Reg E-required emails to your consumers at each stage of the dispute lifecycle, branded with your platform name and logo. For platform branding configuration and information about sending your own regulated emails, see [Issuing regulated customer notices](https://docs.stripe.com/issuing/compliance-us/issuing-regulated-customer-notices.md). ### Consumer dispute email templates ### Dispute received | | | | | Subject: We received your dispute Preheader: We’re reviewing a {currency symbol}{amount}{ISO} dispute We’re reviewing the dispute you opened for a transaction on your {{PLATFORM_NAME}} account ending in {{ACCOUNT_LAST_4}}. We’ll email you with the outcome by {{INVESTIGATION_DEADLINE}}. **Dispute details** Amount: {currency symbol}{amount}{ISO} Transaction date: {{TRANSACTION_DATE}} Dispute date: {{DISPUTE_DATE}} Reason: {{DISPUTE_REASON}} If you don’t recognize this transaction or think your card might be compromised, cancel your card immediately. If you have questions, contact {{PLATFORM_NAME}} support at {{SUPPORT_EMAIL}}. *This email was sent by Stripe for your account with {{PLATFORM\_NAME}}. Your card is issued by {{ISSUING\_BANK\_NAME}} pursuant to a license from {{CARD\_NETWORK}}.* | ### Confirm your dispute in writing (managed support) | | | | | Subject: Submit evidence for your dispute Preheader: We’re investigating the dispute on your {{PLATFORM_NAME}} account We’ve started investigating this dispute on your {{PLATFORM_NAME}} account: Business: {{MERCHANT_NAME}} Amount: {currency symbol}{amount}{ISO} Date: {{TRANSACTION_DATE}} Dispute type: {{DISPUTE_REASON}} **Submit evidence** To give your dispute the best chance of success, reply to this email with: [Agent to fill out information necessary, for example, a receipt] Send this evidence by {{EVIDENCE_DEADLINE}} to help us as we review your dispute. If we don’t receive the evidence by then, we’ll proceed with the information we have. **Send evidence by mail** If you prefer, you can send this information by mail. Include a signed letter with the requested information, your full name, the name of the transaction, and the last four digits of your account number. Mail it to: {{PLATFORM_NAME}} Support {{SUPPORT_MAILING_ADDRESS}} *This email was sent by Stripe for your account with {{PLATFORM\_NAME}}. Your card is issued by {{ISSUING\_BANK\_NAME}} pursuant to a license from {{CARD\_NETWORK}}.* | ### Provisional credit applied | | | | | Subject: Temporary credit applied while we review your dispute Preheader: Your account was credited by {currency symbol}{amount}{ISO} We’re still reviewing the dispute you opened for a transaction on your {{PLATFORM_NAME}} account ending in {{ACCOUNT_LAST_4}}. We’ll email you with the outcome by {{INVESTIGATION_DEADLINE}}. In the meantime, your account has a temporary credit of {currency symbol}{amount}{ISO}. If you win the dispute, you keep the credit. If not, the credit will be reversed. If you have questions, contact {{PLATFORM_NAME}} support at {{SUPPORT_EMAIL}}. *This email was sent by Stripe for your account with {{PLATFORM\_NAME}}. Your prepaid debit card is issued by {{ISSUING\_BANK\_NAME}} pursuant to a license from {{CARD\_NETWORK}}.* | ### No error found — resolution notice | | | | | Subject: Your dispute review is complete Preheader: We finished reviewing your dispute for your transaction We finished reviewing the dispute you opened for a transaction on your {{PLATFORM_NAME}} account ending in {{ACCOUNT_LAST_4}}. After reviewing the evidence, we found no transaction errors or unauthorized transactions on your account. **More details** {{FINDINGS_SUMMARY}} You can contact us to request copies of the documents used in our review. - **Phone:** {{SUPPORT_PHONE}} ({{SUPPORT_HOURS}}) - **Mail:** {{SUPPORT_MAILING_ADDRESS}} *This email was sent by Stripe for your account with {{PLATFORM\_NAME}}. Your card is issued by {{ISSUING\_BANK\_NAME}} pursuant to a license from {{CARD\_NETWORK}}.* | ### Error found — provisional credit finalized | | | | | Subject: You won a dispute Preheader: You keep the {currency symbol}{amount}{ISO} account credit You won the dispute you opened on your {{PLATFORM_NAME}} account ending in {{ACCOUNT_LAST_4}}. You keep the {currency symbol}{amount}{ISO} credit that we already applied to your account on {{PROVISIONAL_CREDIT_DATE}}. No further action is needed. If you have questions, contact {{PLATFORM_NAME}} support at {{SUPPORT_EMAIL}}. *This email was sent by Stripe for your account with {{PLATFORM\_NAME}}. Your card is issued by {{ISSUING\_BANK\_NAME}} pursuant to a license from {{CARD\_NETWORK}}.* | ### No error found — written explanation and provisional credit reversal | | | | | Subject: Your dispute review is complete Preheader: Your credit will be reversed on {{REVERSAL_DATE}} We finished reviewing the dispute you opened for a transaction on your {{PLATFORM_NAME}} account ending in {{ACCOUNT_LAST_4}}. After reviewing the evidence, we found no transaction errors or unauthorized transactions on your account. Because of this, the {currency symbol}{amount}{ISO} temporary credit will be reversed on {{REVERSAL_DATE}}. Make sure you have enough funds in your account to cover this amount. Until {{REVERSAL_DATE}}, we’ll still process any scheduled preauthorized transfers, even if your balance goes negative. After that, normal account terms apply. **More details** {{FINDINGS_SUMMARY}} You can contact us to request copies of the documents used in our review. - **Phone:** {{SUPPORT_PHONE}} ({{SUPPORT_HOURS}}) - **Mail:** {{SUPPORT_MAILING_ADDRESS}} *This email was sent by Stripe for your account with {{PLATFORM\_NAME}}. Your card is issued by {{ISSUING\_BANK\_NAME}} pursuant to a license from {{CARD\_NETWORK}}.* | ### Dispute resolution findings Emails that include a `{{FINDINGS_SUMMARY}}` field are populated by Stripe based on the dispute type and review outcome. The following findings apply when no error is found: ### Unauthorized use or fraud | Finding | Explanation | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | PII match (3 or more elements) | The business and card network provided transaction details that match your identity—including your [list of PII]. This indicates the transaction was made by you or someone authorized to use your card. | | 3D Secure authentication | The transaction was authenticated through an additional security step. Your card also has similar past transactions with this business. These factors indicate the transaction was authorized. | | Tokenized transaction | The transaction used a payment method that requires your authentication. Your card also has similar past transactions with this business. These factors indicate the transaction was authorized. | | Cardholder description indicates authorized use | The details you provided when filing this dispute indicate that you recognize this purchase. This means it was an authorized transaction. | ### Processing errors | Finding | Explanation | | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Paid by other means | The business confirmed that the {{TRANSACTION_AMOUNT}} charge is the only charge for this purchase—no other payment method was used. This indicates the transaction was processed correctly. | | Duplicate processing | The business provided records showing the transactions were separate charges for different purchases or billing periods. This indicates the transactions aren’t duplicates. | | Incorrect amount | The business provided a receipt confirming that {{TRANSACTION_AMOUNT}} matches the price you agreed to. This indicates you were charged the correct amount. | | Fee miscalculation | We reviewed the {{TRANSACTION_AMOUNT}} fee charged on {{TRANSACTION_DATE}}. We found that it matches the fee schedule and terms for your {{PLATFORM_NAME}} prepaid debit card. | | Rewards or points miscalculation | We reviewed the rewards calculation on your account. We found that your rewards balance matches the program terms for your {{PLATFORM_NAME}} prepaid debit card, including any caps, exclusions, or category-specific earning rates. | | Omission from periodic statement | We reviewed your statement and confirmed that all electronic fund transfers during this period are accurately reflected. No transactions were missing. | ### ATM cash not received | | | | | The ATM operator provided records confirming that {{TRANSACTION_AMOUNT}} was successfully dispensed on {{TRANSACTION_DATE}}. | ### Canceled recurring transaction | | | | | The business provided records showing you continued using the service after the billing date. This indicates that the recurring charge is valid. | ## 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.