+254 722 117 850 Support Login
Products Payments
M-Pesa · Live

One API call. Money on your shortcode in 12 seconds.

Fire an M-Pesa STK Push to a customer's phone, let Safaricom handle the PIN, get a webhook the moment it confirms. Or share a hosted pay-link if your customer isn't on Safaricom. OTP-protected receipts kill screenshot fraud at the till.

Bring your own Daraja OTP-verified receipts Hosted pay-link
M-PESA STK Push · Galaxion Stores
Lipa Na M-Pesa Pay KSh 2,400 to
GALAXION STORES
Ref: INV-4821 · OTP appears in receipt
Confirmation SMS RJ12X9PQRS Confirmed. KSh 2,400.00 sent to GALAXION STORES on 18/5/26 at 4:21 PM. OTP: 8392
Webhook fired POST yourapp/pay/confirm → 200 OK
Endpoint POST /api/v1/zuka/push
Hosted link sozuri.net/zuka/pay/{code}
Rail M-Pesa Daraja (BYO credentials)
Confirmation SMS + webhook + OTP
How it works

From cart to settled, in three calls

Bring your own Safaricom Daraja credentials — Sozuri orchestrates the push, the polling, the confirmation SMS and the webhook. You stay in control of the paybill.

1

Trigger an STK Push

POST phone, amount and an account_reference (max 12 chars). The customer's phone receives the M-Pesa prompt within 2 seconds.

2

Customer enters PIN

Safaricom handles the PIN prompt natively on the phone. You poll /status/{checkoutRequestId} every ~5 seconds — or just wait for the webhook.

3

SMS + webhook fire together

The customer gets an OTP-stamped confirmation SMS. Your endpoint gets a JSON webhook with the full M-Pesa C2B payload (TransID, TransAmount, MSISDN, names).

In the API

Three fields. One STK Push.

Phone in any Kenyan format (Sozuri normalises). Amount as an integer (minimum 1 KES). Optional reference (visible on the customer's M-Pesa receipt).

  • Synchronous response with checkout_request_id
  • Poll /zuka/pay/{code}/status/{id} for pending state
  • Webhook delivers final state with full Safaricom payload
Full API reference →
stk-push.sh
# Trigger an STK Push to a customer's phone
curl -X POST "https://api.sozuri.net/v1/zuka/push" \
  -H "Authorization: Bearer $SOZURI_API_KEY" \
  -d '{
    "phone":             "0712345678",
    "amount":            2400,
    "account_reference": "INV-4821"
  }'

# Response
{
  "message":              "STK push initiated",
  "checkout_request_id":  "ws_CO_1801202611220129...",
  "merchant_request_id":  "29115-34620561-1"
}
The Safaricom rule STK Push only reaches Safaricom subscribers. For Airtel & Telkom customers, share the hosted pay-link at sozuri.net/zuka/pay/{code} — same backend, same webhook, different prompt.
What you get

Built around the way Kenyan businesses actually collect

STK Push

The native M-Pesa prompt — appears on the customer's phone in 2 seconds, no app, no QR, no friction.

Hosted pay-link

A branded URL you can share over WhatsApp, SMS, email or QR code. Works for every customer, every network.

OTP-protected SMS

Confirmation SMS includes a numeric OTP shared between customer and cashier — eliminates the screenshot-fraud problem.

Status polling + webhook

Belt-and-braces: poll the status endpoint for in-progress UI, listen on the webhook for the authoritative answer.

Cashier & manager alerts

Optional CC SMS to up to three operator phones for every confirmed payment. No more "did it come through?" at the till.

Bring your own Daraja

You own the paybill, you own the funds. Sozuri orchestrates calls against your Consumer Key, Secret and Passkey — the money never sits with us.

In the wild

The retail till that finally trusts its M-Pesa.

Galaxion Stores switched their cashier flow to Sozuri-orchestrated STK plus OTP-stamped receipts. Screenshot fraud dropped to zero. End-of-day reconciliation runs in minutes — not hours.

  • Cashier sees the OTP on their own phone
  • Customer sees the same OTP on theirs
  • Both match before the goods leave the till
  • End-of-day reports auto-emailed from the dashboard
Set up Zuka →
CASHIER PHONE · PETER SMS · Galaxion till 2
Payment IN KSh 2,400 from ALICE WANJIRU · Ref INV-4821 · OTP: 8392
Manager: Confirmed, release the order. Daily total so far KSh 184,200.16:21
Common questions

What founders ask before they switch

Do you hold the money at any point?

No. You bring your own Safaricom Daraja credentials (Consumer Key, Secret, Passkey). The funds settle directly into your paybill. Sozuri orchestrates the API calls but never touches the money.

What if the customer isn't on Safaricom?

STK Push only works on Safaricom numbers. Share the hosted pay-link instead — sozuri.net/zuka/pay/{code}. The customer opens the link, enters their phone, gets the prompt. Same webhook, same receipt.

How long does the customer have to enter their PIN?

Safaricom times the STK prompt out at 120 seconds. Sozuri polls the status endpoint to detect outcomes earlier. Best practice: poll every 5 seconds until you see confirmed, fail or 2 minutes elapses.

What does the OTP do, exactly?

The confirmation SMS includes a 4-digit OTP. The same OTP appears in the receipt sent to your cashier/operator phones. Before releasing goods, both phones must show the same OTP — defeats screenshot fraud and fake confirmation messages.

KSh 2,400 CONFIRMED · OTP 8392 Customer SMS · Cashier SMS · Webhook all three fire together
Your move

Stop chasing M-Pesa confirmations.

One API call. One STK Push. One webhook. End-of-day reports that match the till to the shilling. Bring your Daraja credentials, we'll do the orchestration.

Chat on WhatsApp
Your first SMS in the time it takes to brew coffee. Start building in minutes