Skip to content

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 ​

FieldType
idstringcs_ke_… or cs_ug_…, then 24 hex characters
urlstringHosted page. Redirect the payer here
statusstringopen, completed, or expired. See How a checkout works
amountstringMinor units. "150000" is 1,500.00
currencystringKES or UGX, from the host
referencestring or nullYour value. The payer page does not show it
descriptionstring or nullYour value. The payer page shows it
return_urlstring or nullYour value
expires_atstringISO 8601 UTC
created_atstringISO 8601 UTC
paymentobject or nullLatest 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 ​

FieldType
intent_idstringpi_…
statusstringcreated, reserved, submitted, pending, completed, failed, expired, or reversed
amount_settledstring or nullMinor units received. null until settled
provider_receiptstring or nullMobile-money receipt. null until settled
phonestringPayer phone number

payment is the latest attempt only.

Status ​

statusMeaningDo this
openPayable, or a payment is in flightWait. Do not fulfill
completedThe money landedFulfill once
expiredTime passed, and nothing is in flightDo 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.

Staging documentation. Staging charges real money. See Environments.