Skip to main content

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​

ParameterTypeDescription
idintegerBundle ID

Query Parameters​

FieldTypeRequiredDescription
start_datestringYesStart date/time (ISO 8601).
end_datestringYesEnd date/time (ISO 8601). Must be on or after start_date.
location_idintegerNoScope availability to a pickup location's stock. Omit to count stock across all locations (the previous behavior).
choicesobjectNo{ choice_group: bundle_item_id } — the chosen option per "pick one" group. Scopes availability to the chosen items instead of the default selection.
durationsobjectNo{ bundle_item_id: hours } — chosen rental durations (hours; fractions = minutes).
participantsobjectNo{ bundle_item_id: headcount } — heads per experience option.
variationsobjectNo{ bundle_item_id: variation_id } — chosen variation for a rental item.
schedulesobjectNo{ 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​

FieldTypeDescription
max_bundlesintegerHow 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_productstring|nullThe item that caps max_bundles.
itemsarrayPer-item availability (+ duration_pricing deal-pill savings, as in Price preview).
items[].available_qtyintegerUnits available for this item (location-scoped when location_id is sent).
warningsarrayAdvisory only — see below.

warnings[] — advisory, never blocking​

Warnings never block a booking

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.)

FieldTypeDescription
typestringmin_notice or conflict.
item_idintegerThe bundle item the warning is about.
messagestringHuman-readable explanation.
available_fromstring(min_notice only) The earliest bookable instant (ISO 8601, UTC).
available_from_labelstring(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_label tell 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.