# Send payouts

Learn how to send payouts to recipients in more than 160 markets.

Send payouts to recipients from your [financial account](https://docs.stripe.com/treasury.md#account-types) in Stripe Treasury. Speed and cost vary by [payout method](https://docs.stripe.com/global-payouts/payout-methods.md).

## How to send payouts 

You can send payouts from the Dashboard or with the API.

#### Dashboard

To send payouts to recipients directly from the Dashboard:

1. Go to Treasury > **[Payouts](https://dashboard.stripe.com/global-payouts/payouts)**.
2. Click **Send money**.
3. Search and choose from the recipient list, or click **Add new recipient**. Click **Continue**.
4. Choose the amount you want to send.
   - If you’re sending a cross-border payout and converting currencies, you can specify either the sending amount or the amount the recipient receives in the local currency.
5. Choose the payout method you want to use.
6. (Optional) You can add an internal note to reference when managing payouts. Notes are visible only to you and limited to 50 characters.
7. (Optional) If you want Stripe to send a confirmation email to your recipients on your behalf, select the box.
8. Click **Review**, then review the details and click **Send**.
   - If you’re sending a cross-border payout and converting currencies, the exchange rate might be updated. If so, the updated rate and the estimated payout amount and fees are shown. The rate on the review page is the finalized rate.

After you send the payout to the recipient, track your payout status on the [Payouts](https://dashboard.stripe.com/global-payouts/payouts) page. See [Monitor and manage payouts](https://docs.stripe.com/global-payouts/manage-payouts.md#view-payout-status) for more detail on payout statuses and how to view them.

## Confirmation of Payee (UK only)

When you send a GBP payout from a UK financial account to a UK bank account, Confirmation of Payee (CoP) requires you to check that the recipient’s legal name and business type match the details their bank has on file.

Stripe helps you meet this requirement by running the check in the Dashboard when you add the recipient’s UK bank account. If you send a payout to an existing bank account that hasn’t been checked, the bank account shows a `Not verified` badge. Click **Verify** to run the check.

Depending on the result:

- **Match**: Stripe shows `Bank account verified`, and you can send the payout.
- **Partial Match or No Match**: The recipient’s legal name, business type, or both don’t match the bank’s records. Click **Edit** to correct the recipient’s details and run the check again, or click **Continue without match** to proceed.
- **Unavailable**: Stripe couldn’t verify the details with the recipient’s bank. Review the bank details, then click **Continue without match** if you want to proceed.

Only continue without a match if you’re confident the bank account belongs to the intended recipient. Funds sent to the wrong bank account might not be recoverable.

#### API

## Send payouts with the API

The Payout Intents API is the recommended API for sending payouts to recipients. A PayoutIntent guides you through each stage of a payout, from preparation and review to sending and handling failures. Use it to preview fees and exchange rates before you send a payout, schedule payouts, and handle failed and returned payouts on the same object.

The Payout Intents API is available for senders in the US and the UK.

Each payout attempt is an OutboundPayment. Use the Outbound Payments API to see the details of each attempt. In most cases, you can also create OutboundPayments directly. To send cross-border payouts from the UK, you must use the Payout Intents API because of fee transparency requirements.

## Use API keys

Sandbox secret keys work with the Global Payouts APIs, but full-access secret keys (`sk_live_...`) don’t work in live mode. For live requests, use a [restricted API key](https://docs.stripe.com/keys/restricted-api-keys.md). For a standard integration, [create one in the Dashboard](https://dashboard.stripe.com/apikeys/create) with these permissions:

- `Recipient Configuration: Write`
- `Money Management Financial Accounts: Read`
- `Money Management Payout Methods: Write`
- `Money Management Outbound Payments: Write`
- `Money Management Payout Intents: Write`

If you haven’t set up a recipient, see [Create recipients](https://docs.stripe.com/global-payouts/recipient-creation.md).

## Look up your FinancialAccount and recipient IDs

First, get your FinancialAccount ID using the [Financial Accounts API](https://docs.stripe.com/api/v2/money-management/financial-accounts.md). The response includes your available funds in `balance.available`. If your business has multiple financial accounts, retrieve the one you want to send payouts from.

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

Then use the [Accounts v2 API](https://docs.stripe.com/api/v2/core/accounts.md) to get the recipient’s Account ID. In the API response, check the `status` of the recipient’s capabilities to confirm that `status` is set to `active`. This ensures you have all the required information to complete a payout. Otherwise, your payout might fail.

You also have the option to inspect a recipient’s available payout methods or set a default payout method. See [View all payout methods for a recipient](https://docs.stripe.com/global-payouts/recipient-creation.md?dashboard-or-api=api#view-all-payout-methods-for-a-recipient) and [Set a default payout method for a recipient](https://docs.stripe.com/global-payouts/recipient-creation.md?dashboard-or-api=api#set-a-default-payout-method-for-a-recipient).

If your recipient doesn’t have any payout methods, you can create them using the API. Learn more about [creating payout methods for your recipients](https://docs.stripe.com/global-payouts/recipient-creation.md?dashboard-or-api=api&recipient-collection-method=own-ui#create-payout-methods-for-your-recipients).

#### Payout Intents API

Use the Payout Intents API to choose a payout method and review fees and timing before you send the payout.

To send a payout with the Payout Intents API:

- [Create the PayoutIntent](https://docs.stripe.com/global-payouts/send-money.md#submit-a-payout-with-payoutintents). You can also [choose payment networks](https://docs.stripe.com/global-payouts/send-money.md#select-a-payment-network) or [schedule the payout](https://docs.stripe.com/global-payouts/send-money.md#schedule-a-payout-intent) for a future date.
- If the PayoutIntent requires confirmation, [review and confirm it](https://docs.stripe.com/global-payouts/send-money.md#review-payout-intent-details-and-fees). Confirmation is required if you set `confirmation_method` to `manual`, for UK cross-border payouts, and for UK domestic payouts where the [Confirmation of Payee check](https://docs.stripe.com/global-payouts/send-money.md#verify-payout-intent-recipient-names) doesn’t return a match and you haven’t acknowledged the result.
- [Inspect the payout status](https://docs.stripe.com/global-payouts/send-money.md#inspect-a-payoutintent), and [handle payouts that require action](https://docs.stripe.com/global-payouts/send-money.md#handle-payouts-that-require-action).

## Select a payment network

You can specify the payment networks for a payout by setting `to.payout_method_options.bank_account.preferred_networks` when you create a PayoutIntent. Stripe selects the most appropriate network from the list you provide.

| Sender country | Available networks |
| --- | --- |
| United States (domestic) | `ach`, `fedwire` |
| United Kingdom (domestic) | `fps` |
| Eurozone (domestic) | `sepa` |
| Cross-border | `ach`, `fps`, `sepa`, `swift` |

If you don’t specify `preferred_networks`, Stripe selects the most appropriate network based on the recipient’s payout method and capabilities.

## Submit a payout 

Use the [Payout Intents API](https://docs.stripe.com/api/v2/money-management/payout-intents/create.md) to send a payout to a recipient. You must provide the following parameters to create a payout:

| Required information | API parameter |
| --- | --- |
| Financial account ID | `from.financial_account` |
| From currency | `from.currency` |
| Recipient ID | `to.recipient` |
| (Optional) Payout method ID | `to.payout_method` |
| (Optional) Preferred payment network | `to.payout_method_options.bank_account.preferred_networks` |
| (Optional) Confirmation method | `confirmation_method` |
| Amount in minor units (for example, 100 = 1 USD) | `amount.value` |
| Currency | `amount.currency` |

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usd"
    },
    "to": {
        "recipient": "{{ACCOUNTIDGLOBALPAYOUTS_ID}}",
        "payout_method": "{{PAYOUTMETHODID_ID}}",
        "payout_method_options": {
            "bank_account": {
                "preferred_networks": [
                    "ach"
                ]
            }
        }
    },
    "amount": {
        "value": 1999,
        "currency": "usd"
    },
    "description": "Streamer earnings"
  }'
```

By default, `confirmation_method` is `automatic`, and the PayoutIntent moves to `pending` without further action unless a regulatory requirement mandates confirmation. To review every payout before Stripe sends it, set `confirmation_method` to `manual`. You can’t change `confirmation_method` after you create the PayoutIntent.

After you create the PayoutIntent, check its `status` in the response. If the status is `requires_action`, the payout needs confirmation before Stripe sends it. See [Review and confirm the payout](https://docs.stripe.com/global-payouts/send-money.md#review-payout-intent-details-and-fees).

## Review and confirm the payout 

When a PayoutIntent requires confirmation, its status is `requires_action` and `next_action.type` is `confirm`. `next_action.confirm.reason` is `manually_requested` if you set `confirmation_method` to `manual`, or `automatically_required` if a regulatory requirement mandates confirmation.

`next_action.confirm.fields_to_review` lists the PayoutIntent fields to review before you confirm:

- `estimated_fees`: The estimated fees for the payout, by fee type.
- `fx_quote`: For payouts that convert currencies, the exchange rate. If the rate is locked, `fx_quote.lock_expires_at` shows when the lock expires and `fx_quote.lock_status` is `active`.
- `recipient_verification`: For UK domestic payouts, the result of the Confirmation of Payee check. See [Verify recipient names](https://docs.stripe.com/global-payouts/send-money.md#verify-payout-intent-recipient-names).

The PayoutIntent also includes `from.debited` and `to.credited`, which are the estimated amounts debited from your financial account and credited to the recipient, with the exchange rate applied.

After you review the details, confirm the PayoutIntent. Confirming moves the PayoutIntent to `pending`. If `fields_to_review` includes `recipient_verification`, confirming also acknowledges the Confirmation of Payee result.

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents/poi_1234/confirm \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive"
```

If the exchange rate lock expired before you confirm, the request fails with `payout_intent_fx_quote_expired`. Get a new rate with [refresh FX quote](https://docs.stripe.com/api/v2/money-management/payout-intents/fx-quote.md), review the updated `fx_quote`, amounts, and `estimated_fees`, then confirm again.

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents/poi_1234/refresh_fx_quote \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive"
```

## Verify recipient names 

When you send a GBP payout from a UK financial account to a UK bank account, Confirmation of Payee (CoP) requires you to check that the recipient’s legal name and business type match the details their bank has on file. When you create a PayoutIntent for one of these payouts, Stripe runs the check for you and adds the result to the PayoutIntent’s `recipient_verification` field.

The `match_result` field contains one of the following results:

- **`match`**: The recipient’s legal name and business type match the bank’s records. Stripe sends the payout without asking you to confirm the result.
- **`close_match`**: The recipient’s details closely resemble the bank’s records. `match_result_details.matched_name` shows the name the bank has on file.
- **`no_match`**: The recipient’s details don’t match the bank’s records.
- **`unavailable`**: Stripe couldn’t check the details with the recipient’s bank.

If the result is `close_match`, `no_match`, or `unavailable`, and you haven’t already acknowledged a result for this recipient and bank account, the PayoutIntent moves to `requires_action`, `next_action.type` is `confirm`, and `next_action.confirm.fields_to_review` includes `recipient_verification`. The following example shows the relevant fields:

```json
{
  "id": "poi_1234",
  "object": "v2.money_management.payout_intent",
  "status": "requires_action",
  "next_action": {
    "type": "confirm",
    "confirm": {
      "reason": "automatically_required",
      "fields_to_review": ["recipient_verification"]
    }
  },
  "recipient_verification": {
    "match_result": "close_match",
    "match_result_details": {
      "matched_name": "Jenny Rosen",
      "message": "The provided name is a close match to the name the bank has on file for this account.",
      "provided_name": "Jenny Rose",
      "provided_business_type": "personal",
      "matched_business_type": "personal"
    }
  },
  ...
}
```

Review `match_result_details`, which compares the name and business type you provided with the bank’s records, then take one of the following actions:

- **Send the payout anyway**: [Confirm the PayoutIntent](https://docs.stripe.com/global-payouts/send-money.md#review-payout-intent-details-and-fees) to acknowledge the result. Only confirm if you’re confident that the bank account belongs to the intended recipient. Funds sent to the wrong bank account might not be recoverable.
- **Correct the recipient’s details**: [Update the recipient’s Account](https://docs.stripe.com/api/v2/core/accounts/update.md) with the correct legal name or business type, then refresh the PayoutIntent’s recipient verification. You can also refresh to retry a check that returned `unavailable`. The PayoutIntent stays in `requires_action`, and the response includes the updated `recipient_verification`. If the new result is `match`, confirm the PayoutIntent to send it.
- **Don’t send the payout**: [Cancel the PayoutIntent](https://docs.stripe.com/global-payouts/send-money.md#handle-payouts-that-require-action).

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents/poi_1234/refresh_recipient_verification \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive"
```

Stripe also records each check as a [RecipientVerification](https://docs.stripe.com/api/v2/money-management/recipient-verifications/object.md). Use the PayoutIntent’s `recipient_verification` field to decide whether to confirm. A Confirmation of Payee result stays valid for future payouts from you to the same recipient and bank account until the recipient’s legal name or business type changes.

When you confirm a PayoutIntent to acknowledge a `close_match`, `no_match`, or `unavailable` result, Stripe reuses that acknowledged result for later payouts to the same recipient and bank account. Those PayoutIntents don’t require CoP confirmation, even though `match_result` still shows the original result. Check `status` and `next_action` rather than `match_result` to decide whether to confirm.

## Set additional ACH options 

For ACH payouts to US bank accounts, set `preferred_networks` to `ach` and use `to.payout_method_options.bank_account.preferred_network_options.ach` to control how Stripe sends the payout:

- `transaction_purpose`: Set to `payroll` for payroll payouts. NACHA rules require originators to identify payroll payouts to recipients in the US.

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usd"
    },
    "to": {
        "recipient": "{{ACCOUNTIDGLOBALPAYOUTS_ID}}",
        "payout_method": "{{PAYOUTMETHODID_ID}}",
        "payout_method_options": {
            "bank_account": {
                "preferred_networks": [
                    "ach"
                ],
                "preferred_network_options": {
                    "ach": {
                        "transaction_purpose": "payroll"
                    }
                }
            }
        }
    },
    "amount": {
        "value": 1999,
        "currency": "usd"
    },
    "description": "Payroll"
  }'
```

## Handle payouts that require action

A PayoutIntent moves to `requires_action` when it needs confirmation or when its payout fails or is returned. Stripe doesn’t retry or reroute payouts automatically. Listen for the `v2.money_management.payout_intent.requires_action` event, then check `next_action.type`:

- `confirm`: The payout needs review before Stripe sends it. `next_action.confirm.fields_to_review` lists what to review. See [Review and confirm the payout](https://docs.stripe.com/global-payouts/send-money.md#review-payout-intent-details-and-fees).
- `handle_failure`: The payout failed or was returned. `next_action.handle_failure.failure_reason` describes the cause, for example, `insufficient_funds` or `payout_method_closed`.

To fix a failed payout, [update the PayoutIntent](https://docs.stripe.com/api/v2/money-management/payout-intents/update.md), for example, with a different `to.payout_method`. You can update a PayoutIntent while its status is `pending` or `requires_action`.

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents/poi_1234 \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive" \
  --json '{
    "to": {
        "payout_method": "{{PAYOUTMETHODID_ID}}"
    }
  }'
```

After you update the PayoutIntent, check its `status` in the response:

- `pending`: Stripe started a new payout attempt. You don’t need to take any other action.
- `requires_action` with `next_action.type` set to `confirm`: The updated payout needs review before Stripe sends it. See [Review and confirm the payout](https://docs.stripe.com/global-payouts/send-money.md#review-payout-intent-details-and-fees).

To retry a failed payout without changing it (for example, after you add funds to your financial account), [confirm the PayoutIntent](https://docs.stripe.com/api/v2/money-management/payout-intents/confirm.md). If its exchange rate lock expired, refresh the FX quote first. If a scheduled payout fails, create a new PayoutIntent instead of retrying it.

Each retry creates a new payout attempt. If the attempt fails or is returned, the PayoutIntent moves back to `requires_action`.

If you don’t want to send the payout, cancel the PayoutIntent.

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents/poi_1234/cancel \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive"
```

## Inspect payout status 

Call the [Payout Intents API](https://docs.stripe.com/api/v2/money-management/payout-intents/retrieve.md) to inspect payouts, including their status. Specify the PayoutIntent ID in the request.

```curl
curl https://api.stripe.com/v2/money_management/payout_intents/poi_1234 \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive"
```

Learn more about [managing payouts](https://docs.stripe.com/global-payouts/manage-payouts.md).

## Listen for payout events 

Use [webhooks](https://docs.stripe.com/webhooks.md) to track payouts instead of polling. For a PayoutIntents integration, listen for the following events:

| Event | What to do |
| --- | --- |
| `v2.money_management.payout_intent.requires_action` | Check `next_action.type`. Confirm the payout, or fix and retry it. See [Handle payouts that require action](https://docs.stripe.com/global-payouts/send-money.md#handle-payouts-that-require-action). |
| `v2.money_management.payout_intent.posted` | The funds left your financial account. Mark the payout as sent. |
| `v2.money_management.payout_intent.canceled` | Stripe won’t send the payout. Update your records. |

The `v2.money_management.payout_intent.created` and `v2.money_management.payout_intent.processing` events are optional. Use them if you show progress before the payout posts.

You also receive `v2.money_management.outbound_payment` events for each payout attempt. You don’t need to handle them if you listen for the PayoutIntent events above, except to learn when Stripe holds a payout attempt for review. For that, listen for `v2.money_management.outbound_payment.under_review`. See [Payout risk review](https://docs.stripe.com/global-payouts/manage-payouts.md#payout-risk-review).

V2 APIs send thin events, so retrieve the PayoutIntent to get its current state. See [V2 events](https://docs.stripe.com/api/v2/core/events.md). Verify webhook signatures to confirm that events came from Stripe. See [verify events](https://docs.stripe.com/webhooks.md#verify-events). For the full list of payout events, see [View changes in payout state](https://docs.stripe.com/global-payouts/manage-payouts.md#view-changes-in-payout-state).

#### Outbound Payments API

Each OutboundPayment is a single payout attempt. Create OutboundPayments directly if you handle retries, rerouting, and pre-payout compliance checks yourself. For most integrations, use the Payout Intents API instead.

To send a payout with the Outbound Payments API:

- If you pay a UK bank account in GBP from a UK financial account, [complete a Confirmation of Payee check](https://docs.stripe.com/global-payouts/send-money.md#confirmation-of-payee-outbound-payments) for the recipient’s bank account.
- (Optional) [Choose payment networks](https://docs.stripe.com/global-payouts/send-money.md#select-a-payment-network-outbound-payments) for the payout.
- [Submit the payout](https://docs.stripe.com/global-payouts/send-money.md#submit-a-payout).
- [Inspect the payout status](https://docs.stripe.com/global-payouts/send-money.md#inspect-payout-status), and [handle failed or returned payouts](https://docs.stripe.com/global-payouts/send-money.md#handle-failed-and-returned-outbound-payments).

## Verify recipient names 

Some payouts require you to check the recipient’s name with their bank before you send a payout. Use the [Recipient Verifications API](https://docs.stripe.com/api/v2/money-management/recipient-verifications/create.md) to run the check. Stripe determines the type of check from the payout method’s country and currency, and returns it in the RecipientVerification’s `verification_type` field.

### Confirmation of Payee (UK only) 

When you send an OutboundPayment in GBP from a UK financial account to a UK bank account with an account number and sort code, you must complete a Confirmation of Payee (CoP) check for the recipient’s bank account before you create the OutboundPayment. CoP checks that the recipient’s legal name and business type match the details their bank has on file. If you haven’t completed the check, the OutboundPayment request fails with `outbound_payment_recipient_verification_missing`.

Create a RecipientVerification with the recipient’s Account ID and PayoutMethod ID:

```curl
curl -X POST https://api.stripe.com/v2/money_management/recipient_verifications \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive" \
  --json '{
    "recipient": "{{ACCOUNTIDGLOBALPAYOUTS_ID}}",
    "payout_method": "{{PAYOUTMETHODID_ID}}"
  }'
```

The response includes the check result. For CoP, `verification_type` is `confirmation_of_payee` and `expires_at` is `null`:

```json
{
  "id": "{{RECIPIENT_VERIFICATION_ID}}",
  "object": "v2.money_management.recipient_verification",
  "verification_type": "confirmation_of_payee",
  "status": "awaiting_acknowledgement",
  "match_result": "close_match",
  "match_result_details": {
    "matched_name": "Jenny Rosen",
    "message": "The provided name is a close match to the name the bank has on file for this account.",
    "provided_name": "Jenny Rose",
    "provided_business_type": "personal",
    "matched_business_type": "personal"
  },
  "expires_at": null,
  ...
}
```

If `match_result` is `match`, `status` is `verified` and you can create the OutboundPayment. For `close_match`, `no_match`, or `unavailable`, `status` is `awaiting_acknowledgement`. Review `match_result_details`, which compares the name and business type you provided with the bank’s records, then do one of the following:

- **Correct the recipient’s details**: [Update the recipient’s Account](https://docs.stripe.com/api/v2/core/accounts/update.md) with the correct legal name or business type, then create a new RecipientVerification.
- **Send the payout anyway**: Acknowledge the RecipientVerification. Only acknowledge the result if you’re confident that the bank account belongs to the intended recipient. Funds sent to the wrong bank account might not be recoverable.

```curl
curl -X POST https://api.stripe.com/v2/money_management/recipient_verifications/{{RECIPIENTVERIFICATIONID_ID}}/acknowledge \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive"
```

After you acknowledge it, the RecipientVerification’s `status` is `acknowledged`, and you can create the OutboundPayment.

You don’t need to pass the RecipientVerification ID when you create the OutboundPayment. Stripe uses the most recent CoP check for the recipient and payout method. To use a specific check instead, pass its ID in `recipient_verification`.

You complete CoP once for each recipient and bank account. The result doesn’t expire, and creating an OutboundPayment doesn’t use it up, so it applies to all future payouts from you to that bank account. If the recipient’s legal name or business type changes, Stripe sets the RecipientVerification’s `status` to `expired`, and you must complete a new check before your next payout.

In a sandbox, use the [test helper](https://docs.stripe.com/api/v2/money-management/recipient-verifications/test-helper-create.md) to create a RecipientVerification with a specific `match_result`.

## Select a payment network 

You can specify the payment networks for a payout by setting `to.payout_method_options.bank_account.preferred_networks` when you create an OutboundPayment. Stripe selects the most appropriate network from the list you provide.

| Sender country | Available networks |
| --- | --- |
| United States (domestic) | `ach`, `fedwire` |
| United Kingdom (domestic) | `fps` |
| Eurozone (domestic) | `sepa` |
| Cross-border | `ach`, `fps`, `sepa`, `swift` |

If you don’t specify `preferred_networks`, Stripe selects the most appropriate network based on the recipient’s payout method and capabilities.

## Submit a payout

Use the [Outbound Payments API](https://docs.stripe.com/api/v2/money-management/outbound-payments.md) to send a payout to a recipient. You must provide the following parameters to create a payout:

| Required information | API parameter |
| --- | --- |
| Financial account ID | `from.financial_account` |
| From currency | `from.currency` |
| Recipient ID | `to.recipient` |
| (Optional) Payout method | `to.payout_method` |
| Amount in minor units (for example, 100 = 1 USD) | `amount.value` |
| Currency | `amount.currency` |

If you omit `to.payout_method`, Stripe uses the recipient’s [default payout method](https://docs.stripe.com/global-payouts/recipient-creation.md?dashboard-or-api=api#set-a-default-payout-method-for-a-recipient) for the payout’s currency.

```curl
curl -X POST https://api.stripe.com/v2/money_management/outbound_payments \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.preview" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usd"
    },
    "to": {
        "recipient": "{{ACCOUNTIDGLOBALPAYOUTS_ID}}",
        "payout_method": "{{PAYOUTMETHODID_ID}}"
    },
    "amount": {
        "value": 1999,
        "currency": "usd"
    },
    "description": "Streamer earnings"
  }'
```

## Inspect payout status

Call the [Outbound Payments API](https://docs.stripe.com/api/v2/money-management/outbound-payments/retrieve.md) to inspect a payout, including its status. Specify the OutboundPayment ID in the request.

```curl
curl https://api.stripe.com/v2/money_management/outbound_payments/obp_1234 \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.preview"
```

Learn more about [managing payouts](https://docs.stripe.com/global-payouts/manage-payouts.md).

## NACHA payroll compliance

When sending funds for payroll purposes to recipients in the US with ACH, NACHA rules require the originator to explicitly identify the payouts as such. When you create an OutboundPayment, set `to.payout_method_options.bank_account.preferred_networks` to `ach` and `to.payout_method_options.bank_account.preferred_network_options.ach.transaction_purpose` to `payroll` to ensure compliance with this requirement.

## Handle failed and returned payouts 

If an OutboundPayment fails or is returned, its status changes to `failed` or `returned`, and Stripe returns the funds to your financial account. Stripe doesn’t retry the payout. Fix the cause (for example, by asking the recipient to update their bank account details) then create a new OutboundPayment. See [Manage returned payouts](https://docs.stripe.com/global-payouts/manage-payouts.md#manage-returned-payouts).

## Listen for payout events 

Use [webhooks](https://docs.stripe.com/webhooks.md) to track payouts instead of polling. For an OutboundPayments integration, listen for the following events:

| Event | What to do |
| --- | --- |
| `v2.money_management.outbound_payment.posted` | The funds left your financial account. Mark the payout as sent. |
| `v2.money_management.outbound_payment.failed` | The payout failed and Stripe returned the funds. Fix the cause, then create a new OutboundPayment. |
| `v2.money_management.outbound_payment.returned` | The recipient’s bank returned the payout. Fix the cause, then create a new OutboundPayment. See [Manage returned payouts](https://docs.stripe.com/global-payouts/manage-payouts.md#manage-returned-payouts). |
| `v2.money_management.outbound_payment.under_review` | Stripe is holding the payout for review, which can delay its arrival. See [Payout risk review](https://docs.stripe.com/global-payouts/manage-payouts.md#payout-risk-review). |

If you cancel payouts, also listen for `v2.money_management.outbound_payment.canceled`. The `v2.money_management.outbound_payment.created` and `v2.money_management.outbound_payment.updated` events are optional. You don’t need them to track a payout’s status if you listen for the events above.

V2 APIs send thin events, so retrieve the OutboundPayment to get its current state. See [V2 events](https://docs.stripe.com/api/v2/core/events.md). Verify webhook signatures to confirm that events came from Stripe. See [verify events](https://docs.stripe.com/webhooks.md#verify-events). For the full list of payout events, see [View changes in payout state](https://docs.stripe.com/global-payouts/manage-payouts.md#view-changes-in-payout-state).

After you submit a payout, Stripe can hold it for review or reject it. See [Payout risk review](https://docs.stripe.com/global-payouts/manage-payouts.md#payout-risk-review) to understand processing delays and review outcomes.

For minimum and maximum payout amounts by country, see [Payout amounts](https://docs.stripe.com/global-payouts/payout-methods.md#payout-amounts).

## Additional features

Use these features to extend the standard payout flow for specific use cases.

### Schedule a payout 

You can schedule a payout to send on a future date, up to 180 days ahead, in the Dashboard or with the Payout Intents API. Stripe doesn’t hold funds for a scheduled payout.

#### Dashboard

[Contact support](https://support.stripe.com/) to get access to this feature. If you have insufficient funds on the scheduled payout date, the payout fails and you receive an email.

To schedule a future payout:

1. After clicking **Send money** and selecting the payout amount and recipient, click the calendar icon (:calendar:) in the `When` field.
2. In the calendar, select the date that you want to send the payout.
3. Click **Continue**. After reviewing the payout details, click **Schedule**.

To view your scheduled payouts, go to the [Scheduled](https://dashboard.stripe.com/global-payouts/payouts?status%5B0%5D=pending&type%5B0%5D=payout_intent) tab.

#### API

To schedule a payout with the API, set `schedule_options.execute_on` to a date in `YYYY-MM-DD` format when you create the PayoutIntent. The date must be between tomorrow and 180 days from today. Stripe starts sending the payout at 09:00 on that date in your country’s local time zone, for example, `America/New_York` for US senders and `Europe/London` for UK senders. The funds might arrive later, depending on the payment network.

The PayoutIntent stays `pending` until the scheduled date. On that date, Stripe creates the OutboundPayment and the PayoutIntent moves to `processing`. If you don’t set `schedule_options`, Stripe sends the payout immediately. To change a scheduled payout before its send date, [update the PayoutIntent](https://docs.stripe.com/api/v2/money-management/payout-intents/update.md).

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.endive" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usd"
    },
    "to": {
        "recipient": "{{ACCOUNTIDGLOBALPAYOUTS_ID}}",
        "payout_method": "{{PAYOUTMETHODID_ID}}"
    },
    "amount": {
        "value": 1999,
        "currency": "usd"
    },
    "schedule_options": {
        "execute_on": "2026-11-15"
    },
    "description": "Streamer earnings"
  }'
```

You can’t schedule a PayoutIntent that requires confirmation. This includes PayoutIntents with `confirmation_method` set to `manual`, UK cross-border payouts, and UK domestic payouts where the Confirmation of Payee check doesn’t return a match and you haven’t acknowledged the result.

If your financial account doesn’t have enough funds on the scheduled date, the PayoutIntent moves to `requires_action` with `next_action.handle_failure.failure_reason` set to `insufficient_funds`. Stripe doesn’t retry the payout when funds arrive. To send the payout, add funds and create a new PayoutIntent.

### Statement descriptors

A statement descriptor is the text that appears on your recipient’s bank statement for the payout. By default, a payout recipient sees [your account’s statement descriptor](https://docs.stripe.com/get-started/account/statement-descriptors.md#static).

#### Customize statement descriptors

You can customize the descriptor for each payout when you create it.

#### Dashboard

When creating a payout in the Dashboard, enter a custom statement descriptor in the **Statement descriptor** field.

#### API

#### Payout Intents API

When creating a PayoutIntent, set `statement_descriptor` to the text you want the recipient to see.

```curl
curl -X POST https://api.stripe.com/v2/money_management/payout_intents \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.preview" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usd"
    },
    "to": {
        "recipient": "{{ACCOUNTIDGLOBALPAYOUTS_ID}}",
        "payout_method": "{{PAYOUTMETHODID_ID}}"
    },
    "amount": {
        "value": 1999,
        "currency": "usd"
    },
    "description": "Streamer earnings",
    "statement_descriptor": "Payment for streaming"
  }'
```

#### Outbound Payments API

When creating an OutboundPayment, set `statement_descriptor` to the text you want the recipient to see.

```curl
curl -X POST https://api.stripe.com/v2/money_management/outbound_payments \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.preview" \
  --json '{
    "from": {
        "financial_account": "{{FINANCIALACCOUNTID_ID}}",
        "currency": "usd"
    },
    "to": {
        "recipient": "{{ACCOUNTIDGLOBALPAYOUTS_ID}}",
        "payout_method": "{{PAYOUTMETHODID_ID}}"
    },
    "amount": {
        "value": 1999,
        "currency": "usd"
    },
    "description": "Streamer earnings",
    "statement_descriptor": "Payment for streaming"
  }'
```
