Skip to content

Menu

Menu items, categories and modifiers

The catalogue your customers order from. Menu items reference a category and zero or more modifier groups; orders reference menu items by id.

List menu items

GET /v1/menu_items Scope: menu:read

Returns menu items for the restaurant. Filter by category, availability, and active state.

Query parameters

limitintegerOptional

Page size, default 10, max 100.

starting_afterstringOptional

Cursor from a previous response.

ending_beforestringOptional

Cursor for backwards pagination.

categorystringOptional

Filter to a single menu_category id (mc_…).

is_availablebooleanOptional

true to return only items currently in stock.

is_activebooleanOptional

false to include soft-deleted items.

expandstring[]Optional

category, modifier_groups.

Request

curl 'https://api.tablezio.com/v1/menu_items?is_available=true&limit=20' \
  -H 'X-API-Key: tbz_…'

Response

application/json
{
  "object": "list",
  "data": [ /* menu_item objects */ ],
  "has_more": false,
  "next_cursor": null,
  "previous_cursor": null,
  "url": "/v1/menu_items"
}

Retrieve a menu item

GET /v1/menu_items/{id} Scope: menu:read

Fetch a single menu item.

Path parameters

idstringRequired

Menu item ID (mi_…).

Query parameters

expandstring[]Optional

category, modifier_groups.

Request

curl https://api.tablezio.com/v1/menu_items/mi_… -H 'X-API-Key: tbz_…'

Response

application/json
{
  "id": "mi_5a1b2c3d4e5f6a7b8c9d0e1f",
  "object": "menu_item",
  "created": 1716657000,
  "updated": 1716657000,
  "name": "Classic burger",
  "description": "8oz patty, brioche, cheddar",
  "category": "mc_6b2c…",
  "price": 1200,
  "cost": 410,
  "sku": "BRG-CL-001",
  "image_url": "https://cdn.tablezio.com/…/burger.jpg",
  "is_active": true,
  "is_available": true,
  "preparation_time_minutes": 12,
  "nutrition": { "calories": 720, "protein": 38, "carbs": 42, "fat": 35, "fiber": 3, "sodium": 880 },
  "allergens": ["gluten", "dairy"],
  "tags": ["best_seller"],
  "modifier_groups": ["mg_…"],
  "sort_order": 0,
  "tax_rate": 0,
  "translations": {}
}

Create a menu item

POST /v1/menu_items Scope: menu:write

Adds a new item to the catalogue.

Body parameters

namestringRequired

Display name.

categorystringRequired

Parent menu_category id (mc_…).

priceinteger (cents)Required

Price in the smallest currency unit.

descriptionstringOptional

Long description shown on menus.

costinteger (cents)Optional

Internal cost; used for margin reports.

skustringOptional

Optional inventory SKU.

image_urlstringOptional

Public URL of the item photo.

is_activebooleanOptional

Whether the item is published. Default true.

is_availablebooleanOptional

Whether the item is in stock right now. Default true.

allergensstring[]Optional

Free-form allergen tags.

tagsstring[]Optional

Free-form marketing tags.

modifier_groupsstring[]Optional

IDs of modifier groups (mg_…).

tax_ratenumberOptional

Override the restaurant default tax rate (0..1).

Request

curl -X POST https://api.tablezio.com/v1/menu_items \
  -H 'X-API-Key: tbz_…' -H 'Content-Type: application/json' \
  -d '{ "name": "Classic burger", "category": "mc_…", "price": 1200 }'

Response

application/json
{
  "id": "mi_5a1b2c3d4e5f6a7b8c9d0e1f",
  "object": "menu_item",
  "created": 1716657000,
  "updated": 1716657000,
  "name": "Classic burger",
  "description": "8oz patty, brioche, cheddar",
  "category": "mc_6b2c…",
  "price": 1200,
  "cost": 410,
  "sku": "BRG-CL-001",
  "image_url": "https://cdn.tablezio.com/…/burger.jpg",
  "is_active": true,
  "is_available": true,
  "preparation_time_minutes": 12,
  "nutrition": { "calories": 720, "protein": 38, "carbs": 42, "fat": 35, "fiber": 3, "sodium": 880 },
  "allergens": ["gluten", "dairy"],
  "tags": ["best_seller"],
  "modifier_groups": ["mg_…"],
  "sort_order": 0,
  "tax_rate": 0,
  "translations": {}
}

Update a menu item

PATCH /v1/menu_items/{id} Scope: menu:write

Partial update. Only included fields are changed.

Path parameters

idstringRequired

Menu item ID.

Body parameters

*anyOptional

