1
Create a customer
Before issuing a virtual bank account, you need a customer record. The customer ties the account to a real person and is required for permanent accounts.The response contains the new customer’s
cURL
Node.js
id, which you’ll use in the next step.2
Choose an account type
Dubu Pay offers two virtual bank account types. Pick the one that fits your use case:
Temporary onramps require you to pass an
amount when creating the account. The rate is locked at that moment so the customer always knows exactly how much to send.3
Issue a virtual bank account
Call The response includes the Settlement modes:
POST /payments/onramps to create the virtual bank account. You can also use POST /customers/:id/ngn-virtual-account if you want the account linked directly to a specific customer record.virtual_account object with the bank account details to show your customer.INTERNAL_BALANCE— converted USDT is credited to your merchant balance or the customer’s internal ledgerONCHAIN— converted USDT is sent directly to thedestination_addressyou provide
USDT, USDCSupported chains for onchain settlement: APTOS, BASE, CELO, ETHEREUM, POLYGON, SOLANA, TRON4
Share the account details with your payer
Present the
virtual_account fields to your customer in your UI or payment flow:- Bank name:
Wema Bank - Account number:
9901234567 - Account name:
Dubu Pay / Amara Okafor - Amount to send: ₦5,000 (for temporary accounts)
- Expiry: 25 minutes from creation (for temporary accounts)
5
Detect the deposit
You have two options for detecting when a payment arrives:Option A — Webhooks (recommended)Register a webhook endpoint to receive real-time
deposit.* events. See the Webhooks guide for setup instructions. The events you’ll receive are:Option B — PollingPoll
GET /payments/deposits filtered by the onramp ID:Prefer webhooks over polling in production. Polling introduces latency and adds unnecessary API calls.
6
Check deposit status
Fetch a specific deposit by ID to get the full status and settlement details:Deposit status lifecycle:Only take action (e.g., credit your customer’s account or fulfil an order) when the status is
SETTLED.Testing in sandbox
Use the sandbox endpoint to simulate a deposit without sending real funds:"should_flag": true to simulate a flagged deposit instead of a settled one.