Discover and retrieve bookable listings
Listings API V1 (2.0.0)
The Listings API V1 is a venue-aggregated discovery interface.
The response root carries meta and listings[]. Each entry in listings[] is a ListingGroup — one per operator (venue-group / chain), carrying a groupName and an items[] array.
Each item represents a single venue (or a standalone event when no venue is known): it carries the venue name, a location, and a capabilities[] array. Each entry in capabilities[] is a Listing with exactly one capability (table_reservation or event_ticket), and carries its own media[]. A venue that also hosts a ticketed event therefore yields a single item with two capabilities — one for the venue, one for the event.
All bookable units (venue products, event ticket types, future capability types) are unified under a single bookableProducts[] array. Every entry is a single Bookable shape; capability-specific fields are nullable and the parent Listing's capability sets the context.
Temporal information (venue opening hours, event occurrences, blackout dates) is unified under a single availabilityOccurrence[] field of CalendarRules. Both capabilities use the same shape.
Pre-order assets (packages, menus) are unified under a single preorders container — applicable to either capability when the listing supports pre-orders.
listingId (Listing.id, as returned in /v1/listings and taken as the path parameter on GET /v1/listings/{listingId}) identifies a venue or a standalone event. It is 3 segments: {VenueGroupId}|{RmsSlug}|{ResourceId}. For a hybrid entity the event-side row uses the EventExt's own resource id (different RmsSlug + ResourceId) so the two rows are unambiguous.
compositeId (Bookable.compositeId — a specific bookable product/ticket type, used in bookableProducts[], and as the compositeId in /v1/availabilities and /v1/orders) is 4 segments: {VenueGroupId}|{RmsSlug}|{ResourceId}|{AdditionalId}.
These are two different identifiers for two different things, not two interchangeable formats for the same one — a listingId never appears where a compositeId is expected, or vice versa.
Request
Returns the entire bookable catalogue available to the caller, paginated and venue-aggregated. Results are grouped by operator (ListingGroup); each group carries its venues (ListingItem), and each venue carries one Listing per capability it offers (table_reservation, event_ticket).
A venue that also hosts a ticketed event therefore appears once, with two entries in its capabilities[] — one per capability. Optional query filters (capability, name, location, features, date, …) narrow the catalogue; with no filters the whole catalogue is returned page by page.
Restrict results to a single capability. Venues are still returned aggregated; only their matching capability entries are included.
Filter by listing name — partial, case-insensitive match, with a semantic (vector similarity) fallback for near-matches. For an event listing, matches against either the event's own title or the name of the venue it's hosted at.
Filter to listings having at least one entry in bookableProducts[] whose name matches — partial, case-insensitive match, with a semantic (vector similarity) fallback for near-matches on the product/ticket type name (e.g. "Sunday Roast" also surfacing "Sunday Lunch").
Filter by operator (venue-group / chain) name.
Filter by type / feature slugs (matched against types). Comma-separated list.
Filter listings that have availability on a specific date (YYYY-MM-DD).
Field selection using Google Fields syntax. Comma-separated list of top-level Listing fields to include. When omitted, all fields are returned.
Optional ID for cross-system transaction tracking.
Required for Bookable Agents — identifies the partner on whose behalf the request is made. Accepts either a partner reference (e.g. bottomlessbrunch.com) or a partner id (e.g. 288); a value matching a known partner reference resolves as that reference, otherwise it is treated as a partner id.
- Livehttps://api.bookabletech.com/v1/listings
- Sandboxhttps://api-sandbox.bookabletech.com/v1/listings
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://api.bookabletech.com/v1/listings?capability=table_reservation&listingName=dishoom&bookableProductName=sunday+roast&operatorName=stonegate&city=london&area=shoreditch&features=dog_friendly%2Clive_music&date=2026-06-15&fields=id%2Cname%2Ccapability%2Clocation%28lat%2Clng%2Ccity%29%2CbookableProducts%28compositeId%2Cname%29&pageNumber=1&pageSize=20&sortBy=default&sortDirection=ASC' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'X-Correlation-ID: 11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA' \
-H 'X-Partner-Reference: bottomlessbrunch.com'- application/json
- application/vnd.bookable.toon+json
- tableReservationListing
- eventTicketListing
- hybridListing
{ "meta": { "currentPage": 1, "pageSize": 20, "totalItems": 1, "totalPages": 1 }, "listings": [ { … } ] }
Request
Fetches one listing (a venue or a standalone event) by its listingId (Listing.id, {VenueGroupId}|{RmsSlug}|{ResourceId}, 3 segments — see the ID formats note above; not a Bookable.compositeId).
Returns the same shape as a single entry in GET /v1/listings' listings[] — groupName plus items[] — but items[] always holds exactly the one matching ListingItem, so a caller that already has a listingId (e.g. from a prior catalogue call) can re-fetch it directly without paginating the whole catalogue.
Optional ID for cross-system transaction tracking.
Required for Bookable Agents — identifies the partner on whose behalf the request is made. Accepts either a partner reference (e.g. bottomlessbrunch.com) or a partner id (e.g. 288); a value matching a known partner reference resolves as that reference, otherwise it is treated as a partner id.
- Livehttps://api.bookabletech.com/v1/listings/{listingId}
- Sandboxhttps://api-sandbox.bookabletech.com/v1/listings/{listingId}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://api.bookabletech.com/v1/listings/29|CS|275cc44dd2e2496fba44857c9257443a' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'X-Correlation-ID: 11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA' \
-H 'X-Partner-Reference: bottomlessbrunch.com'The listing's operator group, with a single matching item in items[].
- application/json
- application/vnd.bookable.toon+json
Venues (and standalone events) belonging to this operator.
Venue name, or event name when there is no associated venue.
Physical location. null for virtual listings (e.g. online events).
The bookable capabilities offered at this venue.
listingId — {VenueGroupId}|{RmsSlug}|{ResourceId}. See the ID formats note above; not a Bookable.compositeId.
Operator (venue-group / chain) display name.
Name of the venue hosting this listing. Populated for event_ticket listings whose event is associated with a physical venue (resolved from Collins); the venue's address is reflected in location. null when there is no associated venue (e.g. virtual events).
Identifies a booking capability.
Listing types and feature tag slugs, merged into a single list (e.g. venue categories like pub, bar plus feature tags like dog_friendly, live_music).
Operator-managed public-facing FAQ list. Omitted/null when none are configured. For an event_ticket listing this is inherited from the hosting venue (hostedBy) when one exists — events have no FAQ list of their own.
Photos and videos for this capability, cover first, with captions for alt text. An event_ticket listing without its own imagery shows its hosting venue's. Replaces the photos URL list removed in 2.0.0 — use the first type: photo item wherever you used photos[0]. Its URL can differ from the old one: once a venue has media in Bookable's library, these are Bookable-hosted files rather than the booking system's.
Unified temporal description of the listing. Use recurring_with_time rules for weekly opening hours, specific_dates* for event dates or holiday closures, date_range* for seasonal availability, etc. Multiple rules may combine — status: closed overrides status: open. Rules sharing the same type, status and time window are aggregated: recurring rules combine their daysOfWeek, specific-date rules combine their dates.
Pre-order assets for a listing. Either capability MAY expose packages and/or menus that can be selected at booking time. null when the listing does not support pre-orders.
All bookable units for this listing. Every entry is a Bookable — a single unified shape. Capability-specific fields are populated according to the row's capability.
CompositeId of the bookable unit.
- table_reservation →
{VenueGroupId}|{RmsSlug}|{VenueId}|{ProductId} - event_ticket →
{VenueGroupId}|{RmsSlug}|{EventId}|{TicketTypeId}
Spaces/areas available within this bookable product.
Pre-order configuration for the bookable unit.
Deposit configuration for the bookable unit.
Monetary amount with currency.
Capacity for a ticket type.
Bookable-scoped CalendarRule entries that refine or restrict the listing-level availabilityOccurrence for this specific bookable unit (event sessions, exceptional dates, closures, …). Same shape as Listing.availabilityOccurrence; status: closed overrides status: open.
- application/json
- application/vnd.bookable.toon+json
{ "groupName": "Stonegate Group", "items": [ { … } ] }
Request
Batch availability check. Modelled as a command (POST), not a search.
The request carries root-level date, quantity and optional time, plus a bookableProducts[] list. Each entry has a required compositeId and may override date, quantity and time. When an entry omits any of those, the root-level value is used.
quantity carries the count for either capability, same as in POST /v1/orders — number of covers for a table reservation, number of tickets for an event-ticket line.
Every entry must end up with date and quantity resolved (either from the entry or the root). time is optional — event capabilities are queried by date alone; for table reservations it narrows the slot when supplied. An entry that cannot resolve date and quantity is reported as an error result and does not block the others.
Searches run independently: a failure on one compositeId yields an error on that result only — all other results are returned normally. The response carries one AvailabilityResult per requested compositeId, preserving request order.
There is no 404 response: an unknown/nonexistent compositeId is not a request-level failure — it's reported as an error on that entry's AvailabilityResult, same as any other per-entry failure (e.g. unresolved date/quantity), never as an HTTP-level not-found for the whole call.
Optional ID for cross-system transaction tracking.
Required for Bookable Agents — identifies the partner on whose behalf the request is made. Accepts either a partner reference (e.g. bottomlessbrunch.com) or a partner id (e.g. 288); a value matching a known partner reference resolves as that reference, otherwise it is treated as a partner id.
Default booking date (YYYY-MM-DD), inherited by entries that omit it.
Default quantity, inherited by entries that omit it — same field as OrderItem.quantity. For a table_reservation bookable, quantity is the number of people (covers); for an event_ticket bookable, quantity is the number of tickets.
Optional default start time (HH:mm), inherited by entries that omit it.
Optional default duration (minutes), inherited by entries that omit it.
Bookable products to check. One result is returned per entry.
CompositeId of the bookable product to check.
Overrides the root date for this entry.
Overrides the root quantity for this entry — number of people for a table_reservation bookable, number of tickets for an event_ticket bookable.
Overrides the root time for this entry.
- Livehttps://api.bookabletech.com/v1/availabilities
- Sandboxhttps://api-sandbox.bookabletech.com/v1/availabilities
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.bookabletech.com/v1/availabilities \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-H 'X-Correlation-ID: 11C46F5F-CDEF-4865-94B2-0EE0EDCC26DA' \
-H 'X-Partner-Reference: bottomlessbrunch.com' \
-d '{
"date": "2026-06-15",
"quantity": 4,
"time": "19:00",
"bookableProducts": [
{
"compositeId": "29|CS|275cc44dd2e2496fba44857c9257443a|prod1"
},
{
"compositeId": "29|CS|275cc44dd2e2496fba44857c9257443a|prod2",
"quantity": 2,
"time": "20:00"
},
{
"compositeId": "29|CS|999|prod3"
}
]
}'One result per requested compositeId. Each result carries either availability (success) or error (failure); never both.
One result per requested compositeId, in request order.
The compositeId this result refers to.
Availability for a single bookable product. Mirrors the BookingApi AvailabilityResponse.
{ "results": [ { … }, { … }, { … } ] }