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.getAllreturns 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. anAUD_NPPaccount 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.