Menu
Reading categories and items, and writing prices and availability.
#List categories
GET /v1/menu/categoriesScope: menu:read. Takes page and limit. Ordered by the sort order you set in the dashboard.
{
"data": [
{
"id": "cmd8ct1a90007abcdefghijkl",
"title": "Mains",
"slug": "mains",
"sortOrder": 1,
"createdAt": "2026-02-01T09:00:00.000Z",
"updatedAt": "2026-06-14T11:20:00.000Z"
}
],
"pagination": { "page": 1, "limit": 25, "total": 6, "totalPages": 1, "hasMore": false }
}#List items
GET /v1/menu/itemsScope: menu:read.
| Parameter | Description |
|---|---|
page, limit | Pagination |
categoryId | Items in one category |
published | true or false |
search | Substring match on the item slug |
#Fetch one item
GET /v1/menu/items/{itemId}Scope: menu:read.
{
"id": "cmd8mn7d80005abcdefghijkl",
"title": "Falafel plate",
"slug": "falafel-plate",
"description": "Six pieces, tahini, pickles",
"published": true,
"imageUrl": "https://cdn.tryrestro.com/items/falafel.jpg",
"allowSpecialRequests": true,
"unavailableUntil": null,
"unavailableReason": null,
"category": {
"id": "cmd8ct1a90007abcdefghijkl",
"title": "Mains",
"slug": "mains"
},
"prices": [
{
"branchId": "cmd8w9k1a0002abcdefghijkl",
"branchSlug": "maadi",
"currency": "EGP",
"price": "60.00",
"vat": "14.00",
"listed": true
}
],
"createdAt": "2026-02-01T09:12:00.000Z",
"updatedAt": "2026-07-20T08:00:00.000Z"
}Localized text is flattened to the restaurant's default language. Titles and descriptions come back as plain strings.
#Update an item
PATCH /v1/menu/items/{itemId}Scope: menu:write.
Every field is optional, but the body must contain at least one of published, unavailableUntil, or prices.
{
"published": true,
"unavailableUntil": "2026-07-28T22:00:00.000Z",
"unavailableReason": "SOLD_OUT",
"unavailableNote": "Back tomorrow",
"prices": [
{ "branchId": "cmd8w9k1a0002abcdefghijkl", "price": 65, "vat": 14, "listed": true }
]
}#Publication
published is the permanent switch. false hides the item everywhere.
#Availability
unavailableUntil is the temporary snooze, matching the dashboard's behaviour:
- An ISO timestamp hides the item until then. It must be in the future and no more than 30 days out.
nullclears the snooze and makes the item available again.unavailableReasonis one ofSOLD_OUT,INGREDIENTS,EQUIPMENT,OTHER, and defaults toSOLD_OUT.
This is the endpoint an inventory system should call when something runs out.
curl -X PATCH https://api.tryrestro.com/v1/menu/items/cmd8mn7d80005abcdefghijkl \
-H "Authorization: Bearer $RESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"unavailableUntil":"2026-07-28T22:00:00.000Z","unavailableReason":"SOLD_OUT"}'#Prices
prices is an array of per-branch changes. Each entry needs a branchId; price, vat, and listed are individually optional, so you can relist an item without restating its price.
- The branch must belong to your restaurant, and must be inside the key's branch scope. Otherwise
403. - If no price row exists for that branch yet, one is created — but only if you supply a
price. An entry with nopricefor a branch that has none is skipped rather than creating a free item. listed: falseremoves the item from that branch's menu without touching the others.
Returns the full updated item, and writes an activity log entry naming your key.
Did this page miss something? Tell us.
Back to top