Skip to main content
Each wallet is automatically assigned a dedicated virtual bank account at creation time. To add funds, send money to that account number via any Nigerian bank transfer. Axis detects the incoming payment via a webhook from the banking provider and credits the wallet’s balance — no manual reconciliation required.

Finding your virtual account

The virtualAccount 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:
  1. Get the account number — read virtualAccount.accountNumber from the wallet object.
  2. Initiate a bank transfer — send NGN to that account number from any Nigerian bank (mobile app, internet banking, USSD, etc.).
  3. Provider fires a webhook — once the payment clears, the banking provider calls Axis at POST /api/webhooks with a charge.success event.
  4. Axis credits the wallet — Axis matches the payment to the correct wallet via the account_reference, credits the balance, and creates a LedgerEntry of type topup.
  5. Balance increasesGET /api/wallets/:walletId will 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, poll GET /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.