Skip to content

Menus & modifiers

GET /stores/{store_id}/menu returns everything you need to render a store’s menu in one response.

{
"data": {
"store": { "id": "…", "name": "Burger Lab", "status": "open", "…": "…" },
"currency": "AED",
"categories": [
{
"id": "…", "name": "Burgers", "name_ar": "برغر",
"items": [
{
"id": "66f1a2b3c4d5e6f708192a50",
"name": "Classic Burger",
"description": "Beef patty, cheddar, house sauce",
"image_url": "https://…/classic.jpg",
"price": 30.0,
"original_price": null,
"available": true,
"modifier_groups": [
{
"id": "…", "name": "Choose your size",
"required": true, "min_select": 1, "max_select": 1,
"options": [
{ "id": "…", "name": "Regular", "price": 0 },
{ "id": "…", "name": "Large", "price": 5 }
]
}
]
}
]
}
]
}
}
  • price is the price the customer pays now. If the item is discounted, original_price holds the undiscounted price so you can show a strike-through.
  • A modifier option’s price is added to the item price (and multiplied by the quantity).
  • You never send prices when ordering. The order response returns the authoritative pricing; display that, not your own sum.

Each group tells you how to let the customer choose:

FieldMeaning
requiredThe customer must pick at least min_select options
min_selectMinimum choices (0 for optional groups)
max_selectMaximum choices; null means unlimited

Send the chosen option ids as modifier_ids on the order line. Option ids come from options[].id.

{ "item_id": "66f1a2b3c4d5e6f708192a50", "quantity": 2, "modifier_ids": ["…large option id…"] }
  • available: false — the item is sold out or hidden right now. Show it greyed out, or hide it. Ordering it returns 422 item_unavailable.
  • Store status and accepting_orders change with opening hours, pauses and restaurant availability. A menu cached for a few minutes is fine; confirm the store is still open when the customer checks out.

Names and descriptions come with Arabic variants where the restaurant provides them (name_ar, description_ar); the field is null when there is none.

Menus change rarely during service. Cache per store for 2–5 minutes and refresh on checkout. There are no ETag headers; do not poll a menu faster than once a minute.