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).
| Method | Path | Returns |
|---|---|---|
GET | /api/v1/availability | Slots for a product and date range. |
GET | /api/v1/availability/next | The first date with a bookable slot. |
GET | /api/v1/availability/sites | Your sites. |
GET | /api/v1/availability/sites/{siteId}/products | Bookable products at a site, with search filters. |
GET | /api/v1/availability/sites/{siteId}/config | Public settings for a site. |
GET | /api/v1/availability/sites/{siteId}/labels | Slot labels used at a site. |
GET | /api/v1/availability/product-tags | Product tags, for filtering. |
GET | /api/v1/availability/products/{productId}/addons | Add-ons offered with a product. |
GET | /api/v1/availability/products/{productId}/images | Product images. |
GET | /api/v1/availability/products/{productId}/participant-pricing | Prices 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
| Parameter | Required | Description |
|---|---|---|
product_id | Yes | The product. |
date_from | Yes | First date, YYYY-MM-DD. |
date_to | No | Last date, YYYY-MM-DD. Defaults to date_from. |
site_id | No | The site. If you leave it out, the product's own site is used. |
party_size | No | Number of people. Default 1. Prices in pricingPreview use this size. |
include_labels | No | true to include slot labels. Default false. |
duration_mins | No | For products with a choice of durations: only return start times that fit. |
locale | No | Language 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": "…"
}
}
]
}
| Field | Description |
|---|---|
slots[].slotId | Pass this to the booking hold. |
slots[].startsAt, endsAt | ISO 8601, UTC. |
slots[].totalCapacity | Capacity of the slot, including any capacity override. |
slots[].bookedCount | Places already taken. |
slots[].remainingCapacity | Places left. For products booked as a whole (buyouts), this is 1 or 0. |
slots[].labelCodes | Slot labels, for example adults_only. Empty unless include_labels=true. |
slots[].pricingPreview | Estimated price for party_size, in major units (euros). |
minPartySize, maxPartySize | The product's party size limits. |
waitlistEnabled | Whether 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
}
]
}
| Field | Description |
|---|---|
addonType | item, service, upgrade or resource. |
mode | yesno (a checkbox), free_qty (the customer enters a quantity) or per_participant (one per person). |
priceType | How priceAmount is applied. |
priceAmount | Price in euros, as a decimal string. |
isRequired | The add-on must be selected. |
visibility | always, or conditional when it depends on other add-ons (visibilityCondition). |
group | The add-on group, with its name in the requested locale, or null. |
promoBadge | A 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"