Virtual bank accounts are the primary way your customers pay you in Nigerian Naira through Dubu Pay. When a customer sends a bank transfer to the account number you provide, Dubu Pay detects the deposit, converts it to USDT (or credits your internal balance), and notifies your server via webhook. This guide walks you through every step: creating a customer, choosing the right account type, issuing the account, sharing the details, and confirming the payment.Documentation Index
Fetch the complete documentation index at: https://docs.dubupay.com/llms.txt
Use this file to discover all available pages before exploring further.
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.Choose an account type
Dubu Pay offers two virtual bank account types. Pick the one that fits your use case:
| Type | TTL | Rate | When to use |
|---|---|---|---|
TEMPORARY | 25 minutes | Locked at creation | One-off payments with a known amount |
PERMANENT | No expiry | Floating | Recurring top-ups, wallets, long-lived accounts |
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.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, TRONShare 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)
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
Option B — PollingPoll
deposit.* events. See the Webhooks guide for setup instructions. The events you’ll receive are:| Event | Meaning |
|---|---|
deposit.received | NGN transfer received; FX conversion in progress |
deposit.pending_withdrawal | FX complete; USDT being sent to destination |
deposit.settled | USDT delivered; settlement complete |
deposit.failed | Something went wrong |
deposit.flagged | Deposit held for compliance review |
GET /payments/deposits filtered by the onramp ID:Prefer webhooks over polling in production. Polling introduces latency and adds unnecessary API calls.
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.