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.
For corporate / company bank accounts (GBP, EUR, USD, NGN, CAD EFT), set "recipient_type": "business" and put the company name in account_name — see Beneficiaries. Then use the returned id as beneficiary_id on the quote as usual.
Endpoint
POST /api/v1/client/beneficiaries
Authentication
Example: NGN Beneficiary
Example: NGN Beneficiary (corporate)
Example: USD Beneficiary (ACH)
Example: USD Beneficiary (corporate ACH)
Example: GBP Beneficiary (corporate)
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.
Example: LRD Beneficiary (Mobile money)
Liberia mobile money payouts use the same beneficiary and quote flow. List operators with GET /banks/LR?type=momo and pass the operator code as bank_code.
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.
INR payout {#inr-payout}
INR payouts send rupees from an INR balance to an Indian bank account (IMPS, NEFT, or RTGS). This is a same-currency withdrawal: source_currency and target_currency are both INR.
- Create an INR beneficiary (
currency_code: "INR",country_code: "IN") withaccount_number,bank_code(IFSC),account_name,email, andphone. Field rules are in Beneficiaries. - Create a quote with
quote_type: "WITHDRAWAL". - Accept the quote. Status updates use the regular transaction webhook.
INR deposits are a separate UPI collection. See INR UPI deposit.
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
Sender Of Record (CAD, GBP, EUR)
For CAD, GBP, and EUR payouts, the on_behalf_of customer is the sender of record, so the payout is filed under that customer rather than under your business. This requires the customer to have completed KYC: if they have not, the quote is rejected with 422 and "customer KYC is incomplete" instead of being sent under your business identity.
Complete the customer's onboarding (see Customer onboarding), then create the quote again. If on_behalf_of is omitted, your business remains the sender.
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 Interac security credentials become available, 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.