OnSeasonChannel API

Get availability

Get day-level availability, prices, and stay limits for one listing.

GET/api/v1/availability/{listingID}

Returns one row per date and unit from OnSeason's synchronized calendar. It doesn't call the PMS and doesn't hold inventory. The quote and the reservation check availability again.

Path parameters

ParameterTypeDescription
listingIDUUIDOnSeason listing ID.

Query parameters

ParameterTypeDescription
startDatedateFirst date, YYYY-MM-DD. Send with endDate.
endDatedateLast date, YYYY-MM-DD. Inclusive.
statusenumAVAILABLE or NOT_AVAILABLE.
displayCurrencystringISO 4217 currency for prices.
includePricebooleantrue adds avgNightlyPrice for the rows on the page.
aggregatebooleantrue returns one row per date, available when any requested unit is available.
unitIdsUUIDUnit to include in aggregate mode. Repeat the parameter for each unit.
pageintegerPage number. Default 1.
limitintegerRows per page. Default 90, maximum 730.

endDate is the last night, unlike search and quote, where the checkout date is not charged. For a stay from 10 to 13 August, request startDate=2026-08-10 and endDate=2026-08-12.

Example

curl --get \
  "https://zepl-staging.calry.app/api/v1/availability/80e0e6d4-48cf-4ca7-8c85-6e8d7e9d969a" \
  --header "x-calry-api-key: <API_KEY>" \
  --data-urlencode "startDate=2026-08-10" \
  --data-urlencode "endDate=2026-08-12" \
  --data-urlencode "displayCurrency=EUR" \
  --data-urlencode "includePrice=true"
{
  "data": [
    {
      "id": "14bb0c51-7f5a-4b36-9704-8c5cd65eca1f",
      "date": "2026-08-10",
      "status": "AVAILABLE",
      "price": 132,
      "minimumNights": 2,
      "maximumNights": 30,
      "currency": "EUR",
      "originalPrice": 120,
      "priceModifications": {
        "defaultDiscount": { "percentage": 0, "value": 0 },
        "markup": { "percentage": 10, "value": 12 }
      },
      "unit": {
        "id": "70978a5b-c0d4-4f8c-8187-c695cac9d64e",
        "providerUnitID": "staging-unit-101",
        "name": "Entire apartment"
      }
    }
  ],
  "meta": { "total": 3, "limit": 90, "totalPages": 1, "current": 1 },
  "avgNightlyPrice": 132
}

The example shows the first of three rows.

Response

FieldDescription
data[].idRow ID.
data[].dateCalendar date, YYYY-MM-DD.
data[].statusAVAILABLE or NOT_AVAILABLE.
data[].pricePrice for the night, with your channel's pricing.
data[].minimumNightsMinimum stay for a booking that starts on this date.
data[].maximumNightsMaximum stay for a booking that starts on this date.
data[].currencyCurrency of the prices.
data[].originalPricePrice before OnSeason's price modifications.
data[].priceModificationsDefault discount and channel markup applied.
data[].unitUnit id, providerUnitID, and name. Absent in aggregate mode.
metaPagination metadata.
avgNightlyPriceAverage of the row prices on the page. Only with includePrice=true.

Status codes

StatusMeaning
200Availability returned. An empty data array is valid.
400The listing ID, dates, status, currency, or pagination is invalid.
401The API key is missing or invalid.
404No listing with this ID is enabled for your channel.

On this page