Transfer NGN to an external bank
curl --request POST \
--url https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"destinationBankCode": "<string>",
"destinationAccountName": "<string>",
"destinationAccountNumber": "<string>",
"destinationBankName": "<string>",
"reference": "<string>",
"remarks": "<string>",
"amount": 123
}
'import requests
url = "https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank"
payload = {
"customerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"destinationBankCode": "<string>",
"destinationAccountName": "<string>",
"destinationAccountNumber": "<string>",
"destinationBankName": "<string>",
"reference": "<string>",
"remarks": "<string>",
"amount": 123
}
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({
customerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
destinationBankCode: '<string>',
destinationAccountName: '<string>',
destinationAccountNumber: '<string>',
destinationBankName: '<string>',
reference: '<string>',
remarks: '<string>',
amount: 123
})
};
fetch('https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank', 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-production.fossapay.com/api/v1/transfers/fiat/inter-bank",
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([
'customerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'destinationBankCode' => '<string>',
'destinationAccountName' => '<string>',
'destinationAccountNumber' => '<string>',
'destinationBankName' => '<string>',
'reference' => '<string>',
'remarks' => '<string>',
'amount' => 123
]),
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-production.fossapay.com/api/v1/transfers/fiat/inter-bank"
payload := strings.NewReader("{\n \"customerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationBankName\": \"<string>\",\n \"reference\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123\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-production.fossapay.com/api/v1/transfers/fiat/inter-bank")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationBankName\": \"<string>\",\n \"reference\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank")
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 \"customerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationBankName\": \"<string>\",\n \"reference\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123\n}"
response = http.request(request)
puts response.read_body{
"status": true,
"statusCode": 200,
"message": "Transfer request is being processed",
"data": {
"reference": "TRF-2026-10025"
}
}
NGN Transfers
Inter-Bank Transfer (External Bank)
Send NGN from FossaPay to an account at another supported Nigerian bank
POST
/
api
/
v1
/
transfers
/
fiat
/
inter-bank
Transfer NGN to an external bank
curl --request POST \
--url https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"destinationBankCode": "<string>",
"destinationAccountName": "<string>",
"destinationAccountNumber": "<string>",
"destinationBankName": "<string>",
"reference": "<string>",
"remarks": "<string>",
"amount": 123
}
'import requests
url = "https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank"
payload = {
"customerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"destinationBankCode": "<string>",
"destinationAccountName": "<string>",
"destinationAccountNumber": "<string>",
"destinationBankName": "<string>",
"reference": "<string>",
"remarks": "<string>",
"amount": 123
}
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({
customerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
destinationBankCode: '<string>',
destinationAccountName: '<string>',
destinationAccountNumber: '<string>',
destinationBankName: '<string>',
reference: '<string>',
remarks: '<string>',
amount: 123
})
};
fetch('https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank', 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-production.fossapay.com/api/v1/transfers/fiat/inter-bank",
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([
'customerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'destinationBankCode' => '<string>',
'destinationAccountName' => '<string>',
'destinationAccountNumber' => '<string>',
'destinationBankName' => '<string>',
'reference' => '<string>',
'remarks' => '<string>',
'amount' => 123
]),
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-production.fossapay.com/api/v1/transfers/fiat/inter-bank"
payload := strings.NewReader("{\n \"customerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationBankName\": \"<string>\",\n \"reference\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123\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-production.fossapay.com/api/v1/transfers/fiat/inter-bank")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationBankName\": \"<string>\",\n \"reference\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank")
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 \"customerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationBankName\": \"<string>\",\n \"reference\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123\n}"
response = http.request(request)
puts response.read_body{
"status": true,
"statusCode": 200,
"message": "Transfer request is being processed",
"data": {
"reference": "TRF-2026-10025"
}
}
Send NGN to a recipient whose account is at a bank outside the bank used for FossaPay NGN wallets.
The request
Use inter-bank transfer for external bank accounts. First confirm the destination bank is supported, perform a bank name enquiry, and calculate the applicable transfer fee.
If both people are FossaPay customers under the same business, use the free Wallet-to-Wallet Transfer endpoint instead.
Request
string
required
Active production API key belonging to the customer and source wallet merchant.
string
required
UUID of the customer initiating the transfer
string
required
The bank code of the external destination bank
string
required
The name of the destination account holder
string
required
The recipient’s account number at the external destination bank
string
required
The name of the external destination bank
string
required
Unique transfer reference generated and saved by your system. Maximum 36 characters; longer references are rejected before any funds move.
string
required
Additional remarks or description for the transfer
number
required
Amount delivered to the beneficiary. The customer wallet is debited this amount plus the configured fee.
Request Example
curl -X POST https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank \
-H "x-api-key: $FOSSAPAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customerId": "11111111-1111-4111-8111-111111111111",
"destinationBankCode": "044",
"destinationAccountName": "JOHN DOE",
"destinationAccountNumber": "1234567890",
"destinationBankName": "ACCESS BANK",
"reference": "TRF-2026-10025",
"remarks": "Customer withdrawal",
"amount": 50000.00
}'
const response = await fetch('https://api-production.fossapay.com/api/v1/transfers/fiat/inter-bank', {
method: 'POST',
headers: {
'x-api-key': process.env.FOSSAPAY_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
customerId: '11111111-1111-4111-8111-111111111111',
destinationBankCode: '044',
destinationAccountName: 'JOHN DOE',
destinationAccountNumber: '1234567890',
destinationBankName: 'ACCESS BANK',
reference: 'TRF-2026-10025',
remarks: 'Customer withdrawal',
amount: 50000.00
})
});
const data = await response.json();
Response
{
"status": true,
"statusCode": 200,
"message": "Transfer request is being processed",
"data": {
"reference": "TRF-2026-10025"
}
}
{
"status": "error",
"statusCode": 400,
"message": "Insufficient funds in customer wallet to complete transfer"
}
{
"status": "error",
"statusCode": 404,
"message": "Could not retrieve customer wallet balance at the moment"
}
{
"status": "error",
"statusCode": 500,
"message": "Internal server error"
}
reference is the replay and reconciliation identifier. It must be 36 characters or fewer. This endpoint does not use X-Idempotency-Key. After a timeout, reconcile by reference and wallet history before creating another transfer.
Errors
| Status | Typical cause |
|---|---|
400 | Customer/wallet missing, insufficient funds, duplicate processing, provider failure, or unresolved outcome |
401 | Missing or invalid API key |
404 | Customer wallet balance or related resource not found |
422 | Missing or invalid request field, including a reference longer than 36 characters |
5xx | Temporary platform or provider failure; reconcile before retrying |
Authorizations
Body
application/json
Unique customer inter-bank transfer reference. Must be 36 characters or fewer.
Required string length:
1 - 36
