Create Virtual Account
Creates a new virtual account for the resolved customer-or-owner and
currency. Pass customerId to mint the VA for a specific end-user;
omit it to mint one for the business owner.
Subject to a per-(business, customer, currency) limit. Requests that
would exceed the limit return VIRTUAL_ACCOUNT_LIMIT_REACHED.
Label vs amount: label groups static virtual accounts by
purpose (e.g. SALES, OPERATIONS). It is mutually exclusive
with amount, which routes to a dynamic (ephemeral) virtual
account. Supplying both is rejected at validation.
customerId to mint the virtual account for a specific end-user, or omit it to mint one for the business owner.
Important: Virtual accounts are only active in production and do not work on staging/dev.
Static vs dynamic virtual accounts
You choose between two flavours of virtual account by what you pass alongsidecurrency and customerId.
Static (label)
Pass alabel to group static virtual accounts by purpose. Static accounts are permanently assigned to the customer and never expire. The same account number remains valid for repeated funding.
Allowed labels: SALES, OPERATIONS, PAYROLL, COLLECTIONS, VENDOR_PAYMENTS, TAX, REFUNDS, MARKETING, TREASURY, GENERAL.
Use static accounts when you want stable, long-lived account numbers a customer can top up over time, organised by purpose.
Dynamic (amount)
Pass anamount to mint a dynamic (ephemeral) virtual account tied to that specific amount. Dynamic accounts expire after a short window.
Use dynamic accounts when you need to collect a specific, known amount within a defined window, like a one-time payment for a particular order.
BVN requirement for NGN static virtual accounts
For NGN static virtual accounts (label-based, Nigeria), the customer must have a Bank Verification Number (BVN) on file. This is a regulatory requirement for permanently assigned accounts in Nigeria. If the BVN is missing, the API returns an error. You can supply a BVN when creating a new customer or add it to an existing customer at any time using the Update Customer KYC endpoint.Limits
Creation is subject to a per-(business, customer, currency) cap. Requests that would exceed the cap returnVIRTUAL_ACCOUNT_LIMIT_REACHED with 400. Call List Virtual Accounts first to check what already exists for the customer.Authorizations
Static business API key issued from the dashboard. A business can provision multiple API keys, each scoped to a configurable set of permissions (e.g. read transactions, create deposits, etc). Permissions are chosen per key at creation time in the dashboard and may be revoked by deleting the key. Requests made with a key that does not include the permission required by the target endpoint will be rejected with a 403 Forbidden response; an unrecognised, malformed or revoked key returns 401 Unauthorized. Manage your keys and their permissions under Developer → API keys in the dashboard.
Headers
API version in ISO 8601 format (e.g. 2025-12-28). Defaults to latest stable.
Body
The 3-letter ISO 4217 currency code for the virtual account.
USD, NGN, GBP, EUR Optional customer ID. When supplied, the VA is created for that customer. When omitted, it is created for the business owner.
Optional amount for a dynamic (ephemeral) virtual
account. Mutually exclusive with label.
0 <= x <= 5000000Optional label that groups static virtual accounts by
purpose. Mutually exclusive with amount.
SALES, OPERATIONS, PAYROLL, COLLECTIONS, VENDOR_PAYMENTS, TAX, REFUNDS, MARKETING, TREASURY, GENERAL Response
Virtual account created successfully.
A payment method. Empty fields are omitted. Account-shaped channels (BANK_ACCOUNT, MOBILE_MONEY, SWIFT, etc.) populate accountName, accountNumber, and institution; the CARD channel instead populates last4, brand, expiration, and cardName.
