OnLink
ConceptsRails

KES

Partner payouts settle to a registered bank account. Mobile money is not a partner payout destination.

Kenyan shillings reach you, or leave you, through a bank account registered against your partner account.

Payouts (sell flow)

A KES payout settles to one of your registered payout accounts. Read them with GET /v1/payout-accounts and pass the one you want as payoutAccountId when you create a sell order.

M-PESA and PesaLink are not partner payout destinations

Whatever a general list of Kenyan rails might suggest, a partner payout cannot land in an M-PESA wallet or be sent over PesaLink today. The destination is a registered bank account.

If your product assumes a payout can reach a mobile money wallet, that assumption needs revisiting before you build — it is the single most common mismatch between what teams expect here and what the rail does.

Payout accounts are registered with us rather than created over the API; there is no POST /v1/payout-accounts. An account that cannot receive is refused at order creation with PAYOUT_ACCOUNT_NOT_PAYABLE.

Collections (buy flow)

Your payers send KES to a collection account issued to you. The create response carries paymentInstructions, and GET /v1/funding is the source of truth for them.

Two rails reach that account, and they differ in one way that matters:

RailAttribution
M-PESA paybillBy the Account Number, which is your dedicated collection account. M-PESA carries no narration field, so paymentReference cannot travel on it.
Bank transfer (PesaLink, RTGS, EFT)By paymentReference in the narration, which is delivered on these rails and gives exact attribution.

Pay the exact amount, before the order's deadline. See References and attribution for what happens when a payment cannot be attributed.

Precision

KES carries at most 2 decimal places, always as a string. See Money.

On this page