Overview

A virtual account is a dedicated Nigerian bank account number tied to one of your customers. Money paid into it credits your NGN balance.

All amounts are in major units — naira, not kobo. A balance of 1000 means one thousand naira.


Customer Requirements

Use Case

Read this before calling Create Virtual Account. An incomplete customer record is the most common reason the request fails.

We are required to verify the identity behind every naira account, so the customer must already carry all of the following:

1
first_namestringRequired

Customer's legal first name. Combined with last_name to form the account_name a payer sees when confirming a transfer.

2
last_namestringRequired

Customer's legal surname. Must match the name held against the BVN, or verification fails.

3
emailstringRequired

A valid, unique email address for the customer. Used to identify them on your account and for any notifications.

4
phone_numberstringRequired

The customer's active phone number. Send the subscriber number and set dial_code alongside it, for example '8012345678' with '+234'. The forms '08012345678' and '+2348012345678' are also accepted, but the number is stored exactly as you send it and dial_code is never inferred from it, so set dial_code yourself if you want it recorded. A customer created without a phone number is accepted, but cannot be issued an account until you add one.

5
date_of_birthstringRequired

Date of birth as an ISO date, for example '1994-03-21'. The customer must be 18 or over, and it is checked against the BVN record.

6
id_typestringRequired

The kind of identity document supplied. Must be 'bvn' for a Nigerian virtual account; no other value is accepted.

7
id_numberstringRequired

The customer's 11 digit Bank Verification Number. Checked against the national registry when the account is created, so a BVN that does not match the name and date of birth is rejected.

The BVN lives on the customer

Set id_type and id_number when you create the customer, or patch an existing one.

Customer Record

When the customer is incomplete

You get one error naming every missing field at once, so you can fix them in a single pass. The fields named are on the customer record, not on the request you sent.

Incomplete Customer

Create Virtual Account

Use Case

Issues a dedicated Nigerian bank account number for one of your customers. Deposits into it credit your NGN balance. Returns 201 Created.

Base URL

Create Virtual Account Request Body
1
referencestringRequired

A unique, client-generated identifier for this account. Acts as the idempotency key: retrying with a reference you have already used returns the existing account rather than issuing a second one.

2
currencystringRequired

Currency the account should collect in. 'NGN' is the only accepted value today — call Supported Currencies for the live list.

3
customer_iduuidRequired

The customer this account is issued to. Must already carry a BVN, date of birth and contact details, or the request fails naming the missing fields.

4
account_aliasstringNot Required

Display name for the account in your own systems. Defaults to the customer's account name when omitted, and can be changed later with Update Account Alias.

Request Body

Create Virtual Account Response
1
iduuid

Bitnob's identifier for the virtual account. This is the :id you pass to every other endpoint in this section, so persist it against your customer record.

2
company_iduuid

The company the account was issued under. Derived from the API key you authenticated with, not from anything you send.

3
account_numberstring

The Nigerian bank account number your customer pays into. Show it alongside bank_name; together they are all a payer needs to send a transfer.

4
account_namestring

The name the account resolves to on the banking network. Taken from the customer's first and last name, so it is what a payer sees when they confirm the transfer.

5
bank_namestring

The bank holding the account, for example 'Sandbox Bank'. Assigned by us at creation; you cannot choose it, and it may differ between accounts.

6
referencestring

The reference you supplied on the request, echoed back. Use it to match the account to your own record without storing the Bitnob id first.

7
customer_iduuid

The customer this account was issued to. One customer can hold more than one account, so do not assume it is unique across the list.

8
currencystring

Currency the account collects in. Always 'NGN' today — see Supported Currencies for the live list.

9
statusstring

Whether the account can currently receive money. 'active' means it is live and payable.

10
account_aliasstring

Display name for your own dashboards. Defaults to the account name when you do not supply one, and is the only field Update Account Alias changes.

11
account_typestring

Mirrors the customer's type, for example 'individual'. Set from the customer record rather than the account request.

12
created_atstring

ISO 8601 timestamp of when the account was issued, in UTC.

