Wallet-to-Wallet Transfer (Free)
curl --request POST \
--url https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"fromAccount": "<string>",
"toAccount": "<string>",
"amount": 123,
"reference": "<string>",
"narration": "<string>"
}
'import requests
url = "https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet"
payload = {
"fromAccount": "<string>",
"toAccount": "<string>",
"amount": 123,
"reference": "<string>",
"narration": "<string>"
}
headers = {
"x-api-key": "<x-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': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
fromAccount: '<string>',
toAccount: '<string>',
amount: 123,
reference: '<string>',
narration: '<string>'
})
};
fetch('https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet', 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/wallets/fiat/transfers/wallet-to-wallet",
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([
'fromAccount' => '<string>',
'toAccount' => '<string>',
'amount' => 123,
'reference' => '<string>',
'narration' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-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/wallets/fiat/transfers/wallet-to-wallet"
payload := strings.NewReader("{\n \"fromAccount\": \"<string>\",\n \"toAccount\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"narration\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-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/wallets/fiat/transfers/wallet-to-wallet")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fromAccount\": \"<string>\",\n \"toAccount\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"narration\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromAccount\": \"<string>\",\n \"toAccount\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"narration\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Wallet transfer successfull"
}
{
"success": false,
"message": "Insufficient funds",
"code": "INSUFFICIENT_FUNDS",
"errors": {
"amount": "Insufficient funds for transfer"
}
}
NGN Transfers
Wallet-to-Wallet Transfer (Free)
Transfer NGN for free between two customers under the same business
POST
/
api
/
v1
/
wallets
/
fiat
/
transfers
/
wallet-to-wallet
Wallet-to-Wallet Transfer (Free)
curl --request POST \
--url https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"fromAccount": "<string>",
"toAccount": "<string>",
"amount": 123,
"reference": "<string>",
"narration": "<string>"
}
'import requests
url = "https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet"
payload = {
"fromAccount": "<string>",
"toAccount": "<string>",
"amount": 123,
"reference": "<string>",
"narration": "<string>"
}
headers = {
"x-api-key": "<x-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': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
fromAccount: '<string>',
toAccount: '<string>',
amount: 123,
reference: '<string>',
narration: '<string>'
})
};
fetch('https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet', 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/wallets/fiat/transfers/wallet-to-wallet",
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([
'fromAccount' => '<string>',
'toAccount' => '<string>',
'amount' => 123,
'reference' => '<string>',
'narration' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-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/wallets/fiat/transfers/wallet-to-wallet"
payload := strings.NewReader("{\n \"fromAccount\": \"<string>\",\n \"toAccount\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"narration\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-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/wallets/fiat/transfers/wallet-to-wallet")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fromAccount\": \"<string>\",\n \"toAccount\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"narration\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromAccount\": \"<string>\",\n \"toAccount\": \"<string>\",\n \"amount\": 123,\n \"reference\": \"<string>\",\n \"narration\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Wallet transfer successfull"
}
{
"success": false,
"message": "Insufficient funds",
"code": "INSUFFICIENT_FUNDS",
"errors": {
"amount": "Insufficient funds for transfer"
}
}
Move funds instantly between two FossaPay NGN wallets belonging to customers under your business. Wallet-to-wallet transfers are free.
Use this endpoint only when both the sender and recipient are FossaPay customers created under the same business and both account numbers belong to their FossaPay NGN wallets.
To send money to an account at another bank, use the Inter-Bank Transfer endpoint instead.
Request
string
required
API Key for authentication
string
required
FossaPay NGN wallet account number belonging to the sending customer
string
required
FossaPay NGN wallet account number belonging to another customer under the same business
number
required
Transfer amount
string
required
Transfer reference
string
Transfer narration/description
Request Example
curl -X POST https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet \
-H "x-api-key: fk_production_DTKUG..." \
-H "Content-Type: application/json" \
-d '{
"fromAccount": "1234567890",
"toAccount": "0987654321",
"amount": 5000,
"reference": "transfer_ref_001",
"narration": "Payment for services"
}'
const response = await fetch('https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet', {
method: 'POST',
headers: {
'x-api-key': 'fk_production_DTKUG...',
'Content-Type': 'application/json'
},
body: JSON.stringify({
fromAccount: '1234567890',
toAccount: '0987654321',
amount: 5000,
reference: 'transfer_ref_001',
narration: 'Payment for services'
})
});
const data = await response.json();
import requests
url = "https://api-production.fossapay.com/api/v1/wallets/fiat/transfers/wallet-to-wallet"
headers = {
"x-api-key": "fk_production_DTKUG...",
"Content-Type": "application/json"
}
data = {
"fromAccount": "1234567890",
"toAccount": "0987654321",
"amount": 5000,
"reference": "transfer_ref_001",
"narration": "Payment for services"
}
response = requests.post(url, headers=headers, json=data)
data = response.json()
Response
No transfer fee is charged for a successful wallet-to-wallet transfer.boolean
Indicates if the transfer was successful
string
Human-readable response message
Response Example
{
"success": true,
"message": "Wallet transfer successfull"
}
{
"success": false,
"message": "Insufficient funds",
"code": "INSUFFICIENT_FUNDS",
"errors": {
"amount": "Insufficient funds for transfer"
}
}
Error Codes
| Code | Description |
|---|---|
INSUFFICIENT_FUNDS | Insufficient funds for transfer |
INVALID_ACCOUNT | Invalid source or destination account |
UNAUTHORIZED | Invalid API key or insufficient permissions |
TRANSFER_LIMIT_EXCEEDED | Transfer amount exceeds limit |
Rate Limit: 50 requests per minute
Confirm that both account numbers belong to customers under your business before initiating the free internal transfer.

