Create a virtual account
curl --request POST \
--url https://api.payracle.com/api/v1/virtual-accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_name": "Jane Doe",
"customer_phone": "+2348012345678",
"customer_email": "jane@example.com",
"bvn": "12345678901",
"funding_limit": 100000,
"provider": "paga",
"banks": [
"paga",
"palmpay"
]
}
'import requests
url = "https://api.payracle.com/api/v1/virtual-accounts"
payload = {
"customer_name": "Jane Doe",
"customer_phone": "+2348012345678",
"customer_email": "jane@example.com",
"bvn": "12345678901",
"funding_limit": 100000,
"provider": "paga",
"banks": ["paga", "palmpay"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_name: 'Jane Doe',
customer_phone: '+2348012345678',
customer_email: 'jane@example.com',
bvn: '12345678901',
funding_limit: 100000,
provider: 'paga',
banks: ['paga', 'palmpay']
})
};
fetch('https://api.payracle.com/api/v1/virtual-accounts', 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.payracle.com/api/v1/virtual-accounts",
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([
'customer_name' => 'Jane Doe',
'customer_phone' => '+2348012345678',
'customer_email' => 'jane@example.com',
'bvn' => '12345678901',
'funding_limit' => 100000,
'provider' => 'paga',
'banks' => [
'paga',
'palmpay'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.payracle.com/api/v1/virtual-accounts"
payload := strings.NewReader("{\n \"customer_name\": \"Jane Doe\",\n \"customer_phone\": \"+2348012345678\",\n \"customer_email\": \"jane@example.com\",\n \"bvn\": \"12345678901\",\n \"funding_limit\": 100000,\n \"provider\": \"paga\",\n \"banks\": [\n \"paga\",\n \"palmpay\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.payracle.com/api/v1/virtual-accounts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_name\": \"Jane Doe\",\n \"customer_phone\": \"+2348012345678\",\n \"customer_email\": \"jane@example.com\",\n \"bvn\": \"12345678901\",\n \"funding_limit\": 100000,\n \"provider\": \"paga\",\n \"banks\": [\n \"paga\",\n \"palmpay\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.payracle.com/api/v1/virtual-accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_name\": \"Jane Doe\",\n \"customer_phone\": \"+2348012345678\",\n \"customer_email\": \"jane@example.com\",\n \"bvn\": \"12345678901\",\n \"funding_limit\": 100000,\n \"provider\": \"paga\",\n \"banks\": [\n \"paga\",\n \"palmpay\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"customer_name": "<string>",
"accounts": [
{
"account_number": "0354650915",
"account_name": "Jane Doe",
"bank_name": "Paga",
"bank_code": null
}
],
"errors": [
{
"provider": "palmpay",
"message": "license number duplicate"
}
]
}Virtual Accounts
Multi-Provider Requests
Provision a virtual account on both Paga and PalmPay in one call
POST
/
virtual-accounts
Create a virtual account
curl --request POST \
--url https://api.payracle.com/api/v1/virtual-accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_name": "Jane Doe",
"customer_phone": "+2348012345678",
"customer_email": "jane@example.com",
"bvn": "12345678901",
"funding_limit": 100000,
"provider": "paga",
"banks": [
"paga",
"palmpay"
]
}
'import requests
url = "https://api.payracle.com/api/v1/virtual-accounts"
payload = {
"customer_name": "Jane Doe",
"customer_phone": "+2348012345678",
"customer_email": "jane@example.com",
"bvn": "12345678901",
"funding_limit": 100000,
"provider": "paga",
"banks": ["paga", "palmpay"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_name: 'Jane Doe',
customer_phone: '+2348012345678',
customer_email: 'jane@example.com',
bvn: '12345678901',
funding_limit: 100000,
provider: 'paga',
banks: ['paga', 'palmpay']
})
};
fetch('https://api.payracle.com/api/v1/virtual-accounts', 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.payracle.com/api/v1/virtual-accounts",
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([
'customer_name' => 'Jane Doe',
'customer_phone' => '+2348012345678',
'customer_email' => 'jane@example.com',
'bvn' => '12345678901',
'funding_limit' => 100000,
'provider' => 'paga',
'banks' => [
'paga',
'palmpay'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.payracle.com/api/v1/virtual-accounts"
payload := strings.NewReader("{\n \"customer_name\": \"Jane Doe\",\n \"customer_phone\": \"+2348012345678\",\n \"customer_email\": \"jane@example.com\",\n \"bvn\": \"12345678901\",\n \"funding_limit\": 100000,\n \"provider\": \"paga\",\n \"banks\": [\n \"paga\",\n \"palmpay\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.payracle.com/api/v1/virtual-accounts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_name\": \"Jane Doe\",\n \"customer_phone\": \"+2348012345678\",\n \"customer_email\": \"jane@example.com\",\n \"bvn\": \"12345678901\",\n \"funding_limit\": 100000,\n \"provider\": \"paga\",\n \"banks\": [\n \"paga\",\n \"palmpay\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.payracle.com/api/v1/virtual-accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_name\": \"Jane Doe\",\n \"customer_phone\": \"+2348012345678\",\n \"customer_email\": \"jane@example.com\",\n \"bvn\": \"12345678901\",\n \"funding_limit\": 100000,\n \"provider\": \"paga\",\n \"banks\": [\n \"paga\",\n \"palmpay\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"customer_name": "<string>",
"accounts": [
{
"account_number": "0354650915",
"account_name": "Jane Doe",
"bank_name": "Paga",
"bank_code": null
}
],
"errors": [
{
"provider": "palmpay",
"message": "license number duplicate"
}
]
}POST /v1/virtual-accounts
Pass a banks array instead of a single provider string to request accounts on multiple networks at once. Each provider is attempted independently — if one fails (e.g. PalmPay rejects a duplicate identity document), the other’s account is still returned rather than the whole call failing.
string
required
Full name of the customer
string
Required if
paga is one of the requested providersstring
Required if
paga is one of the requested providersarray
required
Array of provider names to request, e.g.
["paga", "palmpay"]curl -X POST "https://api.payracle.com/api/v1/virtual-accounts" \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"customer_name": "Jane Doe",
"customer_phone": "+2348012345678",
"customer_email": "jane@example.com",
"banks": ["paga", "palmpay"]
}'
Response — all succeeded
{
"message": "Virtual accounts created successfully.",
"customer_name": "Jane Doe",
"accounts": [
{ "account_number": "0354650915", "account_name": "Jane Doe", "bank_name": "Paga", "bank_code": null },
{ "account_number": "6610371184", "account_name": "Jane Doe", "bank_name": "PalmPay", "bank_code": null }
],
"errors": []
}
Response — partial failure
{
"message": "Virtual accounts created successfully. (palmpay failed — see errors.)",
"customer_name": "Jane Doe",
"accounts": [
{ "account_number": "0354650915", "account_name": "Jane Doe", "bank_name": "Paga", "bank_code": null }
],
"errors": [
{ "provider": "palmpay", "message": "license number duplicate" }
]
}
A
422 is only returned if every requested provider failed. A partial success still returns 201 — always check the errors array, don’t assume success just because the HTTP status is 2xx.Authorizations
sk_live_... or sk_test_... — can call every endpoint. Server-side only.
Body
application/json
Example:
"Jane Doe"
Required if provider/banks includes paga
Example:
"+2348012345678"
Required if provider/banks includes paga
Example:
"jane@example.com"
Example:
"12345678901"
Example:
100000
Available options:
paga, palmpay Available options:
paga, palmpay Example:
["paga", "palmpay"]