Availability and pricing
An activity's availability is time-aware. Read the bookable dates for a product-type, then the timeslots and per-traveller prices for a chosen date. Past dates and times are already filtered out against the activity's local timezone.
Read availability
GET/v3/HAPI/activities/product-types/{id}/availability
Requires the activities:read scope. The {id} is an apt_ product-type id.
Query parameters
| Name | Type | Description |
|---|---|---|
date | string | Optional YYYY-MM-DD. Without it you get the bookable dates; with it you get the timeslots and rates for that date. |
Response — bookable dates
{
"object": "activity_availability",
"product_type_id": "apt_88213",
"timezone": "Asia/Tbilisi",
"dates": [
{ "date": "2026-11-14" },
{ "date": "2026-11-15" }
]
}Response — a chosen date
{
"object": "activity_availability",
"product_type_id": "apt_88213",
"date": "2026-11-14",
"weekday": "Saturday",
"timezone": "Asia/Tbilisi",
"available": true,
"capacity": [
{ "category": "adult", "quantity": 12 },
{ "category": "child", "quantity": 12 }
],
"timeslots": [
{ "start_time": "09:00" },
{ "start_time": "14:00" }
],
"rates": [
{ "category": "adult", "price": { "amount": "29.00", "currency": "USD" } },
{ "category": "child", "price": { "amount": "19.00", "currency": "USD" } },
{ "category": "senior", "price": { "amount": "24.00", "currency": "USD" } }
],
"booking_options": {
"per_booking": [
{
"id": "46db421e-5727-46fc-9f2c-10679e026582",
"name": "Flight number", "name_translated": "Flight number",
"description": "As shown on your ticket", "required": true, "add_on": false,
"input_type": 14, "input_type_name": "flight_number",
"format_regex": "^[A-Z0-9][A-Z0-9][0-9]{0,4}$",
"valid_from": null, "valid_to": null
}
],
"per_pax": [
{
"id": "543f0e45-bdfe-4dc7-af73-e7fd5eda8246",
"name": "Pickup zone", "required": true, "add_on": true,
"input_type": 1, "input_type_name": "list",
"items": [
{ "label": "Zone 1", "value": "zone_1", "price": { "amount": "10.00", "currency": "USD" } },
{ "label": "Zone 2", "value": "zone_2", "price": { "amount": "15.00", "currency": "USD" } }
]
}
]
}
}
Time-aware by design.
Dates and timeslots already in the past are removed relative to the activity's local timezone, so a slot you see is a slot you can book. Prices are per traveller and in USD.
A
capacity quantity of 0 means that traveller category is sold out on this date; activities with open (untimed) admission return an empty timeslots list.
Booking options
Some activities require extra information at booking time — a flight number, a pickup zone, passenger names, an uploaded document. These come back under booking_options, split into:
per_booking— answered once for the whole booking.per_pax— answered once per traveller (adults + children + seniors, in that order).
Each option carries:
| Field | Meaning |
|---|---|
id | Option id — send it back as the answer's id when booking. |
name / name_translated | Label to show the guest. |
description / description_translated | Helper text. |
required | When true, the booking is rejected without an answer. |
add_on | A paid extra shown on the product page. |
input_type / input_type_name | The field type — see the table below. |
format_regex | Optional client-side validation pattern for the value. |
valid_from / valid_to | Date window during which the option applies (or null). |
price | Optional flat surcharge for choosing this option. |
items | For list types: the selectable { label, value, price } choices. |
input_type values
| # | name | # | name |
|---|---|---|---|
1 | list | 8 | image |
2 | list_multiple | 9 | address |
3 | number | 10 | time |
4 | string | 11 | datetime |
5 | boolean | 12 | country |
6 | date | 13 | phone |
7 | file | 14 | flight_number |
Add-on pricing. An option's
price, and each list items[].price, is a per-choice surcharge in USD that the guest pays on top of the ticket rates — it is the customer-facing price (any applicable markup is already included). Options without a price are informational (e.g. a flight number) and cost nothing.
Required options are enforced. If the activity has any
required option and you omit it (or omit it for one of the travellers), the booking is rejected with 422 and a message naming the missing option — nothing is held. Answer every required option to book.
Submit the answers under options when you create the booking.
Was this page helpful?