Check Experience Availability
Check available spots for an experience schedule slot.
Endpointโ
GET /v1/availability/experiences
Query Parametersโ
| Parameter | Type | Required | Description |
|---|---|---|---|
experience_id | integer | Yes | ID of the experience |
schedule_id | integer | Yes | ID of the schedule slot |
participants | integer | No | Number of participants (default: 1) |
booking_option_id | integer | No | Check 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โ
| Field | Type | Description |
|---|---|---|
available | boolean | Whether requested spots are available |
available_spots | integer | Remaining 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_groups | integer|null | Groups 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_available | boolean | true 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_reason | object|null | Why 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_reason | object|null | Why 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_participants | integer | Number requested |
max_capacity | integer|null | Maximum capacity (null if unlimited) |
booked_count | integer | Currently booked participants |
held_count | integer | Spots customers are holding in their booking-page carts right now. Not booked, and not free to sell until the hold ends |
experience.id | integer | Experience ID |
experience.name | string | Experience name |
schedule.id | integer | Schedule slot ID |
schedule.date | string | Date of the slot (YYYY-MM-DD) |
prices | array | Gear 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_time | string | Start time (HH:MM:SS) |
schedule.end_time | string | End 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_spotsreturns a large number booked_countincludes all non-cancelled bookings for this scheduleheld_countis 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_minuteson 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.