☰ Menu · Orders
API reference

Orders

Carts guests send from the QR menu at a table.

The order object

numberinteger
Short number to say out loud and print on the kitchen ticket.
statusstring
new, accepted, preparing, ready, served, completed, rejected, cancelled.
tablestring or null
From the table link ?table=, or typed by the guest.
notestring or null
The guest's comment.
subtotal, currency, item_count
Priced by us from the menu at the time of the order.
items[]array
item_id, external_id (your SKU), name, quantity, unit_price, total, options[] with their own external_id and price_delta.
external_idstring or null
Your order id, set on accept.
guest_languagestring
The menu language the guest used.
JSON
{
  "object": "order",
  "id": "0c69a81c-0fbc-4333-b26c-789566b9bea4",
  "number": 10,
  "status": "new",
  "table": "7",
  "note": "No onions, please",
  "currency": "MDL",
  "subtotal": 14000,
  "item_count": 2,
  "items": [
    {
      "item_id": "a48343bd-9f6e-424a-b003-fe790617f4d6",
      "external_id": "2040",
      "name": "Zeamă",
      "quantity": 2,
      "unit_price": 7000,
      "total": 14000,
      "options": []
    }
  ],
  "external_id": null,
  "reject_reason": null,
  "guest_language": "en",
  "source": "qr_menu",
  "livemode": true,
  "created_at": "2026-10-06T18:14:48.233+00:00",
  "accepted_at": null,
  "completed_at": null,
  "updated_at": "2026-10-06T18:14:48.233+00:00"
}
GET/v1/orders
Scope: orders:read

Newest first. Filter by ?status=new (repeat it or separate with commas). Paginated.

curl
curl "https://loyaltyfy.io/api/v1/orders?status=new" \
  -H "Authorization: Bearer sk_test_..."
GET/v1/orders/{order}
Scope: orders:read

One order.

POST/v1/orders/{order}/accept
Scope: orders:write

Moves a new order to accepted. Pass your own order id as external_id; it must be unique per venue.

curl
curl -X POST https://loyaltyfy.io/api/v1/orders/0c69a81c-0fbc-4333-b26c-789566b9bea4/accept \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "external_id": "POS-ORDER-55821" }'
POST/v1/orders/{order}/reject
Scope: orders:write

Declines a new order. reason is optional and kept with the order.

curl
curl -X POST https://loyaltyfy.io/api/v1/orders/0c69a81c-0fbc-4333-b26c-789566b9bea4/reject \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "reason": "Kitchen closes at 22:00" }'
PATCH/v1/orders/{order}
Scope: orders:write

Sets status (forward only, steps can be skipped; any open order can be cancelled with a reason). Sending the current status again is a no-op. Sends order.updated with previous_status.

curl
curl -X PATCH https://loyaltyfy.io/api/v1/orders/0c69a81c-0fbc-4333-b26c-789566b9bea4 \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "status": "ready" }'
Questions about an integration: api@loyaltyfy.io. We answer within one business day.