Skip to main content
POST
Create a virtual account

Authorizations

Authorization
string
header
required

Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.

Scopes

virtual_accounts:write

Headers

X-Account-Id
string

Connected account to create the virtual account for. Omit to create one for the account that owns the API key.

Body

application/json
currency
string
required

Three-letter ISO 4217 code for the money the account accepts, e.g. NGN. NGN is the only currency issued today; any other value is rejected with VIRTUAL_ACCOUNT_CURRENCY_NOT_SUPPORTED. There is no default, because the currency decides what the number can receive.

Required string length: 3
Example:

"NGN"

bank_code
enum<string>

The bank to hold the number: 103 (Globus Bank), 090645 (Nombank MFB) or 110072 (Bank78 MFB). Leave it out, or send an empty string, and we pick a bank, trying another if the first is down. A bank you pick is never swapped: if it can't make the number, you get an error. Only used the first time. A number you already have keeps its bank.

Available options:
103,
090645,
110072
Example:

"090645"

Response

Virtual account created, or the existing virtual account for the requested currency.

A fixed bank account number belonging to your platform or a connected account. It does not expire and can receive deposits at any time.

id
string
required

Unique identifier for the virtual account, prefixed va_. It appears at payment_method_details.bank_transfer.virtual_account.id on each payment received through this account.

Example:

"va_8Hs2kQ4mZpXv"

currency
string
required

Three-letter ISO 4217 code for the money this account accepts, e.g. NGN. Money sent in any other currency cannot reach it.

Example:

"NGN"

account_number
string
required

The account number the sender enters in their banking app. Show it with bank_name so the sender can select the correct destination.

Example:

"9902847361"

bank_name
string
required

The bank that issued the number, as the sender sees it in their banking app. Read it from this field rather than storing one name, because accounts created later can be issued by a different bank.

Example:

"Globus Bank"

status
enum<string>
required

Whether the virtual account is in use. active: the number appears in reads and accepts deposits. inactive: the number no longer appears in reads, but deposits sent to it are still received.

Available options:
active,
inactive
Example:

"active"

created_at
string<date-time>
required

ISO 8601 timestamp of when the account number was issued.

Example:

"2026-09-22T09:14:02.000Z"

account_name
string | null

The name a sender sees on the account in their banking app: the account's business name. Show it beside account_number and bank_name so senders can confirm they have the right account. null only on some accounts issued before October 2026.

Example:

"Ada Stores"

bank_code
string | null

The code of the bank that holds the number, from the same list you send as bank_code: 103, 090645 or 110072. Older numbers may still hold the issuing provider's own code, or null.

Example:

"090645"