CNGN / USDC / USDT, withdraw crypto, or pay out to a Nigerian bank.
These are not the same as:
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: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.*
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=