Fiat Payout
The Fiat Payout flow allows you to send funds from your wallet to an external bank account. This uses the Quotes API with quote_type: "WITHDRAWAL" for same-currency payouts, or quote_type: "EXCHANGE" when the source and target currencies differ.
Overview
- Create a Beneficiary — Register the recipient's bank details
- Create a WITHDRAWAL Quote — Lock in fees and create a payout quote
- Accept the Quote — Execute the payout
- Webhook Notification — Receive confirmation when the payout completes
Step 1: Create a Beneficiary
Before initiating a payout, you need to register the recipient as a beneficiary. If you've already created the beneficiary, skip to Step 2.
Endpoint
POST /api/v1/client/beneficiaries
Authentication
Example: NGN Beneficiary
Example: USD Beneficiary (ACH)
Example: CAD Beneficiary (Interac)
CAD beneficiaries use Interac e-Transfer. Only the recipient's email is required — no bank account details needed.
For non-autodeposit recipients, security question and answer are not returned in the accept-quote response. They arrive asynchronously on a transaction webhook while the payout is still PROCESSING — see interac_payout_instruction in the Transaction Webhook docs.
Example: TZS Beneficiary (Mobile money)
Mobile money payouts use the same beneficiary and quote flow as bank payouts. List operators with GET /banks/TZ?type=momo and pass the operator code as bank_code.
Then create a WITHDRAWAL or EXCHANGE quote with beneficiary_id and accept it — same as Step 2 below.
Currency-Specific Requirements
Mobile money payouts: Use international phone format without
+(e.g.255712345678). The API rejects traditional bank codes when a mobile money operator is required. Payout execution uses the standard quote accept flow — status progresses throughPROCESSING_PAYOUTtoCOMPLETEDvia the same transaction webhook as bank payouts.
Supported mobile money operators (pass code as bank_code; see Banks API for the live list):
Response
Store the id — you'll use it as beneficiary_id in the next step.
For full details on creating beneficiaries including address objects, validation rules, and all supported currencies, see the Beneficiaries API.
Step 2: Create a WITHDRAWAL Quote
Create a quote to lock in fees and initiate the payout.
Endpoint
POST /api/v1/client/quotes
Authentication
Request Body (Same-Currency Withdrawal)
Use quote_type: "WITHDRAWAL" when the source and target currencies are the same (e.g., NGN to NGN):
Request Body (Cross-Currency Payout)
Use quote_type: "EXCHANGE" when the source and target currencies differ (e.g., USD to NGN). This converts funds and sends to the beneficiary in a single operation:
Required Parameters
Optional Parameters
Success Response (201 Created)
Store the quote_id — you'll need it to accept the quote.
Quotes expire after approximately 30 minutes. Accept before the
valid_untiltimestamp.
Step 3: Accept the Quote
Accept the quote to execute the payout. Funds will be deducted from your wallet and sent to the beneficiary.
Endpoint
POST /api/v1/client/quotes/{id}/accept
Authentication
Success Response (200 OK)
Store the transaction_id and transaction_reference for reconciliation.
Step 4: Webhook Notification
Once the payout is processed, you'll receive a transaction webhook with the status:
For full details on webhook handling and signature verification, see the Webhooks documentation.
CAD Interac (non-autodeposit)
After accept, you receive the usual PROCESSING payout flow. When the provider returns Interac security credentials, you get an additional transaction webhook with status: "PROCESSING" and interac_payout_instruction:
Forward the question and answer to the beneficiary so they can accept the e-Transfer. A final webhook with COMPLETED or FAILED follows when the payout settles. interac_payout_instruction is omitted on all non-CAD payouts and on CAD payouts where credentials are not required.
Verify Payout Status
You can check the payout status at any time by polling the quote:
Endpoint
GET /api/v1/client/quotes/{id}
Success Response
The response includes the current quote_status which progresses through:
CREATED → AWAITING_PAYMENT → PAYMENT_CONFIRMED → PROCESSING_PAYOUT → COMPLETED
For full details, see the Quotes API.
Example: Complete Fiat Payout Flow
cURL
Step 1: Create beneficiary
Step 2: Create withdrawal quote
Step 3: Accept the quote
JavaScript
Best Practices
- Create Beneficiaries Once — Beneficiaries are reusable. Create them once and store the
idfor future payouts. - Use Unique Origin References — Each
origin_referencemust be unique. Duplicate references will be rejected, preventing accidental double payouts. - Accept Quotes Promptly — Quotes expire after ~30 minutes. Accept before the
valid_untiltimestamp. - Handle Webhooks — Always verify payout completion via webhooks rather than relying solely on polling.
- Validate Balances — Ensure your wallet has sufficient balance to cover the payout amount plus fees before creating a quote.
- Store References — Save
quote_id,transaction_id,transaction_reference, and yourorigin_referencefor reconciliation.