Menu
Read categories and items, then update publication, per-branch availability, and per-branch prices.
#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": "Pizza",
"slug": "pizza",
"sortOrder": 1,
"source": "manual",
"itemLimit": null,
"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 }
}source is manual, best_sellers, or offers. Dynamic categories (best_sellers, offers) have no fixed members; itemLimit is how many items they show, and items keep their own category regardless.
#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": "Margherita pizza",
"slug": "margherita-pizza",
"description": "Tomato, fresh mozzarella, basil",
"published": true,
"imageUrl": "https://cdn.tryrestro.com/items/margherita-pizza.jpg",
"allowSpecialRequests": true,
"unavailability": [
{
"branchId": "cmd8w9k1a0002abcdefghijkl",
"branchSlug": "soho",
"unavailableUntil": "2026-07-28T22:00:00.000Z",
"unavailableReason": "sold_out",
"unavailableNote": "Back tomorrow"
}
],
"category": {
"id": "cmd8ct1a90007abcdefghijkl",
"title": "Pizza",
"slug": "pizza"
},
"prices": [
{
"branchId": "cmd8w9k1a0002abcdefghijkl",
"branchSlug": "soho",
"currency": "USD",
"price": "18.00",
"compareAtPrice": null,
"vat": "8.88",
"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.
unavailability lists the branches where the item is currently snoozed. A branch that is missing from the list is serving the item as normal (as long as it is listed and published).
#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,
"branches": [
{ "branchId": "cmd8w9k1a0002abcdefghijkl" },
{ "branchId": "cmd8w9k1a0003abcdefghijkl", "unavailableReason": "EQUIPMENT", "unavailableNote": "Oven is down" }
],
"unavailableUntil": "2026-07-28T22:00:00.000Z",
"unavailableReason": "SOLD_OUT",
"unavailableNote": "Back tomorrow",
"prices": [
{ "branchId": "cmd8w9k1a0002abcdefghijkl", "price": 18, "compareAtPrice": 22, "vat": 8.88, "listed": true }
]
}compareAtPrice is optional. Set it above price to show a struck-through regular price on the storefront, or send null to clear it.
#Publication
published is the permanent switch. false hides the item everywhere.
#Availability
unavailableUntil is the temporary snooze, matching the dashboard's behavior. Snoozes are per branch: running out of something at one branch does not hide it at the others.
- 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.branchespicks the branches to snooze or clear. Each entry needs abranchIdand can carry its ownunavailableReasonandunavailableNote, so one branch can be sold out while another has an equipment issue. Leave the array out to apply the change to every branch the key can reach.unavailableReasonis one ofSOLD_OUT,INGREDIENTS,EQUIPMENT,OTHER, and defaults toSOLD_OUT. The top-level reason and note are the defaults for any branch entry that does not set its own.
This is the endpoint an inventory system should call when something runs out at a branch.
curl -X PATCH https://api.tryrestro.com/v1/menu/items/cmd8mn7d80005abcdefghijkl \
-H "Authorization: Bearer $RESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"branches":[{"branchId":"cmd8w9k1a0002abcdefghijkl"}],"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