Bulk Transfer
curl --request POST \
--url https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/ \
--header 'Content-Type: <content-type>' \
--header 'api-key: <api-key>' \
--header 'api-secret: <api-secret>' \
--data '
{
"batch_reference": "PAYROLL_2026_03",
"transfers": [
{
"amount": "15000.00",
"account_number": "0123456789",
"bank_code": "999991",
"account_name": "John Doe",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP001"
}
]
}
'import requests
url = "https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/"
payload = {
"batch_reference": "PAYROLL_2026_03",
"transfers": [
{
"amount": "15000.00",
"account_number": "0123456789",
"bank_code": "999991",
"account_name": "John Doe",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP001"
}
]
}
headers = {
"api-key": "<api-key>",
"api-secret": "<api-secret>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'api-key': '<api-key>',
'api-secret': '<api-secret>',
'Content-Type': '<content-type>'
},
body: JSON.stringify({
batch_reference: 'PAYROLL_2026_03',
transfers: [
{
amount: '15000.00',
account_number: '0123456789',
bank_code: '999991',
account_name: 'John Doe',
narration: 'March salary',
reference: 'PAYROLL_2026_03_EMP001'
}
]
})
};
fetch('https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/', 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.payvessel.com/pms/api/external/request/wallet/bulk-transfer/",
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([
'batch_reference' => 'PAYROLL_2026_03',
'transfers' => [
[
'amount' => '15000.00',
'account_number' => '0123456789',
'bank_code' => '999991',
'account_name' => 'John Doe',
'narration' => 'March salary',
'reference' => 'PAYROLL_2026_03_EMP001'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"api-key: <api-key>",
"api-secret: <api-secret>"
],
]);
$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.payvessel.com/pms/api/external/request/wallet/bulk-transfer/"
payload := strings.NewReader("{\n \"batch_reference\": \"PAYROLL_2026_03\",\n \"transfers\": [\n {\n \"amount\": \"15000.00\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"999991\",\n \"account_name\": \"John Doe\",\n \"narration\": \"March salary\",\n \"reference\": \"PAYROLL_2026_03_EMP001\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api-key", "<api-key>")
req.Header.Add("api-secret", "<api-secret>")
req.Header.Add("Content-Type", "<content-type>")
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.payvessel.com/pms/api/external/request/wallet/bulk-transfer/")
.header("api-key", "<api-key>")
.header("api-secret", "<api-secret>")
.header("Content-Type", "<content-type>")
.body("{\n \"batch_reference\": \"PAYROLL_2026_03\",\n \"transfers\": [\n {\n \"amount\": \"15000.00\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"999991\",\n \"account_name\": \"John Doe\",\n \"narration\": \"March salary\",\n \"reference\": \"PAYROLL_2026_03_EMP001\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api-key"] = '<api-key>'
request["api-secret"] = '<api-secret>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"batch_reference\": \"PAYROLL_2026_03\",\n \"transfers\": [\n {\n \"amount\": \"15000.00\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"999991\",\n \"account_name\": \"John Doe\",\n \"narration\": \"March salary\",\n \"reference\": \"PAYROLL_2026_03_EMP001\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": true,
"message": "<string>",
"data": {}
}Transfer
Bulk Transfer
Initiate multiple wallet transfers in a single batch
POST
/
pms
/
api
/
external
/
request
/
wallet
/
bulk-transfer
/
Bulk Transfer
curl --request POST \
--url https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/ \
--header 'Content-Type: <content-type>' \
--header 'api-key: <api-key>' \
--header 'api-secret: <api-secret>' \
--data '
{
"batch_reference": "PAYROLL_2026_03",
"transfers": [
{
"amount": "15000.00",
"account_number": "0123456789",
"bank_code": "999991",
"account_name": "John Doe",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP001"
}
]
}
'import requests
url = "https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/"
payload = {
"batch_reference": "PAYROLL_2026_03",
"transfers": [
{
"amount": "15000.00",
"account_number": "0123456789",
"bank_code": "999991",
"account_name": "John Doe",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP001"
}
]
}
headers = {
"api-key": "<api-key>",
"api-secret": "<api-secret>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'api-key': '<api-key>',
'api-secret': '<api-secret>',
'Content-Type': '<content-type>'
},
body: JSON.stringify({
batch_reference: 'PAYROLL_2026_03',
transfers: [
{
amount: '15000.00',
account_number: '0123456789',
bank_code: '999991',
account_name: 'John Doe',
narration: 'March salary',
reference: 'PAYROLL_2026_03_EMP001'
}
]
})
};
fetch('https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/', 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.payvessel.com/pms/api/external/request/wallet/bulk-transfer/",
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([
'batch_reference' => 'PAYROLL_2026_03',
'transfers' => [
[
'amount' => '15000.00',
'account_number' => '0123456789',
'bank_code' => '999991',
'account_name' => 'John Doe',
'narration' => 'March salary',
'reference' => 'PAYROLL_2026_03_EMP001'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"api-key: <api-key>",
"api-secret: <api-secret>"
],
]);
$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.payvessel.com/pms/api/external/request/wallet/bulk-transfer/"
payload := strings.NewReader("{\n \"batch_reference\": \"PAYROLL_2026_03\",\n \"transfers\": [\n {\n \"amount\": \"15000.00\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"999991\",\n \"account_name\": \"John Doe\",\n \"narration\": \"March salary\",\n \"reference\": \"PAYROLL_2026_03_EMP001\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api-key", "<api-key>")
req.Header.Add("api-secret", "<api-secret>")
req.Header.Add("Content-Type", "<content-type>")
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.payvessel.com/pms/api/external/request/wallet/bulk-transfer/")
.header("api-key", "<api-key>")
.header("api-secret", "<api-secret>")
.header("Content-Type", "<content-type>")
.body("{\n \"batch_reference\": \"PAYROLL_2026_03\",\n \"transfers\": [\n {\n \"amount\": \"15000.00\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"999991\",\n \"account_name\": \"John Doe\",\n \"narration\": \"March salary\",\n \"reference\": \"PAYROLL_2026_03_EMP001\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api-key"] = '<api-key>'
request["api-secret"] = '<api-secret>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"batch_reference\": \"PAYROLL_2026_03\",\n \"transfers\": [\n {\n \"amount\": \"15000.00\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"999991\",\n \"account_name\": \"John Doe\",\n \"narration\": \"March salary\",\n \"reference\": \"PAYROLL_2026_03_EMP001\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": true,
"message": "<string>",
"data": {}
}Use this endpoint to send multiple payouts from your business wallet in one request. Each transfer in the batch debits your wallet and credits a different beneficiary account.
For detailed per‑transfer status, use the transfer status and wallet transactions endpoints.
Bulk transfers are powerful: always validate input (bank codes, account numbers, amounts) before sending a batch, and use unique references for each row.
Sandbox
curl -X POST "https://sandbox.payvessel.com/pms/api/external/request/wallet/bulk-transfer/" \
-H "api-key: YOUR_SANDBOX_API_KEY" \
-H "api-secret: YOUR_SANDBOX_API_SECRET" \
-H "Content-Type: application/json" \
-d '{"batch_reference":"PAYROLL_2026_03","transfers":[{"amount":"15000.00","account_number":"0123456789","bank_code":"999991","account_name":"John Doe","narration":"Salary March","reference":"PAYROLL_001"}]}'
Endpoint
POST/pms/api/external/request/wallet/bulk-transfer/
Request Body
string
required
Unique reference for this bulk batch (for reconciliation)
Must be unique across all your bulk transfers
array
required
List of individual transfers in the batch
Show Transfer Object
Show Transfer Object
string
required
Amount to send for this transfer in the smallest currency unit (e.g.
"15000.00")string
required
Destination bank account number
string
required
Destination bank code (see bank list endpoint for available codes)
string
Optional account name for your own records
string
Description that may appear on the beneficiary’s statement
string
required
Unique reference for this specific transfer in the batch
Must be unique across all transfers in this batch
Example request
{
"batch_reference": "PAYROLL_2026_03",
"transfers": [
{
"amount": "15000.00",
"account_number": "0123456789",
"bank_code": "999991",
"account_name": "John Doe",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP001"
},
{
"amount": "20000.00",
"account_number": "0987654321",
"bank_code": "120001",
"account_name": "Jane Smith",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP002"
}
]
}
Example cURL
curl -X POST "https://api.payvessel.com/pms/api/external/request/wallet/bulk-transfer/" \
-H "api-key: YOUR_API_KEY" \
-H "api-secret: YOUR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"batch_reference": "PAYROLL_2026_03",
"transfers": [
{
"amount": "15000.00",
"account_number": "0123456789",
"bank_code": "999991",
"account_name": "John Doe",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP001"
},
{
"amount": "20000.00",
"account_number": "0987654321",
"bank_code": "120001",
"account_name": "Jane Smith",
"narration": "March salary",
"reference": "PAYROLL_2026_03_EMP002"
}
]
}'
Response
On success you receive high‑level information about the batch:{
"status": true,
"message": "Bulk transfer initiated",
"data": {
"batch_reference": "PAYROLL_2026_03",
"total_count": 2,
"successful_count": 2,
"failed_count": 0,
"total_amount": "35000.00"
}
}
Headers
Your Payvessel public API key
Your Payvessel secret
Request content type
Available options:
application/json Body
application/json
⌘I
