Real-time status
Follow an app payment as it moves: server-sent events or polling, and what each status means.
Money takes seconds to minutes to move. There are two ways to follow it.
Server-sent events
GET /api/v1/funding/{id}/live keeps the connection open and sends an event with the full top-up now and on every change. It closes itself once progress.terminal is true.
curl -N "https://api.autopayke.com/api/v1/funding/3e5b2a90-8c1d-4f6e-b0a2-1c9d7e4f5a33/live" \
-H "Authorization: Bearer $AUTOPAYKE_TOKEN"Polling
Where a long-lived connection isn't practical, poll GET /api/v1/funding/{id} every 2 seconds while someone is watching, and every 30 seconds otherwise. Stop when progress.terminal is true.
Progress
Every top-up carries a progress object: the stages from request to balance, each done, active, pending or failed, with the time it happened. It's what the app shows on its own tracking screen, so you can show the same steps.
{
"stages": [
{
"key": "requested",
"title": "Payment requested",
"detail": "We sent a prompt to +254 712 ••• 678",
"state": "done",
"at": "2026-11-03T09:10:00.000Z"
},
{
"key": "payer",
"title": "Waiting for approval",
"detail": "Approve the prompt with your M-Pesa PIN",
"state": "active",
"at": null
},
{
"key": "credited",
"title": "In your balance",
"detail": "",
"state": "pending",
"at": null
}
],
"terminal": false,
"hint": "This usually takes under a minute."
}Outbound webhooks to your own URL aren't offered yet. If you need them, say so in partner access.