Withdraw to a bank account

Pay a fiat balance out to a bank external account.

This guide covers the full bank withdrawal flow.

Prerequisites

  • A bank external account on the account (account.external.bank.getAll returns it)
  • A balance in the matching fiat currency

1. Find the external account

POST /account.external.bank.getAll
{
    "data": [
        {
            "id": "b21189d4-e549-4d77-b76b-85bfbb45d42d",
            "created_at": "2026-05-12T04:15:39.841Z",
            "type": "BANK_ACCOUNT",
            "is_active": true,
            "metadata": {
                "type": "AUD_NPP",
                "account_name": "Jane Doe",
                "account_number": "123456789",
                "nickname": "Primary AUD"
            }
        }
    ]
}

Record the id. The destination rail is in metadata.type (e.g. AUD_NPP).

2. Execute the withdrawal

POST /transaction.submitWithdraw
Content-Type: application/json

{
    "external_account_id": "b21189d4-e549-4d77-b76b-85bfbb45d42d",
    "currency_out": { "value": "150000", "code": "AUD", "decimals": 2 },
    "metadata": { "description": "Payout p_001" }
}

Amounts are in the smallest unit — 150000 AUD = $1500.00.

3. Track completion

Bank payouts settle asynchronously. Expect a transaction.updated webhook delivery reporting the terminal status, or poll transaction.get if you must:

  • Pending → Completed once the payout settles
  • Pending → Failed if the receiving bank rejects (incorrect details, sanctions, etc.)

Pitfalls

  • Currency mismatch. The destination rail must be able to receive currency_out (e.g. an AUD_NPP account receives AUD); mismatches are rejected. Cross-currency payout is not supported in a single call — swap first, then withdraw.
  • Public holidays delay settlement. Build user-facing ETAs accordingly.