Menu API
The Menu API exposes a read-only view of your kiosk menu catalog — categories, items, prices, modifiers, and inventory. It is intended for website syncs, loyalty apps, and any integration that needs the same menu the kiosks display. All endpoints live under /api/v1/menu and require a Sanctum token (see API Authentication).
List menu items
GET /api/v1/menu/items
Authorization: Bearer <token>
Query parameters
| Param | Type | Default | Description |
|---|---|---|---|
active_only |
bool | true |
Hide inactive items |
category_id |
int | — | Return only items in this category |
Response
{
"data": [
{
"id": 14,
"category_id": 3,
"category_name": "Burgers",
"name": "Double cheeseburger",
"slug": "double-cheeseburger",
"description": "Two patties, American cheese, pickles.",
"image": "https://...",
"price": 8.50,
"is_featured": true,
"is_active": true,
"inventory_count": 42,
"low_stock_threshold": 10,
"prep_time_minutes": 7,
"options": [
{ "id": 3, "name": "Bacon", "price": 1.50 },
{ "id": 7, "name": "Extra cheese", "price": 0.75 }
]
}
]
}
The inventory_count field is null for items that do not track inventory (most do not — only items with limited daily supply opt in). The low_stock_threshold is the count at which a inventory.low webhook fires.
List categories
GET /api/v1/menu/categories
Authorization: Bearer <token>
Returns only active categories. The items_count field is a live count of menu items in each category.
{
"data": [
{
"id": 3,
"name": "Burgers",
"slug": "burgers",
"description": "Flame-grilled, never frozen.",
"image": "https://...",
"sort_order": 2,
"is_active": true,
"items_count": 12
}
]
}
Caching
Menu data changes rarely. It is safe to cache responses from these endpoints for minutes at a time. For strict consistency, subscribe to the menu.updated webhook (coming soon) instead of polling.
Modifying the menu
There are no write endpoints in the public Menu API — menu edits happen in the owner panel. This is deliberate: the Filament admin does menu validation, slug generation, image uploading, and activity logging, and exposing those paths over JSON would bypass all of it. A future v2 write API is on the roadmap.