To transfer to a Kenyan bank account via Paystack, create a nuban-type recipient with the Kenyan bank code and KES currency. Get bank codes from GET /bank?country=kenya. Initiate the transfer with the recipient code, amount in cents, and a unique reference. Settlement timing depends on the destination bank and can range from minutes to several hours through interbank clearing.
Every Kenyan bank on Paystack has a unique code. You need this code to create a recipient. Fetch the full list from the API.
const getKenyanBanks = async () => {
var response = await fetch('https://api.paystack.co/bank?country=kenya', {
headers: {
Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY,
},
});
var data = await response.json();
return data.data;
// Returns: [{ name: "Kenya Commercial Bank", code: "xxx", ... }, ...]
};
// Cache this list and refresh weekly
var kenyanBanks = await getKenyanBanks();
Cache the bank list in your application. It does not change often. Present it as a dropdown in your vendor onboarding form so users select their bank by name rather than entering a code manually. This eliminates the most common error: wrong bank code.
const createKenyanBankRecipient = async (name, accountNumber, bankCode) => {
var response = await fetch('https://api.paystack.co/transferrecipient', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'nuban',
name: name,
account_number: accountNumber,
bank_code: bankCode,
currency: 'KES',
}),
});
var data = await response.json();
if (!data.status) {
throw new Error('Recipient creation failed: ' + data.message);
}
return {
recipientCode: data.data.recipient_code,
resolvedName: data.data.details.account_name,
bankName: data.data.details.bank_name,
};
};
Paystack resolves the account at creation time. If the account number and bank code do not match a real account, the request fails. Always show the resolved account name to the user for confirmation before proceeding. A mismatch between the name they entered and the resolved name is a red flag.
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
const sendToKenyanBank = async (recipientCode, amountKES, reason, reference) => {
var amountCents = Math.round(amountKES * 100);
var response = await fetch('https://api.paystack.co/transfer', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
source: 'balance',
amount: amountCents,
recipient: recipientCode,
reason: reason,
reference: reference,
}),
});
var data = await response.json();
if (!data.status) {
throw new Error('Transfer failed: ' + data.message);
}
return data.data;
};
// Usage
var result = await sendToKenyanBank(
'RCP_kenyan_vendor_01',
25000, // 25,000 KES
'Monthly vendor settlement - July 2026',
'vendor_settlement_july_v01'
);
The amount is in cents (the smallest KES unit). 25,000 KES = 2,500,000 cents. Double-check your multiplication, especially when converting from user-facing amounts to API amounts. A mistake here means sending 100x too much or too little.
Kenyan bank transfer settlement depends on several factors.
Same-bank transfers (sender and recipient are at the same bank) tend to be faster because the money does not need to cross the interbank clearing system. These can settle in minutes.
Cross-bank transfers go through the Kenya Bankers Association clearing system. Settlement can take anywhere from 30 minutes to several hours. During peak periods, batch processing, or bank maintenance windows, delays extend.
Business hours matter. Transfers initiated during banking hours (roughly 8 AM to 4 PM EAT, Monday to Friday) generally settle faster than those initiated in the evening, overnight, or on weekends. Weekend and holiday transfers may queue until the next business day, depending on the destination bank.
Month-end and salary periods cause increased processing volumes across the banking system. If your payout run coincides with the 25th-30th of the month (when many companies process payroll), expect longer settlement times.
For time-sensitive payouts in Kenya, M-Pesa transfers are near-instant, and Pesalink offers real-time bank-to-bank settlement. See Pesalink transfers through Paystack for the instant option.
Beyond the standard transfer failure reasons, Kenyan bank transfers have some specific patterns.
Account number format mismatch. Kenyan banks have varying account number lengths and formats. Some use 10 digits, others use 13 or 14. If the account number format does not match what the bank expects, the transfer fails. Validate the account number length against the expected format for the selected bank.
Dormant accounts. Kenyan banks are required to flag accounts as dormant after a period of inactivity (typically 12 months with no transactions). Transfers to dormant accounts fail. The recipient needs to visit their bank to reactivate the account.
CBK compliance holds. The Central Bank of Kenya requires banks to screen certain transfers for compliance. If a transfer triggers a compliance check, it may be held for review, causing delays beyond the normal settlement window. This is more common for larger transfers.
Bank system maintenance. Kenyan banks occasionally take their systems offline for maintenance, usually during late night hours or weekends. Transfers during these windows fail with timeout or system unavailable errors. These are transient and succeed on retry after the maintenance window ends.
Build your retry logic to handle these scenarios. Transient failures (timeouts, maintenance) resolve with a retry after 15-60 minutes. Permanent failures (wrong account, dormant) require recipient action. See managing transfer failures and reversals for the full framework.
Most Kenyan platforms need both bank and M-Pesa payout options. Here is when to use each.
Bank transfers are better for: Large amounts above M-Pesa limits, corporate vendor payments, salary disbursement to employees with bank accounts, and recipients who need bank statements for tax purposes.
M-Pesa is better for: Small to moderate amounts, speed-sensitive payouts (rider settlements, instant payouts), recipients without bank accounts, and rural recipients where M-Pesa agents are more accessible than bank branches.
Let recipients choose during onboarding. Store their preference and create the appropriate recipient type. Some platforms default to M-Pesa (fastest, most accessible) and offer bank transfer as an alternative for high-value payouts.
For the full M-Pesa transfer guide, see transfers to M-Pesa wallets, Paybills, and Tills.
KES 2,999
The definitive guide to building payment systems with Paystack — from your first transaction to production-grade payment infrastructure across Africa. 9 modules, 47 lessons. Free preview available.
Start Paystack Course