Appearance
The checkout object
data from POST /checkouts and GET /checkouts/{id}.
json
{
"id": "cs_ke_3f9a1c7e5b2d4a8e6c0b91d7",
"url": "https://…/checkout/cs_ke_3f9a1c7e5b2d4a8e6c0b91d7",
"status": "open",
"amount": "150000",
"currency": "KES",
"reference": "order-1042",
"description": "2× Latte, 1× Mandazi",
"return_url": "https://yourshop.example/paid",
"expires_at": "2026-09-30T09:30:00.000Z",
"created_at": "2026-09-30T09:00:00.000Z",
"payment": null
}Fields
| Field | Type | |
|---|---|---|
id | string | cs_ke_… or cs_ug_…, then 24 hex characters |
url | string | Hosted page. Redirect the payer here |
status | string | open, completed, or expired. See How a checkout works |
amount | string | Minor units. "150000" is 1,500.00 |
currency | string | KES or UGX, from the host |
reference | string or null | Your value. The payer page does not show it |
description | string or null | Your value. The payer page shows it |
return_url | string or null | Your value |
expires_at | string | ISO 8601 UTC |
created_at | string | ISO 8601 UTC |
payment | object or null | Latest attempt. null until someone tries to pay |
The merchant object does not include the phone you sent at create. It does not include the M-Pesa Pay Bill numbers. Those are on the payer page.
payment
| Field | Type | |
|---|---|---|
intent_id | string | pi_… |
status | string | created, reserved, submitted, pending, completed, failed, expired, or reversed |
amount_settled | string or null | Minor units received. null until settled |
provider_receipt | string or null | Mobile-money receipt. null until settled |
phone | string | Payer phone number |
payment is the latest attempt only.
Status
status | Meaning | Do this |
|---|---|---|
open | Payable, or a payment is in flight | Wait. Do not fulfill |
completed | The money landed | Fulfill once |
expired | Time passed, and nothing is in flight | Do not fulfill from this checkout |
On Kenya, an exact Pay Bill payment can move expired to completed. Read the checkout again if the customer says they paid from the menu.
Fulfill on status. Use payment.status only to see why a checkout is still open.