API reference
Checkouts
Push abandoned checkouts and update their status.
Create or update a checkout
POST /api/v1/stores/{store_id}/checkoutsUpserts an abandoned checkout on (store_id, external_id). Drives
checkout-recovery automations.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
external_id | string(255) | required | Your checkout token. |
abandoned_at | ISO 8601 | required | When the checkout was abandoned. |
total_price | number ≥ 0 | required | Checkout total. |
currency | string(3) | optional | ISO 4217. |
recovery_url | url(1024) | optional | Link the customer uses to resume. |
customer | object | required | Same shape as on orders. |
customer.phone | string | required | Matched to a WhatsApp contact. |
customer.external_id | string(255) | optional | |
customer.first_name | string(255) | optional | |
customer.last_name | string(255) | optional | |
customer.email | email(255) | optional | |
customer.locale | string(10) | optional | |
customer.tags | string[] | optional | |
line_items | object[] | optional | |
tags | string[] | optional | |
metadata | object | optional |
Request
curl -X POST https://api.getkanal.com/api/v1/stores/123/checkouts \
-H "Authorization: Bearer 8fK2pX9mWq4Ld7Vb3Nc6Ts1Z" \
-H "Content-Type: application/json" \
-d '{
"external_id": "CHECKOUT-7700",
"abandoned_at": "2026-05-18T09:40:00Z",
"recovery_url": "https://shop.example.com/checkout/recover/7700",
"total_price": 49.90,
"currency": "EUR",
"customer": { "phone": "+33612345678", "first_name": "Marie" }
}'Response 201 Created / 200 OK
{
"external_id": "CHECKOUT-7700",
"store_id": 123,
"status": "abandoned",
"total_price": "49.90",
"currency": "EUR",
"recovery_url": "https://shop.example.com/checkout/recover/7700",
"tags": [],
"created_at": "2026-05-18T09:40:00+00:00"
}Update a checkout
PATCH /api/v1/stores/{store_id}/checkouts/{external_id}| Field | Type | Notes |
|---|---|---|
status | enum | One of active, abandoned, recovered, completed, expired. |
recovery_url | url(1024) | |
tags | string[] | Replaces tags. |
metadata | object | Free-form. |
curl -X PATCH https://api.getkanal.com/api/v1/stores/123/checkouts/CHECKOUT-7700 \
-H "Authorization: Bearer 8fK2pX9mWq4Ld7Vb3Nc6Ts1Z" \
-H "Content-Type: application/json" \
-d '{ "status": "recovered" }'Response 200 OK — same shape as the create response.