Saltar al contenido

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.

kitchenbardessertother
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 }
  ]
}