If you’d rather not choose — or want all three on one page — use payment links and let the payer pick.
Mobile money charge
You know the payer’s number and the amount. You ask; they approve on their phone.pending while the prompt sits on their phone; it becomes completed (balance credited, collection.completed fires) or failed (declined, timed out, wallet error — collection.failed). A timeout is normal: people put their phone down. Let them retry.
Virtual account
A real bank account number that belongs to your organization. Give it to a customer; whatever they transfer credits your balance.externalReference is yours, so you can tell later whose money arrived. Each inbound transfer fires account.credited and shows up as a collection. Pause an account with PATCH … { "status": "paused" }.
This is the rail that makes Nigeria work, and the one to reach for whenever the payer, not you, decides the amount.
Crypto address
A deposit address for one asset on one chain.GET /v1/capabilities → deposits (testnets on sandbox).
Tell your customer the asset and the chain. USDC sent on the wrong network to a Solana address is gone.
Funding your own balance
The same two mechanisms are how you top up in production: create a virtual account or a crypto address in your own name and transfer to it — or use Add funds in the dashboard, which does exactly that.What “received” means
All three end the same way: a ledger credit on your balance (available rises), an account.credited webhook, and a row in GET /v1/transactions. Reconcile on externalReference where you set one, or on the virtual account / address id where the payer chose the amount.