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

DestinationCurrencySchemeMethodSettlement
United KingdomGBPFPSBank transferSame day
Euro zoneEURSEPABank transferSame day
United StatesUSDACHBank transferSame / next day
United StatesUSDWireBank transferSame day
AustraliaAUDBECSBank transfer1–2 business days
CanadaCADEFTBank transferSame / next day
NigeriaNGNNIPBank transferInstant
South AfricaZARRTCBank transferSame day
SingaporeSGDFASTBank transferInstant
Hong KongHKDHK FPSBank transferInstant
United Arab EmiratesAEDUAE LocalBank transferSame / next day
KenyaKESEFTBank transferSame day
UgandaUGXEFTBank transferSame day
GhanaGHSEFTBank transferSame day
TanzaniaTZSEFTBank transferSame day
BrazilBRLTEDBank transferSame day
MexicoMXNSPEIBank transferInstant
ChinaCNYLocalBank transferSame day
CEMAC zoneXAFCEMACBank transfer1–2 business days
GlobalAnySWIFT (IBAN)Bank transfer1–3 business days
GlobalAnySWIFT (Acct No.)Bank transfer1–3 business days
MultipleKES / GHS / UGX / TZSMobile moneyMoMo transferInstant
MultipleUSC / USTStablecoinStablecoin transferNear-instant
MultipleAnyNuvion DirectBook transferInstant
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.
curl -X POST https://api.nuvion.dev/counterparties \
  -H "Authorization: Bearer $NUVION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "individual",
    "entity_id": "01KBCFY3VB1XT0MC8VMZXME6RS",
    "profile": {
      "first_name": "Jane",
      "last_name": "Smith",
      "relationship": "vendor",
      "email": "jane.smith@example.com",
      "address": {
        "line1": "123 Main St",
        "city": "Austin",
        "state_or_province": "TX",
        "postal_code": "78701",
        "country": "US"
      }
    }
  }'
{
  "id": "01KM37EZ0AYCVDXJ3WDHXPPSZ9",
  "entity_id": "01KBCFY3VB1XT0MC8VMZXME6RS",
  "type": "individual",
  "nickname": "Jane Smith",
  "status": "active",
  "profile": {
    "first_name": "Jane",
    "last_name": "Smith",
    "relationship": "vendor",
    "email": "jane.smith@example.com",
    "address": {
      "line1": "123 Main St",
      "city": "Austin",
      "state_or_province": "TX",
      "postal_code": "78701",
      "country": "US"
    }
  },
  "meta": {},
  "created": 1735725600000,
  "updated": 1735725600000
}
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 /counterparties/{counterparty_id}/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 both ach and wire).

Base fields

payment_method
string
required
The transfer method. One of bank-transfer, momo-transfer, stablecoin-transfer, or book-transfer.
currency
string
required
ISO 4217 currency code. e.g. GBP, USD, EUR, KES.
account_holder_name
string
required
Full legal name of the recipient account holder.
entity_id
string
required
The ID of the entity on whose behalf the payout is being sent.
country
string
ISO 3166-1 alpha-2 destination country code. Required for all bank transfer rails. e.g. US, GB, DE.
scheme
string
The payment scheme. Required only when a currency supports multiple schemes. For USD, specify ach or wire. One of: fps, sepa, ach, wire, becs, eft, nip, rtc, fast, hk_fps, uae_local, ke_eft, ug_eft, gh_eft, tz_eft, br_ted, mx_spei, cn_local, cemac, swift, mpesa, mtn, airtel, orange, wave, tigo, nuvion_direct.
meta
object
Optional key-value metadata.

Request examples

curl -X POST https://api.nuvion.dev/counterparties/01KM37EZ0AYCVDXJ3WDHXPPSZ9/payment-details \
  -H "Authorization: Bearer $NUVION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payment_method": "bank-transfer",
    "currency": "GBP",
    "country": "GB",
    "account_holder_name": "Jane Smith",
    "entity_id": "01KBCFY3VB1XT0MC8VMZXME6RS",
    "sort_code": "040004",
    "account_number": "12345678"
  }'

Rail-specific fields