Any field accepted by Create — all optional.

Request

curl -X PATCH https://api.tablezio.com/v1/menu_items/mi_… \
  -H 'X-API-Key: tbz_…' -H 'Content-Type: application/json' \
  -d '{ "is_available": false }'

Response

application/json
{
  "id": "mi_5a1b2c3d4e5f6a7b8c9d0e1f",
  "object": "menu_item",
  "created": 1716657000,
  "updated": 1716657000,
  "name": "Classic burger",
  "description": "8oz patty, brioche, cheddar",
  "category": "mc_6b2c…",
  "price": 1200,
  "cost": 410,
  "sku": "BRG-CL-001",
  "image_url": "https://cdn.tablezio.com/…/burger.jpg",
  "is_active": true,
  "is_available": true,
  "preparation_time_minutes": 12,
  "nutrition": { "calories": 720, "protein": 38, "carbs": 42, "fat": 35, "fiber": 3, "sodium": 880 },
  "allergens": ["gluten", "dairy"],
  "tags": ["best_seller"],
  "modifier_groups": ["mg_…"],
  "sort_order": 0,
  "tax_rate": 0,
  "translations": {}
}

Deactivate a menu item

DELETE /v1/menu_items/{id} Scope: menu:write

Soft-deletes (sets is_active=false). The item stops appearing in customer menus but historical orders keep referencing it.

Path parameters

idstringRequired

Menu item ID.

Request

curl -X DELETE https://api.tablezio.com/v1/menu_items/mi_… -H 'X-API-Key: tbz_…'

Response

application/json
{
  "id": "mi_5a1b2c3d4e5f6a7b8c9d0e1f",
  "object": "menu_item",
  "created": 1716657000,
  "updated": 1716657000,
  "name": "Classic burger",
  "description": "8oz patty, brioche, cheddar",
  "category": "mc_6b2c…",
  "price": 1200,
  "cost": 410,
  "sku": "BRG-CL-001",
  "image_url": "https://cdn.tablezio.com/…/burger.jpg",
  "is_active": true,
  "is_available": true,
  "preparation_time_minutes": 12,
  "nutrition": { "calories": 720, "protein": 38, "carbs": 42, "fat": 35, "fiber": 3, "sodium": 880 },
  "allergens": ["gluten", "dairy"],
  "tags": ["best_seller"],
  "modifier_groups": ["mg_…"],
  "sort_order": 0,
  "tax_rate": 0,
  "translations": {}
}

List menu categories

GET /v1/menu_categories Scope: menu:read

Returns categories ordered by sort_order, newest first.

Query parameters

limitintegerOptional

Page size.

starting_afterstringOptional

Cursor.

Request

curl https://api.tablezio.com/v1/menu_categories -H 'X-API-Key: tbz_…'

Response

application/json
{ "object": "list", "data": [ /* menu_category */ ], "has_more": false, "next_cursor": null, "previous_cursor": null, "url": "/v1/menu_categories" }

Create a menu category

POST /v1/menu_categories Scope: menu:write

Adds a category. Supports nesting through parent_category.

Body parameters

namestringRequired

Display name.

descriptionstringOptional

Internal description.

parent_categorystringOptional

Parent category id (mc_…) — leaves it nested.

sort_orderintegerOptional

Where it appears in the menu list.

stationstringOptional

Routing target: the key of one of the restaurant's active kitchen stations. Every restaurant starts with kitchen, bar, dessert and other, and can add its own (e.g. grill). An unknown or inactive key is rejected with 400 unknown_station.

available_fromstring (HH:MM)Optional

Daily availability start.

available_untilstring (HH:MM)Optional

Daily availability end.

Request

curl -X POST https://api.tablezio.com/v1/menu_categories \
  -H 'X-API-Key: tbz_…' -H 'Content-Type: application/json' \
  -d '{ "name": "Burgers", "station": "kitchen" }'

Response

application/json
{
  "id": "mc_6b2c3d4e5f6a7b8c9d0e1f20",
  "object": "menu_category",
  "created": 1716657000,
  "updated": 1716657000,
  "name": "Burgers",
  "description": null,
  "parent_category": null,
  "sort_order": 0,
  "is_active": true,
  "station": "kitchen",
  "image_url": null,
  "available_from": null,
  "available_until": null,
  "available_days": [],
  "translations": {}
}

List modifier groups

GET /v1/modifier_groups Scope: menu:read

Reusable groups of choices (size, doneness, add-ons) that attach to menu items.

Request

curl https://api.tablezio.com/v1/modifier_groups -H 'X-API-Key: tbz_…'

Response

