# Reuse payment credentials for Global Payouts Collect identity and credential information to enable customer payment methods, then reuse that information to enable those payment methods as payout methods for Global Payouts. You can collect identity and credential information from a customer account to enable a payment method (for example, debit card or bank account information), then reuse that information to enable the same payment account as a payout method for [Global Payouts](https://docs.stripe.com/global-payouts.md). Potential use cases include: - **Insurance**: Collect an insurance premium from a customer up front, and pay out approved claims later. - **Prediction market**: Collect a bet from a customer up front, and pay out winnings. - **Fintech**: Allow a customer to add or remove funds from a wallet. ## Limitations - You must opt in to using the [Accounts v2 API](https://docs.stripe.com/api/v2/core/accounts/object.md). - [Global Payouts](https://docs.stripe.com/global-payouts.md) is in public preview and requires that you use a `.preview` [API version](https://docs.stripe.com/upgrades.md). We recommend using `2026-03-25.preview` or later. - You can only reuse credentials for US debit cards and US bank accounts (ACH direct debit), excluding cards that originate from a [wallet](https://docs.stripe.com/payments/wallets.md). - If you [share customers and payment methods across accounts](https://docs.stripe.com/get-started/account/orgs/sharing/customers-payment-methods.md), you can’t reuse payment method credentials collected from one account to create a payout method for a different account in its sharing group. - You can only reuse credentials for [PaymentMethods](https://docs.stripe.com/api/payment_methods/object.md), not legacy [Cards](https://docs.stripe.com/api/cards.md) or [Sources](https://docs.stripe.com/api/sources.md). ## How credential reuse works The Accounts v2 API allows you to represent each of your end users with one `Account` object that supports all interactions with them, including both payments and payouts. When you create an `Account` using the v2 API, Stripe automatically creates a v1 [Customer](https://docs.stripe.com/api/customers/object.md) object (ID prefix `cus_`) and a v2 `Account` object (ID prefix `acct_`) with a [customer configuration](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-configuration-customer). If you have existing `Customers` when you opt in to using the Accounts v2 API, Stripe automatically creates a corresponding v2 `Account` with the `customer` configuration for each existing `Customer`. You can find the ID of the `Account` in the `Customer`’s [customer_account](https://docs.stripe.com/api/customers/object.md#customer_object-customer_account) property. If you create a v1 `Customer` after opting in to using the Accounts v2 API, Stripe automatically creates a corresponding v2 `Account` with the `customer` configuration. However, we recommend that you create v2 `Accounts` directly. If you create a `Customer`, listen for the [v2.core.account.created](https://docs.stripe.com/api/v2/core/events/event-types.md#v2_event_types-v2.core.account.created) webhook event. An event with a `related_object.id` that matches the [customer_account](https://docs.stripe.com/api/customers/object.md#customer_object-customer_account) property of the `Customer` indicates that the synced `Account` has been created. The following properties of the `Customer` object stay synchronized with the corresponding properties of the `Account` object: | `Customer` property | `Account` property | | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [name](https://docs.stripe.com/api/customers/object.md#customer_object-name) | [display_name](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-display_name) | | [email](https://docs.stripe.com/api/customers/object.md#customer_object-email) | [contact_email](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-contact_email) | | [address](https://docs.stripe.com/api/customers/object.md#customer_object-address) | - [identity.individual.address](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-identity-individual-address) if the entity type is `individual` - [identity.business_details.address](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-identity-business_details-address) if the entity type is any type other than `individual` | | [phone](https://docs.stripe.com/api/customers/object.md#customer_object-phone) | - [identity.individual.phone](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-identity-individual-phone) if the entity type is `individual` - [identity.business_details.phone](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-identity-business_details-phone) if the entity type is any type other than `individual` | | [preferred_locales](https://docs.stripe.com/api/customers/object.md#customer_object-preferred_locales) | [defaults.locales](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-defaults-locales) | | [metadata](https://docs.stripe.com/api/customers/object.md#customer_object-metadata) | [metadata](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-metadata) | | [shipping](https://docs.stripe.com/api/customers/object.md#customer_object-shipping) | [configuration.customer.shipping](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer-shipping) | | [business_name](https://docs.stripe.com/api/customers/object.md#customer_object-business_name) | [identity.business_details.registered_name](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-identity-business_details-registered_name) | | [tax_exempt](https://docs.stripe.com/api/customers/object.md#customer_object-tax_exempt) | [configuration.customer.automatic_indirect_tax.exempt](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-configuration-customer-automatic_indirect_tax) | | [invoice_prefix](https://docs.stripe.com/api/customers/object.md#customer_object-invoice_prefix) | [configuration.customer.billing.invoice.prefix](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-configuration-customer-billing-invoice-prefix) | ## Create an Account This workflow assumes that you are directly creating `Account` objects with `customer` and `recipient` configurations using the Accounts v2 API. If you create `Customer` objects instead, retrieve the `Account` ID from the `Customer`’s `customer_account` property. ```curl curl -X POST https://api.stripe.com/v2/core/accounts \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2026-03-25.preview" \ --json '{ "contact_email": "jenny.rosen@example.com", "display_name": "Jenny Rosen", "identity": { "country": "us", "entity_type": "individual", "individual": { "address": { "city": "San Francisco", "line1": "123 Main St", "postal_code": "94105", "state": "CA", "country": "US" }, "given_name": "Jenny", "surname": "Rosen" } }, "configuration": { "customer": {}, "recipient": {} }, "include": [ "configuration.customer", "configuration.recipient", "identity" ] }' ``` ## Collect credentials ### Collect the payment method configuration Use the [Payment Element](https://docs.stripe.com/payments/payment-element.md) or any custom Checkout integration to collect the payment method credentials. Create a `SetupIntent` or `PaymentIntent` and attach it to the `Account` using the `customer_account` parameter: ```curl curl https://api.stripe.com/v1/setup_intents \ -u "<>:" \ -H "Stripe-Version: 2026-03-25.preview" \ -d "payment_method_data[type]=us_bank_account" \ -d customer_account=acct_123 ``` ```json { "id": "seti_123", "object": "setup_intent", "customer_account": "acct_123", "payment_method": "pm_123", "payment_method_types": [ "us_bank_account" ], // Other SetupIntent fields "status": "succeeded" } ``` The payout method is available a few seconds later. Its ID starts with a different prefix than `pm_`, depending on the credential type (for example, `usba_` or `card_`). ### Retrieve the new payout method ID You can use either [list PayoutMethods](https://docs.stripe.com/api/v2/money-management/payout-methods/list.md?api-version=preview) or listen for a [webhook event](https://docs.stripe.com/webhooks.md) to retrieve the new payout method ID. #### ListPayoutMethods ```curl curl https://api.stripe.com/v2/money_management/payout_methods \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2026-03-25.preview" ``` The response contains the new payout method ID: ```json { "data": [ {"id": "usba_test_123", // The new v2 payout method ID "object": "v2.money_management.payout_method", "alternative_reference": {"id": "pm_123", // The ID of the underlying payment method "type": "payment_method" }, "available_payout_speeds": [ "instant", "standard" ], "bank_account": { "archived": false, "bank_account_type": "checking", "bank_name": "STRIPE TEST BANK", "branch_number": null, "country": "US", "enabled_delivery_options": [ "local" ], "financial_connections_account": null, "last4": "6789", "routing_number": "110000000", "supported_currencies": [ "usd" ], "swift_code": null }, "created": "2026-04-29T12:00:00+0000", "latest_outbound_setup_intent": null, "restricted": false, "type": "bank_account", "usage_status": { "payments": "eligible", "transfers": "eligible" }, "livemode": false }, ] } ``` #### Webhooks Listen for `v2.money_management.payout_method.created`: ```json { "id": 'evt_123', "object": 'v2.core.event',"type": 'v2.money_management.payout_method.created', "created": "2026-04-29T12:00:00+0000", "related_object": {"id": 'usba_test_123', // The new v2 payout method ID "type": 'v2.money_management.payout_method', "url": '/v2/money_management/payout_methods/usba_test_123' }, "changes": null, "conext": null, "data": {}, "reason": null, "livemode": false } ``` ## Create the OutboundPayment ### Request Account recipient capabilities The example in this section requests the `recipient.capabilities.bank_accounts.local` capability, but any of the other Global Payout capabilities, including `bank_accounts.local` and `card`, also work. Optionally, you can make the payout method the default by setting its ID as the `Account`’s [configuration.recipient.default_outbound_destination](https://docs.stripe.com/api/v2/core/accounts/update.md?api-version=preview#v2_update_accounts-configuration-recipient-default_outbound_destination). ```curl curl -X POST https://api.stripe.com/v2/core/accounts/acct_123 \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2026-03-25.preview" \ --json '{ "configuration": { "recipient": { "capabilities": { "bank_accounts": { "local": { "requested": true } } }, "default_outbound_destination": "usba_test_123" } }, "include": [ "configuration.recipient" ] }' ``` ### Retrieve your FinancialAccount ID You need to provide your [Financial Account](https://docs.stripe.com/financial-accounts.md) as the source when you create an `OutboundPayment`. Because you only have one Financial Account, you can call [list FinancialAccounts](https://docs.stripe.com/api/v2/money-management/financial-accounts/list.md?api-version=preview) to retrieve it. Save the `FinancialAccount` ID to use when creating the `OutboundPayment`. > #### Financial Accounts access > > If you have access to Global Payouts, you also have access to Financial Accounts. ```curl curl https://api.stripe.com/v2/money_management/financial_accounts \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2026-03-25.preview" ``` ```shell # Save the FinancialAccount ID FINANCIAL_ACCOUNT_ID = fa_123 ``` ### Create the OutboundPayment ```curl curl -X POST https://api.stripe.com/v2/money_management/outbound_payments \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2026-03-25.preview" \ --json '{ "from": { "financial_account": "fa_123", "currency": "usd" }, "to": { "recipient": "acct_123", "payout_method": "usba_test_123" }, "amount": { "value": 100, "currency": "usd" }, "description": "Payout" }' ``` ## Manage credentials Any updates made to the underlying v1 `PaymentMethod` get propagated to the synced v2 `PayoutMethod` if they’re relevant to the payout method (for example, [detaching a payment method from a customer](https://docs.stripe.com/api/payment_methods/detach.md?api-version=.preview) or [updating a card’s expiration date](https://docs.stripe.com/api/payment_methods/update.md?api-version=preview#update_payment_method-card-exp_year)). When the payout method updates, a `payout_method.updated webhook` event is emitted. ```curl curl -X POST https://api.stripe.com/v1/payment_methods/pm_123/detach \ -u "<>:" ``` ```json { "id": "pm_123", "object": "payment_method", "customer_account": null, // customer_account is null now that it is detached "livemode": false, "type": "card" // other PM fields } ``` Listen for the `v2.money_management.payout_method.updated` event: ```json { "id": "evt_456", "object": "v2.core.event", "type": "v2.money_management.payout_method.updated", "created": "2026-04-30T12:00:00+0000", "related_object": { "id": "usba_test_123", "type": "v2.money_management.payout_method", "url" : "/v2/money_management/payout_methods/usba_test_123" }, "changes": { "before": { "us_bank_account": { "archived": false, } }, "after": { "us_bank_account": { "archived": true, } } }, "context": null, "data": {}, "reason": null, "livemode": false } ``` The updated `PayoutMethod` looks like this: ```curl curl https://api.stripe.com/v2/money_management/payout_methods/usba_test_123 \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2026-03-25.preview" ``` ```json { "id": "usba_test_123", "object": "v2.money_management.payout_method", "alternative_reference": { "id": "pm_123", "type": "payment_method" }, "bank_account": { "archived": true, "bank_account_type": "checking", "bank_name": "STRIPE TEST BANK", "branch_number": null, "country": "US", "enabled_delivery_options": [ "local" ], "financial_connections_account": null, "last4": "6789", "routing_number": "110000000", "supported_currencies": [ "usd" ], "swift_code": null }, "created": "2026-04-29T12:00:00+0000", "latest_outbound_setup_intent": null, "type": "bank_account", "usage_status": { "payments": "eligible", "transfers": "eligible" }, "livemode": false } ```