Skip to main content
POST
/
v1
/
local-bank-transfer
Initiate local bank transfer
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: JSON.stringify({
    merchantTransactionId: 'bank_tx_48291',
    senderAccountNo: 'ACC-123456',
    senderAddress: '12 Riverside Drive, Nairobi',
    beneficiaryBankCode: '07000',
    beneficiaryBankName: 'Equity Bank',
    beneficiaryAccountId: '0012345678901',
    beneficiaryAccountCcy: 'KES',
    beneficiaryName: 'Jane Wambui',
    amount: 25000000,
    narration: 'Supplier payment',
    paymentChannel: 'PESALINK',
    beneficiaryBranchCode: '00123',
    paymentPurposeId: 'OTHR'
  })
};

fetch('https://api.fingopay.io/v1/local-bank-transfer', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
import requests

url = "https://api.fingopay.io/v1/local-bank-transfer"

payload = {
"merchantTransactionId": "bank_tx_48291",
"senderAccountNo": "ACC-123456",
"senderAddress": "12 Riverside Drive, Nairobi",
"beneficiaryBankCode": "07000",
"beneficiaryBankName": "Equity Bank",
"beneficiaryAccountId": "0012345678901",
"beneficiaryAccountCcy": "KES",
"beneficiaryName": "Jane Wambui",
"amount": 25000000,
"narration": "Supplier payment",
"paymentChannel": "PESALINK",
"beneficiaryBranchCode": "00123",
"paymentPurposeId": "OTHR"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
curl --request POST \
--url https://api.fingopay.io/v1/local-bank-transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"merchantTransactionId": "bank_tx_48291",
"senderAccountNo": "ACC-123456",
"senderAddress": "12 Riverside Drive, Nairobi",
"beneficiaryBankCode": "07000",
"beneficiaryBankName": "Equity Bank",
"beneficiaryAccountId": "0012345678901",
"beneficiaryAccountCcy": "KES",
"beneficiaryName": "Jane Wambui",
"amount": 25000000,
"narration": "Supplier payment",
"paymentChannel": "PESALINK",
"beneficiaryBranchCode": "00123",
"paymentPurposeId": "OTHR"
}
'
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.fingopay.io/v1/local-bank-transfer"

payload := strings.NewReader("{\n \"merchantTransactionId\": \"bank_tx_48291\",\n \"senderAccountNo\": \"ACC-123456\",\n \"senderAddress\": \"12 Riverside Drive, Nairobi\",\n \"beneficiaryBankCode\": \"07000\",\n \"beneficiaryBankName\": \"Equity Bank\",\n \"beneficiaryAccountId\": \"0012345678901\",\n \"beneficiaryAccountCcy\": \"KES\",\n \"beneficiaryName\": \"Jane Wambui\",\n \"amount\": 25000000,\n \"narration\": \"Supplier payment\",\n \"paymentChannel\": \"PESALINK\",\n \"beneficiaryBranchCode\": \"00123\",\n \"paymentPurposeId\": \"OTHR\"\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.fingopay.io/v1/local-bank-transfer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"merchantTransactionId\": \"bank_tx_48291\",\n \"senderAccountNo\": \"ACC-123456\",\n \"senderAddress\": \"12 Riverside Drive, Nairobi\",\n \"beneficiaryBankCode\": \"07000\",\n \"beneficiaryBankName\": \"Equity Bank\",\n \"beneficiaryAccountId\": \"0012345678901\",\n \"beneficiaryAccountCcy\": \"KES\",\n \"beneficiaryName\": \"Jane Wambui\",\n \"amount\": 25000000,\n \"narration\": \"Supplier payment\",\n \"paymentChannel\": \"PESALINK\",\n \"beneficiaryBranchCode\": \"00123\",\n \"paymentPurposeId\": \"OTHR\"\n}")
.asString();
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fingopay.io/v1/local-bank-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([
'merchantTransactionId' => 'bank_tx_48291',
'senderAccountNo' => 'ACC-123456',
'senderAddress' => '12 Riverside Drive, Nairobi',
'beneficiaryBankCode' => '07000',
'beneficiaryBankName' => 'Equity Bank',
'beneficiaryAccountId' => '0012345678901',
'beneficiaryAccountCcy' => 'KES',
'beneficiaryName' => 'Jane Wambui',
'amount' => 25000000,
'narration' => 'Supplier payment',
'paymentChannel' => 'PESALINK',
'beneficiaryBranchCode' => '00123',
'paymentPurposeId' => 'OTHR'
]),
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;
}
using RestSharp;


