Developers · Orders

Every order, every channel — one stream.

Pull live orders for an in-house dispatcher. Build a custom analytics warehouse off the order history. React to status transitions in real time via webhooks. The Orders API gives you the same data the POS, the kiosk and the driver app see, with the same latency.

Channel-agnostic by design. Web, app, kiosk, walk-in, phone, every aggregator — all one shape.

Eight states. Every transition timestamped.

From the moment an order lands at a location until it leaves the door (or is handed across the counter) every state change is recorded. You can poll, you can subscribe via webhooks, you can replay history.

1Created
2Accepted
3Preparing
4Ready
5Dispatched
6Delivered
7Cancelled
8Refunded

Reads — Queries API

  • GET /organizations/{orgId}/orders/live?LocationId={locationId}
  • GET /organizations/{orgId}/orders
  • GET /organizations/{orgId}/orders/{id}
  • GET /organizations/{orgId}/orders/by-reference/{scheme}/{value}
  • GET /organizations/{orgId}/customers/{id}/orders
  • GET /organizations/{orgId}/orders/{id}/audit

Writes — Commands API

  • POST /organizations/{orgId}/orders/{id}/accept
  • POST /organizations/{orgId}/orders/{id}/cancel
  • POST /organizations/{orgId}/orders/{id}/refund
  • PUT /organizations/{orgId}/orders/{id}/status

Six things every order integration needs.

1. Live orders for a location

Returns the active order list at a single location — anything not yet completed or cancelled. Sub-second cache, perfect for an internal dispatcher screen, a custom KDS or a heads-up overlay.

GET
Request
GET /organizations/{organizationId}/orders/live?LocationId={locationId}
Authorization: Bearer <access_token>
Response — 200 OK
{
  "values": [
    {
      "id": "a91c2f44-1d7e-4b88-9cb1-44e2cf3a2ec0",
      "reference": "#5482",
      "locationId": "7f2b6c9e-1a4d-4f12-9b23-5c8e0d1a3b42",
      "channel": "Web",
      "occasion": "Delivery",
      "status": "Preparing",
      "createdTimeUtc": "2026-04-19T18:42:11Z",
      "acceptedTimeUtc": "2026-04-19T18:42:14Z",
      "requestedDispatchTimeUtc": "2026-04-19T19:10:00Z",
      "customer": { "name": "S. Patel", "phoneNumber": "+44…" },
      "total": { "currency": "GBP", "amount": 28.40 }
    }
  ]
}

2. Search the order history

Same endpoint, broader filter set. Filter by status group, occasion, channel, time window or free-text search across reference, customer name and email. Paginated; the response wraps the array in a values envelope alongside page, pageSize and totalCount.

GET
Request
GET /organizations/{organizationId}/orders
    ?LocationId=7f2b6c9e-1a4d-4f12-9b23-5c8e0d1a3b42
    &StatusGroup=Completed
    &Occasion=Delivery
    &CreatedFromUtc=2026-04-12T00:00:00Z
    &CreatedToUtc=2026-04-19T00:00:00Z
    &page=1
    &pageSize=50
    &sortBy=createdTimeUtc
    &sortDirection=Descending
Authorization: Bearer <access_token>
Response — 200 OK
{
  "page": 1,
  "pageSize": 50,
  "totalCount": 3142,
  "values": [
    { "id": "…", "reference": "#5481", "status": "Delivered", "total": { "amount": 19.20 } },
    { "id": "…", "reference": "#5480", "status": "Delivered", "total": { "amount": 42.80 } }
  ]
}

3. Pull a single order in full

The detail view returns lines, modifiers, applied deals, charges (delivery fee, service charge, processing fee), payment records, the audit trail of state transitions, the assigned driver if any, and the complete address with what3words.

GET
Request
GET /organizations/{organizationId}/orders/{id}
Authorization: Bearer <access_token>
Response — 200 OK
{
  "id": "a91c2f44-1d7e-4b88-9cb1-44e2cf3a2ec0",
  "version": 7,
  "reference": "#5482",
  "locationId": "7f2b6c9e-…",
  "status": "Preparing",
  "channel": "Web",
  "occasion": "Delivery",
  "lines": [
    {
      "productId": "a1c23f44-…",
      "name": "Margherita (Large)",
      "quantity": 1,
      "unitPrice": 14.50,
      "modifiers": [
        { "name": "Extra Cheese", "price": 1.50 }
      ]
    }
  ],
  "charges": [
    { "type": "DeliveryFee", "amount": 2.50 }
  ],
  "payments": [
    { "type": "Card", "amount": 28.40, "reference": "pi_3O…" }
  ],
  "address": {
    "line1": "24 Granby Road", "city": "Leicester", "postCode": "LE1 6FB"
  }
}

4. Look up an order by external reference

Every aggregator and channel attaches its own identifier. Use the by-reference endpoint to resolve them to an Andromeda order id without scanning the history. Useful when handling a webhook from Uber Eats, Deliveroo, Just Eat or your own system.

GET
Request — Uber Eats order reference
GET /organizations/{organizationId}/orders/by-reference/ExternalOrderId/19c2f1ab-5d3e-4ac8-b711-3f0d4e2a1b9c
Authorization: Bearer <access_token>
Response — 200 OK
{
  "id": "a91c2f44-1d7e-4b88-9cb1-44e2cf3a2ec0",
  "reference": "#5482",
  "status": "Preparing",
  "identifiers": [
    { "scheme": "ExternalOrderId", "value": "19c2f1ab-…" },
    { "scheme": "AggregatorChannel",  "value": "UberEats" }
  ]
}

5. Refund an order

Refund the whole order or specific lines. The Commands API records the refund as a domain event, settles against the original payment provider (Stripe Connect, your acquiring bank), and propagates back to the customer’s order history within seconds.

POST
Request — full refund
POST /organizations/{organizationId}/orders/{id}/refund
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "reason": "CustomerComplaint",
  "notes": "Margherita arrived cold",
  "amount": { "currency": "GBP", "amount": 28.40 }
}
Response — 202 Accepted
{
  "refundId": "4d8a91f2-…",
  "orderId": "a91c2f44-…",
  "status": "Pending",
  "providerReference": "re_3OabcXYZ…"
}

6. Subscribe to order events via webhook

Polling is fine; webhooks are better. Register a delivery URL on your tenant, choose the event topics you care about, and Andromeda will post a signed JSON payload to your endpoint within a second of every state change. Retries with exponential back-off; HMAC-SHA256 signature in the X-Andromeda-Signature header. See the Integrations page for the full webhook contract.

POST
Webhook payload — order.status.changed
POST https://your-app.example.com/andromeda/webhook
X-Andromeda-Signature: sha256=8d2f3e…
X-Andromeda-Event: order.status.changed

{
  "eventId": "f4e2c9a1-…",
  "event": "order.status.changed",
  "organizationId": "…",
  "locationId": "7f2b6c9e-…",
  "orderId": "a91c2f44-…",
  "reference": "#5482",
  "from": "Preparing",
  "to": "Ready",
  "occurredTimeUtc": "2026-04-19T18:54:02Z"
}

Keep going.

Build something on top of Andromeda.

Test environment, sandbox tenant, sample data, real endpoints. No commitment.