Check Product Availability
Check real-time availability for a single product.
Endpointโ
GET /v1/availability/products
Query Parametersโ
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id | integer | Yes | ID of the product |
variation_id | integer | No | ID of specific variation |
start_date | string | Yes | Start date/time (ISO 8601) |
end_date | string | Yes | End date/time (ISO 8601) |
quantity | integer | No | Quantity to check (default: 1) |
Responseโ
Product Without Variationsโ
{
"data": {
"available": true,
"available_quantity": 5,
"bookable_quantity": 5,
"requested_quantity": 2,
"product": {
"id": 1,
"name": "Mountain Bike",
"has_variations": false,
"inventory_tracking": "group"
},
"period": {
"start_date": "2026-02-15T09:00:00+00:00",
"end_date": "2026-02-17T17:00:00+00:00"
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}
Product With Variations (No Variation Specified)โ
When a product has variations enabled and no variation_id is specified, the response includes availability for each variation:
{
"data": {
"available": true,
"available_quantity": 8,
"bookable_quantity": 8,
"requested_quantity": 2,
"product": {
"id": 1,
"name": "Ski Boots",
"has_variations": true,
"inventory_tracking": "item"
},
"period": {
"start_date": "2026-02-15T09:00:00+00:00",
"end_date": "2026-02-17T17:00:00+00:00"
},
"variations": [
{
"id": 10,
"sku": "SKI-BOOT-S",
"values": [
{ "property": "Size", "value": "Small" }
],
"available": true,
"available_quantity": 3,
"bookable_quantity": 3
},
{
"id": 11,
"sku": "SKI-BOOT-M",
"values": [
{ "property": "Size", "value": "Medium" }
],
"available": true,
"available_quantity": 5,
"bookable_quantity": 5
},
{
"id": 12,
"sku": "SKI-BOOT-L",
"values": [
{ "property": "Size", "value": "Large" }
],
"available": false,
"available_quantity": 0,
"bookable_quantity": 0
}
]
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}
The top-level available, available_quantity, and bookable_quantity reflect the total across
all variations.
Specific Variationโ
When variation_id is specified, only that variation's availability is returned:
{
"data": {
"available": true,
"available_quantity": 3,
"bookable_quantity": 3,
"requested_quantity": 1,
"product": {
"id": 1,
"name": "Ski Boots",
"has_variations": true,
"inventory_tracking": "item"
},
"variation": {
"id": 10,
"sku": "SKI-BOOT-S",
"values": [
{ "property": "Size", "value": "Small" }
]
},
"period": {
"start_date": "2026-02-15T09:00:00+00:00",
"end_date": "2026-02-17T17:00:00+00:00"
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}
Products That Keep Selling When Sold Outโ
A product can be set to keep taking bookings after its on-hand stock is gone, up to a small allowance
(allow_shortage / max_shortage โ see
Keep selling when sold out). For those products
bookable_quantity is higher than available_quantity, and available follows bookable_quantity:
{
"data": {
"available": true,
"available_quantity": 8,
"bookable_quantity": 10,
"requested_quantity": 2,
"product": {
"id": 1,
"name": "Ski Boots",
"has_variations": true,
"inventory_tracking": "item"
},
"variations": [
{
"id": 10,
"sku": "SKI-BOOT-S",
"values": [{ "property": "Size", "value": "Small" }],
"available": true,
"available_quantity": 3,
"bookable_quantity": 5
},
{
"id": 11,
"sku": "SKI-BOOT-M",
"values": [{ "property": "Size", "value": "Medium" }],
"available": true,
"available_quantity": 5,
"bookable_quantity": 7
},
{
"id": 12,
"sku": "SKI-BOOT-L",
"values": [{ "property": "Size", "value": "Large" }],
"available": true,
"available_quantity": 0,
"bookable_quantity": 2
}
]
}
}
Points worth noting when you read these numbers:
- The allowance is one shared budget for the product, added once rather than per option. Here 8 units are on hand and the allowance is 2, so 10 are bookable in total โ and a single option can absorb the whole 2, which is why the Large option is bookable with nothing on hand.
- It is a running budget for the window. Bookings already flagged short over overlapping dates
draw it down, so
bookable_quantityfalls back towardavailable_quantityas it is used up, and rises again after a cancellation. - Kits never use the allowance. A product with linked contents is refused up front when one of its parts is sold out, even if that part allows shortage itself.
- Rentals only. Experiences do not use the allowance โ check them with /v1/availability/experiences.
Example Requestโ
Basic Checkโ
curl "https://app.equipdash.com/api/v1/availability/products?product_id=1&start_date=2026-02-15T09:00:00Z&end_date=2026-02-17T17:00:00Z" \
-H "Authorization: Bearer YOUR_API_KEY"
Check Specific Quantityโ
curl "https://app.equipdash.com/api/v1/availability/products?product_id=1&quantity=3&start_date=2026-02-15T09:00:00Z&end_date=2026-02-17T17:00:00Z" \
-H "Authorization: Bearer YOUR_API_KEY"
Check Product With Variations (All Variations)โ
For products with variations, omit variation_id to get availability for each variation:
curl "https://app.equipdash.com/api/v1/availability/products?product_id=1&quantity=2&start_date=2026-02-15T09:00:00Z&end_date=2026-02-17T17:00:00Z" \
-H "Authorization: Bearer YOUR_API_KEY"
Check Specific Variationโ
curl "https://app.equipdash.com/api/v1/availability/products?product_id=1&variation_id=12&quantity=2&start_date=2026-02-15T09:00:00Z&end_date=2026-02-17T17:00:00Z" \
-H "Authorization: Bearer YOUR_API_KEY"
Response Fieldsโ
| Field | Type | Description |
|---|---|---|
available | boolean | Whether the requested quantity can be booked โ computed as bookable_quantity >= requested_quantity (total across all variations if applicable). This is the pre-flight answer: true means POST /v1/bookings accepts the quantity |
available_quantity | integer | Units physically on hand for the window (max 999) |
bookable_quantity | integer | Units that may actually be sold: on hand plus whatever is left of the product's shortage allowance. Identical to available_quantity unless the product has allow_shortage enabled |
requested_quantity | integer | What was requested |
product.id | integer | Product ID |
product.name | string | Product name |
product.has_variations | boolean | Whether product has variations enabled |
product.inventory_tracking | string | none, group, or item |
variation | object | Single variation details (only when variation_id specified) |
variation.id | integer | Variation ID |
variation.sku | string | Variation SKU |
variation.values | array | Variation property values |
variations | array | Per-variation availability (only for products with variations when no variation_id specified) |
variations[].id | integer | Variation ID |
variations[].sku | string | Variation SKU |
variations[].values | array | Variation property values |
variations[].available | boolean | Whether the requested quantity can be booked for this variation |
variations[].available_quantity | integer | Units on hand for this variation |
variations[].bookable_quantity | integer | Units that may be sold for this variation, including whatever is left of the product's shared shortage allowance |
period.start_date | string | Requested start date (ISO 8601) |
period.end_date | string | Requested end date (ISO 8601) |
To decide whether a booking will be accepted, read available โ or compare your quantity against
bookable_quantity. Use available_quantity when you want to show a person how much gear is
physically on hand. The two quantities only differ for products that
keep selling when sold out.
Errorsโ
Product Not Foundโ
{
"error": {
"code": "resource_not_found",
"message": "The requested product was not found."
},
"meta": {
"request_id": "req_abc123"
}
}
Invalid Variationโ
{
"error": {
"code": "validation_error",
"message": "The given data was invalid.",
"details": [
{
"field": "variation_id",
"message": "The selected variation does not belong to this product."
}
]
},
"meta": {
"request_id": "req_abc123"
}
}
Inventory Tracking Modesโ
| Mode | Available Quantity |
|---|---|
none | Always returns 999 (unlimited) |
group | Returns total available across all items |
item | Returns count of specific available items |