Skip to main content

2026-11-03

Visit type price periods

  • Added expand=priceFromPeriods to 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 priceFrom includes packages booked on request and packages switched off in SpaPortal.

2026-10-30

Visit type catalog

  • Added GET /visit-types and GET /visit-types/{visitTypeId} with the Visit type object: catalog filters, cursor pagination, hotel listings with prices, and channelContent.collections for 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, and infantsExcluded to occupancy in room type list, detail, and hotel expansion responses. Each value is null when the room type has no configured value; an explicit false is a configured value.
  • Booking and prices use only occupancy.standard; the other occupancy fields are informational.

Disabled room types

  • Added the required boolean disabled to room type list, detail, and hotel expansion responses.
  • Room type lists return only enabled rooms by default. Use disabled=true for disabled rooms or disabled=all for 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 pricing is null or an object with type and schedule, for hotel and room type amenities, including room parking. The types are included, included_scheduled, included_conditional, and paid; only included_scheduled has a schedule.
  • openingHours is null when unknown, otherwise { "schedule": [...] }. A 24/7 schedule lists all seven days from 00:00 to 24:00.
  • Added the includes detail kind and the includedAmenityCodes dictionary metadata for aquaparks. Nested facilities return resolved conditions and support expand=amenityLabels.
  • Hotel amenity filters also match facilities in an aquapark’s includes, before pagination. The hotel’s own facilities are separate amenities.
  • Added note to 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 name is a single string shared by all languages, in room type lists, details, and hotel expand=roomTypes. Accept-Language selects the description, label, and image alt translations.
  • Room type search matches the name. A missing image alt falls back to the name in each requested language. See Room type names and labels.

Room amenity coverage

  • Added the coverage detail kind to selected room type amenities. Assigned values return coverage: "all" or coverage: "some" in room type lists, details, and hotel expansions, and amenity filters match both values. See Coverage.

Room inclusions

  • Added the inclusions category in scope roomType, containing parking, welcome_drink, and fruit_bowl. Room responses return assigned benefits through amenityCategories, including room types embedded in hotels.
  • Room parking uses the pricing detail kind; included means that parking is included in the room price.
  • The category supports amenityCategory=inclusions, amenity filters, and expand=amenityLabels. See Included with this room.

2026-10-07 (v3.2.24)

Hotel buildings

  • Added buildings to hotel list and detail responses, without requiring expand. Each item contains id, localized name, and localized label.
  • 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 id to roomType.building.id. Texts follow Accept-Language, with null for missing translations.

2026-09-30 (v3.2.21)

Assigned amenity categories

  • Assigned amenity categories in hotel and room type responses contain code and, with expand=amenityLabels, label. The resource decides the dictionary scope: hotel for hotel amenities and roomType for room type amenities.

2026-09-29 (v3.2.20)

Amenity category scopes

  • GET /amenity-categories without scope returns both the hotel and the room type dictionary. scope=hotel or scope=roomType returns one of them.
  • Dictionary categories include scope: "hotel" or scope: "roomType". Match categories by scope and code; both scopes contain accessibility.
  • Room type categories use the codes bathroom, equipment, accessibility, view, and kitchen.
  • Combined and filtered dictionary responses have distinct ETags.

2026-09-29

Room types and amenities

  • Room types return name, occupancy.standard, and amenityCategories, also when embedded in hotels, and can be filtered by occupancy.
  • Added unitType, tier, bedConfiguration, size, renovationYear, rules, and building. Enum values carry their labels, and the pet rule includes the hotel’s policy.
  • Added unitType, tier, amenities, and amenityCategory filters on room types. expand accepts hotel and amenityLabels together.
  • Added scope=roomType to the amenity dictionary. expand=roomTypes,amenityLabels includes 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.js fetch sends * when you do not set the header.
  • Inside a list, * adds the locales you do not list, at its own quality value. Locales listed with q=0 are excluded.

2026-09-18

Hotel and room type images

  • Added width, height, localized alt, and variants to every image, including room types embedded in a hotel response.
  • variants contains available WebP URLs at widths 480, 960, 1440, and 1920. Sizes larger than the original are omitted. When no variant exists, use url.
  • Unavailable dimensions are null; unavailable variants are {}.
  • alt follows Accept-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 priceFrom holds, per currency, the hotel-wide price all and the categories health and wellness. Each carries two independent minima, perPersonPerNight and perStay, and every minimum reports its own amount, original, nights, occupancy, and visitType. See Prices.
  • A category is omitted when it has no price in the currency. The categories follow the visit type category.
  • Send Accept-Language: priceFrom embeds visit type names, and without the header every name is returned in all four locales.

2026-07-28

Amenities

  • GET /amenity-categories includes each amenity’s options list.
  • Hotel amenity values return the category, the amenity, and each selected option by code; localized labels come from the dictionary.
  • GET /hotels and GET /hotels/{hotelId} accept expand=amenityLabels, which inlines the localized label on each amenity category, amenity, and selected option for a self-contained response. expand accepts a comma-separated list.

2026-07-27

Amenities

  • GET /amenity-categories supports conditional revalidation: responses carry an ETag and Cache-Control: private, max-age=3600, and a request with a matching If-None-Match returns 304 without a body.
  • GET /amenity-categories, GET /hotels, and GET /hotels/{hotelId} return the X-SpaPortal-Amenities-Version header. 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 priceFrom with the lowest current and future prices, including applicable promotions and their original prices. It is null when the hotel has no price.

Amenities

  • The amenity dictionary is available from GET /amenity-categories. Each item in data contains category and an amenities array.
  • Hotel responses expose assigned amenity values under amenityCategories. Categories without assigned amenities are omitted.
  • Amenity-specific choices use the generic options detail kind.
  • Hotel amenity values contain code and the detail fields listed in the dictionary entry’s detailKinds.
  • Detail fields that are not filled have neutral values: scalar fields are null, arrays are empty, and requested note translations are null.
  • Dictionary entries with an empty detailKinds array are presence-only. Their hotel values contain only code.

2026-07-23

Hotels and amenities

  • Added GET /hotels.
  • Added GET /hotels/{hotelId}.
  • Added GET /amenity-categories.
  • Hotel responses include localized shortDescription and channelContent.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 code and search query parameters are treated as omitted parameters.