Skip to main content
A payout sends money out to a recipient — a wallet or a bank account. This is a different thing from a refund, which sends money back to a payer who already paid you. Payouts use a different endpoint, a different lifecycle, and a different set of status values than payments or refunds. Do not mix the two up.

Payout methods

The request body is the same shape for every method — only payout_type and payout_method_data change.
MTN MoMo payouts use currency: "EUR". The other five methods use currency: "KES".
The three wallet methods take an empty object, since the recipient is identified by phone and phone_country_code. The three bank methods need their own payout_method_data: PesaLinkpayout_type: "bank"
For valid bank_code values, see the PesaPay bank codes page. Paybillpayout_type: "bank"
Paytillpayout_type: "bank"
The account numbers above are illustrative — replace them with the recipient’s actual paybill, till, or PesaLink account details.
1

Create and confirm the payout

Send a POST request to /payouts/create with confirm: true. Along with amount, currency, profile_id, phone, and phone_country_code, you choose a payout_type and fill in the matching payout_method_data.Here is a full example for M-Pesa Express:
A successful call returns a 200 with a payout object. The fields that matter right now:
The payout has been accepted for processing, but it has not necessarily reached the recipient yet.
2

Poll for the final status

Poll the payout with force_sync=true until the status settles:

Status reference

These are the only values status can take on a payout (PayoutStatus):
The terminal success value is success, not succeeded. succeeded is a payment status — it does not exist on payouts. Checking for the wrong string is a common source of payouts that look “stuck” when they actually completed.

Common errors

PesaLink, Paybill, and Paytill all require account_id in payout_method_data.bank. Omitting it fails validation before the payout is even created.
If phone is not registered for the wallet named in payout_type (for example, a number with no M-Pesa account), the payout fails at the connector even though the request itself is valid.
Payout completion is success. Code copied from a payments integration that checks for succeeded will never match and will poll forever.

Next steps

Refunds

Send money back to a payer instead.

Quickstart

The full create-and-poll payment loop.

Wallet payments

M-Pesa, Airtel, and MTN MoMo payments.