Skip to main content
Use indicative prices for teasers and comparisons. priceFrom is the lowest price of a complete stay with free rooms from today onward. priceFromPeriods shows how a package’s prices change over time. Neither reserves a room or quotes a chosen set of guests and dates. The Price from object and Price period object define their fields.

Two independent minima

perPersonPerNight selects the lowest average price per guest per night for a complete stay. perStay independently selects the lowest total for the whole room and stay. Each uses the room type’s full standard occupancy. Do not derive one minimum from the other: they can select different offers. Even for the same offer, independently rounded values can make perStay.amount differ from perPersonPerNight.amount × occupancy × nights. For two available seven-night offers without a promotion: perPersonPerNight selects the double room. perStay selects the single room. To display the cheapest whole package, use perStay.amount with its reported occupancy and nights. Dividing the double-room total by two does not produce a buyable single-room offer.

Selecting a complete stay

A complete stay can become a priceFrom minimum only when all of these conditions hold:
  • Its arrival and checkout satisfy the applicable stay rules.
  • Every occupied night has a price in the same currency and the same room type has remaining capacity for every night.
  • The package is in the visit type catalog of your public key. Hotel prices include only packages with available: true and bookingMode: "instant". Visit type prices also include packages booked on request and packages switched off in SpaPortal.
  • Its hotel, package, and room type belong to the scope of the calculation: the hotel’s packages for a hotel price, the package’s hotels for a package price.
Each candidate uses the shortest stay its package permits. A package with a longer minimum stay can still win: perStay compares totals, and perPersonPerNight compares averages per guest per night. Different currencies can select different offers. Package and hotel minima compare every arrival from today in Europe/Prague onward. The total uses each occupied night’s seasonal rate. The checkout date needs neither a nightly price nor room capacity. A gap in prices or capacity makes that complete stay ineligible; the calculation does not combine rooms or currencies to fill the gap. Equal amounts prefer the shorter stay, then the lower occupancy, then the lower visitType.id, hotel id, and room type id, then the earlier arrival. Query parameters do not change indicative prices.

Comparing hotel groups

The hotel-wide all group compares all buyable offers. The health and wellness groups compare offers from one category. Every package that a hotel price names can be opened with the same public key. For the same currency and minimum, the hotel-wide amount cannot exceed the amount in a category group. Compare the two perStay values or the two perPersonPerNight values; comparing across those metrics is not meaningful. An omitted category price does not prove the hotel has no packages in that category. Do not present a hotel-wide price as a category-specific offer. The container definitions specify which groups and currencies are omitted when no offer exists.

Promotions

Whether a promotion applies follows the channel of your public key and the promotion’s hotel, room, and night restrictions. Promotion defines the fields and shows an example limited to two room types. Overlapping percentage discounts apply one after another to the nights they both cover. For a base price of 1,000, a 10% discount followed by 15% gives 1,000 × 0.90 × 0.85 = 765: a combined reduction of 23.5%, not 25%. For example, a hotel promotion shared with the hotel’s own website and SpaBooking combines with a separate SpaBooking-only promotion. The website uses the shared 10% discount and reports 900; SpaBooking uses both discounts and reports 765. A promotion assigned only to another channel does not apply. A promotion discounts each night at most once, even when more than one of its assignments applies. A promotion changes only the nights from its from night to its to night. The original amount belongs to the same selected offer before those promotions; it is not a separately selected cheapest undiscounted stay. For example, a three-night package has two nights at CZK 1,000 and one at CZK 2,000. A 50% promotion covering only the third night gives a total of CZK 3,000 and an original total of CZK 4,000. The first two nights are not discounted.

Package and package-at-hotel prices

The package’s priceFrom compares complete stays across all hotels that sell it. The priceFrom of each hotelListings[] entry compares only that hotel. Both use the selection rules above and the same Price from object. Requesting one hotel with hotelId on the detail endpoint does not change the package’s priceFrom.

Price periods

Request the detail with expand=priceFromPeriods to receive price periods: ranges of nights with the package’s prices, including past nights. Each period prices the package’s shortest stay with that period’s prices and promotions, without checking free rooms or permitted arrival days. Periods are a price overview, so their amounts can differ from priceFrom, and requesting them does not change priceFrom.

Room capacity

priceFrom is calculated for each request from the room capacity recorded in SpaPortal at that moment. If the cheapest stay is sold out, the calculation selects the next stay with free rooms. For example, a sold-out CZK 3,000 offer does not beat an available CZK 4,500 offer. The response does not hold a room. A price you cache can be outdated by the next request, because prices and recorded capacity change. An absent indicative price does not mean the package is unavailable; check its catalog availability separately.

Payer and the quoted amount

For a health stay, payer describes which costs the guest pays. For guest_and_insurer, the indicative price covers the guest-payable accommodation and meals. Display that amount directly; do not subtract an insurer contribution.

Display and rounding

Amounts use integer minor currency units. Convert them using the reported currency exponent; rounding to whole units for display is a client choice. The rules for the original-price field and its separately rounded average are on Price from.