Skip to main content
POST
Wallet → Bank (payout)

Authorizations

Authorization
string
header
required

The access token received from the authorization server in the OAuth 2.0 flow.

Body

application/json

Pay out from a wallet to a bank account (intent_type=payout).

The required payment_type selects the flow and drives validation:

  • send — pay another party. Provide payee_destination_id (recommended) or the legacy payee_payment_method_id; do NOT send payment_method_id.
  • transfer — withdraw to the user's OWN bank. Provide payment_method_id (the user's linked bank, the same one they fund from); do NOT send a payee. A Plaid-linked bank is connected to the payout provider on demand if it is not already.

Either way the payout is SUA-gated, moves available → escrow on submit, and settles via webhook.

wallet_id
string<uuid>
required

Source wallet UUID — the tenant's master wallet or one of the user's wallets. Server validates tenant ownership and currency and resolves the owner from it.

Example:

"a1b2c3d4-e5f6-7890-abcd-ef1234567890"

amount
number
required

Amount in major currency units (e.g. dollars).

Example:

100.5

payment_type
enum<string>
required

Required. send pays a payee (use payee_destination_id); transfer withdraws to the user's own bank (use payment_method_id).

Available options:
send,
transfer
Example:

"send"

idempotency_key
string
required

Unique key to ensure idempotent payment creation.

Required string length: 1 - 120
Example:

"pay_req_20260604_abc123"

product_id
string<uuid>
required

UUID of the payout product (rail + provider route).

Example:

"d4e5f6a7-b8c9-0123-4567-890abcdef012"

user_id
string<uuid> | null

Optional safety cross-check — when sent, must match the owner of wallet_id.

Example:

"b3a9b622-cc63-4d3c-aad6-2d8e29e6f9d4"

currency
string
default:USD

ISO 4217 currency code.

Required string length: 3
Example:

"USD"

metadata
Metadata · object

Arbitrary key-value metadata to attach to the payment.

Example:
from_hold
boolean
default:false

Draw this payout from the wallet's frozen (held) funds instead of its available balance. The held balance must cover the amount plus any payer-borne fee, or the request is rejected with insufficient_held_funds. Omit for a normal payout from available balance.

Example:

false

payee_destination_id
string<uuid> | null

send only. UUID of the payee's destination (recommended) — the canonical field for ACH-push and digital-check auto-deposit. Either this or payee_payment_method_id is required when payment_type=send.

Example:

"c8d9e0f1-a2b3-4567-89ab-cdef01234567"

payee_payment_method_id
string<uuid> | null
deprecated

Deprecated legacy payee target (send only) — use payee_destination_id instead.

Example:

"f6a7b8c9-d0e1-2345-6789-0abcdef01234"

payment_method_id
string<uuid> | null

transfer only. UUID of the user's OWN linked bank account to withdraw to. Must belong to the wallet owner and be active. A Plaid-linked bank is connected to the payout provider on demand if it is not already.

Example:

"e5f6a7b8-c9d0-1234-5678-90abcdef0123"

Response

Successful Response

Standard response wrapper for single-object responses and errors.

Generic over the payload type. A route that declares CommonResponse[SomeModel] gets the real data schema rendered in OpenAPI/Swagger; a bare CommonResponse leaves data untyped.

status_code
integer
required

HTTP status code for the response.

data
any
required

Payload or error details.

query_generated_time
integer
required

UTC timestamp (milliseconds since epoch) when response was generated.