Skip to main content
Nuvion supports payouts to bank accounts, mobile money wallets, stablecoin addresses, and other Nuvion accounts across 100+ currencies. All payouts follow the same three-step flow: create a counterparty, attach their payment routing details, then initiate the transfer.

Supported corridors


Transaction limits

Most currency and scheme combinations do not enforce fixed transaction limits. The schemes listed below do. Minimum and maximum are stated in main currency units for readability only; amount itself is always submitted in the smallest currency unit.
Counterparties and payment details are reusable. Create them once per recipient and reference the same IDs for all future transfers.

Step 1: Create a counterparty

A counterparty represents the recipient. Their identity (name, address, email) lives here, separate from their banking details. Use POST /counterparties.
Save the id. You’ll use it as counterparty_id throughout the remaining steps.
Counterparties also support type: "business". See the Counterparties guide for the full schema.

Step 2: Add payment details

Attach the counterparty’s banking or wallet routing information using POST /payment-details. The scheme is inferred automatically from currency and country for most rails; set scheme explicitly only when a currency supports multiple options (e.g. USD supports ach, wire, and rtp).

Base fields

string
required
The transfer method. One of bank-transfer, momo-transfer, stablecoin-transfer, or book-transfer.
string
required
ISO 4217 currency code. e.g. GBP, USD, EUR, KES.
string
required
Full legal name of the recipient account holder.
string
The ID of the entity on whose behalf the payout is being sent. Defaults to the authenticating entity when omitted. Required when acting on a child entity. See Managing child entities for details.
string
required
The ID of the recipient counterparty.
string
ISO 3166-1 alpha-2 destination country code. Required for all bank transfer rails and for mobile money. e.g. US, GB, DE.
object
Bank address.
string
The payment scheme. Required only when a currency supports multiple schemes. For USD, specify ach, wire, or rtp. For CAD, specify eft, interac_email, or interac_account. One of: fps, sepa, ach, wire, rtp, becs, eft, interac_email, interac_account, nip, rtc, fast, pesonet, insta_pay, hk_chats, uae_local, ke_eft, ug_eft, gh_eft, tz_eft, clabe, swift, mpesa, mtn, airtel, telkom, vodafone, vodacom, halotel, tigo, nuvion_direct.
string
Recipient’s email address. Required for the interac_email scheme.
object
Optional key-value metadata.

Rail-specific fields

Schemes available per currency:TZS: halotel, airtel, tigo, vodacomKES: mpesa, airtel, telkomGHS: mtn, vodafone, airtel

Request examples

Response

Save the id. Pass it as payment_detail_id when initiating the transfer.

Step 3: Initiate the transfer

For cross-currency payments, obtain an FX quote before initiating the transfer, then include fx_quote_id below. See Cross Currency Payouts for the full flow.
With payment details registered, initiate the payout. Use POST /transfers for bank and SWIFT rails, mobile money, and for stablecoin sends. Use specific payment type to specify the type of payment.

string
required
The ID of the source account to debit.
string
required
The id returned by POST /payment-details.
string
required
The ID of the recipient counterparty. Returned by POST /counterparties.
number
required
Amount in the smallest currency unit. 10000 = $100.00 USD or £100.00 GBP.
string
required
ISO 4217 currency code. e.g. GBP, USD, EUR, KES. This is the from_currency for cross-currency transfers. See Cross Currency Payouts.
string
required
Transfer description. Passed to the recipient’s bank statement where supported.
string
required
The payment type of the transfer. One of bank-transfer, momo-transfer, stablecoin-transfer, or book-transfer.
string
required
Idempotency key. Resubmitting the same reference returns the original transfer rather than creating a duplicate.
string
The ID of an FX quote from POST /fx-quotes. Required when the source account currency differs from the transfer currency. See Cross Currency Payouts.
string
Defaults to the authenticating entity when omitted. Required when acting on a child entity. See Managing child entities for details.
object
Optional key-value metadata.

Transfer statuses

All amounts are in the smallest currency unit. 10000 = $100.00 USD, £100.00 GBP, or ₦100.00 NGN.

Webhooks

Transfers are asynchronous: the response you get back from POST /transfers reflects the initial pending state, not the final outcome. Subscribe to outflows.created, outflows.completed, outflows.failed, and outflows.cancelled to track a transfer as it moves through the statuses above. See Event types for the full payload schema.
Verify the transfer’s status with GET /transfers/{transfer_id} before treating a payout as complete, rather than relying on the webhook payload alone. See Verifying webhook signatures to confirm the event itself is genuine.

What’s next

Counterparties

Full counterparty management: create, update, list, and deactivate.

Accept a payment

Receive funds into an account via bank transfer.

Transfers API reference

Full endpoint documentation for transfers.