Hermeseus Docs
Legacy docs

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

NameTypeDescription
datestringOptional 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:

Each option carries:

FieldMeaning
idOption id — send it back as the answer's id when booking.
name / name_translatedLabel to show the guest.
description / description_translatedHelper text.
requiredWhen true, the booking is rejected without an answer.
add_onA paid extra shown on the product page.
input_type / input_type_nameThe field type — see the table below.
format_regexOptional client-side validation pattern for the value.
valid_from / valid_toDate window during which the option applies (or null).
priceOptional flat surcharge for choosing this option.
itemsFor list types: the selectable { label, value, price } choices.

input_type values

#name#name
1list8image
2list_multiple9address
3number10time
4string11datetime
5boolean12country
6date13phone
7file14flight_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.