Skip to content
Help

Menu

Read categories and items, then update publication, per-branch availability, and per-branch prices.

Public API2 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": "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

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": "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

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,
  "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.
  • null clears the snooze and makes the item available again.
  • branches picks the branches to snooze or clear. Each entry needs a branchId and can carry its own unavailableReason and unavailableNote, 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.
  • unavailableReason is one of SOLD_OUT, INGREDIENTS, EQUIPMENT, OTHER, and defaults to SOLD_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.

bash
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 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