Skip to main content
After Nigeria onboarding is active, the wallet holds CNGN and money moves in two directions: in through a Nigerian virtual account, and out to any Nigerian bank account.

Deposits (NGN in)

Incoming NGN bank transfers land on a virtual account and are credited to the smart wallet as CNGN. The virtual account itself is created during Nigeria onboardingPOST /onboarding/start-nigeria is what issues it. This call points its deposits at a smart wallet:
The bank account must belong to the calling user, who must be an active admin of the wallet. Read the account details back — the number the user actually transfers to — with:
To stop routing deposits to this wallet, DELETE the same onramp/vba/nigeria path.

Withdrawals (NGN / USD → Nigerian bank)

Three calls, in order. Do not skip the verify step — it is what gives you the exact account holder name the registration call requires.

1. Look up the bank code

Returns every supported bank with its name and CBN code. Use both verbatim in the next two calls.

2. Verify the account number

Returns the registered account holder name. A 404 means no account matches that number and bank code — surface it and let the user correct the number rather than pushing on.

3. Register the withdrawal account

Get-or-create: calling it again with the same account returns the existing record instead of duplicating it. The response carries the id you pass as bankAccountId below.

4. Create the offramp

Source currency can be CNGN (sent directly) or USDB (auto-swapped to NGN first). The caller must be an active admin of the smart wallet. This returns a proposal, not a completed payout:

5. Sign the proposal

status moves PENDING_APPROVALSPENDING_SIGNATURES once the approval threshold is met, then COMPLETED after the on-chain execution and the off-chain payout both succeed.
Sign the EIP-712 payload with the wallet owner key via bmoni_embedded_sdk — the same key registered as userOwnerAddress at wallet creation — and submit the hex signature. Poll GET …/proposals/{proposalId} for the terminal status.
The signature must come from the registered owner key. Reuse the same SDK instance you used for initWallet / walletAddress, or the recovered signer will not match the proposal’s signer snapshot.