Skip to main content
POST
Create a bank payout
Provider sandbox on this deployment. Our backend targets the bank provider’s sandbox: bank details are test details, no real transfer settles, and settlement lands on a testnet (read network from GET /v1/config). Known limits: only the EUR/IBAN rail is wired for the simulated pay-in, and identity checks run on test-mode applicants. Every response says which environment answered in its environment field.
Currently being connected, docs updating. This endpoint answers mock: true: ids, shapes and statuses are real and deterministic from your input, every money figure is the placeholder 1234567.89, and nothing is sent to a provider. Integrate against the shape; do not compute anything from the figures.

Authorizations

Authorization
string
header
required

Your API key, issued by us and shown once at creation.

Body

application/json
quoteId
string
required

From POST /v1/bank/payout/quote.

Minimum string length: 1
accountId
string
required

The user paying out: the one whose identity result we hold. Not the beneficiary.

Minimum string length: 1
Example:

"acct_8f2c91d0a4"

beneficiary
object
required

Always name and schema; the rest of the fields follow the schema.

purpose
string

Free-text reason for the transfer, passed to the receiving bank where the rail carries one.

Example:

"invoice 2026-114"

reference
string

Your idempotency key, up to 64 characters. A retry carrying the same value answers the original object instead of creating a second one.

Maximum string length: 64
Example:

"payout-2026-09-02-115"

Response

The payout and where to send.

environment
enum<string>
required

Which environment answered. sandbox: at least one money upstream is the provider's sandbox - no real money moves there, and the card corridor is the sandbox's asset (read GET /v1/config), not the documented production one. production: every configured upstream is real. Derived from the configured upstream hosts at boot, never a flag.

Available options:
sandbox,
production
Example:

"sandbox"

mock
boolean
required

Always true on this endpoint: the provider behind it is currently being connected, docs updating. Ids, shapes and statuses are real and deterministic from your input; every money figure is the placeholder 1234567.89; nothing is sent to a provider. The field disappears the day the provider is wired, so branch on its presence, not its value.

Example:

true

id
string
required

The payout id. Poll it on the matching status endpoint.

Example:

"bpo_77c2e1f4309a6d5b"

depositAddress
string
required

Where the user sends the stablecoins. While the payout providers are being connected this is the zero address and nothing must be sent to it; wired, it is a single-use address derived per payout.

Pattern: ^0x[0-9a-fA-F]{40}$
Example:

"0x0000000000000000000000000000000000000000"

depositAmount
string
required

Placeholder while the provider is being connected: always 1234567.89, never a price. Do not compute anything from it. When the provider is wired this becomes a decimal string in major units.

Allowed value: "1234567.89"
Example:

"1234567.89"

chain
integer
required

The chain depositAddress lives on - the chain the quote was made for.

Required range: x <= 9007199254740991
Example:

42161

status
enum<string>
required

pending: created, waiting for the user's stablecoin at the deposit address. converting: the stablecoin landed and is being converted. sent: left the provider, NOT arrived. settled: reached the card or bank account - the one state to tell the user about. rejected: the provider refused it. returned: sent and came back. While the payout providers are being connected every payout answers pending.

Available options:
pending,
converting,
sent,
settled,
rejected,
returned
Example:

"pending"

expiresAt
string
required

ISO 8601. Stablecoins arriving after this convert at the rate current on arrival, not the quoted one.

Example:

"2026-09-08T18:14:12.000Z"