Skip to main content
POST
Withdraw Funds
Initiate a withdrawal from your wallet to a beneficiary. You can reference a saved beneficiary by ID or provide inline beneficiary details for a one-time transfer. Either beneficiaryId or inlineBeneficiary must be provided. The required fields inside inlineBeneficiary depend on the currency and withdrawal_method.
Paying out for a specific merchant (tenant keys): if your API key is a white-label tenant key managing multiple merchants, add the X-Account-Id header set to the merchant’s account ID — the payout is then deducted from that merchant’s wallet. Without it, the withdrawal runs against your own (parent) account. The account ID is the id returned by POST /accounts (or from GET /accounts).
For USD, the top-level amount is US cents — e.g. 100 cents = $1.00 USD transferred (consistent with ledger *_amount fields returned on transactions).

Top-level Parameters

* One of beneficiaryId or inlineBeneficiary is required.

inlineBeneficiary — Required Fields by Currency

NGN


Choosing a USD rail

USD payouts run on one of three bank rails, selected with withdrawal_method. The choice drives settlement speed, the fields you must supply, and the fee — so pass it explicitly on both the quote and the withdrawal.
Fees are configured per rail, so ach and domestic_wire to the same bank generally cost different amounts. Send withdrawal_method (or beneficiaryId) to POST /wallet/fee to quote the exact fee this withdrawal will be charged.

USD — ACH

Unlike international_wire, ACH needs no supporting documents — send it as a normal JSON body.
routing_number is required for ach and domestic_wire. Omitting it returns a 400 with "routing_number is required for ACH and domestic wire withdrawals".This is newly enforced. It has always been documented as required for domestic_wire, but the server previously accepted domestic wire requests without it and the payout then stranded. If you have been omitting it, those requests now fail fast instead.

USD — Domestic Wire


USD — International Wire

USD international wire requires reference documents/invoices to be attached, so this is the one withdrawal type that must be sent as multipart/form-data (every other currency/method uses a JSON body). Include one or more files under the documents field.
Send inlineBeneficiary as a single JSON-stringified field — one form field named inlineBeneficiary whose value is the full JSON object. Do not spread it across bracketed fields like inlineBeneficiary[account_name]=…; multipart form fields are not reconstructed into a nested object, so the request will fail with 400 "Either beneficiaryId or inlineBeneficiary must be provided".

USD — Crypto (USDT / USDC)

Crypto withdrawals are sent from your USD wallet. Set withdrawal_method to "crypto_usdt" or "crypto_usdc" to send the USD value as a stablecoin to a crypto wallet address.

XAF


Example Response

Use beneficiaryId to pay a saved beneficiary. Use inlineBeneficiary for one-time transfers. Set saveBeneficiary: true to save the inline beneficiary automatically for reuse.
Fees: By default, fees are deducted from the withdrawal amount (beneficiary receives less). Set deductFeesFromBalance: true so fees come out of your wallet balance and the beneficiary receives the exact amount specified.

Authorizations

X-API-Key
string
header
required

Your Rolla API key

Body

Either beneficiaryId or inlineBeneficiary must be provided.

amount
number
required

Amount in smallest units (kobo for NGN; US cents for USD — 100 = 1 USD).

Example:

5000

currency
string
required

3-letter currency code

Required string length: 3
Example:

"NGN"

description
string

Narration for the transaction

Maximum string length: 500
externalReference
string

Your own unique reference for this transaction

Maximum string length: 255
beneficiaryId
string<uuid>

ID of a saved beneficiary. Use this OR inlineBeneficiary.

inlineBeneficiary
object

One-time beneficiary details (use instead of beneficiaryId)

saveBeneficiary
boolean
default:false

Save the inline beneficiary for future use

deductFeesFromBalance
boolean
default:false

If true, fees are taken from your wallet balance so the beneficiary receives the exact amount

Response

Withdrawal initiated successfully

status
number
Example:

200

success
boolean
Example:

true

message
string
Example:

"Withdrawal initiated successfully"

transaction
object