Sapa Moto

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.

Order with cash on delivery
{
  "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

methodHow the recipient paysWhere the money goes
cashcash to the courierthe 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_qrscans your Kaspi QRstraight 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
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:

POST <your URL> — order.delivered
{
  "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”.

These docs are built from the platform's OpenAPI specification. Download OpenAPI