Skip to main content

Availability API

The availability endpoints are public and read-only. They power the booking widget: which sites and products you have, which slots are free, and which add-ons a product offers.

None of them needs a login. Send your tenant ID in the x-tenant-id header (or as the tenant_id query parameter).

MethodPathReturns
GET/api/v1/availabilitySlots for a product and date range.
GET/api/v1/availability/nextThe first date with a bookable slot.
GET/api/v1/availability/sitesYour sites.
GET/api/v1/availability/sites/{siteId}/productsBookable products at a site, with search filters.
GET/api/v1/availability/sites/{siteId}/configPublic settings for a site.
GET/api/v1/availability/sites/{siteId}/labelsSlot labels used at a site.
GET/api/v1/availability/product-tagsProduct tags, for filtering.
GET/api/v1/availability/products/{productId}/addonsAdd-ons offered with a product.
GET/api/v1/availability/products/{productId}/imagesProduct images.
GET/api/v1/availability/products/{productId}/participant-pricingPrices per participant type (adult, child, ...).

Resource add-ons (rooms and other resources booked alongside an activity) have their own endpoints. See Resource add-ons API.

Query slots​

GET /api/v1/availability?product_id=p_demo&site_id=s_demo&date_from=2026-10-10&date_to=2026-10-17&party_size=4
x-tenant-id: t_demo
ParameterRequiredDescription
product_idYesThe product.
date_fromYesFirst date, YYYY-MM-DD.
date_toNoLast date, YYYY-MM-DD. Defaults to date_from.
site_idNoThe site. If you leave it out, the product's own site is used.
party_sizeNoNumber of people. Default 1. Prices in pricingPreview use this size.
include_labelsNotrue to include slot labels. Default false.
duration_minsNoFor products with a choice of durations: only return start times that fit.
localeNoLanguage for add-on group and badge labels, for example en or fi.

Response (trimmed):

{
"productId": "p_demo",
"siteId": "s_demo",
"dateFrom": "2026-10-10",
"dateTo": "2026-10-17",
"partySize": 4,
"minPartySize": 1,
"maxPartySize": 12,
"waitlistEnabled": false,
"slots": [
{
"slotId": "sl_123",
"startsAt": "2026-10-10T10:00:00.000Z",
"endsAt": "2026-10-10T11:00:00.000Z",
"labelCodes": [],
"totalCapacity": 16,
"bookedCount": 4,
"remainingCapacity": 12,
"pricingPreview": {
"subtotal": 80.0,
"tax": 20.0,
"total": 100.0,
"currency": "EUR",
"hash": "…"
}
}
]
}
FieldDescription
slots[].slotIdPass this to the booking hold.
slots[].startsAt, endsAtISO 8601, UTC.
slots[].totalCapacityCapacity of the slot, including any capacity override.
slots[].bookedCountPlaces already taken.
slots[].remainingCapacityPlaces left. For products booked as a whole (buyouts), this is 1 or 0.
slots[].labelCodesSlot labels, for example adults_only. Empty unless include_labels=true.
slots[].pricingPreviewEstimated price for party_size, in major units (euros).
minPartySize, maxPartySizeThe product's party size limits.
waitlistEnabledWhether customers can join a waitlist for full slots.

The endpoint always answers 200. If nothing is bookable, or the product or site is unknown, slots is an empty array.

The preview is an estimate. The final price, with promotions and add-ons, is set when you create a booking hold. See Bookings API.

First available date​

GET /api/v1/availability/next?product_id=p_demo&site_id=s_demo&party_size=4
x-tenant-id: t_demo

Returns { "nextAvailableDate": "2026-10-12" }, or null when nothing is bookable within the booking horizon.

Product add-ons​

GET /api/v1/availability/products/{productId}/addons?locale=en
x-tenant-id: t_demo

Returns the active add-ons linked to the product, in display order:

{
"product_id": "p_demo",
"addons": [
{
"id": "addon_123",
"name": "Snack pack",
"description": "Drink and snack per person",
"addonType": "item",
"mode": "per_participant",
"priceType": "fixed",
"priceAmount": "6.00",
"vatRate": 14,
"maxQuantity": null,
"isRequired": false,
"sortOrder": 0,
"visibility": "always",
"visibilityCondition": null,
"imageUrl": null,
"group": null,
"promoBadge": null
}
]
}
FieldDescription
addonTypeitem, service, upgrade or resource.
modeyesno (a checkbox), free_qty (the customer enters a quantity) or per_participant (one per person).
priceTypeHow priceAmount is applied.
priceAmountPrice in euros, as a decimal string.
isRequiredThe add-on must be selected.
visibilityalways, or conditional when it depends on other add-ons (visibilityCondition).
groupThe add-on group, with its name in the requested locale, or null.
promoBadgeA badge to show, for example a discount label, or null.

If the product is unknown, addons is an empty array. For what the types and modes mean to staff, see Add-ons.

Products at a site​

GET /api/v1/availability/sites/{siteId}/products?q=escape&party_size=4&limit=20
x-tenant-id: t_demo

Optional filters: q, tags, min_price, max_price, min_duration, max_duration, party_size, min_age, sort, limit, offset. Returns { "site_id": "...", "products": [...] }.

Example​

curl "https://api.example.com/api/v1/availability?product_id=p_demo&date_from=2026-10-10&party_size=4" \
-H "x-tenant-id: t_demo"