Bonaventure OgetoBy Bonaventure Ogeto|

Transfers to Kenyan Bank Accounts via Paystack

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.

Getting Kenyan Bank Codes

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.

Creating Kenyan Bank Recipients

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.

Initiating KES Bank Transfers

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.

Settlement Timing for Kenyan Banks

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.

Common Failure Scenarios for Kenyan Banks

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.

Choosing Between Bank and M-Pesa for Kenyan Payouts

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.

Build for the Kenyan Market

Kenyan bank transfers are one piece of the payment puzzle. Understanding when to use banks vs M-Pesa vs Pesalink gives your product the best coverage across the Kenyan market.

The McTaba bootcamp covers payment integration for the East African market. You build real products that handle the complexity of Kenya's payment landscape.

Create a free McTaba account

Key Takeaways

  • Kenyan bank recipients use the nuban type with Kenyan bank codes and KES currency. Get bank codes from GET /bank?country=kenya.
  • Settlement timing for Kenyan bank transfers varies. Same-bank transfers are faster. Cross-bank transfers go through interbank clearing and can take minutes to hours.
  • Amounts are in cents (1 KES = 100 cents). To send 10,000 KES, pass 1000000.
  • Bank transfers are better than M-Pesa for large amounts, corporate accounts, and recipients who prefer bank settlement.
  • For instant bank-to-bank transfers, consider Pesalink where available through Paystack.
  • Common failures include wrong bank codes, account number mismatches, and bank maintenance windows.

Frequently Asked Questions

Does Paystack support all Kenyan banks?
Paystack supports a wide range of Kenyan banks. Call GET /bank?country=kenya to see the current list of supported banks. If a specific bank is not listed, the recipient would need to provide an account at a supported bank or accept M-Pesa payouts instead.
Can I send KES transfers from an NGN Paystack balance?
No. Transfers must use the same currency as your Paystack balance. To send KES transfers, you need a KES balance funded by KES payments or KES deposits. You cannot convert NGN to KES through Paystack.
What happens if I use the wrong bank code for a Kenyan account?
Recipient creation will likely fail because Paystack validates the account number against the bank code. If by some chance it passes validation but the bank code is wrong, the transfer will fail when the interbank system cannot route the payment. Always let users select banks from a dropdown populated by the List Banks endpoint.

Ready to build real-world apps?

Join the McTaba Labs full-stack marathon (4 months full-time · 6 months part-time). Learn M-Pesa, USSD, and WhatsApp engineering while shipping 8 production apps.

Apply to the McTaba Marathon