Legacy
Moving money using OutboundPayment v2 objects Legacy
Learn how to create outbound payments to move money out of financial accounts to third parties.
Legacy integration
The v1 version of Treasury for platforms is a legacy integration that doesn’t support many of the features introduced in Treasury for platforms v2. Don’t build a new v1 integration.
OutboundPayment objects represent push-based transfers from your financial account to a third-party external account using ACH or wire transfer or another financial account associated with the same platform instantly using the stripe network. For example, if you want to send money from your financial account to your vendor’s external US bank account, you create an OutboundPayment to move the funds. The receiving account for an OutboundPayment is either an external bank account or a financial account that belongs to a different connected account.
The typical transfer time for outbound payments can range from minutes (when using the Stripe network), same day, to 1-2 business days (when using the ACH network). For more information, see the Money movement timelines guide.
Create an OutboundPayment
Collect required fields
First, get your FinancialAccount ID using the FinancialAccount API. You can also view your available funds.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Then, use the Accounts v2 API to retrieve the recipient account’s recipient configuration and verify that the status of the desired payout method capability is set to active. This ensures you have all the required information to complete a payout. Otherwise, your payout might fail. Learn more about managing recipients.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
{
"id": "acct_1R826uQgVatBcAVX",
"object": "v2.core.account",
"applied_configurations": [
"recipient"
],
"configuration": {
"customer": null,
"merchant": null,
"recipient": {
"capabilities": {
"bank_accounts": {
"local": {
"requested": true,
"status": "active",
"status_details": []
},
"wire": null,
"instant": null
},
"cards": null,
"stripe_balance": null,
"paper_checks": null
},
"default_outbound_destination": null
You can optionally use the Payout Methods v2 API with the recipient ID to inspect available payout methods. The response contains a list of PayoutMethod objects that a recipient owns. Use the Accounts v2 API to set a PayoutMethod as the default outbound destination with configuration.recipient.default_outbound_destination.
The Stripe-Context header in this request must be the Account ID of the connected account + forward slash + the Account ID of the recipient (for example, acct_111a/acct_111b).
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Submit a payout
Use the OutboundPayments API v2 to make a payout to a recipient. You must provide the following parameters to create a payout:
| Required information | API parameter |
|---|---|
| Financial Account ID | financial_account |
| Recipient ID | recipient |
| (Optional) Payout method | to.payout_method |
| Amount in minor units (for example, 100 = 1 USD) | amount.value |
| Currency | amount.currency |
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Submit a payout with PayoutIntents Private preview
Use the Payout Intents API to make 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 |
| Amount in minor units (for example, 100 = 1 USD) | amount.value |
| Currency | amount.currency |
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Submit a paper check Private preview
To send a paper check, provide a signature in the delivery_options.paper_check.signature field. Optionally, provide a memo and specify a shipping speed in delivery_options.paper_check.memo and delivery_options.paper_check.shipping_speed fields respectively. You don’t need to use the to.payout_method field when submitting a paper check.
Both delivery_options.paper_check.signature and delivery_options.paper_check.memo are printed on the check.
Command Line
cURL
Add attachments to a paper check
You can include a PDF attachment with a paper check, such as an invoice or receipt. Stripe supports PDF files only. The maximum page count depends on the shipping speed: 5 pages for standard shipping and 50 pages for priority shipping.
Upload the file with the Files API and set purpose to paper_check_attachment. You must include the Stripe-Account header and set it to the connected account ID that owns the financial account.
Command Line
Pass the returned file ID in delivery_options.paper_check.attachment when you create the outbound payment.
Command Line
cURL
Inspect payout status
Call the OutboundPayments API v2 to inspect payouts, including their status. Specify using the OutboundPaymentID in the OutboundPayments API v2 call.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Inspect a PayoutIntent Private preview
Call the Payout Intents API to inspect payouts, including their status. Specify the PayoutIntent ID in the request.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Learn more about managing payouts.
Possible payout statuses
The following table describes the possible payout statuses.
| Status | Description |
|---|---|
| processing | The starting state of the payout. Funds allocate to a pending transaction and remain part of the current outbound_pending balance. If the value of the cancelable parameters is set to true, you can cancel the payout. |
| failed | The payout failed. Stripe voids the pending transaction and returns the funds to you. |
| canceled | The payout was canceled before it posted. Stripe voids the pending transaction and returns the funds to you. |
| posted | The payout posts and funds leave the FinancialAccount. Posted doesn’t guarantee that your recipient has received money, because their bank might delay the release of funds. If a payout is posted but the recipient hasn’t received money, instruct them to wait several business days or to inquire with their bank. |
| returned | The payout failed to arrive at the destination. Stripe returns the funds to you in a separate transaction ( returned_details[transaction]). To see the return reason, on the Global Payouts page, click the payout in the list view and see the return reason listed in the Timeline section. You can also view return reasons in OutboundPayments. Payouts are typically returned within 2-3 business days, but might take longer depending on the recipient country. |
Track status of paper checks
Paper checks have additional information such as tracking details to help you know its location at any time. These fields populate under tracking_details.paper_check.
| Field | Description |
|---|---|
tracking_number | The tracking number from the carrier. |
carrier | The carrier delivering the check. |
tracking_status | The status of the delivery of the check: delivered, mailed, or in_transit. |
current_postal_code | The postal code where the check is currently at. |
check_number | The number printed on the check. |
mailing_address | The destination of the check. |
updated_at | The last time tracking_details.paper_check was updated. |
Statement descriptors
Statement descriptors explain charges or payments on bank statements. By default, a payout recipient sees your account’s statement descriptor.
Customize statement descriptors Public preview
You can customize the descriptor for each payout when you create it.
When creating a payout in the Dashboard, enter a custom statement descriptor in the Statement descriptor field.
Payout amounts
Review the following tables to learn the minimum and maximum payout amounts for each country. Keep in mind the following when considering minimum payout amounts:
- The minimum amount applies regardless of whether the currency is the source or destination currency.
- The minimum amount in the API request must be in minor units . For example, enter 1 USD as 100.
- The source and destination currencies must both pass the minimum payout amounts.
For example, if you’re a US business funding a cross-border payout in USD to a recipient in South Africa who will receive ZAR, you must meet the minimums for both USD (0.01 USD) and ZAR (100 ZAR). If you tried to send 3 USD (passes USD minimum) to a South African recipient, the payout would fail because 3 USD = 55.63 ZAR, which fails the ZAR minimum.
Minimum sending amounts by sender country
The following minimum amounts apply based on your business’s sending country and currency.
| Sending country | Sending currency | Minimum payout amount (major units) | Minimum payout amount ( minor units for API) |
|---|---|---|---|
| United States | USD | 0.01 USD | 1 |
| the related setting | 1 the related setting | 1000000 1 | |
| United Kingdom | GBP | 0.01 GBP | 1 |
| EUR | 0.01 EUR | 1 | |
| USD | 0.01 USD | 1 |
1 the related setting supports 6 decimal places, so 1 the related setting = 1000000 expressed in minor units.
Maximum sending amounts by sender country
The following maximum amounts apply based on your business’s sending country, currency, and payout method.
| Sending country | Sending currency | Payout method | Maximum payout amount (major units) | Maximum payout amount ( minor units for the API) |
|---|---|---|---|---|
| United States | USD | Wire | 10,000,000 USD | 1000000000 |
| Standard | 1,000,000 USD | 100000000 | ||
| Instant | 9,999 USD | 999900 | ||
| United Kingdom | GBP | Standard | 1,000,000 GBP | 100000000 |
| GBP | Instant (cards) | 9,999 GBP | 999900 | |
| USD | Standard | 1,000,000 USD | 100000000 |
Maximum receiving amounts by recipient currency
The following maximum amounts apply based on the currency your recipient receives.
| Recipient country | Currency | Maximum payout amount (major units) | Maximum payout amount ( minor units for API) |
|---|---|---|---|
| Benin | XOF | 50,000,000 XOF | 50000000 |
| Côte d’Ivoire | XOF | 50,000,000 XOF | 50000000 |
| India | INR | 10,000,000.00 INR | 1000000000 |
| Indonesia | IDR | 1,000,000,000.00 IDR | 100000000000 |
| Israel | ILS | 1,000,000.00 ILS | 100000000 |
| Kenya | KES | 1,000,000.00 KES | 100000000 |
| Morocco | MAD | 9,999,999.99 MAD | 999999999 |
| Norway | NOK | 10,000,000.00 NOK | 1000000000 |
| Peru | PEN | 310,000.00 PEN | 31000000 |
| Romania | RON | 50,000.00 RON | 5000000 |
| Senegal | XOF | 50,000,000 XOF | 50000000 |
| South Africa | ZAR | 5,000,000.00 ZAR | 500000000 |
| Sweden | SEK | 10,000,000.00 SEK | 1000000000 |
| Tunisia | TND | 100,000.000 TND | 100000000 |
Minimum receiving amounts by recipient currency
The following minimum amounts apply based on the currency your recipient receives.
| Recipient country | Currency | Minimum payout amount (major units) | Minimum payout amount ( minor units for the API) |
|---|---|---|---|
| Albania | ALL | 3000.00 ALL | 300000 |
| Algeria | DZD | 1.00 DZD | 100 |
| Antigua and Barbuda | XCD | 0.04 XCD | 4 |
| Armenia | AMD | 12100.00 AMD | 1210000 |
| Australia | AUD | 0.01 AUD | 1 |
| Austria | EUR | 0.01 EUR | 1 |
| Bahrain | BHD | 0.005 BHD | 5 |
| Bahamas | BSD | 25 BSD | 2500 |
| Belgium | EUR | 0.01 EUR | 1 |
| Benin | XOF | 1 XOF | 1 |
| Bhutan | BTN | 2500.00 BTN | 250000 |
| Bosnia and Herzegovina | BAM | 50 BAM | 5000 |
| Botswana | BWP | 1.00 BWP | 100 |
| Brunei | BND | 1.00 BND | 100 |
| Bulgaria | EUR | 0.01 EUR | 1 |
| Canada | CAD | 0.01 CAD | 1 |
| China | CNY | 182.00 CNY | 18200 |
| Costa Rica | CRC | 7 CRC | 700 |
| Côte d’Ivoire | XOF | 1 XOF | 1 |
| Croatia | EUR | 0.01 EUR | 1 |
| Cyprus | EUR | 0.01 EUR | 1 |
| Czech Republic | EUR | 0.01 EUR | 1 |
| Denmark | DKK | 0.01 DKK | 1 |
| Ecuador | USD | 1 USD | 100 |
| El Salvador | USD | 30 USD | 3000 |
| Estonia | EUR | 0.01 EUR | 1 |
| Ethiopia | ETB | 1 ETB | 100 |
| Finland | EUR | 0.01 EUR | 1 |
| France | EUR | 0.01 EUR | 1 |
| Gambia | GMD | 1900.00 GMD | 190000 |
| Germany | EUR | 0.01 EUR | 1 |
| Greece | EUR | 0.01 EUR | 1 |
| Guatemala | GTQ | 1.00 GTQ | 100 |
| Guyana | GYD | 6300.00 GYD | 630000 |
| Hong Kong | HKD | 20.00 HKD | 2000 |
| Hungary | HUF | 0.01 HUF | 1 |
| Iceland | EUR | 0.01 EUR | 1 |
| Indonesia | IDR | 0.01 IDR | 1 |
| Ireland | EUR | 0.01 EUR | 1 |
| Israel | ILS | 0.01 ILS | 1 |
| Italy | EUR | 0.01 EUR | 1 |
| Jamaica | JMD | 0 JMD | 0 |
| Jordan | JOD | 0.010 JOD | 10 |
| Kenya | KES | 20 KES | 2000 |
| Kuwait | KWD | 1.000 KWD | 1000 |
| Latvia | EUR | 0.01 EUR | 1 |
| Liechtenstein | EUR | 0.01 EUR | 1 |
| Lithuania | EUR | 0.01 EUR | 1 |
| Luxembourg | EUR | 0.01 EUR | 1 |
| Madagascar | MGA | 132300.00 MGA | 13230000 |
| Malaysia | MYR | 133.00 MYR | 13300 |
| Malta | EUR | 0.01 EUR | 1 |
| Mauritius | MUR | 0.01 MUR | 1 |
| Mexico | MXN | 0.01 MXN | 1 |
| Morocco | MAD | 0.01 MAD | 1 |
| Moldova | MDL | 500.00 MDL | 50000 |
| Mongolia | MNT | 105000 MNT | 10500000 |
| Mozambique | MZN | 1600.00 MZN | 160000 |
| Namibia | NAD | 500 NAD | 50000 |
| Netherlands | EUR | 0.01 EUR | 1 |
| New Zealand | NZD | 0.01 NZD | 1 |
| North Macedonia | MKD | 1500.00 MKD | 150000 |
| Norway | NOK | 0.01 NOK | 1 |
| Oman | OMR | 0.005 OMR | 5 |
| Pakistan | PKR | 4 PKR | 400 |
| Panama | USD | 50 USD | 5000 |
| Peru | PEN | 0.05 PEN | 5 |
| Philippines | PHP | 0.01 PHP | 1 |
| Poland | PLN | 0.01 PLN | 1 |
| Portugal | EUR | 0.01 EUR | 1 |
| Qatar | QAR | 1.00 QAR | 100 |
| Romania | RON | 0.01 RON | 1 |
| Rwanda | RWF | 100 RWF | 100 |
| Saint Lucia | XCD | 0.04 XCD | 4 |
| Senegal | XOF | 1 XOF | 1 |
| Serbia | RSD | 3000 RSD | 300000 |
| Singapore | SGD | 0.01 SGD | 1 |
| Slovakia | EUR | 0.01 EUR | 1 |
| Slovenia | EUR | 0.01 EUR | 1 |
| South Africa | ZAR | 100 ZAR | 10000 |
| Spain | EUR | 0.01 EUR | 1 |
| Sri Lanka | LKR | 1.00 LKR | 100 |
| Sweden | SEK | 0.01 SEK | 1 |
| Switzerland | EUR | 0.01 EUR | 1 |
| Taiwan | TWD | 800.00 TWD | 80000 |
| Tanzania | TZS | 35.00 TZS | 3500 |
| Thailand | THB | 600.00 THB | 60000 |
| Trinidad and Tobago | TTD | 0.10 TTD | 10 |
| Tunisia | TND | 0.001 TND | 1 |
| Turkey | TRY | 5 TRY | 500 |
| United Arab Emirates | AED | 5.00 AED | 500 |
| United Kingdom | GBP | 0.01 GBP | 1 |
| United States | USD | 0.01 USD | 1 |
| Uzbekistan | UZS | 343000 UZS | 34300000 |
| Vietnam | VND | 81125 VND | 81125 |
the related setting payroll compliance
When sending funds for payroll purposes to recipients in the US with ACH, the related setting rules require the originator to explicitly identify the payouts as such. When sending an OutboundPayment, set the purpose parameter to payroll to ensure compliance with this requirement.
Payout timing
| Recipient location | Payout method | Capability | Expected arrival time |
|---|---|---|---|
| United States | Standard | bank_accounts.local | Typically 2-3 business days |
| United States | Wire | bank_accounts.wire | Typically 1 business day |
| United States | Instant | cards | Immediate |
| Outside of the United States ( available countries) | Standard | Varies by country | Typically 1-7 days (varies by country) |
Wire transfer routing numbers
Some banks might use a separate wire transfer routing number that differs from ACH. Consequently, you might receive an error during wire creation if the routing number on the payment method doesn’t support wire transfers. If you receive this error, you need to add a new payment method with your bank’s wire routing number.
RTP routing requirements
Real-Time Payments (RTP) use the same routing numbers as ACH transfers. However, not all banks support RTP. If you receive an error during RTP payout creation, the recipient’s bank might not support RTP, and you should use ACH ( bank_accounts.local) or wire ( bank_accounts.wire) instead.
Create an OutboundPayment to a financial account
To move money between financial accounts, call POST /the relevant part of the product on the origin account and specify the destination account in the destination_payment_method_data parameter. Both financial accounts must be associated with the same platform, but can’t be associated with the same connected account. To transfer money between financial accounts associated with the same connected account, use an OutboundTransfer.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
The body of your request must be x-www-form-urlencoded, but the following JSON defines the data you can send.
Select a language
JSON (commented)
JSON
No results
{
// The source FinancialAccount. Funds are pulled from this account.
"financial_account": "{{SOURCE_FINANCIAL_ACCOUNT_ID}}",
// The amount to send.
"amount": 1000,
"currency": "usd",
// The destination payment method. This parameter is the only way to
// send an OutboundPayment through the `stripe` network.
"destination_payment_method_data": {
"type": "financial_account",
Cancel an OutboundPayment
Use POST /the relevant part of the product/{{the related setting}}/cancel to cancel the OutboundPayment with the associated ID. The OutboundPayment object includes a cancelable parameter with a Boolean value to indicate whether you can cancel the transfer. After an OutboundPayment submits to the network, the cancelable value becomes false and you receive an error from this endpoint for that transfer.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
If successful, the response returns the OutboundPayment object with the status value set to canceled.
{
"id": "{{OUTBOUND_PAYMENT_ID}}",
"object": "outbound_payment",
"livemode": false,
"created": 123456,
"financial_account": "{{FINANCIAL_ACCOUNT_ID}}",
"amount": 1000,
"currency": "usd",
...
"status": "canceled",
Test OutboundPayments
To confirm your integration works, you can simulate sending payouts in a test environment.
Sandboxes
In the Stripe Dashboard, use a sandbox to test functionality without affecting your live integration. Learn more about working in Sandboxes.
- Create a sandbox environment and switch to it.
- Enable Issuing and Treasury for platforms on the sandbox in the Dashboard.
- In the sandbox, create a connected account to start testing.
Use sandbox API key
Use a sandbox API key to test your integration. Sandbox API keys contain the sk_test_ prefix and live mode secret keys contain the sk_live_ prefix. Keys associated with a sandbox can only operate on objects in that sandbox.
- Navigate to Developers , and click API keys .
- Under Standard keys , locate your secret test key.
Create recipient and send money
After enabling OutboundPayments on your sandbox and funding the sandbox financial account, you can create recipients and send money to them. Use test payout credentials to test different scenarios in your sandboxes. You can’t use these test accounts in live mode.
Test bank account numbers
If you’re in a sandbox, you can use the related setting as the verification code.
Recipient country:
| the related setting / BIC Code | the related setting | Behavior |
|---|---|---|
the related setting | the related setting | Payout succeeds. |
the related setting | the related setting | Payout fails with a no_account code. |
the related setting | the related setting | Payout fails with an account_closed code. |
the related setting | the related setting | Payout fails with a insufficient_funds code. |
the related setting | the related setting | Payout fails with a debit_not_authorized code. |
the related setting | the related setting | Payout fails with an invalid_currency code. |
Test check signatures
Use the following test signature values in the delivery_options.paper_check.signature field to simulate different check send outcomes in your sandbox. All other signature values result in an error.
| Signature | Behavior |
|---|---|
paper_check_success | OutboundPayment succeeds. |
paper_check_expired | OutboundPayment fails with failure reason paper_check_expired. |
paper_check_undeliverable | OutboundPayment fails with failure reason paper_check_undeliverable. |
