Skip to main content
In this guide you save a bank account outside Nigeria as a payout destination, then withdraw your balance to it. By the end you will have a saved destination you can reuse for future withdrawals, a withdrawal on its way to your bank, and a webhook that tells you when the money has arrived. Multi-currency withdrawals are available to all Bachs users. You can save multiple bank accounts belonging to you and choose a destination for each withdrawal. The API calls withdrawals payouts, so its endpoints and webhook events keep that name.

What you can withdraw to

International SWIFT transfers are not offered. This guide covers bank accounts outside Nigeria; see Withdraw using the API for your Nigerian bank account. Other currencies are not supported for bank withdrawals.

Prerequisites

  • An API key with payouts:write to create destinations and withdrawals, and payouts:read to retrieve their status. See Authentication Overview.
  • Your organization enabled for payouts. Without it, payout requests return PAYOUTS_NOT_ENABLED.
  • Available USD funds sufficient for the withdrawal and fee. These bank routes use your USD balance; an NGN balance cannot fund them. Check Get Balances. USD-to-USD needs no conversion quote; another destination currency needs a quote (step 3).
  • Complete account identity information, including the account name, contact email and address. This is separate from the bank branch address below.
Sandbox payouts are simulated. They move through the same statuses as live payouts without moving real money, so you can build the whole flow against https://sandbox-api.bachs.io first. Sandbox destinations are automatically approved; this does not establish live approval or access. The requests and responses below are illustrative examples, not recorded API results. Replace the sample bank details, identifiers and amounts with your own.

Steps

1

Save your bank account as a destination

Call Create Destination with the currency and your bank details. The fields depend on the currency. Pick your currency below.account_name is the name on the bank account. We send it to your bank exactly as you type it, and we cannot look it up for these banks. If it does not match the name your bank holds, the bank can refuse the payment and return it.
The response is the destination. Keep its id:
Response (USD)

Fields required for each currency

bank_address is the address of your bank’s branch, not your own address. You can paste sort codes, IBANs and account numbers with spaces or dashes, as your bank statement prints them. We remove them before we check the format.
scheme is required only where a currency can be paid more than one way: USD and CAD. GBP and EUR have one way each, so you leave scheme out and it comes back null.
2

Wait for review, if your currency needs it

In live mode, a USD bank destination is automatically approved when you save it: status is approved and is_usable is true.Other bank destinations in the table above initially come back in live mode with status set to pending_review and is_usable set to false. Our team checks the details before any money can go to the account. Check the destination with Get Destination and continue when is_usable is true. If we cannot approve it, status becomes rejected and status_reason says why.
Check the destination
Changing the account details of a saved destination (account number, sort code, IBAN, routing number, holder name or bank name) sends it back to pending_review, even for a USD bank. Its approval was for the old details. See Update Destination.
3

Get a quote for a destination currency other than USD

For a withdrawal from your USD balance to your USD bank account, skip this step.To withdraw USD as another currency, for example to your GBP bank account, call Create Payout Quote first. amount is how much leaves your balance, before the fee. Send payout_method as BANK_TRANSFER.
to_amount is what reaches your bank. A quote lasts 30 seconds, so create it right before the payout and send the payout as soon as it returns.
4

Send the withdrawal

Call Create Payout with the destination. For a same-currency withdrawal, send amount. With a quote, send quote_id and leave amount out, because the quote already fixes both amounts. Always send an Idempotency-Key.
amount is in the bank’s currency. fee and total_debited are in source_currency, the balance the money left. The fee is charged on top, so a 500.00 USD withdrawal debits more than 500.00 USD. Reconcile against total_debited.
A 500, 502, 503 or 504, or a request that times out, does not mean the withdrawal failed. The money may already have left your balance. Check with Get Payout or List Payouts before you try again, and retry with the same Idempotency-Key so you cannot pay twice.
5

Confirm the money arrived

A successful response means we accepted the withdrawal and took the money from your balance. It does not mean your bank has it. The status moves from pending to processing, then to completed or failed.Listen for payout.paid and payout.failed, or poll Get Payout:
Check the withdrawal
On failed, failure_reason says why. The amount and the fee both go back to your available balance.

Errors

See Errors for the shape of every error response.

Next steps