2026-11-03
Visit type price periods
- Added
expand=priceFromPeriodsto the visit type detail. It returns price periods for the package and for each hotel listing: ranges of nights with their prices per guest and per room, the room each price comes from, and the promotions that apply. Periods include past nights, so the expanded detail also returns ended promotions. - Visit type
priceFromincludes packages booked on request and packages switched off in SpaPortal.
2026-10-30
Visit type catalog
- Added
GET /visit-typesandGET /visit-types/{visitTypeId}with the Visit type object: catalog filters, cursor pagination, hotel listings with prices, andchannelContent.collectionsfor the company’s own website channel.
Hotel procedures and prices
- Hotel responses include the hotel’s procedures as Procedure objects.
- Hotel price minima include both the hotel and visit type references, using the same Price from object as package prices.
- Hotel prices select available packages with
bookingMode: "instant"from the visit type catalog. - A promotion lowers a hotel price on the nights it covers.
- The package-page guide covers opening a package from a hotel price and showing original and discounted amounts.
Room type occupancy settings
- Added
max,singleUse, andinfantsExcludedtooccupancyin room type list, detail, and hotel expansion responses. Each value isnullwhen the room type has no configured value; an explicitfalseis a configured value. - Booking and prices use only
occupancy.standard; the other occupancy fields are informational.
Disabled room types
- Added the required boolean
disabledto room type list, detail, and hotel expansion responses. - Room type lists return only enabled rooms by default. Use
disabled=truefor disabled rooms ordisabled=allfor both states. - Both hotel endpoints include only enabled, non-draft rooms with
expand=roomTypes. Room type details are available by id, including disabled rooms. - Disabled room types are excluded from new bookings, prices, and availability results; past bookings keep their references.
2026-10-28 (v3.2.33)
Amenity pricing, hours, and aquapark facilities
- Amenity
pricingisnullor an object withtypeandschedule, for hotel and room type amenities, including room parking. The types areincluded,included_scheduled,included_conditional, andpaid; onlyincluded_scheduledhas a schedule. openingHoursisnullwhen unknown, otherwise{ "schedule": [...] }. A 24/7 schedule lists all seven days from00:00to24:00.- Added the
includesdetail kind and theincludedAmenityCodesdictionary metadata for aquaparks. Nested facilities return resolved conditions and supportexpand=amenityLabels. - Hotel amenity filters also match facilities in an aquapark’s
includes, before pagination. The hotel’s own facilities are separate amenities. - Added
noteto aquapark, indoor pool, outdoor pool, sauna, and laundry, and location, pricing, hours, and note to children’s pools and whirlpools. See Amenities for field meanings and examples.
2026-10-21 (v3.2.32)
Room type name
- Room type
nameis a single string shared by all languages, in room type lists, details, and hotelexpand=roomTypes.Accept-Languageselects the description, label, and imagealttranslations. - Room type
searchmatches the name. A missing imagealtfalls back to the name in each requested language. See Room type names and labels.
Room amenity coverage
- Added the
coveragedetail kind to selected room type amenities. Assigned values returncoverage: "all"orcoverage: "some"in room type lists, details, and hotel expansions, and amenity filters match both values. See Coverage.
Room inclusions
- Added the
inclusionscategory in scoperoomType, containingparking,welcome_drink, andfruit_bowl. Room responses return assigned benefits throughamenityCategories, including room types embedded in hotels. - Room parking uses the
pricingdetail kind;includedmeans that parking is included in the room price. - The category supports
amenityCategory=inclusions, amenity filters, andexpand=amenityLabels. See Included with this room.
2026-10-07 (v3.2.24)
Hotel buildings
- Added
buildingsto hotel list and detail responses, without requiringexpand. Each item containsid, localizedname, and localizedlabel. - The array includes all buildings of the hotel in the order set in
SpaPortal. Hotels without buildings return
[]; hotels with one building return one item. - Match a building’s
idtoroomType.building.id. Texts followAccept-Language, withnullfor missing translations.
2026-09-30 (v3.2.21)
Assigned amenity categories
- Assigned amenity categories in hotel and room type responses contain
codeand, withexpand=amenityLabels,label. The resource decides the dictionary scope:hotelfor hotel amenities androomTypefor room type amenities.
2026-09-29 (v3.2.20)
Amenity category scopes
GET /amenity-categorieswithoutscopereturns both the hotel and the room type dictionary.scope=hotelorscope=roomTypereturns one of them.- Dictionary categories include
scope: "hotel"orscope: "roomType". Match categories byscopeandcode; both scopes containaccessibility. - Room type categories use the codes
bathroom,equipment,accessibility,view, andkitchen. - Combined and filtered dictionary responses have distinct ETags.
2026-09-29
Room types and amenities
- Room types return
name,occupancy.standard, andamenityCategories, also when embedded in hotels, and can be filtered byoccupancy. - Added
unitType,tier,bedConfiguration,size,renovationYear,rules, andbuilding. Enum values carry their labels, and the pet rule includes the hotel’s policy. - Added
unitType,tier,amenities, andamenityCategoryfilters on room types.expandacceptshotelandamenityLabelstogether. - Added
scope=roomTypeto the amenity dictionary.expand=roomTypes,amenityLabelsincludes labels on embedded room amenities. - The amenity version covers both scopes and is also returned on room type endpoints. ETags include the scope.
Localization
Accept-Language: *returns every supported locale key, like an omitted header. Node.jsfetchsends*when you do not set the header.- Inside a list,
*adds the locales you do not list, at its own quality value. Locales listed withq=0are excluded.
2026-09-18
Hotel and room type images
- Added
width,height, localizedalt, andvariantsto every image, including room types embedded in a hotel response. variantscontains available WebP URLs at widths 480, 960, 1440, and 1920. Sizes larger than the original are omitted. When no variant exists, useurl.- Unavailable dimensions are
null; unavailable variants are{}. altfollowsAccept-Language. Missing translations fall back to the hotel name or the room type name. Preserve an explicit empty string for decorative images.
2026-09-10
Hotels
- Hotel
priceFromholds, per currency, the hotel-wide pricealland the categorieshealthandwellness. Each carries two independent minima,perPersonPerNightandperStay, and every minimum reports its ownamount,original,nights,occupancy, andvisitType. See Prices. - A category is omitted when it has no price in the currency. The categories
follow the visit type
category. - Send
Accept-Language:priceFromembeds visit type names, and without the header every name is returned in all four locales.
2026-07-28
Amenities
GET /amenity-categoriesincludes each amenity’soptionslist.- Hotel amenity values return the category, the amenity, and each selected
option by
code; localized labels come from the dictionary. GET /hotelsandGET /hotels/{hotelId}acceptexpand=amenityLabels, which inlines the localizedlabelon each amenity category, amenity, and selected option for a self-contained response.expandaccepts a comma-separated list.
2026-07-27
Amenities
GET /amenity-categoriessupports conditional revalidation: responses carry anETagandCache-Control: private, max-age=3600, and a request with a matchingIf-None-Matchreturns304without a body.GET /amenity-categories,GET /hotels, andGET /hotels/{hotelId}return theX-SpaPortal-Amenities-Versionheader. The value changes only when the dictionary content changes; refetch the dictionary when it differs from the cached version.
2026-07-24
Hotels
- Added hotel
priceFromwith the lowest current and future prices, including applicable promotions and their original prices. It isnullwhen the hotel has no price.
Amenities
- The amenity dictionary is available from
GET /amenity-categories. Each item indatacontainscategoryand anamenitiesarray. - Hotel responses expose assigned amenity values under
amenityCategories. Categories without assigned amenities are omitted. - Amenity-specific choices use the generic
optionsdetail kind. - Hotel amenity values contain
codeand the detail fields listed in the dictionary entry’sdetailKinds. - Detail fields that are not filled have neutral values: scalar fields are
null, arrays are empty, and requested note translations arenull. - Dictionary entries with an empty
detailKindsarray are presence-only. Their hotel values contain onlycode.
2026-07-23
Hotels and amenities
- Added
GET /hotels. - Added
GET /hotels/{hotelId}. - Added
GET /amenity-categories. - Hotel responses include localized
shortDescriptionandchannelContent.tagline, structured accommodation rules and meal services, ordered indication codes, staff language codes, and structured amenities.
Room types
- Invalid cursors, cursors created for another sort mode, and cursors of
another resource return
400. - Empty localized strings are returned as
null. - Empty
codeandsearchquery parameters are treated as omitted parameters.