OnSeasonChannel API

Create a quote

Get the current price and terms for a stay, and a token to book it.

POST/api/v1/quote

Asks the PMS for the current price of one stay and checks that the stay can be sold. The response has the full price breakdown, the cancellation terms, and a signed quoteToken that you send with the reservation. The token is valid for 15 minutes.

Query parameters

ParameterTypeDescription
displayCurrencystringISO 4217 currency for every amount in the response.

Request body

FieldRequiredTypeDescription
listingIDYesUUIDOnSeason listing ID.
checkInDateYesdateCheck-in date, YYYY-MM-DD. Not in the past.
checkOutDateYesdateCheck-out date, YYYY-MM-DD. After check-in.
guestsYesnumberTotal guests. Minimum 1.
guestCountInfoNoobjectCounts by type: adults, children, infants, and pets.
unitIDNoUUIDUnit to quote, for MULTI_UNIT and COMPLEX listings.
roomTypeNostringRoom type for OnSeason to pick a free unit from. Ignored when you send unitID.

Example

curl --request POST "https://zepl-staging.calry.app/api/v1/quote?displayCurrency=EUR" \
  --header "x-calry-api-key: <API_KEY>" \
  --header "Content-Type: application/json" \
  --data '{
    "listingID": "80e0e6d4-48cf-4ca7-8c85-6e8d7e9d969a",
    "checkInDate": "2026-12-05",
    "checkOutDate": "2026-12-08",
    "guests": 4,
    "guestCountInfo": { "adults": 3, "children": 1, "infants": 0, "pets": 0 }
  }'
{
  "quoteId": "q_abcdefghijklmnopqrstuv",
  "quoteExpiresAt": "2026-11-10T10:15:00.000Z",
  "listingID": "80e0e6d4-48cf-4ca7-8c85-6e8d7e9d969a",
  "checkInDate": "2026-12-05",
  "checkOutDate": "2026-12-08",
  "guests": 4,
  "currency": "EUR",
  "totalPrice": 486,
  "priceBeforeTaxes": 436,
  "components": {
    "basePrice": {
      "amount": 396,
      "breakdown": [
        { "name": "Nightly rate", "description": "2026-12-05", "price": 132, "type": "nightly" },
        { "name": "Nightly rate", "description": "2026-12-06", "price": 132, "type": "nightly" },
        { "name": "Nightly rate", "description": "2026-12-07", "price": 132, "type": "nightly" }
      ]
    },
    "fees": {
      "amount": 40,
      "breakdown": [{ "name": "Cleaning fee", "description": "Cleaning fee", "price": 40, "type": "fee" }]
    },
    "taxes": {
      "amount": 50,
      "breakdown": [{ "name": "Taxes", "description": "Taxes", "price": 50, "type": "tax" }]
    },
    "discounts": { "amount": 0, "breakdown": [] }
  },
  "priceModifications": {
    "defaultDiscount": { "percentage": 0, "value": 0 },
    "markup": { "percentage": 10, "value": 36 }
  },
  "deposit": 0,
  "payAtProperty": [
    {
      "name": "Tourist tax",
      "description": "Payable on arrival per person per night",
      "price": 2.6,
      "currency": "EUR",
      "unit": "person_day"
    }
  ],
  "originalTotalPrice": 450,
  "originalBasePrice": {
    "amount": 360,
    "breakdown": [
      { "name": "Nightly rate", "description": "2026-12-05", "price": 120, "type": "nightly" },
      { "name": "Nightly rate", "description": "2026-12-06", "price": 120, "type": "nightly" },
      { "name": "Nightly rate", "description": "2026-12-07", "price": 120, "type": "nightly" }
    ]
  },
  "cancellationPolicy": {
    "policyID": "2f8d6b1a-9c3e-4d7f-8a1b-5e6c7d8f9a0b",
    "name": "Strict",
    "version": 1,
    "source": "TENANT",
    "salesChannel": "acme",
    "timeZone": "Europe/Paris",
    "fixedAt": "2026-11-10T10:00:00.000Z",
    "refundable": true,
    "refundableTag": "RFN",
    "freeCancellationUntil": "2026-11-21T14:00:00.000Z",
    "penalties": [
      { "from": "2026-11-21T14:00:00.000Z", "percentage": 50, "amount": 243, "currency": "EUR" },
      { "from": "2026-11-28T14:00:00.000Z", "percentage": 100, "amount": 486, "currency": "EUR" }
    ],
    "description": "Full refund if cancelled before 2026-11-21 15:00 (Europe/Paris). 50% refund (243.00 EUR) if cancelled before 2026-11-28 15:00 (Europe/Paris). No refund after that."
  },
  "quoteToken": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...",
  "quoteTokenExpiresAt": "2026-11-10T10:15:00.000Z"
}

The token is shortened. Send the whole token you receive.

Response

FieldTypeDescription
listingIDUUIDListing quoted.
checkInDate, checkOutDatestringDates quoted.
guestsnumberGuests quoted.
currencystringCurrency of every amount in the response, except payAtProperty items, which carry their own.
totalPricenumberPrice of the stay with markup, fees, taxes, and discounts. Book at this price.
priceBeforeTaxesnumbertotalPrice without taxes.
components.basePriceprice componentAccommodation price.
components.feesprice componentFees, when present.
components.taxesprice componentTaxes, when present.
components.discountsprice componentPMS discounts, when present. Amounts can be negative.
priceModificationsobjectDefault discount and channel markup, each with percentage and value. Already in the prices above.
depositnumberDeposit the PMS requires, when it applies.
payAtPropertyarrayMandatory costs the guest pays on site. Not in totalPrice and not charged at booking. See below.
originalTotalPricenumberTotal before OnSeason's price modifications. For information only.
originalBasePriceprice componentAccommodation price before OnSeason's price modifications. For information only.
quoteMetadataobjectPMS-specific quoteId and ratePlanId, when the PMS returns them. The token carries them.
cancellationPolicyobjectThe cancellation terms for this stay, fixed now. Booking with the token keeps them.
quoteTokenstringSigned token for Create a reservation. Opaque.
quoteTokenExpiresAtdate-timeWhen the token expires, 15 minutes after the quote.
quoteIdstringOnSeason's ID for this quote. Include it in support requests.
quoteExpiresAtdate-timeWhen OnSeason stops keeping this quote.

PMSs name their price lines differently. Treat names and type values you don't recognize as valid lines.

Pay-at-property charge

FieldTypeDescription
idstringThe PMS's code for the charge, when it has one.
namestringName to show the guest, such as Local tax.
descriptionstringThe PMS's wording of when and how the charge is paid, when it has one.
pricenumberPrice per unit, in currency.
currencystringCurrency the property charges in. Can differ from the quote currency.
unitenumWhat price is per: stay, day, week, person, person_day, usage (metered, such as electricity), or other (read description).

What the token binds

  • The token binds the listing, unit, dates, guest count, currency, prices, and cancellation terms to your API key.
  • A reservation whose listingID, dates, guests, or unitID differs from the quote is rejected.
  • The token is not a hold on the dates and not an idempotency key.
  • After 15 minutes, quote again. An expired token is rejected.

Status codes

StatusMeaning
201Quote created.
400The request is invalid, the party is too large, the check-in is too close for the property, or the stay is not available.
401The API key is missing or invalid.
403The listing is not enabled for your channel, or the API key is not allowed to create quotes.
404The listing or unit was not found.

On this page