Sign in to see your venue's slug and publishable key in every sample.
Your account has no venue yet, so the samples keep their placeholders. Sign out
Signed in as · . Create a publishable key in the console and reload to see it here. Sign out
Signed in as · . The samples show your venue's publishable key. Sign out
Developer docs
Menus
Read every published menu, its groups and items, priced in the venue's currency — the display menu, not the seated guest's order menu.
Every published menu with its groups and items, priced in the venue's currency. This is the display menu; what a seated guest can order from is the table session's menus (QR codes and table sessions). It follows the same key rules as the rest of /api/venues/** (Keys and headers) and answers 404 with a problem body when no venue has that slug.
Endpoints
GET /api/venues/{venueSlug}/menus
Response 200 OK
| Field | Type | Meaning |
|---|---|---|
slug, currency |
string | The venue and the ISO 4217 currency of every price below |
menus[] |
object[] | id, name, description, groups[] |
groups[] |
object[] | name, description (nullable), items[] |
items[] |
object[] | name, description, price (decimal), currency, tags (string[], e.g. dietary labels), imageUrl (nullable), id (nullable) — the item's stable identity: it survives a rename, so reference an item by id, not by name. Null only for an item stored before ids existed |
{
"slug": "demo-sportsbar",
"currency": "EUR",
"menus": [
{
"id": "kitchen",
"name": "Kitchen",
"description": "Served from open until one hour before close.",
"groups": [
{
"name": "Small plates",
"description": null,
"items": [
{
"name": "Loaded nachos",
"description": "Melted cheese, jalapeños, lime crema",
"price": 9.50,
"currency": "EUR",
"tags": [
"vegetarian"
],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/nachos.webp",
"id": "cccb4f0acf5604910b9edff5eb7d85d3"
},
{
"name": "Buffalo wings",
"description": "Blue-cheese dip, celery",
"price": 11.00,
"currency": "EUR",
"tags": [],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/wings.webp",
"id": "af1cc7fd0772f60da833b1612f46fa69"
},
{
"name": "Padrón peppers",
"description": "Sea salt, olive oil",
"price": 7.00,
"currency": "EUR",
"tags": [
"vegan",
"gluten-free"
],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/padron-peppers.webp",
"id": "08d1b4c209107e4e8b8bd809ee0dedf4"
}
]
},
{
"name": "Mains",
"description": null,
"items": [
{
"name": "Smash burger",
"description": "Double patty, house sauce, fries",
"price": 14.50,
"currency": "EUR",
"tags": [],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/smash-burger.webp",
"id": "787f5afafde1b8be62dc96b0db2e5735"
},
{
"name": "BBQ ribs",
"description": "Slow-cooked, slaw, fries",
"price": 19.00,
"currency": "EUR",
"tags": [],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/bbq-ribs.webp",
"id": "ead9e92d6a163e0e8fe95b27a7c96fa5"
},
{
"name": "Halloumi flatbread",
"description": "Grilled halloumi, harissa, greens",
"price": 13.00,
"currency": "EUR",
"tags": [
"vegetarian"
],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/halloumi-flatbread.webp",
"id": "655fa085e02ec363972091746b29e2cb"
}
]
},
{
"name": "Sweet",
"description": null,
"items": [
{
"name": "Churros",
"description": "Cinnamon sugar, chocolate",
"price": 7.00,
"currency": "EUR",
"tags": [
"vegetarian"
],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/churros.webp",
"id": "d668f32064f026a8ce33c30ebbd4cb5a"
}
]
}
]
},
{
"id": "bar",
"name": "Bar",
"description": "Draft, cocktails and zero-proof.",
"groups": [
{
"name": "Draft beer",
"description": null,
"items": [
{
"name": "House lager 0.3L",
"description": "Crisp pilsner",
"price": 4.50,
"currency": "EUR",
"tags": [],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/lager.webp",
"id": "139018ac588c888bddc135dcb72099f7"
},
{
"name": "Local IPA 0.5L",
"description": "Hoppy, citrus finish",
"price": 6.50,
"currency": "EUR",
"tags": [],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/ipa.webp",
"id": "f65791315063c5eb8a9006d8f85ba5b5"
}
]
},
{
"name": "Cocktails",
"description": null,
"items": [
{
"name": "Old Fashioned",
"description": "Bourbon, bitters, orange",
"price": 11.00,
"currency": "EUR",
"tags": [],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/old-fashioned.webp",
"id": "371c345ec3f606b3195ec7c5d596f418"
},
{
"name": "Spicy margarita",
"description": "Tequila, chilli, lime",
"price": 10.50,
"currency": "EUR",
"tags": [],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/margarita.webp",
"id": "cb63f7f8f82dcabc46206b49d34f641d"
}
]
},
{
"name": "Zero proof",
"description": null,
"items": [
{
"name": "Craft soda",
"description": "House-made, ask for today's flavour",
"price": 4.00,
"currency": "EUR",
"tags": [
"vegan"
],
"imageUrl": "_content/BookDinePlay.App.Shared/menu/craft-soda.webp",
"id": "af0cb8e85bf03fbc2e997bd4bdbe0136"
}
]
}
]
}
]
}Errors — 404 no venue with that slug.
curl
curl "https://api.bookdineplay.com/api/venues/your-venue/menus" \
-H "X-BookDinePlay-Key: bdp_pk_your_publishable_key" \
-H "Origin: https://www.your-venue.example"JavaScript
const { menus, currency } = await (await fetch('https://api.bookdineplay.com/api/venues/your-venue/menus', {
headers: { 'X-BookDinePlay-Key': 'bdp_pk_your_publishable_key' }
})).json();
for (const menu of menus) for (const group of menu.groups) for (const item of group.items) {
console.log(menu.name, group.name, item.name, item.price, currency);
}C#
var menus = await client.GetMenusAsync("your-venue", cancellationToken);Next steps
- Venue — the other five reads for this venue.
- QR codes and table sessions — the seated guest's order menu, not this display menu.
- .NET SDK — the same read as a typed method.