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 } ] } ] } ] } ] }}Prices
Section titled “Prices”priceis the price the customer pays now. If the item is discounted,original_priceholds the undiscounted price so you can show a strike-through.- A modifier option’s
priceis 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.
Modifier groups
Section titled “Modifier groups”Each group tells you how to let the customer choose:
| Field | Meaning |
|---|---|
required | The customer must pick at least min_select options |
min_select | Minimum choices (0 for optional groups) |
max_select | Maximum 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…"] }Availability
Section titled “Availability”available: false— the item is sold out or hidden right now. Show it greyed out, or hide it. Ordering it returns422 item_unavailable.- Store
statusandaccepting_orderschange with opening hours, pauses and restaurant availability. A menu cached for a few minutes is fine; confirm the store is stillopenwhen the customer checks out.
Languages
Section titled “Languages”Names and descriptions come with Arabic variants where the restaurant provides them (name_ar, description_ar); the field is null when there is none.
Caching
Section titled “Caching”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.