Virtual Account Creation
Summary
Create Virtual Accounts on demands, receive funds from customers via Virtual Account Number and get notification on Virtual Accounts usage.
Dedicated Virtual Accounts (DVAs) is a service that lets you create Nigerian, Ghana virtual accounts for your customers. These accounts allow your customers to receive payment from their customers.
When you create a Dedicated Virtual Account (DVA) for a customer, all bank transfers to that account will automatically be recorded as transactions from that customer.
Coverage
Nigeria
NGN
Ghana
GHS
Integration steps
You can generate a VA and start receiving money in 3 easy steps:
Prepare payload (payload includes: first name, last name, currency and email)
Initiate VA creation (encrypting payload)
Get instant response
Before you begin!
Initiate VA creation
create a virtual account
POST  {{env_url}}/wallet/virtual/v3/business/create/account
Encrypt the plain request body using the encryption algorithm specified above. Set the encrypted data to the message as shown below. You are required to set the x-auth-token and Authorization in the headers.
Headers
x-auth-token
Your merchant public key
Authorization
Bearer <token here>
Request Body (encrypted)
{
   "message": "encrypted-message"
}The result of the encryption of the payload that we specified has to be used with the Create virtual account endpoint as shown below:
Request Body (plain)
(Individual)
{
   "firstName": "John",
   "lastName": "Doe",
   "currency": "NGN",
   "email": "[email protected]"
}
(Business)
{
   "currency": "NGN"
   "email": "[email protected]"
}(Individual)
{
   "firstName": "John",
   "lastName": "Doe",
   "currency": "GHS",
   "email": "[email protected]"
}
(Business)
{
   "currency": "GHS",
   "email": "[email protected]"
}firstName*
String
John
lastName*
String
Doe
currency*
String
Must be one of the supported currencies in the Coverage
When you create a Virtual Account (VA), please allow a few seconds for processing. The accountName will be the first and last name for a personal account, or the business name for a corporate account. Below are some sample responses you can expect.
{
    "id": 645,
    "walletId": null,
    "accountNumber": "8571529225",
    "bankName": "WEMA BANK",
    "orderRef": "7uIyXachQYC9hcTpgWOZ",
    "txRef": "klasha-virtual-account-banktransfer-Business owner-133",
    "flwRef": "URF_vK8el9541NEy0j66imFD",
    "currency": "NGN",
    "userId": null,
    "businessId": 133,
    "bankCode": null,
    "enabled": true,
    "accountName": "Business owner",
    "email": "[email protected]",
    "profileHash": null,
    "blockReason": null,
    "createdAt": "2025-09-29 13:32:59",
    "updatedAt": "2025-09-29 13:32:59"
}
 {  
    "id": 4,
    "walletId": null,
    "accountNumber": "7003000100286",
    "bankName": "Affinity",
    "orderRef": "URF_1758189467615_5253135",
    "txRef": "klasha-virtual-account-banktransfer-Neo ai-1758189463344",
    "flwRef": "MockFLWRef-1758189467924",
    "currency": "GHS",
    "userId": null,
    "businessId": 133,
    "bankCode": null,
    "enabled": true,
    "accountName": "John Doe",
    "email": "[email protected]",
    "profileHash": null,
    "blockReason": null,
    "createdAt": "2025-09-18 10:57:49",
    "updatedAt": "2025-09-18 10:57:49"
}{
    "message": "There is no identity available for this bvn.",
    "error": "Operation not allowed"
}{
    "message": "Bvn name mismatch.",
    "error": "Operation not allowed"
}Requery
GET {{env_url}}/wallet/virtual/v2/account/{{email}}
In case of network downtime or failures during VA creation, the virtual account can be re-queried with the user’s email. This can be fetched using the Requery with email API on the Postman collection.
Headers
Authorization
Bearer <token here>
[
    {
        "accountNumber": "8573777620",
        "bankName": "WEMA BANK",
        "orderRef": "HsKRPDlemp7XBKvgO1HE",
        "txRef": "klasha-fund-wallet-banktransfer-steph-AJDcN6app",
        "flwRef": "URF_1Qw8TF2ZN1KkIdsqyHYI",
        "businessId": 5,
        "enabled": true,
        "accountName": "Forrest Green",
        "email": "[email protected]",
        "createdAt": "2023-07-04 17:02:59",
        "updatedAt": "2023-07-04 17:02:59"
    }
]Polling transaction status
POST {{env_url}}/nucleus/tnx/collection/status
To know the status of a transaction, you can fetch the transaction using the Transaction Status API on the Postman collection. Make use of the session id received from the bank. See an example below:
Request Body
gateRef*
String
10043599483902847574821
{
    "destinationCurrency": "NGN",
    "sourceAmount": 2500.000000,
    "sourceCurrency": "NGN",
    "status": "successful",
    "destinationAmount": 2500.000000,
    "customer": {
        "id": 53603,
        "name": "Last Name",
        "email": "[email protected]",
        "phone": null,
        "createdAt": "2023-07-04 20:11:05",
        "updatedAt": "2023-07-04 20:11:05"
    }
}Last updated

