Skip to main content
RemitFlex cNGN APIs move Naira and cNGN for a customer: permanent bank deposit account, one-time payins, convert between CNGN / USDC / USDT, withdraw crypto, or pay out to a Nigerian bank. These are not the same as:
Use local fiat for one-off bank payouts/deposits from your treasury. Use cNGN when the customer needs a linked wallet, permanent VA, or on-wallet CNGN/USDC/USDT converts.
Prerequisite: Enable cNGN for the customer with BVN (dashboard Customers → cNGN, or API below). That creates the Smart Wallet and deposit account.

Enable cNGN

Replace {customerId} with the RemitFlex customer UUID from POST or GET /customers (not a wallet address or StRails id).
Enablement is asynchronous. When KYC finishes, RemitFlex emits cngn.customer.enabled (or cngn.customer.failed). The customer object includes cngn: { enabled, identityMatched, status, legalName, evmWallet, virtualAccount, syncedAt } — null when cNGN has never been started. Create the customer with the BVN holder’s full legal name (first and last). On sync, RemitFlex stores the full StRails /getuserdetails profile, but only exposes legal name / VA / wallet when that KYC name matches customer.name under a strict multi-part name check (blocks BVN fishing). Single given names are not enough. On mismatch, identityMatched is false, enabled is false, PII fields are null, and RemitFlex emits cngn.customer.failed once with code: customer_name_bvn_mismatch / reason: Customer name does not match BVN holder. Until identity is verified (identityMatched: true), PII stays hidden. Reload the customer with GET /v1/customers/{customerId}, or subscribe to webhooks. Once enabled: Required scopes: api:read, api:write

Permanent vs temporary virtual accounts

Permanent credits create local cngn_deposit rows (email + cngn.deposit.* webhooks). List with GET /v1/cngn/deposits (optional ?customerId=).

Temporary payin (NGN → Smart Wallet)

If auto-sweep stalls, funds can remain on the temporary wallet. Check GET /v1/cngn/payins/{payinId} → sweep ({payinId} is the RemitFlex payin UUID from POST /cngn/payins), then:
Until a bank accountNumber exists, status stays requested. RemitFlex sets va_created only when an account number is present. Payins appear in Transactions as cngn_payin. List payins for one customer:

Convert (cNGN ↔ USDC/USDT)

List: GET /v1/cngn/converts (optional ?customerId=). Get: GET /v1/cngn/converts/{convertId} ({convertId} is the RemitFlex convert UUID).

Withdrawal

Send tokens from the customer’s Smart Wallet to an external address:
customerId is required. List: GET /v1/cngn/withdrawals?customerId=...

Banks & account resolution

List banks and verify account names before payout:
Returns 422 when the account cannot be verified or the bank is not supported. bankCode on payouts must come from GET /v1/cngn/banks.

Payout (cNGN → NGN bank)

customerId is required. amount is in Naira. Minimum payout is ₦151. List: GET /v1/cngn/payouts?customerId=...

Status, email, and webhooks

Money events are stored locally. On create/update RemitFlex:
  • Emails the linked customer (and org owner when applicable)
  • Emits merchant webhooks: cngn.deposit.*, cngn.payin.*, cngn.convert.*, cngn.withdrawal.*, cngn.payout.*
Customer enablement emits cngn.customer.enabled / cngn.customer.failed when BVN KYC finishes. Open payins / converts / payouts / withdrawals also refresh on read (GET /v1/cngn/payins/{payinId}, /converts/{convertId}, /payouts/{payoutId}, /withdrawals/{withdrawalId}, /deposits/{depositId}) and via background sync. All of the above appear in Transactions (cngn_deposit, cngn_payin, cngn_convert, cngn_withdrawal, cngn_payout).

Balances vs transactions

All cNGN money lists accept optional customerId — RemitFlex is customer-first; filter when reconciling a single counterparty:
  • GET /v1/cngn/payins?customerId=
  • GET /v1/cngn/deposits?customerId=
  • GET /v1/cngn/converts?customerId=
  • GET /v1/cngn/withdrawals?customerId=
  • GET /v1/cngn/payouts?customerId=