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 apriceFrom 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: trueandbookingMode: "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.
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-wideall 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% gives1,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’spriceFrom 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 withexpand=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.