curl --request GET \
--url https://spaportal.cz/api/v2/hotels \
--header 'X-SpaPortal-Public-Key: <api-key>'import requests
url = "https://spaportal.cz/api/v2/hotels"
headers = {"X-SpaPortal-Public-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-SpaPortal-Public-Key': '<api-key>'}};
fetch('https://spaportal.cz/api/v2/hotels', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://spaportal.cz/api/v2/hotels",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-SpaPortal-Public-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://spaportal.cz/api/v2/hotels"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-SpaPortal-Public-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://spaportal.cz/api/v2/hotels")
.header("X-SpaPortal-Public-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://spaportal.cz/api/v2/hotels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-SpaPortal-Public-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "66f16191f739705faa020001",
"name": {
"cs-CZ": "Spa Resort Pawlik",
"de": "Kurhotel Pawlik",
"en": "Spa Resort Pawlik",
"ru": "Spa Resort Pawlik"
},
"shortDescription": {
"cs-CZ": "Lázeňský hotel s přímým vstupem do aquaparku.",
"de": "Kurhotel mit direktem Zugang zum Aquapark.",
"en": "Spa hotel with direct access to the aquapark.",
"ru": "Спа-отель с прямым доступом в аквапарк."
},
"channelContent": {
"tagline": {
"cs-CZ": "Lázeňská péče pod jednou střechou",
"de": "Kurbehandlungen unter einem Dach",
"en": "Spa care under one roof",
"ru": "Санаторно-курортное лечение под одной крышей"
}
},
"stars": 4,
"address": {
"addressLine": "Národní 25",
"city": "Františkovy Lázně",
"postalCode": "351 01",
"country": "cze"
},
"email": "hotel@example.com",
"phoneNumber": "+420 123 456 789",
"url": "https://hotel.example.com",
"images": [
{
"url": "https://files.example.com/hotel.jpg",
"thumbnailUrl": "https://files.example.com/hotel-thumbnail.webp"
}
],
"accommodationRules": {
"checkIn": {
"from": "14:00",
"to": "20:00"
},
"checkOut": {
"from": "07:00",
"to": "10:00"
},
"children": {
"allowed": true,
"minimumAge": 6
},
"pets": {
"allowed": true,
"minimumNights": 2,
"feePerNight": {
"czk": 500,
"eur": 20
},
"conditions": {
"cs-CZ": "Mazlíčci jsou povoleni ve vybraných pokojích.",
"de": "Haustiere sind in ausgewählten Zimmern erlaubt.",
"en": "Pets are allowed in selected rooms.",
"ru": "Размещение с домашними животными разрешено в отдельных номерах."
}
}
},
"mealServices": {
"breakfast": {
"enabled": true,
"servingTime": {
"from": "07:00",
"to": "10:00"
},
"serviceMethod": "buffet",
"drinksIncluded": true,
"drinksNote": {
"cs-CZ": "Nealkoholické nápoje jsou v ceně.",
"de": "Alkoholfreie Getränke sind inklusive.",
"en": "Soft drinks are included.",
"ru": "Безалкогольные напитки включены в стоимость."
}
},
"lunch": {
"enabled": true,
"servingTime": {
"from": "11:30",
"to": "14:30"
},
"serviceMethod": "buffet",
"drinksIncluded": true,
"drinksNote": {
"cs-CZ": "Voda je zahrnuta v ceně oběda.",
"de": "Wasser ist im Mittagessen inbegriffen.",
"en": "Water is included with lunch.",
"ru": "Вода включена в стоимость обеда."
}
},
"dinner": {
"enabled": true,
"servingTime": {
"from": "18:00",
"to": "21:00"
},
"serviceMethod": "served",
"drinksIncluded": false,
"drinksNote": {
"cs-CZ": "Nápoje se hradí samostatně.",
"de": "Getränke werden separat berechnet.",
"en": "Drinks are charged separately.",
"ru": "Напитки оплачиваются отдельно."
}
}
},
"indications": [
"musculoskeletal",
"cardiovascular",
"diabetes"
],
"staffLanguages": [
"cs",
"de",
"en"
],
"amenityCategories": [
{
"category": {
"code": "wellness"
},
"amenities": [
{
"code": "aquapark",
"proximity": "nearby",
"proximityMeters": 250,
"access": "included",
"openingHours": {
"continuous": false,
"blocks": [
{
"days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"from": "09:00",
"to": "21:00"
}
]
}
},
{
"code": "sauna",
"proximity": "in-hotel",
"proximityMeters": null,
"access": "included",
"options": [
{
"code": "finnish"
},
{
"code": "steam"
}
],
"openingHours": {
"continuous": false,
"blocks": [
{
"days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"from": "09:00",
"to": "21:00"
}
]
}
}
]
},
{
"category": {
"code": "parking",
"label": {
"cs-CZ": "Parkování",
"de": "Parken",
"en": "Parking",
"ru": "Парковка"
}
},
"amenities": [
{
"code": "parking",
"access": "paid",
"options": [
{
"code": "covered",
"label": {
"cs-CZ": "Kryté",
"de": "Überdacht",
"en": "Covered",
"ru": "Крытая"
}
},
{
"code": "guarded",
"label": {
"cs-CZ": "Hlídané",
"de": "Bewacht",
"en": "Guarded",
"ru": "Охраняемая"
}
}
],
"note": {
"cs-CZ": "Hlídané parkoviště je přímo u hotelu.",
"de": "Der bewachte Parkplatz befindet sich direkt am Hotel.",
"en": "Guarded parking is available next to the hotel.",
"ru": "Охраняемая парковка находится рядом с отелем."
}
}
]
}
],
"priceFrom": {
"CZK": {
"perNight": {
"amountMinor": 288000,
"currency": "CZK",
"currencyExponent": 2
},
"perNightOriginal": {
"amountMinor": 320000,
"currency": "CZK",
"currencyExponent": 2
},
"minimumStay": {
"amountMinor": 576000,
"currency": "CZK",
"currencyExponent": 2
},
"minimumStayOriginal": {
"amountMinor": 640000,
"currency": "CZK",
"currencyExponent": 2
},
"guests": 2,
"minimumNights": 2
},
"EUR": {
"perNight": {
"amountMinor": 11340,
"currency": "EUR",
"currencyExponent": 2
},
"perNightOriginal": {
"amountMinor": 12600,
"currency": "EUR",
"currencyExponent": 2
},
"minimumStay": {
"amountMinor": 22680,
"currency": "EUR",
"currencyExponent": 2
},
"minimumStayOriginal": {
"amountMinor": 25200,
"currency": "EUR",
"currencyExponent": 2
},
"guests": 2,
"minimumNights": 2
}
}
}
],
"pagination": {
"limit": 25,
"nextCursor": "<string>",
"hasMore": true,
"total": 123
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"requestId": "<string>",
"details": [
{}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"requestId": "<string>",
"details": [
{}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"requestId": "<string>",
"details": [
{}
]
}
}List hotels
Returns active hotels across the companies your public key is scoped to.
A hotel includes its localized short description and sales-channel
content, structured accommodation rules, meal services, indications,
staff languages, and hotel-level amenities. Localized fields return
the locale keys selected by Accept-Language. name falls back to the
default locale (cs-CZ); other untranslated values are returned as null.
priceFrom contains the cheapest available current or future room
price for the room’s standard occupancy. It is null when no usable
price is available. Applicable public-channel promotions are reflected
in the price.
See the Hotel object for the full field
reference, including the allowed values for serviceMethod,
indications, and staffLanguages.
curl --request GET \
--url https://spaportal.cz/api/v2/hotels \
--header 'X-SpaPortal-Public-Key: <api-key>'import requests
url = "https://spaportal.cz/api/v2/hotels"
headers = {"X-SpaPortal-Public-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-SpaPortal-Public-Key': '<api-key>'}};
fetch('https://spaportal.cz/api/v2/hotels', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://spaportal.cz/api/v2/hotels",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-SpaPortal-Public-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://spaportal.cz/api/v2/hotels"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-SpaPortal-Public-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://spaportal.cz/api/v2/hotels")
.header("X-SpaPortal-Public-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://spaportal.cz/api/v2/hotels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-SpaPortal-Public-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "66f16191f739705faa020001",
"name": {
"cs-CZ": "Spa Resort Pawlik",
"de": "Kurhotel Pawlik",
"en": "Spa Resort Pawlik",
"ru": "Spa Resort Pawlik"
},
"shortDescription": {
"cs-CZ": "Lázeňský hotel s přímým vstupem do aquaparku.",
"de": "Kurhotel mit direktem Zugang zum Aquapark.",
"en": "Spa hotel with direct access to the aquapark.",
"ru": "Спа-отель с прямым доступом в аквапарк."
},
"channelContent": {
"tagline": {
"cs-CZ": "Lázeňská péče pod jednou střechou",
"de": "Kurbehandlungen unter einem Dach",
"en": "Spa care under one roof",
"ru": "Санаторно-курортное лечение под одной крышей"
}
},
"stars": 4,
"address": {
"addressLine": "Národní 25",
"city": "Františkovy Lázně",
"postalCode": "351 01",
"country": "cze"
},
"email": "hotel@example.com",
"phoneNumber": "+420 123 456 789",
"url": "https://hotel.example.com",
"images": [
{
"url": "https://files.example.com/hotel.jpg",
"thumbnailUrl": "https://files.example.com/hotel-thumbnail.webp"
}
],
"accommodationRules": {
"checkIn": {
"from": "14:00",
"to": "20:00"
},
"checkOut": {
"from": "07:00",
"to": "10:00"
},
"children": {
"allowed": true,
"minimumAge": 6
},
"pets": {
"allowed": true,
"minimumNights": 2,
"feePerNight": {
"czk": 500,
"eur": 20
},
"conditions": {
"cs-CZ": "Mazlíčci jsou povoleni ve vybraných pokojích.",
"de": "Haustiere sind in ausgewählten Zimmern erlaubt.",
"en": "Pets are allowed in selected rooms.",
"ru": "Размещение с домашними животными разрешено в отдельных номерах."
}
}
},
"mealServices": {
"breakfast": {
"enabled": true,
"servingTime": {
"from": "07:00",
"to": "10:00"
},
"serviceMethod": "buffet",
"drinksIncluded": true,
"drinksNote": {
"cs-CZ": "Nealkoholické nápoje jsou v ceně.",
"de": "Alkoholfreie Getränke sind inklusive.",
"en": "Soft drinks are included.",
"ru": "Безалкогольные напитки включены в стоимость."
}
},
"lunch": {
"enabled": true,
"servingTime": {
"from": "11:30",
"to": "14:30"
},
"serviceMethod": "buffet",
"drinksIncluded": true,
"drinksNote": {
"cs-CZ": "Voda je zahrnuta v ceně oběda.",
"de": "Wasser ist im Mittagessen inbegriffen.",
"en": "Water is included with lunch.",
"ru": "Вода включена в стоимость обеда."
}
},
"dinner": {
"enabled": true,
"servingTime": {
"from": "18:00",
"to": "21:00"
},
"serviceMethod": "served",
"drinksIncluded": false,
"drinksNote": {
"cs-CZ": "Nápoje se hradí samostatně.",
"de": "Getränke werden separat berechnet.",
"en": "Drinks are charged separately.",
"ru": "Напитки оплачиваются отдельно."
}
}
},
"indications": [
"musculoskeletal",
"cardiovascular",
"diabetes"
],
"staffLanguages": [
"cs",
"de",
"en"
],
"amenityCategories": [
{
"category": {
"code": "wellness"
},
"amenities": [
{
"code": "aquapark",
"proximity": "nearby",
"proximityMeters": 250,
"access": "included",
"openingHours": {
"continuous": false,
"blocks": [
{
"days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"from": "09:00",
"to": "21:00"
}
]
}
},
{
"code": "sauna",
"proximity": "in-hotel",
"proximityMeters": null,
"access": "included",
"options": [
{
"code": "finnish"
},
{
"code": "steam"
}
],
"openingHours": {
"continuous": false,
"blocks": [
{
"days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"from": "09:00",
"to": "21:00"
}
]
}
}
]
},
{
"category": {
"code": "parking",
"label": {
"cs-CZ": "Parkování",
"de": "Parken",
"en": "Parking",
"ru": "Парковка"
}
},
"amenities": [
{
"code": "parking",
"access": "paid",
"options": [
{
"code": "covered",
"label": {
"cs-CZ": "Kryté",
"de": "Überdacht",
"en": "Covered",
"ru": "Крытая"
}
},
{
"code": "guarded",
"label": {
"cs-CZ": "Hlídané",
"de": "Bewacht",
"en": "Guarded",
"ru": "Охраняемая"
}
}
],
"note": {
"cs-CZ": "Hlídané parkoviště je přímo u hotelu.",
"de": "Der bewachte Parkplatz befindet sich direkt am Hotel.",
"en": "Guarded parking is available next to the hotel.",
"ru": "Охраняемая парковка находится рядом с отелем."
}
}
]
}
],
"priceFrom": {
"CZK": {
"perNight": {
"amountMinor": 288000,
"currency": "CZK",
"currencyExponent": 2
},
"perNightOriginal": {
"amountMinor": 320000,
"currency": "CZK",
"currencyExponent": 2
},
"minimumStay": {
"amountMinor": 576000,
"currency": "CZK",
"currencyExponent": 2
},
"minimumStayOriginal": {
"amountMinor": 640000,
"currency": "CZK",
"currencyExponent": 2
},
"guests": 2,
"minimumNights": 2
},
"EUR": {
"perNight": {
"amountMinor": 11340,
"currency": "EUR",
"currencyExponent": 2
},
"perNightOriginal": {
"amountMinor": 12600,
"currency": "EUR",
"currencyExponent": 2
},
"minimumStay": {
"amountMinor": 22680,
"currency": "EUR",
"currencyExponent": 2
},
"minimumStayOriginal": {
"amountMinor": 25200,
"currency": "EUR",
"currencyExponent": 2
},
"guests": 2,
"minimumNights": 2
}
}
}
],
"pagination": {
"limit": 25,
"nextCursor": "<string>",
"hasMore": true,
"total": 123
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"requestId": "<string>",
"details": [
{}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"requestId": "<string>",
"details": [
{}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"requestId": "<string>",
"details": [
{}
]
}
}roomTypes response field and expand=roomTypes
behavior are still in progress. Their response shape may change
before they are finalized.Authorizations
See Authentication for how to obtain and send your public key.
Headers
Comma-separated BCP 47 language tags selecting which locale keys localized fields return. When omitted, all locale keys are returned. See Localization for details.
"cs-CZ,de"
Optional client-provided request identifier echoed in error responses.
Query Parameters
Number of records to return. See Pagination.
1 <= x <= 100Cursor from the previous page's pagination.nextCursor. See Pagination.
2000Full-text search of the hotel name across all supported languages (case- and diacritics-insensitive).
200Sort order by creation time: createdAt:desc returns the newest records first, createdAt:asc the oldest. Records are ordered by their id, which increases with creation time, giving a stable total order that keeps cursor pagination exact.
createdAt:desc, createdAt:asc Comma-separated amenity codes; returns only hotels that have ALL listed amenities (AND semantics). E.g. sauna,parking.
500Returns hotels that have any amenity in this category (e.g. wellness).
health, wellness, dining, services, accessibility, parking, sport, children Comma-separated list of expansions (for example expand=amenityLabels or expand=roomTypes,amenityLabels). amenityLabels inlines the localized category, amenity, and option labels in amenityCategories, so no dictionary lookup is needed. roomTypes (draft, response shape may change) embeds each hotel's room types (otherwise fetch them via GET /room-types?hotelId={hotelId}).
roomTypes, amenityLabels