Skip to main content

Check Product Availability

Check real-time availability for a single product.

Endpointโ€‹

GET /v1/availability/products

Query Parametersโ€‹

ParameterTypeRequiredDescription
product_idintegerYesID of the product
variation_idintegerNoID of specific variation
start_datestringYesStart date/time (ISO 8601)
end_datestringYesEnd date/time (ISO 8601)
quantityintegerNoQuantity 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_quantity falls back toward available_quantity as 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โ€‹

FieldTypeDescription
availablebooleanWhether 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_quantityintegerUnits physically on hand for the window (max 999)
bookable_quantityintegerUnits 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_quantityintegerWhat was requested
product.idintegerProduct ID
product.namestringProduct name
product.has_variationsbooleanWhether product has variations enabled
product.inventory_trackingstringnone, group, or item
variationobjectSingle variation details (only when variation_id specified)
variation.idintegerVariation ID
variation.skustringVariation SKU
variation.valuesarrayVariation property values
variationsarrayPer-variation availability (only for products with variations when no variation_id specified)
variations[].idintegerVariation ID
variations[].skustringVariation SKU
variations[].valuesarrayVariation property values
variations[].availablebooleanWhether the requested quantity can be booked for this variation
variations[].available_quantityintegerUnits on hand for this variation
variations[].bookable_quantityintegerUnits that may be sold for this variation, including whatever is left of the product's shared shortage allowance
period.start_datestringRequested start date (ISO 8601)
period.end_datestringRequested end date (ISO 8601)
Which number should I read?

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โ€‹

ModeAvailable Quantity
noneAlways returns 999 (unlimited)
groupReturns total available across all items
itemReturns count of specific available items