Skip to content
Help

Menu

Reading categories and items, and writing prices and availability.

Public API1 min read

#List categories

http
GET /v1/menu/categories

Scope: menu:read. Takes page and limit. Ordered by the sort order you set in the dashboard.

json
{
  "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

http
GET /v1/menu/items

Scope: menu:read.

ParameterDescription
page, limitPagination
categoryIdItems in one category
publishedtrue or false
searchSubstring match on the item slug

#Fetch one item

http
GET /v1/menu/items/{itemId}

Scope: menu:read.

json
{
  "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

http
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.

json
{
  "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.
  • null clears the snooze and makes the item available again.
  • unavailableReason is one of SOLD_OUT, INGREDIENTS, EQUIPMENT, OTHER, and defaults to SOLD_OUT.

This is the endpoint an inventory system should call when something runs out.

bash
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 no price for a branch that has none is skipped rather than creating a free item.
  • listed: false removes 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