KanalKanal API
API reference

Orders

Create, update and patch orders.

Create or update an order

POST /api/v1/stores/{store_id}/orders

Upserts an order on (store_id, external_id).

Body

FieldTypeRequiredNotes
external_idstring(255)requiredYour order id. Natural key.
placed_atISO 8601requiredWhen the order was placed.
total_pricenumber ≥ 0requiredOrder total.
currencystring(3)optionalISO 4217, e.g. EUR.
financial_statusstring(64)optionale.g. pending, paid.
fulfillment_statusstring(64)optionale.g. unfulfilled.
customerobjectrequiredSee below.
customer.phonestringrequiredMatched to a WhatsApp contact.
customer.external_idstring(255)optionalYour customer id.
customer.first_namestring(255)optional
customer.last_namestring(255)optional
customer.emailemail(255)optional
customer.localestring(10)optionale.g. fr.
customer.tagsstring[]optional
customer.lifetime_valueinteger ≥ 0optional
customer.orders_countinteger ≥ 0optional
line_itemsobject[]optionalFree-form line items.
tagsstring[]optional
metadataobjectoptionalFree-form.

Request

curl -X POST https://api.getkanal.com/api/v1/stores/123/orders \
  -H "Authorization: Bearer 8fK2pX9mWq4Ld7Vb3Nc6Ts1Z" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "ORDER-1001",
    "placed_at": "2026-05-18T10:00:00Z",
    "total_price": 49.90,
    "currency": "EUR",
    "customer": { "phone": "+33612345678", "first_name": "Marie" }
  }'

Response 201 Created / 200 OK

{
  "external_id": "ORDER-1001",
  "store_id": 123,
  "total_price": "49.90",
  "currency": "EUR",
  "financial_status": null,
  "fulfillment_status": null,
  "tags": [],
  "created_at": "2026-05-18T10:00:00+00:00"
}

Update an order

PATCH /api/v1/stores/{store_id}/orders/{external_id}

Patches status/tags on an existing order. Returns 404 if the order does not exist. All fields optional; only provided fields change.

FieldTypeNotes
financial_statusstring(64)e.g. paid, refunded.
fulfillment_statusstring(64)e.g. fulfilled.
tagsstring[]Replaces tags.
metadataobjectFree-form.
curl -X PATCH https://api.getkanal.com/api/v1/stores/123/orders/ORDER-1001 \
  -H "Authorization: Bearer 8fK2pX9mWq4Ld7Vb3Nc6Ts1Z" \
  -H "Content-Type: application/json" \
  -d '{ "financial_status": "paid" }'

Response 200 OK — same shape as the create response.

On this page