Cash on delivery
The courier collects payment for your goods — in cash, or through your own Kaspi QR.
Cash on delivery (COD) is enabled per organization in the contract. Without it an order with cod is refused with
422 cod_not_allowed; an amount above the contract limit — 422 cod_limit_exceeded.
{
"external_id": "SHOP-100246",
"pickup": { "point_id": "0192e8a0-11aa-7b3c-9d4e-6f7a8b9c0d1e" },
"dropoff": { "address": "Алматы, Жандосова 58", "latitude": 43.214, "longitude": 76.88 },
"recipient": { "phone": "+77011234567" },
"cod": { "amount_tiyn": 500000, "method": "cash" }
}amount_tiyn is the amount to collect in tiyn (5 000 ₸ = 500000). COD adds a surcharge to the delivery price —
price it with the same cod in the quote.
Two methods
method | How the recipient pays | Where the money goes |
|---|---|---|
cash | cash to the courier | the courier keeps it; it is offset against your delivery invoice (settlement: to_offset); if the cash exceeds the invoice, Sapa Moto pays the difference to you |
kaspi_qr | scans your Kaspi QR | straight to you (settlement: paid_to_client); the money never passes through Sapa Moto |
Kaspi QR: report the payment
For kaspi_qr the courier hands the order over only after the payment is confirmed. Your system learns it from
Kaspi and reports it:
curl https://partner.sapamoto.kz/v1/orders/SHOP-100246/payment \
-H "Authorization: Bearer $SAPA_KEY" -H "Content-Type: application/json" \
-d '{"status": "paid", "reference": "KASPI-7788123"}'status is paid or failed; the order shows it as payment_status.
On delivery
order.delivered carries what was collected:
{
"api_version": "v1",
"created_at": "2026-10-24T09:12:30Z",
"data": {
"cod": {
"amount": {
"amount": 500000,
"currency": "KZT"
},
"method": "cash",
"settlement": "to_offset"
},
"external_id": "SHOP-100245",
"order_id": "0192f1b2-6d4e-7a10-b3c2-8e1f0d9a4c57",
"proof": {
"code_verified": true,
"delivered_at": "2026-10-24T09:53:10Z",
"latitude": 43.21402,
"longitude": 76.88011,
"method": "code_and_photo"
},
"status": "delivered",
"version": 9
},
"event_id": "0192f1c5-0a1b-7c2d-8e3f-4a5b6c7d8e9f",
"livemode": true,
"order_id": "0192f1b2-6d4e-7a10-b3c2-8e1f0d9a4c57",
"order_version": 9,
"type": "order.delivered"
}Fiscal receipt. The seller (you) sends the electronic fiscal receipt to the buyer — use order.delivered as the
signal. GET /v1/orders/{id}/proof also returns cod.
Cash orders appear in your period reconciliation as “to offset”.