Eversend
PlatformGuides
// guide · platform

How to send money to M-Pesa programmatically

5 min read · code-first · updated July 2026
The short answer

Send to any M-Pesa wallet in Kenya with one POST to Eversend's /v1/payouts: rail mpesa, an amount in KES, and the recipient's phone number. Median delivery over our last 90 days of production transfers is 1.6 minutes. Sandbox keys are self-serve, in minutes.

The whole integration

One call. The recipient is a phone number, the rail is a string, and the wallet name comes back before you commit.

payout · m-pesa200 OK
$ curl https://api.eversend.co/v1/payouts \
-H "Authorization: Bearer sk_test_..." \
-d rail=mpesa \
-d amount=25000 -d currency=KES \
-d recipient.phone=+254712345678

Listen for the webhooks

Every payout emits created, processing and delivered events. Point a webhook at your endpoint and treat delivered as the moment to update your user, not the API response, because the rail leg completes after the call returns.

webhook · delivered
{ "type": "payout.delivered",
"id": "pyt_2ma8k1",
"rail": "mpesa", "currency": "KES",
"delivered_in": "1m 34s" }

Then go live

Swap sk_test for sk_live after compliance review. The call does not change, and adding MTN MoMo or Nigerian bank transfer later is the same call with a different rail string.

The full M-Pesa rail, specified.

Measured medians, fees from the source of truth, and the name-check behavior, on one page.

The M-Pesa payout API