application/json
{ "object": "list", "data": [ /* modifier_group */ ], "has_more": false, "next_cursor": null, "previous_cursor": null, "url": "/v1/modifier_groups" }

Create a modifier group

POST /v1/modifier_groups Scope: menu:write

Attach the returned id to any menu item via menu_items.modifier_groups.

Body parameters

namestringRequired

Display name.

requiredbooleanOptional

If true, the customer must pick at least min_selections.

min_selectionsintegerOptional

Minimum selections at order time.

max_selectionsintegerOptional

Maximum selections at order time.

modifiersarrayOptional

List of { name, price_adjustment, is_default?, is_available?, sort_order? }.

Request

curl -X POST https://api.tablezio.com/v1/modifier_groups \
  -H 'X-API-Key: tbz_…' -H 'Content-Type: application/json' \
  -d '{
    "name": "Doneness",
    "required": true,
    "min_selections": 1,
    "max_selections": 1,
    "modifiers": [
      { "name": "Medium rare", "is_default": true },
      { "name": "Well done" }
    ]
  }'

Response

application/json
{
  "id": "mg_8b2c3d4e5f6a7b8c9d0e1f20",
  "object": "modifier_group",
  "created": 1716657000,
  "updated": 1716657000,
  "name": "Doneness",
  "required": true,
  "min_selections": 1,
  "max_selections": 1,
  "modifiers": [
    { "name": "Medium rare", "price_adjustment": 0, "is_default": true, "is_available": true, "sort_order": 0 },
    { "name": "Well done",   "price_adjustment": 0, "is_default": false, "is_available": true, "sort_order": 1 }
  ]
}

Retrieve a menu category

GET /v1/menu_categories/{id} Scope: menu:read

Returns a single menu category by id. Categories are the grouping menu items are ordered under, on every channel that reads the menu.

Path parameters

idstringRequired

Category id (mcat_…).

Request

curl 'https://api.tablezio.com/v1/menu_categories/mcat_5a1b2c3d4e5f6a7b8c9d0e1f' \
  -H 'X-API-Key: tbz_…'

Update a menu category

PATCH /v1/menu_categories/{id} Scope: menu:write

Updates the fields you send and leaves the rest untouched. Renaming or reordering a category changes it everywhere the menu is read from, so there is no per-channel copy to keep in step.

Path parameters

idstringRequired

Category id (mcat_…).

Request

curl -X PATCH 'https://api.tablezio.com/v1/menu_categories/mcat_5a1b2c3d4e5f6a7b8c9d0e1f' \
  -H 'X-API-Key: tbz_…' \
  -H 'Content-Type: application/json' \
  -d '{"name": "Starters"}'

Delete a menu category

DELETE /v1/menu_categories/{id} Scope: menu:write

Deactivates the category rather than erasing it: the historical orders that reference it stay readable. The endpoint returns the deactivated object.

Path parameters

idstringRequired

Category id (mcat_…).

Request

curl -X DELETE 'https://api.tablezio.com/v1/menu_categories/mcat_5a1b2c3d4e5f6a7b8c9d0e1f' \
  -H 'X-API-Key: tbz_…'

Retrieve a modifier group

GET /v1/modifier_groups/{id} Scope: menu:read

Returns a single modifier group — the set of options a menu item can be customised with, and the rules for how many of them may be chosen.

Path parameters

idstringRequired

Modifier group id (mg_…).

Request

curl 'https://api.tablezio.com/v1/modifier_groups/mg_5a1b2c3d4e5f6a7b8c9d0e1f' \
  -H 'X-API-Key: tbz_…'

Update a modifier group

PATCH /v1/modifier_groups/{id} Scope: menu:write

Updates the group in place. Because items reference the group rather than copying its options, one update reaches every item that uses it.

Path parameters

idstringRequired

Modifier group id (mg_…).

Request

curl -X PATCH 'https://api.tablezio.com/v1/modifier_groups/mg_5a1b2c3d4e5f6a7b8c9d0e1f' \
  -H 'X-API-Key: tbz_…' \
  -H 'Content-Type: application/json' \
  -d '{"name": "Cooking point"}'

Delete a modifier group

DELETE /v1/modifier_groups/{id} Scope: menu:write

Removes the modifier group. Unlike items and categories, which are deactivated, this one deletes — check first that no live menu item still references it.

Path parameters

idstringRequired

Modifier group id (mg_…).

Request

curl -X DELETE 'https://api.tablezio.com/v1/modifier_groups/mg_5a1b2c3d4e5f6a7b8c9d0e1f' \
  -H 'X-API-Key: tbz_…'