Skip to main content
Off-ramp payouts are supported to bank accounts in the United States and 60+ other countries. Requirements vary by country: the payment rail, the bank details you collect, whether the customer must select a receiving institution, and in some cases additional recipient fields. For the end-to-end flows, see Withdraw stablecoin to a US bank account and Withdraw stablecoin to an international bank account. For who is eligible to off-ramp, see Jurisdiction overview.

Country requirements

Bank lookup means you must fetch the receiving institution from GET /v2/institutions and pass the selected bank_id. See Bank lookups below. Recipient extras are in addition to the fields every registration requires: name (or business_name), email, and address. Where Business recipients is No, the country accepts individual recipients only, and submitting recipient.business fails. US payouts are first-party only: beneficiary_type must be FIRST_PARTY, and the destination must be a bank account the customer owns. Every other country accepts both FIRST_PARTY and THIRD_PARTY.

SEPA countries

All SEPA corridors pay out in EUR and share the same requirements: Austria, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Norway, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden, Switzerland.

Why rails and details objects differ

Some countries have a standardized local scheme with its own payment_method value, such as SPEI for Mexico or PIX for Brazil. Countries without a dedicated local rail use BANK_TRANSFER as the catch-all, and the country on the request determines which corridor applies. Rails with identical field sets share a details object. SPAV, SINPE, LBTR, IBFT, MADA, ZAHAV, NPSS, BECS, and ACH all use bank_transfer_details despite having distinct payment_method values. Beyond the fields you collect, the rail changes nothing. Conversion submission, webhook handling, and status progression are identical everywhere.

Bank lookups

Countries marked Yes above require the customer to choose their receiving institution, and registration fails without a bank_id. Fetch the list before you render the bank field:
For the response shape, when the list comes back empty, and where this fits in the flow, see Step 3 of the international quickstart. Two country-specific exceptions:
  • Japan requires a lookup for bank_id and separately requires a bank_code, the Zengin code, which the institutions endpoint does not return. Collect it from the customer.
  • United Kingdom needs no lookup, but does require at least one of swift_or_bic_number or bank_id. If you send bank_id, get it from the institutions endpoint rather than constructing it.

Building the request

Payout destinations are registered through POST /v2/identities/{identity_id}/payment-instructions. The country determines three things: the payment_method, the details object nested inside bank_account_details, and which recipient fields you need. Canada, which uses one of the more detailed objects:
Set exactly one of recipient.individual or recipient.business. Nest tax_id and phone inside whichever one you set. Both are also accepted at the top level of recipient, but that form is deprecated, and the nested value wins if you send both. Bastion derives the account holder’s name and address from the recipient object before forwarding to the payment provider. Do not put them inside bank_account_details.

Format requirements

Tax IDs Bank codes Postal codes Street addresses Saudi Arabia, the United Arab Emirates, Israel, and Kenya require a physical street address. P.O. Box and PO Box are rejected in street_line_1. Phone numbers E.164 with country code, e.g. +541143000000. Account identifiers