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

When you enable the Accounts v2 API, Stripe copies each existing `Customer` object to a v2 `Account` object with the `customer` configuration and keeps them synchronized. You can find the ID of the `Account` object in the `Customer` object’s [customer_account](https://docs.stripe.com/api/customers/object.md#customer_object-customer_account) property.

If you create a `Customer` object after opting in to using the Accounts v2 API, Stripe automatically creates a corresponding `Account` object with the `customer` configuration. However, we recommend that you create `Account` objects 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` object indicates that the synced `Account` object has been created.

The following `Customer` object properties stay synchronized with the corresponding `Account` object properties:

| 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 using the Accounts v2 API. Each Account must have the `customer` and `recipient` configurations, which you can set when you create the `Account`. You can also add them later by [updating the Account](https://docs.stripe.com/api/v2/core/accounts/update.md).

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -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": {
            "capabilities": {
                "automatic_indirect_tax": {
                    "requested": true
                }
            }
        },
        "recipient": {
            "capabilities": {
                "bank_accounts": {
                    "local": {
                        "requested": true
                    }
                }
            }
        }
    },
    "include": [
        "configuration.customer",
        "configuration.recipient",
        "identity"
    ]
  }'
```

If you create `Customer` objects instead, [retrieve the Account ID from the Customer’s customer_account property](https://docs.stripe.com/global-payouts/credential-reuse.md#retrieve-existing-ids).

## Optional: Retrieve Account IDs for existing Customer objects

If you have existing `Customer` objects and have enabled the Accounts v2 API, each of your `Customer` objects has a synced `Account` object. To get the ID of the `Account` object synced to a `Customer` object, [retrieve the Customer](https://docs.stripe.com/api/customers/retrieve.md) and look at the `customer_account` property.

```curl
curl https://api.stripe.com/v1/customers/cus_123 \
  -u "<<YOUR_SECRET_KEY>>:"
```

The `customer_account` property contains the `Account` ID:

```json
{
  "id": "cus_123",
  "object": "customer",
  "customer_account": "acct_123",
  // other customer fields
}
```

## Collect credentials

### Collect the payment method configuration

1. Enable **Cards** and **ACH Direct Debit** in the Dashboard [Payment methods](https://dashboard.stripe.com/settings/payment_methods) page.
1. 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](https://docs.stripe.com/api/setup_intents/create.md) or [PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md) and attach it to the `Account` object using the `customer_account` parameter.
1. Use `payment_method_data` to specify information about the bank account or debit card. This example uses `us_bank_account`:

```curl
curl https://api.stripe.com/v1/setup_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Version: 2026-03-25.preview" \
  -d confirm=true \
  -d customer_account=acct_123 \
  -d "mandate_data[customer_acceptance][accepted_at]=1678942624" \
  -d "mandate_data[customer_acceptance][type]=offline" \
  -d "payment_method_data[billing_details][address][line1]=123 Main St" \
  -d "payment_method_data[billing_details][address][postal_code]=94105" \
  --data-urlencode "payment_method_data[billing_details][email]=jenny.rosen@example.com" \
  -d "payment_method_data[billing_details][name]=Jenny Rosen" \
  -d "payment_method_data[type]=us_bank_account" \
  -d "payment_method_data[us_bank_account][account_holder_type]=individual" \
  -d "payment_method_data[us_bank_account][account_number]=000123456789" \
  -d "payment_method_data[us_bank_account][routing_number]=110000000" \
  -d "payment_method_options[us_bank_account][verification_method]=automatic" \
  -d "payment_method_types[]=us_bank_account" \
  --data-urlencode "return_url=https://www.stripe.com"
```

```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 <<YOUR_SECRET_KEY>>" \
  -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

For the `Account` to receive payouts, you need to request Global Payouts capabilities on the `recipient` configuration, and these capabilities must be activated. You can do this either when you create the `Account`, or you can update an existing `Account` later.

#### Dashboard

You can request the Global Payout `recipient` capability for a new customer in the Dashboard:

1. Navigate to **Global Payouts** > [Recipients](https://dashboard.stripe.com/global-payouts/recipients), then click **Add recipient**.
1. Enter the recipient’s first and last name and email address.
1. Choose how you want to collect the recipient’s information. Stripe can email the recipient, you can send a link to the Stripe-hosted form to the recipient directly, or you can enter their information yourself. If you enter the information yourself, you need to enter the recipient’s type of business, legal name, and payout method details.
1. (Optional) Update the payout methods you want to enable for the recipient. After the recipient is created, you can also update payout methods from **Recipient details** > **Payout methods**.
1. Complete the flow by either clicking **Continue** or **Send email** (if you elected for Stripe to send the email directly).

The link is good for 3 days, until it’s clicked twice or completed.

For existing customers, you can also use the Dashboard to add the `recipient` capability in the same step as sending them money:

1. Navigate to the Global Payouts [Overview](https://dashboard.stripe.com/global-payouts/payouts) page and click **Send money**.
1. Enter your recipient’s email address.
1. By default, Stripe emails a link to the recipient to gather their information with your brand’s name, color, and icon. Alternatively, you can enter the information yourself.
1. Complete the flow, specifying the payout methods you want to enable and the payout amount.

To confirm that the `recipient` configuration is active for a customer:

1. Navigate to [Recipients](https://dashboard.stripe.com/global-payouts/recipients) and select the recipient.
1. Confirm that no additional information is required. A banner on the page displays if we require additional information from the recipient (for example, “Information needed” or “Default bank account not set”). Otherwise, the recipient’s information collection is complete.

#### API

To request Global Payouts capabilities with the API, set [configuration.recipient.capabilities.bank_accounts](https://docs.stripe.com/api/v2/core/accounts/create.md?api-version=preview#v2_create_accounts-configuration-recipient-capabilities-bank_accounts) for the `Account`. Each `configuration.recipient.capabilities.bank_accounts` requires you to provide different information about the recipient. For example, setting `local` for a US recipient requires you to submit an account and routing number. After you request payout method capabilities, Stripe determines the additional information requirements that you need to submit to enable them and can identify it in the API response. To receive the requirements in the response, include `requirements`, `configuration.recipient`, and `identity` in the `include` array. Otherwise, Stripe returns a null response for those properties, regardless of their actual values. See [Create a Global Payout recipient with the API](https://docs.stripe.com/global-payouts/api-recipient-creation.md#create-a-recipient) for more details.

Optionally, you can make the payout method the default by setting its ID as the `Account` object’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 <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{
    "configuration": {
        "recipient": {
            "capabilities": {
                "bank_accounts": {
                    "local": {
                        "requested": true
                    }
                }
            },
            "default_outbound_destination": "usba_test_123"
        }
    },
    "include": [
        "identity",
        "configuration.recipient",
        "requirements"
    ]
  }'
```

To confirm that a capability is active, retrieve the `Account` and inspect the `status` of the capabilities you requested. The `status` must be `active` for a recipient to receive payouts by your specified payout method.

```curl
curl -G https://api.stripe.com/v2/core/accounts/acct_1234 \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  -d "include[0]=identity" \
  -d "include[1]=configuration.merchant" \
  -d "include[2]=default"
```

### Retrieve your FinancialAccount ID

You need to provide your [Financial Account](https://docs.stripe.com/treasury.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`.

> #### Stripe Treasury access
> 
> If you have access to Global Payouts, you also have access to Treasury.

```curl
curl https://api.stripe.com/v2/money_management/financial_accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -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 <<YOUR_SECRET_KEY>>" \
  -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 "<<YOUR_SECRET_KEY>>:"
```

```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 <<YOUR_SECRET_KEY>>" \
  -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
}
```
