Overview
LOCAL_BANK and LOCAL_MOMO let you settle to a local bank account or mobile money wallet in a supported corridor. Your payout is funded from your business USDC balance using a locked FX quote (quote → confirm).
Jump to:
- Supported corridors table (below)
- Payout quote
Supported corridors
19 destination countries are supported.LOCAL_BANK is available where we have local bank-transfer coverage; LOCAL_MOMO is available where the corridor has active mobile-money payout channels. Always confirm an amount with the quote endpoint before paying out — corridor and rail availability can change.
| Country | Currency | LOCAL_BANK | LOCAL_MOMO |
|---|---|---|---|
| Nigeria (NG) | NGN | Yes | — |
| Kenya (KE) | KES | Yes | Yes |
| South Africa (ZA) | ZAR | Yes | — |
| Tanzania (TZ) | TZS | Yes | Yes |
| Uganda (UG) | UGX | Yes | Yes |
| Rwanda (RW) | RWF | Yes | Yes |
| Malawi (MW) | MWK | Yes | Yes |
| Zambia (ZM) | ZMW | Yes | Yes |
| Botswana (BW) | BWP | Yes | Yes |
| Cameroon (CM) | XAF | Yes | Yes |
| Benin (BJ) | XOF | — | Yes |
| Burkina Faso (BF) | XOF | — | Yes |
| Côte d’Ivoire (CI) | XOF | — | Yes |
| Mali (ML) | XOF | — | Yes |
| Senegal (SN) | XOF | — | Yes |
| Togo (TG) | XOF | — | Yes |
| Gabon (GA) | XAF | — | Yes |
| Republic of the Congo (CG) | XAF | — | Yes |
| DR Congo (CD) | CDF | — | Yes |
The West Africa (XOF), additional Central Africa (XAF), and DR Congo (CDF) corridors are mobile-money only — pay out with
LOCAL_MOMO. Use GET /v1/business/payouts/networks?country=&rail=LOCAL_MOMO to list the available carriers/networks for the recipient before confirming.Recipient shapes per rail
You can pay out in one of two ways:- Saved recipient (3 calls): create a recipient with
POST /v1/business/payouts/recipients, then reference it byrecipientIdon every payout. Best when you pay the same payee repeatedly. - Inline recipient (2 calls): pass a
recipientobject directly onPOST /v1/business/payouts— no pre-created recipient needed. The inline recipient is sanctions-screened and saved to your recipient book automatically, so you can reuse it byrecipientIdlater.
recipientId or recipient on confirm. The inline recipient uses the same fields as the saved-recipient details object (shown below).
Get the network / bank list first
ForLOCAL_BANK and LOCAL_MOMO, you must select an opaque upstream network identifier using:
GET /v1/business/payouts/networks?country=NG&rail=LOCAL_BANK
That endpoint returns a list of supported banks or mobile-money networks for the corridor. Use the returned id as:
bankCodeforLOCAL_BANKnetworkIdforLOCAL_MOMO
POST /v1/business/payouts/recipients. Use label to identify the payee in your dashboard.
Local bank (LOCAL_BANK)
bankCode is the id returned by GET /v1/business/payouts/networks?country=NG&rail=LOCAL_BANK.Local mobile money (LOCAL_MOMO)
phoneNumber must be E.164 (e.g. +254712345678). networkId is the id returned by
GET /v1/business/payouts/networks?country=CM&rail=LOCAL_MOMO.Cross-currency quote → confirm flow
Local-rail payouts use a two-step flow to lock FX and fees:POST /v1/business/payouts/quotereturns a signedquoteToken(valid for 60 seconds).POST /v1/business/payoutsconfirms the payout by passingquoteTokenback, along with either a savedrecipientIdor an inlinerecipientobject.
Quote and confirm (Node + Python)
Single-call payout with an inline recipient
Skip the separate recipient-creation call by passing the recipient inline on confirm. Exactly one ofrecipientId or recipient is required. The inline recipient is sanctions-screened on submit and saved to your recipient book for reuse.
Quote-token error codes
These codes can be returned when confirming a payout (POST /v1/business/payouts) with a quoteToken:
INVALID_QUOTE_TOKEN: Token is malformed or signature validation failed.QUOTE_EXPIRED: Token is older than the 60-second TTL.QUOTE_BUSINESS_MISMATCH: Token was issued for a different business workspace.INSUFFICIENT_PAYOUT_LIQUIDITY: Liquidity is temporarily unavailable to settle the corridor.TREASURY_FROZEN: Payouts are temporarily disabled for treasury safety checks.PAYOUT_CORRIDOR_NOT_ENABLED: Your business is not enabled for this corridor.
NG bank-name resolve (Nigeria only)
To validate an NG NUBAN and resolve the account-holder name:POST /v1/business/payouts/resolve-account
Request:
This endpoint validates
country="NG" and rejects other countries. Mobile money has no equivalent “name resolve” API.Idempotency
idempotencyKey is required on POST /v1/business/payouts.
- Reusing the same key returns the original payout record for that key.
- Use a new key for every user-initiated payout attempt to avoid accidental deduping.
2FA threshold
The $10,000 USD-equivalent TOTP requirement applies only to interactive dashboard payouts. When a human initiates a payout at or above this amount from the Axra dashboard, a fresh TOTP code (twoFactorCode) is required, and a missing code returns 401 with code: "TWO_FACTOR_REQUIRED".
Server-to-server payouts (API key) are exempt from the 2FA gate. For programmatic payouts there is no interactive TOTP step at any amount — the controls are your secret API key, per-corridor velocity caps, and sanctions screening on every recipient. You never need to send
twoFactorCode from a server integration.Settlement webhooks
Local-rail payouts emit the same business payout events as other rails. Subscribe via Webhooks. Event types:payout.initiated— payout accepted and ledger-debited (statusCREATED).payout.submitted— dispatched to the payout provider (statusSUBMITTED).payout.settled— funds delivered to the recipient (statusSETTLED).payout.failed— dispatch or settlement failed; the debit is reversed (statusFAILED).payout.cancelled— aCREATEDpayout was cancelled before dispatch (statusCANCELLED).payout.review— payout held for compliance/admin review (statusPENDING_REVIEW).
data.object of each event is the same shape as GET /v1/business/payouts/{id}.
Fee model
Merchants see only the aggregated total viaGET /v1/business/psp-pricing. Rates are set per-merchant (your SLA), and the quote response includes the total Axra fee for the corridor.
Confirm payout (raw API)
After quoting, confirm with either a savedrecipientId or an inline recipient object (exactly one).
Saved recipient:
Full integration guides and webhook event reference will be expanded in a later docs release. For OpenAPI field-level detail, see the API Reference tab.