RailCurrencyCountryRequired routing fields
FPSGBPGBsort_code, account_number
SEPAEUREU countryiban
ACHUSDUSscheme: ach, routing_number, account_number, bank_name
WireUSDUSscheme: wire, routing_number, account_number, bank_name
BECSAUDAUbank_code, branch_code, account_number
EFTCADCAbank_institution_number (3 digits), transit_number (5 digits), account_number, bank_name
NIPNGNNGbank_code, account_number
RTCZARZAaccount_number, branch_code
FASTSGDSGswift_bic, account_number
HK FPSHKDHKbank_code, account_number, branch_code
UAE LocalAEDAEiban (23 characters)
KE EFTKESKEsort_code (5 digits), account_number
UG EFTUGXUGsort_code (6 digits), account_number
GH EFTGHSGHsort_code, account_number
TZ EFTTZSTZsort_code, account_number
BR TEDBRLBRbank_code, account_number, branch_code, account_type
MX SPEIMXNMXaccount_number (18-digit CLABE)
CN LocalCNYCNbank_code, account_number
CEMACXAFCM / CF / TD / CG / GQ / GAaccount_number (23 characters)
SWIFT (IBAN)AnyAnyswift_bic, iban, bank_name
SWIFT (Acct No.)AnyAnyswift_bic, account_number, bank_name
Mobile moneyKES / GHS / UGX / TZSscheme (mpesa / mtn / airtel / orange / wave / tigo), phone_number
StablecoinUSC / USTblockchain_network (ETH_MAINNET / SOLANA_MAINNET / BASE_MAINNET / POLYGON_MAINNET), wallet_address
Book transferAnyAnyaccount_number
For mobile money, country is not required — Nuvion infers the destination from currency and scheme.

Response

{
  "id": "pd_01KM37FAABC123DEF456GHI789",
  "payment_method": "bank-transfer",
  "currency": "GBP",
  "country": "GB",
  "scheme": "fps",
  "account_holder_name": "Jane Smith",
  "sort_code": "040004",
  "account_number": "12345678",
  "counterparty_id": "01KM37EZ0AYCVDXJ3WDHXPPSZ9",
  "entity_id": "01KBCFY3VB1XT0MC8VMZXME6RS"
}
Save the id — pass it as payment_detail_id when initiating the transfer.

Step 3: Initiate the transfer

With payment details registered, initiate the payout. Use POST /bank-transfers for bank and SWIFT rails, POST /momo-transfers for mobile money, and POST /stablecoin-transfers for stablecoin sends.
curl -X POST https://api.nuvion.dev/bank-transfers \
  -H "Authorization: Bearer $NUVION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": "acc_01HXYZ5678EFGH",
    "payment_detail_id": "pd_01KM37FAABC123DEF456GHI789",
    "amount": 10000,
    "narration": "Invoice payment INV-2025-001",
    "unique_reference": "PAY-2025-001"
  }'
account_id
string
required
The ID of the source account to debit.
payment_detail_id
string
required
The id returned by POST /counterparties/{counterparty_id}/payment-details.
amount
number
required
Amount in the smallest currency unit. 10000 = $100.00 USD or £100.00 GBP.
narration
string
required
Transfer description. Passed to the recipient’s bank statement where supported.
unique_reference
string
required
Idempotency key. Resubmitting the same reference returns the original transfer rather than creating a duplicate.
meta
object
Optional key-value metadata.
{
  "id": "txf_01HJ5G6R7MXW5ZK2QD6YA8N9F3",
  "account_id": "acc_01HXYZ5678EFGH",
  "entity_id": "01KBCFY3VB1XT0MC8VMZXME6RS",
  "payment_detail_id": "pd_01KM37FAABC123DEF456GHI789",
  "type": "outflow",
  "currency": "GBP",
  "amount": 10000,
  "applicable_fee": 50,
  "status": "pending",
  "status_reason": "awaiting_processing",
  "narration": "Invoice payment INV-2025-001",
  "unique_reference": "PAY-2025-001",
  "meta": {},
  "created": 1735725600000,
  "updated": 1735725600000
}

Transfer statuses

StatusDescription
pendingTransfer created, awaiting processing
processingBeing executed by the payment network
completedSuccessfully delivered to the recipient
failedTransfer could not be completed
reversedTransfer was reversed after completion
All amounts are in the smallest currency unit. 10000 = $100.00 USD, £100.00 GBP, or ₦10,000 NGN.

Webhooks

Listen for transfers.updated to track status changes in real time. Nuvion fires this event each time a transfer moves to a new status.

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.