# 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)
## 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": {
      "given_name": "John",
      "surname": "Doe",
      "date_of_birth": {
        "day": 1,
        "month": 1,
        "year": 1970
      }
    }
  },
  "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.

### 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.
