All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- BREAKING CHANGE
BookingRequest.areaIdrenamed toBookingRequest.spaceId. Type changed fromstringtointeger. Obtain valid space IDs from thespacesarray in the availability response time slots.
AvailabilityTimeSlot.areas: removed. Usespacesfrom the product data to obtain valid space IDs for booking.
AvailabilityResponse.noAvailabilityCode: new nullable string field, populated only whentimesis empty. Machine-readable code indicating why no availability was found. Known values:NO_AVAILABILITY— no available slots for the requested parameters.NO_ELIGIBLE_PRODUCTS— no products match the request.FILTERED_BY_OPERATOR_RULES— all slots were filtered out by operator availability rules.FILTERED_BY_CAPACITY— no slots satisfy the requested party size.- Clients should treat unknown values as a generic no-availability condition, as new values may be introduced without prior notice.
AvailabilityResponse.noAvailabilityAction: removed. UsenoAvailabilityReason(human-readable) and the newnoAvailabilityCode(machine-readable) instead.
AvailabilityTimeSlot.requestReason: new nullable string field, present only whentypeisrequest. Indicates why the time slot requires manual operator approval rather than instant confirmation. Possible values:fully_booked— no real-time availability for this slot, but the operator is open to receiving enquiries.exceeds_auto_confirm— availability exists but the requested party size exceeds the venue's auto-confirm threshold and requires explicit operator approval.- Clients should handle unknown values gracefully as new values may be introduced in future versions.
AvailabilityResponse.noAvailabilityReason: new nullable string field, populated only whentimesis empty. Human-readable message explaining why no availability was found for the requested parameters.Product.slug: new nullable string field — aggregation slug identifier for the product.PreorderPackage.slug: new nullable string field — aggregation slug identifier for the package.Menu.slug: new nullable string field — aggregation slug identifier for the menu.
Product.spaces: new field onGET /venuesandGET /venues/{venueId}responses. Each product now returns the list of spaces available within it, including physical data (spaceName,description,floorLocation,facilities, capacity layout fields) and space policies (minimumSpend,occasionTypes,under18s,promotedEvents,accessibility,servesFood).Product.preOrderRequiredType: enum specifying which type of preorder is required —none,package,menu, orpackageAndMenu.Product.depositRequired: boolean indicating whether a deposit is required when booking a product.AvailabilityRequest.children: optional field for the number of children in the party. Note: not all TMS providers distinguish between adults and children — when unsupported, children may be added to the total party size or ignored.AvailabilityRequestspace policy filters — new optional query parameters to filter time slots by space policy:minimumSpend: maximum minimum spend (in pence); excludes slots above this threshold.under18s: soft filter on the under-18s policy.occasionTypes: filter by supported occasion type.promotedEvents: soft filter on the promoted-events policy.accessibility: filter by wheelchair accessibility.servesFood: soft filter on the serves-food policy.includeUnavailable: whentrue, filtered-out slots are included in the response withunavailableReasonspopulated instead of being excluded.
AvailabilityTimeSlot.product: new object returned in each time slot containing the product'sid,name, andspacesarray. Space policies within this object (includingminimumSpend) are pre-filtered to the requested date and time slot.AvailabilityTimeSlot.areas: list of available areas/zones for this time slot. Populated only for TMS providers that support area-based booking (e.g. Zonal). Pass the desiredidasareaIdwhen creating a booking.AvailabilityTimeSlot.unavailableReasons: present only whenincludeUnavailable=true; contains human-readable explanations for each failing policy filter.BookingRequest.children: optional field for the number of children included in the booking.BookingRequest.areaId: optional area/zone ID to target when creating a booking. Obtain valid IDs fromAvailabilityTimeSlot.areas.Booking.depositAmount: deposit amount (float, in pence) captured from the TMS at reservation time.Booking.area: area or zone assigned to the booking, withidandnameas reported by the TMS.- New schemas:
SpaceCapacityRange,Area,BookingArea. - New shared component files:
common/VenueSpaces.yaml(space schemas and policy types) andcommon/Headers.yaml(shared header parameter definitions).
AvailabilityRequest.partySizeandBookingRequest.partySize: description clarified from "number of guests/people" to "number of adults".CorrelationIDandPartnerReferenceheader parameters refactored to referencecommon/Headers.yamlinstead of being defined inline.
AvailabilityTimeSlot.productId: useAvailabilityTimeSlot.product.idinstead.
- Sparse fieldsets support via the
fieldsquery parameter on all GET endpoints. Request only the fields you need to reduce payload size and improve response times. See Sparse Fieldsets for details. text/toonresponse format support across all Bookings API endpoints that return a body. SetAccept: text/toonto receive responses in TOON (Terse Object-Oriented Notation) — a compact format that reduces token count by 30–60% compared to JSON. Fully opt-in; omitting the header continues to return standard JSON. See TOON Format for details.VenuePreorders: addedpreordersfield toGET /venuesandGET /venues/{venueId}responses.
VenuePreordersschema: new wrapper object containingpackagesandmenusarraysProductAvailabilityRulesschema: availability rules for a product grouped by source (weekly,exceptions,rules)WeeklyRuleschema: weekly booking schedule, one entry per day of the weekRuleExceptionschema: date-specific availability exceptions imposed by the TMSAvailabilityRuleschema: operator-defined availability rules per partnerAvailabilityRuleTypeenum:date_range,recurring,time_based,specific_dates,specific_dates_with_time,date_range_with_time,recurring_with_timeRuleDataBaseand all discriminated subtypes:DateRangeRuleData,RecurringRuleData,TimeBasedRuleData,SpecificDatesRuleData,SpecificDatesWithTimeRuleData,DateRangeWithTimeRuleData,RecurringWithTimeRuleDataPreorderContainerschema: container for all preorder items (packages→PreorderPackageRequest,menus→PreorderMenuRequestV2)MenuItemOptionschema: configurable option for a menu item (fieldvalue)MenuItem: added fieldsname,price,description,diet_types,allergens,configurable_options,type,subType,displayOrderMenuItemSelection: added fieldoptions(array ofMenuItemOption)Booking.preorders.menus: added fieldsubmitted(enum:pre/post)PATCH /venues/bookings/{bookingId}: new endpoint for partial booking updates via JSON Patch (RFC 6902)JsonPatchOperationschema supportingadd,remove,replaceoperationsProduct: added fieldpreOrderRequired(boolean)
MenuItem.subGroupNamerenamed tosubTypePOST /venues/{compositeId}/bookingresponse201: changed fromBookingResponseto fullBookingschema- Terminology updated throughout: "RMS (Restaurant Management System)" → "TMS (Table Management System)"
- Security schemes consolidated: staging environments (
Staging,SandboxStaging,SandboxProduction) removed; onlyProductionandSandboxremain - Servers list reduced to
Production(https://api.bookabletech.com) andSandbox(https://api-sandbox.bookabletech.com)
Venue.packages(top-level array) — replaced byVenue.preorders.packagesVenue.menus(top-level array) — replaced byVenue.preorders.menusBookingRequest.preorderPackages— replaced byBookingRequest.preorders.packagesBookingRequest.preorderMenus— replaced byBookingRequest.preorders.menus- Sandbox Staging server
https://api-sandbox-staging.bookabletech.com
compositeIdquery filter to theGET /venues/bookingsendpoint.
BREAKING CHANGE in the following endpoints:
GET /venues/bookingsGET /venues/bookings/{bookingId}PUT /venues/bookings/{bookingId}Changed:
companyfield is nowvenueGroupNameproductTypefield is nowproductName
Removed:
cursorquery parameter fromGET /venues/bookingscursorfield from response fromGET /venues/bookings
Added: Standard pagination parameters in
GET /venues/bookings:pageNumber(integer, default: 1, min: 1) - The page index to returnpageSize(integer, default: 20, min: 1, max: 100) - Items per pageNumbermetaobject with pagination metadata:
"meta": { "currentPage": 1, "pageSize": 20, "totalItems": 26, "totalPages": 2 }Migration Guide:
- GET /venues/bookings?cursor=abc123 + GET /venues/bookings?pageNumber=1&pageSize=20GET /venues/{compositeId}/availabilityAdded: preOrderItems
venueGroupNamefield on venue object inGET /venuesandGET /venues/{venueId}endpoints.
- Remove constraints on bookingRules.
X-Booking-Sourceheader inPOST venues/bookingsis now an enumeration.
Added sorting capabilities to
GET /venuesendpoint:New Query Parameters
sortBy(optional): Field to sort results bydefault- Sort by composite ID (venue_group_id, rms_id, venue_id)name- Sort alphabetically by venue namecity- Sort by city name, then venue namearea- Sort by area, then venue namevenueGroup- Sort by venue group name (requires venueGroupName filter)relevance- Sort by semantic similarity using vector embeddings (requires embedding filters)
sortDirection(optional): Sort directionASC- Ascending (A-Z, 0-9, most to least similar)DESC- Descending (Z-A, 9-0, least to most similar)
- Operator Booking Id and Partner Booking Id support to
GET venues/bookingsbyoperatorBookingIdandpartnerBookingIdfields - Partner Booking Id support to
POST venues/bookingsbypartnerBookingIdfield
Referencefield is deprecated inGET venues/bookings; useoperatorBookingIdinstead.
- Booking Overrides support to
GET venuesandGET venues\{venueId}bybookingOverridesfield - Operator availability rule support to
GET venuesandGET venues\{venueId}byoperatorAvailabilityRulesfield
- Preorders support to
GET venues/bookingsbypreordersfield - Preorder menus support to
GET venues/bookingsbypreorderMenusfield
- Possibility to filter by
dateandtimewithin theGET /venuesendpoint.
X-Booking-Sourceheader which identifies the source or channel through which the booking was created.
X-Partner-Referenceheader is now mandatory on all the endpoints for Bookable Agent clients.
- noAvailabilityAction support to
GET venues/:venueId/availability - autoConfirmRule support to
GET venues/:venueId/availability
- Preorder menu support to
GET venuesandGET venues/:venueIdbymenusfield - Preorder menu support to
POST venues/:venueId/bookingbypreorderMenusfield - Preorder menu email triggering on submit booking
- Preorder menu support to
GET venues/bookings/:bookingIdbypreorderMenusfield
packageIdfield onPOST venues/:venueId/bookingrequest
- BREAKING CHANGE: Booking PUT request now requires
compositeId
GET /venues/products/{compositeId}endpoint
- Venue packages detail by
packages - Booking POST request now accepts
packageId - Booking POST request now accepts
preorders
- Endpoint to get a venue product detail by
compositeId
- Venue Schema Fields: Deprecated
is_activeandcreated_atfields in venue responses - Booking POST request now accepts
nullvalue fordurationfield
- Booking POST request includes admin_notes, comments & labels field
- Standardized error handling across all endpoints
- BREAKING CHANGE: Modified venue composition - products are now contained within the venue structure
- X-Partner-Reference header for Bookable Agents. The header specifies the partner reference for whom the booking is being made.
- Endpoint to update an existing booking by its unique ID
- Endpoint to cancel a booking by its unique ID
- Endpoint to retrieve a paginated list of bookings
- Endpoint to retrieve a specific booking by its unique ID
- Support for paginated venue listings
- Rename shut into bookingCutoff
- bookingRules: Insert booking rules on Venue to show information about the opening/ close time, max min number of people, and other
- Validation on require field (#TS-948)
- Add the unified api
- VenueId: Introduced the concept of composite Id to manage id into the system
- type into avalability response: Specifies how an operators time slot can be handled.
- type into revervation request
- product_name: the name of product offer from venue