πŸ“£ New Region Unlocked: You can now send payouts directly to Malawi! πŸ‡²πŸ‡Ό
Virtual Accounts
Static Virtual Account

Create Static Virtual Account

The Static Virtual Account endpoint allows merchants to create a permanent, reusable virtual account number for their customers to enable them to carry out transactions.


Requirements

To use this endpoint, ensure that:

  • Your API key is active and IP whitelisting is correctly configured.
  • The user has a valid Bank Verification Number (BVN).
  • You provide a unique reference value for each creation request to ensure idempotency.

Endpoint

POST /v1/virtual-account


Headers

HeaderTypeDescriptionRequired
Content-TypeStringMust be application/json.βœ… Yes
x-api-keyStringYour API key for authentication.βœ… Yes

Supported Currencies for Virtual Account

S/NCountryCountry CodeCurrency
1Nigeria πŸ‡³πŸ‡¬NGNGN
2Malawi πŸ‡²πŸ‡ΌMWMWK
πŸ’‘

You can change the currency and country values in your request to match any of the supported options.

Sample Request

curl --location '({{baseURL}}/v1/virtual-account)' \
--header 'Content-Type: application/json' \
--header 'x-api-key: YOUR_API_KEY_HERE' \
--data-raw '{
    "currency": "NGN",
    "country": "NG",
    "firstName": "Jumoke",
    "lastName": "Dumebi",
    "email": "example@email.com",
    "phoneNumber": "+23481345XXXX",
    "bvn": "12345678901",
    "reference": "00006597506292872311029472",
    "accountName": "Jumoke Dumebi"
}'

Request Body

FieldTypeDescriptionRequired
currencyStringCurrency code (e.g., NGN).βœ… Yes
countryStringCountry code (e.g., NG).βœ… Yes
firstNameStringThe customer's first name.βœ… Yes
lastNameStringThe customer's last name.βœ… Yes
emailStringThe customer's email address.βœ… Yes
phoneNumberStringThe customer's phone number.βœ… Yes
bvnStringThe customer's 11-digit Bank Verification Number.βœ… Yes
referenceStringA unique reference for the request (max 30 characters).βœ… Yes
accountNameStringThe desired name for the virtual account.βœ… Yes

Responses

A successful request returns a 200 OK status and the virtual account details.

Response (200 OK)
{
  "message": "virtual account created successfully",
  "status": "success",
  "data": {
    "id": "e21f7365-4fc9-4669-a9d9-xxxxxxxxxxxxx",
    "firstName": "Jumoke",
    "lastName": "Dumebi",
    "email": "example@email.com",
    "phoneNumber": "+234813456XXXXX",
    "bvn": "********",
    "reference": "00006597506292872311029472",
    "account": {
      "name": "Jumoke Dumebi",
      "bankName": "Mock BANK",
      "sortCode": null,
      "number": "881725XXXXX"
    },
    "status": "ACTIVE",
    "currency": "NGN",
    "country": "NG",
    "created": "2025-05-15T13:39:57.405491181"
  }
}

Response Body Breakdown

Virtual Account Data

This object contains the details of the successfully created static virtual account.

FieldTypeDescription
idStringUnique identifier for the virtual account resource.
firstNameStringFirst name of the virtual account holder.
lastNameStringLast name of the virtual account holder.
emailStringEmail address associated with the account holder.
phoneNumberStringPhone number of the account holder.
bvnStringBank Verification Number, masked for security.
referenceStringThe unique reference passed during account creation.
account.nameStringThe name on the generated virtual account.
account.bankNameStringThe name of the bank providing the virtual account.
account.sortCodeStringThe sort code of the bank (may be null).
account.numberStringThe generated virtual account number.
statusStringThe current status of the virtual account (e.g., ACTIVE).
currencyStringThe currency code for the account.
countryStringISO 3166-1 alpha-2 country code.
createdStringISO 8601 timestamp of when the account was created.

Webhooks

While creating a static virtual account does not trigger a webhook, payments made to the account do.

  • virtualaccount.completed: Sent when a payment to the account is successful.
  • virtualaccount.failed: Sent when a payment to the account fails.

Refer to the main Webhooks documentation for detailed payload structures.

Important Notes:

  • The bvn is always masked in the response for security.
  • The reference must be unique per request to ensure idempotency.
  • The returned account.number can be used to receive payments through the listed bankName.
  • Always validate the status field before considering the account ready for use.