Hotel search and hotel details stop at the property. Room details are the list of rooms inside that property: name, size, how many guests fit, bed layouts, and photos. You already have a hotel_id. This call does not search by city.
The party you send changes the request context. The room records still describe the rooms, including occupancy and beds.
👉 To access this endpoint, you must obtain an API key: https://steadyapi.com/register
Authentication
Every call uses a Bearer token from your SteadyAPI dashboard.
Documentation:
https://docs.steadyapi.com/#authenticating-requests
headers = {
'Authorization': 'Bearer YOUR_API_KEY'
}
Where this fits
Autocomplete is GET /v1/booking/hotels/autocomplete. Search is GET /v1/booking/hotels/search-by-coordinates. Details are GET /v1/booking/hotels/details. Take hotel_id from either search or details and call rooms. Nightly availability for a date window is GET /v1/booking/hotels/availability, which uses travel_purpose as the integer 1 or 2. This rooms call uses travel_reason instead, and the allowed words are LEISURE and BUSINESS.
Rooms for one hotel
Endpoint: GET /v1/booking/hotels/rooms
Documentation:
https://docs.steadyapi.com/#bookingcom-GETapi-v1-booking-hotels-rooms
Parameters
hotel_id— required integerlanguage— optional, defaulten-usrooms— optional integer, default 1, max 5adults— optional integer, default 2children— optional integer, default 0children_ages— optional comma-separated ages, such as5,8travel_reason— optionalLEISUREorBUSINESS, defaultLEISUREcustomer_type— optionalALL,FAMILY,COUPLE,SOLO,BUSINESS, orFRIENDS, defaultALLinclude_review_scores— optional boolean, default true
hotel_id picks the property. adults, rooms, children, and travel_reason are the stay context stored on meta.search_config. customer_type changes which review-score group you emphasize. include_review_scores defaults to true. Set it false when you only want room records. rooms here is a count of rooms in the stay, capped at 5. It is not a room id.
Python
import requests
url = "https://api.steadyapi.com/v1/booking/hotels/rooms"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={
"hotel_id": hotel["hotel_id"],
"adults": 2,
"rooms": 1,
})
response.raise_for_status()
payload = response.json()
for room in payload.get("body", {}).get("rooms", [])[:8]:
print(room.get("name"), room.get("occupancy", {}).get("max_guests"))
Annotated sample
{
"id": 257269102,
"hotel_id": 2572691,
"name": "King Room",
"size": { "square_meters": null },
"occupancy": { "max_guests": null, "max_persons": null, "max_children": null },
"bed_configurations": [
{ "beds": [{ "type": null, "count": null, "translation": null }] }
]
}
Store id and name. On hotel 2572691, reviews refer to a room named King Room with id 257269102. The rooms payload fills size.square_meters, occupancy.max_guests, and the bed type, count, and translation when the property published them. Those values are null in this sketch so the keys are visible. Read the live object rather than the nulls. photos has url and thumbnail_url. meta.total_rooms is the count of rooms in body.rooms.
Practical use
body.review_scores is grouped by customer_type. Each group has scores and average_score. That block is room-page review categories, not the guest comments from GET /v1/booking/hotels/reviews. Turn it off with include_review_scores=false when you do not need it.
Do not send travel_purpose=2 to this route. That integer belongs on availability. Here the parameter is travel_reason, and the default is LEISURE.
An empty rooms list comes back with meta saying there are no rooms, rather than a hard failure, when the property has no room details. Check meta.total_rooms before you render cards.
👉 Get your API key and open the room list: https://steadyapi.com/register