var options = new RestClientOptions("https://api.fingopay.io/v1/local-bank-transfer");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"merchantTransactionId\": \"bank_tx_48291\",\n \"senderAccountNo\": \"ACC-123456\",\n \"senderAddress\": \"12 Riverside Drive, Nairobi\",\n \"beneficiaryBankCode\": \"07000\",\n \"beneficiaryBankName\": \"Equity Bank\",\n \"beneficiaryAccountId\": \"0012345678901\",\n \"beneficiaryAccountCcy\": \"KES\",\n \"beneficiaryName\": \"Jane Wambui\",\n \"amount\": 25000000,\n \"narration\": \"Supplier payment\",\n \"paymentChannel\": \"PESALINK\",\n \"beneficiaryBranchCode\": \"00123\",\n \"paymentPurposeId\": \"OTHR\"\n}", false);
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
{
  "status": "success",
  "message": "Bank transfer initiated successfully",
  "data": {
    "merchantTransactionId": "bank_tx_48291",
    "transactionId": "txn_01j7bankdom"
  }
}
{
"error": {
"message": "<string>",
"param": "<string>",
"requestId": "<string>"
}
}
{
"error": {
"message": "<string>",
"param": "<string>",
"requestId": "<string>"
}
}
{
"error": {
"message": "<string>",
"param": "<string>",
"requestId": "<string>"
}
}
{
"error": {
"message": "<string>",
"param": "<string>",
"requestId": "<string>"
}
}
{
"error": {
"message": "<string>",
"param": "<string>",
"requestId": "<string>"
}
}
{
"error": {
"message": "<string>",
"param": "<string>",
"requestId": "<string>"
}
}

Authorizations

Authorization
string
header
required

Use your API key as a Bearer token. Example: Authorization: Bearer sk_live_...

Headers

Idempotency-Key
string<uuid>

Unique key to safely retry POST without duplicates. Required in live environment.

Body

application/json

Request body for local bank transfers (PesaLink).

merchantTransactionId
string
required

Merchant-side reference used for reconciliation. Accepts 1-64 characters (letters, numbers, dot, underscore, or hyphen).

Required string length: 1 - 64
Pattern: ^[A-Za-z0-9._-]{1,64}$
Example:

"bank_tx_48291"

senderAccountNo
string
required

Sender payout account number funding the transfer. The account number is resolved to an account and validated against its account class.

Example:

"ACC-123456"

senderAddress
string
required

Registered sender address.

Example:

"12 Riverside Drive, Nairobi"

beneficiaryBankCode
string
required

Destination bank code.

Example:

"07000"

beneficiaryBankName
string
required

Destination bank name.

Example:

"Equity Bank"

beneficiaryAccountId
string
required

Destination account number.

Example:

"0012345678901"

beneficiaryAccountCcy
string
required

Destination account currency (ISO 4217).

Example:

"KES"

beneficiaryName
string
required

Destination account holder name.

Example:

"Jane Wambui"

amount
integer
required

Amount in smallest currency unit (cents). Range 1-100,000,000 (KES 0.01-1,000,000.00).

Required range: 1 <= x <= 100000000
Example:

25000000

narration
string
required

Transfer narration. Maximum 140 characters.

Maximum string length: 140
Example:

"Supplier payment"

paymentChannel
enum<string>
required

Payment rail used for the transfer. Only PESALINK is supported.

Available options:
PESALINK
Example:

"PESALINK"

beneficiaryBranchCode
string

Optional branch code. Provide an empty string if not applicable.

Example:

"00123"

paymentPurposeId
string

Optional payment purpose identifier.

Example:

"OTHR"

Response

Accepted — transfer will be processed asynchronously.

status
string
required
Example:

"success"

message
string
required
Example:

"Bank transfer initiated successfully"

data
object
required