Discover and retrieve bookable listings
- Check availability for multiple bookable products in one call
Listings API V1 (1.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 photos[]. 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.
Listing.id (venue or event, as returned in /v1/listings) is 3 segments: {VenueGroupId}|{RmsSlug}|{ResourceId}. For a hybrid entity the event-side row uses the EventExt's CompositeId (different RmsSlug + ResourceId) so the two rows are unambiguous.
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 Listing.id never appears where a Bookable.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.
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.
- 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&venueName=dishoom&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
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.
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.
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.
- 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": [ { … }, { … }, { … } ] }