List package availability

GET
/packages/{package_id}/availability

Returns availability slots for a package. Slots are filtered by comparison operators on the slot start, supplied as field[operator]=value.

Only packages that are currently selling and sold online are addressable here; any other package id (unknown, draft, off-sale, not sold online, or belonging to another company) returns 404.

Supported operators: eq, gteq, gt, lteq, lt (= / >= / > / <= / <). Filters on different fields combine as an intersection.

A bounded start window is required: supply both a lower bound (gteq, gt or eq) and an upper bound (lteq, lt or eq) on start_at. A single eq satisfies both. The window may not exceed 90 days. start_at date-times and start_time_of_day are the package's local wall-clock times: no timezone conversion is applied, and timezone offsets (e.g. a trailing Z or +02:00) are not accepted. A range whose bounds can never overlap (e.g. a lower bound beyond the upper bound) is rejected.

Example queries:

  • Date range: ?start_at[gteq]=2026-05-15&start_at[lteq]=2026-05-17
  • Single day: ?start_at[eq]=2026-05-16
  • Moment range: ?start_at[gteq]=2026-05-15T18:00&start_at[lteq]=2026-05-17T12:00
  • Mornings over a date range: ?start_at[gteq]=2026-05-15&start_at[lteq]=2026-05-17&start_time_of_day[gteq]=09:00&start_time_of_day[lteq]=12:00
  • Exclusive bounds: ?start_at[gt]=2026-05-15&start_at[lt]=2026-05-18
  • With party size: ?start_at[eq]=2026-05-16&adult_count=2

Each availability item has an opaque id and the object availability_package. The endpoint is not paginated.

Slots are read from a precomputed cache, refreshed asynchronously when stock or bookings change. A slot that just became unavailable may still appear here until that refresh lands. Treat this list as a planning signal: POST /bookings is the source of truth, and a 422 there means you should re-fetch availability.

Path Parameters

package_id*string

Package ID (e.g. pkg_9fKbV3aQx7).

Query Parameters

start_at?object

Range filter on the slot start. Each bound is an ISO 8601 date (e.g. start_at[gteq]=2026-05-15, bounding the start date) or date-time (e.g. start_at[gteq]=2026-05-15T18:00, bounding the exact wall-clock moment). A lower and an upper bound are required; a single eq provides both. Must be today or in the future.

eq?string
gteq?string
gt?string
lteq?string
lt?string
start_time_of_day?object

Range filter on the slot start time of day (HH:MM, 24-hour), applied to every date in the window, e.g. start_time_of_day[gteq]=18:00.

eq?string
gteq?string
gt?string
lteq?string
lt?string
adult_count?integer

Number of adult guests to check availability for. If omitted, defaults to the smallest party size the package offers (its minimum party size, the same default the storefront shows).

Range1 <= value

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/packages/string/availability" \  -H "Easol-API-Version: 2026-11-01"
{
  "object": "string",
  "url": "string",
  "has_more": true,
  "next_cursor": "string",
  "data": [
    {
      "object": "availability_package",
      "id": "string",
      "product_name": "string",
      "start_date": "2019-08-24",
      "start_time": "string",
      "adult_count": 0,
      "available": true,
      "remaining_stock": 0,
      "from_price": {
        "amount": 0,
        "currency": "string"
      }
    }
  ]
}
{
  "error": {
    "code": "string",
    "message": "string"
  }
}
{
  "error": {
    "code": "string",
    "message": "string"
  }
}
{
  "error": {
    "code": "string",
    "message": "string"
  }
}
{
  "error": {
    "code": "string",
    "message": "string"
  }
}