# Stablecoin-backed cards for Stripe financial accounts

Issue virtual or physical prepaid or debit cards to connected accounts that spend from stablecoin balances in financial accounts.

You can enable spending backed by stablecoins on your Connect platform to:

- Create financial accounts that hold stablecoins for connected accounts.
- Issue virtual or physical prepaid or debit cards backed by those stablecoin balances.
- Transfer funds to external crypto wallets or pay out to local bank accounts.

> Stablecoin-backed cards for financial accounts are in [private preview](https://docs.stripe.com/release-phases.md). To get access, [contact Stripe sales](https://stripe.com/contact/embedded-finance).

This guide builds on [Treasury for platforms](https://docs.stripe.com/treasury/connect.md) and covers the steps specific to stablecoin-backed cards. For general guidance on connected accounts, financial accounts, and money movement, see the Treasury for platforms guides in each step.

You can use API version `2026-09-30.preview` or later. These versions use the `money_manager` account configuration.

## Availability

Make sure you’re eligible for the preview before you start:

- You must [set up your Stripe account](https://docs.stripe.com/get-started/account/set-up.md) and [configure it as a Connect platform](https://dashboard.stripe.com/connect).
- Your Connect platform must be based in the United States or Europe.
- Connected accounts must be based in a market approved during platform onboarding. Contact your account representative for the markets available to your platform.

## Funding lifecycle

Each connected account holds stablecoins in its own financial account. Cards issued to the connected account draw funds from that balance. This guide uses USDC in its examples. See [stablecoin assets and networks](https://docs.stripe.com/treasury/transfer.md#stablecoin-assets) for the other stablecoins you can use. The integration follows this lifecycle:

1. Onboard each connected account and create a financial account to hold the stablecoin you want to use.
2. Fund the connected account’s financial account using one or more of these methods:
   - **From your platform**: Fund your platform’s financial account in USD, then send an [outbound payment](https://docs.stripe.com/api/v2/money-management/outbound-payments.md) to the connected account’s financial account. Stripe converts the USD to the selected stablecoin.
   - **By bank transfer**: Create a bank account [financial address](https://docs.stripe.com/api/v2/money-management/financial-addresses.md) for the connected account’s financial account. Stripe converts incoming USD transfers to the specified stablecoin.
   - **From a crypto wallet**: Create a crypto wallet financial address for the connected account’s financial account, then send stablecoins to that address onchain.
3. Enable card payments and transfers from the connected account’s financial account:
   - Prepaid or debit cards in USD, using the [Cardholders API](https://docs.stripe.com/api/issuing/cardholders/create.md) and [Cards API](https://docs.stripe.com/api/issuing/cards/create.md).
   - Transfers in stablecoins to crypto wallets, using the [Outbound Setup Intents v2 API](https://docs.stripe.com/api/v2/money-management/outbound-setup-intents.md) and [Outbound Transfers v2 API](https://docs.stripe.com/api/v2/money-management/outbound-transfers.md).
   - Payouts to local bank accounts in currencies such as USD, MXN, or EUR, using the same APIs. Contact your account representative for the full list of payout currencies available to your platform.

## Onboard connected accounts

Create and onboard each connected account that receives cards. Learn more about [connected accounts in Treasury for platforms](https://docs.stripe.com/treasury/connect/account-management/connected-accounts.md).

### Create a connected account

[Create a v2 Account](https://docs.stripe.com/api/v2/core/accounts/create.md) with the `money_manager` and `card_creator` configurations, and request the following capabilities. The storage capabilities use USDC as an example. Request the capabilities for the stablecoin you use. See [stablecoin assets and networks](https://docs.stripe.com/treasury/transfer.md#stablecoin-assets) for availability.

| Capability | Description |
| --- | --- |
| `money_manager.capabilities.business_storage.inbound.usdc` and `money_manager.capabilities.business_storage.outbound.usdc` | Allows the financial account to receive and send USDC. |
| `money_manager.capabilities.outbound_transfers.crypto_wallets` | Allows transfers to external crypto wallets. |
| `money_manager.capabilities.received_credits.bank_accounts` | Allows the financial account to receive bank transfers. Request it if you [fund connected accounts by bank transfer](https://docs.stripe.com/issuing/stablecoin-cards-for-financial-accounts.md#fund-by-bank-transfer). |
| `money_manager.capabilities.received_credits.crypto_wallets` | Allows the financial account to receive USDC from crypto wallets. Request it if you [fund connected accounts from a crypto wallet](https://docs.stripe.com/issuing/stablecoin-cards-for-financial-accounts.md#fund-directly). |
| `card_creator.capabilities.commercial.lead.prepaid_card` | Allows Issuing to create prepaid or debit cards for the account. |

The following example creates a connected account for an individual in Mexico. Replace the `country` value with the two-letter country code for your connected account’s market.

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  --json '{
    "include": [
        "configuration.money_manager",
        "configuration.card_creator"
    ],
    "contact_email": "jenny.rosen@example.com",
    "display_name": "Connected Account for Jenny",
    "identity": {
        "country": "mx",
        "entity_type": "individual"
    },
    "configuration": {
        "merchant": {
            "capabilities": {
                "card_payments": {
                    "requested": true
                }
            }
        },
        "money_manager": {
            "capabilities": {
                "business_storage": {
                    "inbound": {
                        "usdc": {
                            "requested": true
                        }
                    },
                    "outbound": {
                        "usdc": {
                            "requested": true
                        }
                    }
                },
                "outbound_transfers": {
                    "crypto_wallets": {
                        "requested": true
                    }
                },
                "received_credits": {
                    "bank_accounts": {
                        "requested": true
                    },
                    "crypto_wallets": {
                        "requested": true
                    }
                }
            }
        },
        "card_creator": {
            "capabilities": {
                "commercial": {
                    "lead": {
                        "prepaid_card": {
                            "requested": true
                        }
                    }
                }
            }
        }
    },
    "dashboard": "none",
    "defaults": {
        "currency": "usdc",
        "responsibilities": {
            "fees_collector": "application",
            "losses_collector": "application"
        }
    }
  }'
```

### Complete KYC and KYB

Collect the information listed in the account’s [requirements](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-requirements) and update the account with it, or send the account holder through [Stripe-hosted onboarding](https://docs.stripe.com/treasury/connect/account-management/connected-accounts.md).

After you fulfill the requirements, Stripe and Bridge verify the information. If the information passes automated checks, verification usually completes within minutes. If it needs a manual review, it can take up to 1 business day. Monitor the account’s progress with the `v2.core.account[configuration.money_manager].capability_status_updated` and `v2.core.account[configuration.card_creator].capability_status_updated` events, or [retrieve the account](https://docs.stripe.com/api/v2/core/accounts/retrieve.md) with its requirements and configurations:

```curl
curl -G https://api.stripe.com/v2/core/accounts/{{ACCOUNT_ID}} \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -d "include[0]=requirements" \
  -d "include[1]=configuration.money_manager" \
  -d "include[2]=configuration.card_creator"
```

The account is ready when `requirements.entries` is empty and these capabilities have a `status` of `active`:

- `configuration.money_manager.capabilities.business_storage.inbound.usdc`
- `configuration.money_manager.capabilities.business_storage.outbound.usdc`
- `configuration.money_manager.capabilities.outbound_transfers.crypto_wallets`
- `configuration.card_creator.capabilities.commercial.lead.prepaid_card`

## Create a financial account

After the capabilities are active, create a [financial account](https://docs.stripe.com/treasury/connect/account-management/financial-accounts.md) that holds USDC for the connected account. Set the `Stripe-Context` header to the connected account ID. The connected account uses its financial account balance for card payments and transfers to external wallets.

```curl
curl -X POST https://api.stripe.com/v2/money_management/financial_accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "type": "storage",
    "storage": {
        "holds_currencies": [
            "usdc"
        ]
    }
  }'
```

## Fund connected account financial accounts

You can fund a connected account’s financial account from your platform, by bank transfer, or from a crypto wallet. You can combine these methods.

### Fund from your platform 

To fund connected accounts from your platform, add USD to your platform’s financial account, then send funds to each connected account. Learn more about [funding a financial account](https://docs.stripe.com/treasury/connect/moving-money/fund-a-financial-account.md).

Retrieve your platform’s financial account ID:

```curl
curl https://api.stripe.com/v2/money_management/financial_accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview"
```

To receive wire or ACH transfers from your bank account, [create a financial address](https://docs.stripe.com/api/v2/money-management/financial-addresses/create.md) for your platform’s financial account, then retrieve its account and routing numbers:

```curl
curl -X POST https://api.stripe.com/v2/money_management/financial_addresses \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  --json '{
    "financial_account": "{{FINANCIALACCOUNTID_ID}}",
    "type": "bank_account",
    "bank_account": {
        "currency": "usd"
    }
  }'
```

```curl
curl https://api.stripe.com/v2/money_management/financial_addresses \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview"
```

Send funds from your platform’s financial account to the connected account’s financial account with an [outbound payment](https://docs.stripe.com/treasury/connect/moving-money/out-of/outbound-payments.md). Stripe converts USD to USDC as part of the transfer.

```curl
curl -X POST https://api.stripe.com/v2/money_management/outbound_payments \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usd"
    },
    "to": {
        "recipient": "{{ACCOUNT_ID}}",
        "payout_method": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usdc"
    },
    "amount": {
        "value": 10000,
        "currency": "usd"
    },
    "description": "Payout to connected account"
  }'
```

### Fund by bank transfer 

Connected accounts can receive USD bank transfers directly in their USDC financial account, without funds passing through your platform. This requires the `money_manager.capabilities.received_credits.bank_accounts` capability. Create a bank account financial address for the connected account’s financial account with a `settlement_currency` of `usdc`, setting the `Stripe-Context` header to the connected account ID:

```curl
curl -X POST https://api.stripe.com/v2/money_management/financial_addresses \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "financial_account": "{{FINANCIALACCOUNTID_ID}}",
    "type": "bank_account",
    "bank_account": {
        "currency": "usd"
    },
    "settlement_currency": "usdc"
  }'
```

Retrieve the financial address to get its account and routing numbers, and share them with the account holder or the business that pays them. Stripe converts each incoming USD transfer to USDC and credits it to the financial account.

### Fund from a crypto wallet 

Connected accounts can also receive USDC onchain, without funds passing through your platform. This requires the `money_manager.capabilities.received_credits.crypto_wallets` capability. Create a crypto wallet financial address for the connected account’s financial account, setting the `Stripe-Context` header to the connected account ID:

```curl
curl -X POST https://api.stripe.com/v2/money_management/financial_addresses \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "financial_account": "{{FINANCIALACCOUNTID_ID}}",
    "type": "crypto_wallet",
    "crypto_wallet": {
        "network": "tempo"
    }
  }'
```

The response includes the wallet address. Send USDC to that address on the same network, and Stripe credits it to the financial account. See [stablecoin assets and networks](https://docs.stripe.com/treasury/transfer.md#stablecoin-assets) for available assets and networks.

### Verify the balance

Check the connected account’s balance after you fund it:

```curl
curl https://api.stripe.com/v2/money_management/financial_accounts/{{FINANCIALACCOUNTID_ID}} \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}"
```

## Enable crypto wallet transfers

Allow connected accounts to transfer USDC to external crypto wallets that they own. Learn more about [outbound transfers](https://docs.stripe.com/treasury/connect/moving-money/out-of/outbound-transfers.md).

### Create a crypto wallet payout method

For a connected account’s first transfer to a wallet, create a payout method for the wallet. See [stablecoin assets and networks](https://docs.stripe.com/treasury/transfer.md#stablecoin-assets) for the assets and networks you can use.

```curl
curl -X POST https://api.stripe.com/v2/money_management/outbound_setup_intents \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "payout_method_data": {
        "type": "crypto_wallet",
        "crypto_wallet": {
            "address": "0x1234567890abcdef1234567890abcdef12345678",
            "network": "polygon"
        }
    }
  }'
```

### Create an outbound transfer

Transfer USDC from the connected account’s financial account to the crypto wallet:

```curl
curl -X POST https://api.stripe.com/v2/money_management/outbound_transfers \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usdc"
    },
    "to": {
        "payout_method": "cwa_123",
        "currency": "usdc"
    },
    "amount": {
        "value": 1000,
        "currency": "usdc"
    }
  }'
```

## Issue cards

Issue virtual and physical prepaid or debit cards funded by a USD-backed stablecoin balance. Use the v1 Issuing API with the accounts and financial accounts you created using the v2 API earlier in this guide. These APIs are fully interoperable.

### Enable the account to use Issuing

Add the account to Issuing, which enables you to create a `Cardholder` and `Card`.

We provide the platform program value after we onboard your platform.

```curl
curl https://api.stripe.com/v1/issuing/programs \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Version: 2026-10-28.preview; issuing_program_beta=v2" \
  -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \
  -d platform_program=iprg_123 \
  -d is_default=true
```

### Create a cardholder

Create a `Cardholder` object representing the individual or business entity.

**Requirements for individual cardholders:**

- First and last name (required for sanctions screening).
- Date of birth (reduces false positives for watchlist matches).
- Valid phone number or email (required for digital wallets).
- Authorized user terms acceptance.

```curl
curl https://api.stripe.com/v1/issuing/cardholders \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \
  -d "name=Jenny Rosen" \
  --data-urlencode "email=jenny.rosen@example.com" \
  --data-urlencode "phone_number=+18008675309" \
  -d status=active \
  -d type=individual \
  -d "individual[first_name]=Jenny" \
  -d "individual[last_name]=Rosen" \
  -d "individual[dob][day]=1" \
  -d "individual[dob][month]=11" \
  -d "individual[dob][year]=1981" \
  -d "individual[user_terms_acceptance][lead][date]=1470266163" \
  -d "individual[user_terms_acceptance][lead][ip]=91.121.146.224" \
  -d "billing[address][line1]=Calle de la Paz 123" \
  -d "billing[address][city]=Cancun" \
  -d "billing[address][state]=Q.R." \
  -d "billing[address][postal_code]=77500" \
  -d "billing[address][country]=MX"
```

### Create a card

When creating virtual and physical cards, use the `financial_account_v2` parameter to specify which connected account’s financial account the card draws funds from. Standard physical card designs are available immediately, and custom card designs have an approximately 8-week lead time after you finalize the designs.

> Physical cards ship from the US. See [shipping service types](https://docs.stripe.com/issuing/cards/physical/ship-cards.md#select-service-type) for the options available in your cardholders’ countries.

```curl
curl https://api.stripe.com/v1/issuing/cards \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \
  -d "cardholder={{ISSUINGCARDHOLDER_ID}}" \
  -d "financial_account_v2={{FINANCIALACCOUNTID_ID}}" \
  -d currency=usd \
  -d status=active \
  -d type=virtual
```

Both physical and virtual card PINs are set to a random value at creation. Manage and view PINs using the Stripe API and [Issuing Elements](https://docs.stripe.com/issuing/elements.md).

### Spending controls

You can configure stablecoin-backed card spend with [Spending controls](https://docs.stripe.com/issuing/controls/spending-controls.md).

Keep in mind the following:

- Spending controls are specified in USD.
- Stripe’s default daily spending limit doesn’t apply to this integration.
- A per-authorization limit applies and can’t be configured. See the [default spending limits](https://docs.stripe.com/issuing/controls/spending-controls.md#spending-limits).
- When spending limits overlap, the most restrictive control applies.

### Digital wallets

Let cardholders add cards to Apple Pay and Google Pay through manual or push provisioning. Confirm availability in your cardholders’ markets with your account representative.

**Manual provisioning requirements**: For manual provisioning, follow the [manual provisioning steps](https://docs.stripe.com/issuing/cards/digital-wallets.md#manual-provisioning).

**Push provisioning requirements**:

- Complete manual provisioning steps for the US market.
- Integrate with the Stripe mobile SDKs.
- Obtain Apple Pay entitlement from Apple (for Apple Pay).

Learn more about [digital wallet integration](https://docs.stripe.com/issuing/cards/digital-wallets.md).

## Monitor money movement

For stablecoin-backed Issuing, use the [Transactions v2 API](https://docs.stripe.com/api/v2/money-management/transactions.md) to track money movement for card payments and transfers. Learn more about [working with transactions](https://docs.stripe.com/treasury/connect/transactions/working-with-transactions.md).

### Retrieve transaction details

```curl
curl https://api.stripe.com/v2/money_management/transactions/trxn_123 \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}"
```

You can find card spending in the [Received Debit v2 API](https://docs.stripe.com/api/v2/money-management/received-debits.md).

### Retrieve received debit details

```curl
curl https://api.stripe.com/v2/money_management/received_debits/rd_123 \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}"
```

## Testing

Test your integration in a [sandbox](https://docs.stripe.com/sandboxes.md) using your US platform account. [Contact Stripe sales](https://stripe.com/contact/embedded-finance) to configure your sandbox with stablecoin-backed Issuing.

Sandboxes support both the v1 and v2 APIs.

Refer to the [Issuing testing guide](https://docs.stripe.com/issuing/testing.md) to simulate purchases, refunds, and disputes.

## See also

- [Issuing webhook events](https://docs.stripe.com/api/events/types.md#event_types-issuing)
- [Issuing disputes](https://docs.stripe.com/issuing/purchases/disputes.md?dashboard-or-api=api)
- [Managed Support](https://docs.stripe.com/managed-support.md)
- [Global stablecoin payouts with Connect](https://docs.stripe.com/connect/stablecoin-payouts.md)