13
updated_atstring

ISO 8601 timestamp of the last change. Equal to created_at until something changes it, such as an alias update.

Create Virtual Account - Response

List Virtual Accounts

Use Case

Returns the virtual accounts issued under your company.

Base URL

List Virtual Accounts Response
1
page_info.has_next_pageboolean

Whether another page of accounts follows this one. Use it to decide whether to request the next page rather than counting results yourself.

2
page_info.has_previous_pageboolean

Whether a page precedes this one. False on the first page.

3
page_info.totalinteger

Total number of accounts your company holds, across every page rather than just this one.

Same account fields as Create

Each entry in virtual_accounts has the same shape as the account returned by Create Virtual Account — see that section for what every field means.

List Virtual Accounts - Response

Get Virtual Account

Use Case

Fetches a single virtual account by its id.

Base URL

Get Virtual Account Response
Same account fields as Create

Returns a single virtual_account object with the same shape as Create Virtual Account — see that section for what every field means.

Get Virtual Account - Response

Get Account Transactions

Use Case

Lists the deposits paid into a given virtual account.

Base URL

Get Account Transactions Response
1
iduuid

Bitnob's identifier for this single deposit. Store it against your own record if you need to look the transaction up again later.

2
virtual_account_iduuid

The account the money was paid into. Matches the :id on the request path, so you can attribute the deposit to the customer that account belongs to.

3
provider_transaction_idstring

The banking provider's own reference for the transfer. Quote this when raising a query with support, since it is the identifier the bank recognises.

4
ledger_transaction_iduuid

The matching entry on your Bitnob ledger. Use it to tie this deposit to the corresponding balance movement when you reconcile.

5
amountstring

Amount received, in naira and as a string rather than a number. '100000' is one hundred thousand naira, not one thousand — naira is never expressed in kobo.

6
currencystring

Currency of the deposit. Always 'NGN' today, since NGN is the only currency virtual accounts support.

7
typestring

Direction of the movement. 'credit' for money paid into the account.

8
statusstring

Where the deposit sits in its lifecycle. 'completed' means it has settled and your balance has already moved.

9
referencestring

Bitnob's own reference for the deposit, for example 'sbx-dep-3f8a2c14…'. This is not the reference you chose when creating the account.

10
metadatastring

Any extra data attached to the transaction, JSON-encoded as a string rather than returned as an object. Parse it before use; it is '{}' when empty.

11
totalinteger

Total transactions on the account, returned alongside 'limit' and 'offset'. Note this endpoint returns a flat count, unlike List Virtual Accounts which nests paging inside a page_info object.

Get Account Transactions - Response

Update Account Alias

Use Case

Changes the display name on an account. It does not affect the account number or the underlying customer.

Base URL

Update Account Alias Request Body
1
account_aliasstringRequired

The new display name for the account. Only this field and updated_at change; the account number, bank and customer are untouched.

Request Body

Update Account Alias Response
Same account fields as Create

The full account is returned with the same shape as Create Virtual Account. Only account_alias and updated_at change.

Update Account Alias - Response

Supported Currencies

Use Case

Returns the currencies you can issue virtual accounts in. Currently NGN only.

Base URL

Supported Currencies Response
1
currenciesarray

The currency codes you can currently issue virtual accounts in.

2
totalinteger

How many currencies are supported, returned alongside limit and offset.

Supported Currencies - Response

Simulate Deposit

Use Case

Fakes an inbound transfer in sandbox so you can test the deposit flow without moving real money.

Sandbox only

This endpoint is rejected in production.

The deposit amount is fixed

No request body is needed. Each call credits 100000 regardless of any amount you send, so repeated calls step the balance up in units of 100000.

Base URL

Simulate Deposit Response
1
new_balancestring

The account's balance after the simulated deposit, in naira as a string. Each call adds 100000, so repeated calls step it up predictably.

Same transaction fields as Get Account Transactions

transaction has the same shape as an entry in Get Account Transactions — see that section for what every field means.

Simulate Deposit - Response
Did you find this page useful?

Join our Discord