Bundle Availability
Check whether a bundle can be booked for a given window — how many you can sell (max_bundles),
which item is limiting, per-item stock, and any advisory warnings the booking agent should see.
It runs the same availability gate as Create booking, so the count you see here is what will actually book. Nothing is reserved or written. Optionally scope the check to a pickup location and to the customer's selection so the count matches exactly what they configured.
Endpoint
GET /v1/bundles/{id}/availability
Authentication
Requires a live or test API key with products:read scope.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | integer | Bundle ID |
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
start_date | string | Yes | Start date/time (ISO 8601). |
end_date | string | Yes | End date/time (ISO 8601). Must be on or after start_date. |
location_id | integer | No | Scope availability to a pickup location's stock. Omit to count stock across all locations (the previous behavior). |
choices | object | No | { choice_group: bundle_item_id } — the chosen option per "pick one" group. Scopes availability to the chosen items instead of the default selection. |
durations | object | No | { bundle_item_id: hours } — chosen rental durations (hours; fractions = minutes). |
participants | object | No | { bundle_item_id: headcount } — heads per experience option. |
variations | object | No | { bundle_item_id: variation_id } — chosen variation for a rental item. |
schedules | object | No | { bundle_item_id: experience_schedule_id } — the chosen departure for an experience option. Used to compute the conflict advisory. |
These are the same selection keys you send to Price preview and
Create booking. They may also be passed nested under a
single selection object (e.g. selection[location_id], selection[choices][…]). With no
selection or location_id, the endpoint behaves exactly as before (default selection, all locations).
Example Request
curl "https://app.equipdash.com/api/v1/bundles/88/availability?\
start_date=2026-07-15T09:00:00Z&end_date=2026-07-15T13:00:00Z&\
location_id=4&choices[watercraft]=503&schedules[502]=3300" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
Success (200 OK)
{
"data": {
"max_bundles": 3,
"limiting_product": "Sea-Doo GTI 130",
"items": [
{
"item_id": 503,
"product_id": 163,
"product_name": "Sea-Doo GTI 130",
"required_qty": 1,
"available_qty": 3,
"variations": [],
"duration_pricing": [
{ "hours": 2, "price": 240.00, "saving": 60.00 },
{ "hours": 4, "price": 255.00, "saving": 45.00 }
]
}
],
"warnings": [
{
"type": "min_notice",
"item_id": 503,
"message": "This item must be booked at least 24 hours in advance.",
"available_from": "2026-07-16T09:00:00+00:00",
"available_from_label": "16 Jul"
},
{
"type": "conflict",
"item_id": 502,
"message": "Discovery Tour Excursion runs 10:00 AM–12:00 PM during this rental."
}
]
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-06-20T10:00:00Z"
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
max_bundles | integer | How many of this bundle can be booked for the window/location/selection. 0 when a required experience has no bookable departure or a chosen rental is out of stock. |
limiting_product | string|null | The item that caps max_bundles. |
items | array | Per-item availability (+ duration_pricing deal-pill savings, as in Price preview). |
items[].available_qty | integer | Units available for this item (location-scoped when location_id is sent). |
warnings | array | Advisory only — see below. |
warnings[] — advisory, never blocking
Entries in warnings[] are informational. They do not change max_bundles and do not
prevent a booking — staff/agents may still book (e.g. inside the notice window). Surface them as a
banner; keep the booking action enabled. (The customer booking widget applies its own hard rules;
this endpoint is the agent/staff view.)
| Field | Type | Description |
|---|---|---|
type | string | min_notice or conflict. |
item_id | integer | The bundle item the warning is about. |
message | string | Human-readable explanation. |
available_from | string | (min_notice only) The earliest bookable instant (ISO 8601, UTC). |
available_from_label | string | (min_notice only) Short label in the supplier's timezone — a time if it's the same day (1:00 PM), otherwise a date (16 Jul). |
min_notice— a chosen rental is inside its minimum booking-notice window for the requested start.available_from/available_from_labeltell the customer when it frees up.conflict— a chosen experience departure runs inside the bundle's rental window. Purely a heads-up (the bundle shares one rental window across the day); not a clash to prevent.
Rate counts
For a rate-priced bundle, send selection.rate_counts with the offered rate category IDs and counts. Include the selected choices and variations in the same selection object. Availability uses the resulting people and gear quantities; a quote does not reserve them. Booking creation rechecks availability.