Finding your virtual account
ThevirtualAccount object is included in the wallet creation response and in any subsequent GET /api/wallets/:walletId call.
Example virtualAccount object
Funding flow
Here’s what happens end-to-end when you top up a wallet:- Get the account number — read
virtualAccount.accountNumberfrom the wallet object. - Initiate a bank transfer — send NGN to that account number from any Nigerian bank (mobile app, internet banking, USSD, etc.).
- Provider fires a webhook — once the payment clears, the banking provider calls Axis at
POST /api/webhookswith acharge.successevent. - Axis credits the wallet — Axis matches the payment to the correct wallet via the
account_reference, credits the balance, and creates aLedgerEntryof typetopup. - Balance increases —
GET /api/wallets/:walletIdwill reflect the new balance on the next poll.
In the current version, virtual accounts are mocked for hackathon demo purposes — no real bank transfer is required. The system is architected to integrate with Monnify Reserved Accounts or Korapay in production. The webhook schema is already defined and aligned with Korapay
charge.success events, so the switch to live funding is a configuration change only.Polling for balance updates
Axis does not currently expose a WebSocket for real-time balance events. To reflect a top-up in your UI as soon as it lands, pollGET /api/wallets/:walletId on a short interval. The example below shows a reusable React hook that polls every 1.5 seconds and stops automatically when the component unmounts.