Create dynamic virtual bank account
curl --request POST \
--url https://api.nexapay.ng/api/v1/business/virtual-account/create \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"businessId": "<string>",
"amount": 123,
"reference": "<string>",
"merchantCustomerId": "<string>",
"merchantReference": "<string>",
"validityTime": 123,
"amountValidation": "<string>",
"sessionId": "<string>",
"orderId": "<string>",
"customerName": "<string>",
"customerEmail": "<string>",
"customerPhone": "<string>",
"metadata": {}
}
'import requests
url = "https://api.nexapay.ng/api/v1/business/virtual-account/create"
payload = {
"businessId": "<string>",
"amount": 123,
"reference": "<string>",
"merchantCustomerId": "<string>",
"merchantReference": "<string>",
"validityTime": 123,
"amountValidation": "<string>",
"sessionId": "<string>",
"orderId": "<string>",
"customerName": "<string>",
"customerEmail": "<string>",
"customerPhone": "<string>",
"metadata": {}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
businessId: '<string>',
amount: 123,
reference: '<string>',
merchantCustomerId: '<string>',
merchantReference: '<string>',
validityTime: 123,
amountValidation: '<string>',
sessionId: '<string>',
orderId: '<string>',
customerName: '<string>',
customerEmail: '<string>',
customerPhone: '<string>',
metadata: {}
})
};
fetch('https://api.nexapay.ng/api/v1/business/virtual-account/create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nexapay.ng/api/v1/business/virtual-account/create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'businessId' => '<string>',
'amount' => 123,
'reference' => '<string>',
'merchantCustomerId' => '<string>',
'merchantReference' => '<string>',
'validityTime' => 123,
'amountValidation' => '<string>',
'sessionId' => '<string>',
'orderId' => '<string>',
'customerName' => '<string>',
'customerEmail' => '<string>',
'customerPhone' => '<string>',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nexapay.ng/api/v1/business/virtual-account/create"
payload := strings.NewReader("{\n \"businessId\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"merchantCustomerId\": \"<string>\",\n \"merchantReference\": \"<string>\",\n \"validityTime\": 123,\n \"amountValidation\": \"<string>\",\n \"sessionId\": \"<string>\",\n \"orderId\": \"<string>\",\n \"customerName\": \"<string>\",\n \"customerEmail\": \"<string>\",\n \"customerPhone\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.nexapay.ng/api/v1/business/virtual-account/create")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"businessId\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"merchantCustomerId\": \"<string>\",\n \"merchantReference\": \"<string>\",\n \"validityTime\": 123,\n \"amountValidation\": \"<string>\",\n \"sessionId\": \"<string>\",\n \"orderId\": \"<string>\",\n \"customerName\": \"<string>\",\n \"customerEmail\": \"<string>\",\n \"customerPhone\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nexapay.ng/api/v1/business/virtual-account/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"businessId\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"merchantCustomerId\": \"<string>\",\n \"merchantReference\": \"<string>\",\n \"validityTime\": 123,\n \"amountValidation\": \"<string>\",\n \"sessionId\": \"<string>\",\n \"orderId\": \"<string>\",\n \"customerName\": \"<string>\",\n \"customerEmail\": \"<string>\",\n \"customerPhone\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_bodyVirtual Accounts
Create Virtual Account
Creates a temporary, customer-facing virtual bank account for bank transfer collections.
POST
/
virtual-account
/
create
Create dynamic virtual bank account
curl --request POST \
--url https://api.nexapay.ng/api/v1/business/virtual-account/create \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"businessId": "<string>",
"amount": 123,
"reference": "<string>",
"merchantCustomerId": "<string>",
"merchantReference": "<string>",
"validityTime": 123,
"amountValidation": "<string>",
"sessionId": "<string>",
"orderId": "<string>",
"customerName": "<string>",
"customerEmail": "<string>",
"customerPhone": "<string>",
"metadata": {}
}
'import requests
url = "https://api.nexapay.ng/api/v1/business/virtual-account/create"
payload = {
"businessId": "<string>",
"amount": 123,
"reference": "<string>",
"merchantCustomerId": "<string>",
"merchantReference": "<string>",
"validityTime": 123,
"amountValidation": "<string>",
"sessionId": "<string>",
"orderId": "<string>",
"customerName": "<string>",
"customerEmail": "<string>",
"customerPhone": "<string>",
"metadata": {}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
businessId: '<string>',
amount: 123,
reference: '<string>',
merchantCustomerId: '<string>',
merchantReference: '<string>',
validityTime: 123,
amountValidation: '<string>',
sessionId: '<string>',
orderId: '<string>',
customerName: '<string>',
customerEmail: '<string>',
customerPhone: '<string>',
metadata: {}
})
};
fetch('https://api.nexapay.ng/api/v1/business/virtual-account/create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nexapay.ng/api/v1/business/virtual-account/create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'businessId' => '<string>',
'amount' => 123,
'reference' => '<string>',
'merchantCustomerId' => '<string>',
'merchantReference' => '<string>',
'validityTime' => 123,
'amountValidation' => '<string>',
'sessionId' => '<string>',
'orderId' => '<string>',
'customerName' => '<string>',
'customerEmail' => '<string>',
'customerPhone' => '<string>',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nexapay.ng/api/v1/business/virtual-account/create"
payload := strings.NewReader("{\n \"businessId\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"merchantCustomerId\": \"<string>\",\n \"merchantReference\": \"<string>\",\n \"validityTime\": 123,\n \"amountValidation\": \"<string>\",\n \"sessionId\": \"<string>\",\n \"orderId\": \"<string>\",\n \"customerName\": \"<string>\",\n \"customerEmail\": \"<string>\",\n \"customerPhone\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.nexapay.ng/api/v1/business/virtual-account/create")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"businessId\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"merchantCustomerId\": \"<string>\",\n \"merchantReference\": \"<string>\",\n \"validityTime\": 123,\n \"amountValidation\": \"<string>\",\n \"sessionId\": \"<string>\",\n \"orderId\": \"<string>\",\n \"customerName\": \"<string>\",\n \"customerEmail\": \"<string>\",\n \"customerPhone\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nexapay.ng/api/v1/business/virtual-account/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"businessId\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"merchantCustomerId\": \"<string>\",\n \"merchantReference\": \"<string>\",\n \"validityTime\": 123,\n \"amountValidation\": \"<string>\",\n \"sessionId\": \"<string>\",\n \"orderId\": \"<string>\",\n \"customerName\": \"<string>\",\n \"customerEmail\": \"<string>\",\n \"customerPhone\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_bodyCreates a dynamic, customer-facing virtual bank account for bank transfer collections.
Notes
businessId,amount,reference,merchantCustomerId, andmerchantReferenceare required.merchantCustomerIdshould match the merchant’s internal user/customer ID.merchantReferenceshould match the merchant’s own order/session/invoice reference.- Any extra mapping fields are preserved in
metadataand echoed back in the deposit webhook.
Authorizations
Merchant API Key (e.g., nexa-prod-... or nexa-test-...)
Headers
Target environment selector (live production vs. simulated sandbox).
Available options:
prod, test Body
application/json
Unique business ID.
Expected collection amount.
Unique reference for the virtual account session.
ID identifying the end customer.
Merchant reference of the collection.
Session validity limit in minutes (default 4320).
Strict or flexible amount check.
Response
Virtual account successfully created.