Skip to main content

Check Experience Availability

Check available spots for an experience schedule slot.

Endpointโ€‹

GET /v1/availability/experiences

Query Parametersโ€‹

ParameterTypeRequiredDescription
experience_idintegerYesID of the experience
schedule_idintegerYesID of the schedule slot
participantsintegerNoNumber of participants (default: 1)
booking_option_idintegerNoCheck the selected booking option. An ID from another experience falls back to the default option.

Responseโ€‹

{
"data": {
"available": true,
"available_spots": 8,
"available_groups": null,
"guide_available": true,
"fewer_spots_reason": null,
"unavailable_reason": null,
"requested_participants": 4,
"max_capacity": 12,
"booked_count": 4,
"held_count": 0,
"experience": {
"id": 5,
"name": "Sunset Kayak Tour"
},
"schedule": {
"id": 123,
"date": "2026-02-15",
"start_time": "17:00:00",
"end_time": "19:00:00"
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}

Example Requestโ€‹

curl "https://app.equipdash.com/api/v1/availability/experiences?experience_id=5&schedule_id=123&participants=4" \
-H "Authorization: Bearer YOUR_API_KEY"

Response Fieldsโ€‹

FieldTypeDescription
availablebooleanWhether requested spots are available
available_spotsintegerRemaining spots (0 when the business is closed then, or a guide-gated departure has no guide free for the window). When a groups-per-slot cap applies, this is clamped to available_groups ร— the group size
available_groupsinteger|nullGroups still bookable on this departure under the groups-per-slot cap. null when the experience has no cap (or is not a shared group-priced experience)
guide_availablebooleantrue unless the experience requires a guide and none of the slot's assigned guides are free (a guide locked onto an overlapping booked departure is not free)
fewer_spots_reasonobject|nullWhy available_spots is below capacity minus booked while the departure still sells. kind is equipment (gear every guest takes is out on rentals or other departures then) or places (the places it shares with another experience are partly booked). message is one sentence, for example "5 Single Kayaks are out on a rental then.". null otherwise
unavailable_reasonobject|nullWhy no spots are left when seats are not the reason. kind is closed (the business is closed then), private (a private booking holds the departure), request (a booking request holds the departure until the business answers it), equipment (the shared item is booked on another departure or rental), guides (no guide is free), groups (every group is booked) or places (the places it shares with another experience are booked). message is one sentence, for example "11:00 AM full - Harbor Launch is out on the 9:00 AM Morning Paddle until 12:00 PM". A guides message never names staff, and a closed message never shows the closure's own name. null when spots are left or the departure is simply full
requested_participantsintegerNumber requested
max_capacityinteger|nullMaximum capacity (null if unlimited)
booked_countintegerCurrently booked participants
held_countintegerSpots customers are holding in their booking-page carts right now. Not booked, and not free to sell until the hold ends
experience.idintegerExperience ID
experience.namestringExperience name
schedule.idintegerSchedule slot ID
schedule.datestringDate of the slot (YYYY-MM-DD)
pricesarrayGear per price only: one entry per price, {rate_category_id, available_spots}. Each price is limited by its own gear, and never by more than available_spots. Empty when the prices share one gear list
schedule.start_timestringStart time (HH:MM:SS)
schedule.end_timestringEnd time (HH:MM:SS)

Errorsโ€‹

Experience Not Foundโ€‹

{
"error": {
"code": "resource_not_found",
"message": "The requested experience was not found."
},
"meta": {
"request_id": "req_abc123"
}
}

Invalid Scheduleโ€‹

{
"error": {
"code": "validation_error",
"message": "The given data was invalid.",
"details": [
{
"field": "schedule_id",
"message": "The selected schedule does not belong to this experience."
}
]
},
"meta": {
"request_id": "req_abc123"
}
}

Capacity Calculationโ€‹

Available Spots = Max Capacity - Booked Count - Held Count
  • If experience has no max capacity, available_spots returns a large number
  • booked_count includes all non-cancelled bookings for this schedule
  • held_count is spots in customers' booking-page carts. When a customer adds an experience to their cart, its spots are held for the shop's hold length (widget_settings.cart_hold_minutes on Get Settings, 10 minutes unless the shop changes it, 0 = off). A hold ends on its own when that time passes, or when the customer removes the item or books it

Booking optionsโ€‹

Send booking_option_id to check an option's session access, party limits, group capacity, and exclusivity. The response also includes booking_option_id, capacity_unit, and effective_groups_capacity. available_groups counts remaining group slots; available_spots counts the people those slots can accept. A null limit means unlimited. Committed bookings, guide coverage, equipment, and closures still apply.

An experience with booking options switched off uses its first option. Omitting the parameter preserves the existing response behavior.