Skip to content
Help

Orders

Listing orders, fetching one, and advancing its status.

Public API1 min read

#List orders

http
GET /v1/orders

Scope: orders:read.

ParameterDescription
page, limitPagination. limit defaults to 25, max 100
statuspending, confirmed, preparing, ready, delivering, completed, cancelled
typepickup, delivery, dine_in
branchIdRestrict to one branch. Must be within the key's branch scope
createdAfterISO timestamp, inclusive
createdBeforeISO timestamp, inclusive

Ordered newest first.

bash
curl -G https://api.tryrestro.com/v1/orders \
  -H "Authorization: Bearer $RESTRO_API_KEY" \
  -d status=completed \
  -d createdAfter=2026-07-01T00:00:00Z \
  -d limit=100

#Fetch one order

http
GET /v1/orders/{reference}

Scope: orders:read.

{reference} accepts either the order id or the order number — the sequential one your staff and customers see. Numbers are unique per restaurant, so GET /v1/orders/1042 works.

json
{
  "id": "cmd8x2k9p0001abcdefghijkl",
  "number": 1042,
  "type": "delivery",
  "status": "confirmed",
  "paymentStatus": "paid",
  "paymentProviderId": "stripe",
  "currency": "EGP",
  "subtotal": "160.00",
  "discount": "10.00",
  "creditsUsed": "0.00",
  "deliveryFee": "15.00",
  "vat": "19.00",
  "tipAmount": "0.00",
  "total": "184.00",
  "refundedTotal": "0.00",
  "notes": "Ring the bell twice",
  "deliveryAddress": "12 Nile St, Maadi, Cairo",
  "cancelReason": "",
  "cancelledAt": null,
  "branch": {
    "id": "cmd8w9k1a0002abcdefghijkl",
    "slug": "maadi",
    "name": "Maadi",
    "currency": "EGP"
  },
  "customer": {
    "id": "cmd8wa2b30003abcdefghijkl",
    "name": "Nour Hassan",
    "email": "nour@example.com",
    "phone": "+201000000000"
  },
  "lines": [
    {
      "id": "cmd8xb4c50004abcdefghijkl",
      "menuItemId": "cmd8mn7d80005abcdefghijkl",
      "title": "Falafel plate",
      "quantity": 2,
      "unitPrice": "60.00",
      "lineTotal": "120.00",
      "specialRequest": "extra tahini",
      "options": [
        {
          "id": "cmd8op9e10006abcdefghijkl",
          "customization": "Size",
          "name": "Large",
          "price": "10.00"
        }
      ]
    }
  ],
  "refunds": [],
  "createdAt": "2026-07-28T10:12:04.000Z",
  "updatedAt": "2026-07-28T10:31:22.000Z"
}

Line items store a snapshot of the title and price at the time of ordering. Renaming or repricing a menu item later does not rewrite past orders.

#Update status

http
POST /v1/orders/{reference}/status

Scope: orders:update-status.

json
{
  "status": "ready",
  "reason": ""
}

status is one of confirmed, preparing, ready, delivering, completed, cancelled. reason is optional and only recorded when cancelling.

bash
curl -X POST https://api.tryrestro.com/v1/orders/1042/status \
  -H "Authorization: Bearer $RESTRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"ready"}'

Returns the full updated order.

#Rules

  • An order that is already completed or cancelled cannot be moved. That returns 409.
  • Setting the status it already has is a no-op and returns the order unchanged.
  • Moving to confirmed deducts recipe ingredients from stock, exactly as the dashboard does.
  • Moving to cancelled returns that stock and records cancelReason.
  • Every change fires the matching webhook and is written to the activity log with your key's name as the actor.

#Branches

http
GET /v1/branches

No scope required beyond a valid key. Returns the branches the key can see — useful for resolving the branchId values other endpoints want.

json
{
  "data": [
    {
      "id": "cmd8w9k1a0002abcdefghijkl",
      "name": "Maadi",
      "slug": "maadi",
      "currency": "EGP",
      "status": "open",
      "address": "12 Nile St, Maadi, Cairo",
      "countryCode": "EG",
      "timezone": "Africa/Cairo"
    }
  ]
}

Did this page miss something? Tell us.

Back to top