Search tells you a hotel exists. Details prices one stay. Availability is the calendar around a start date: which dates in the window can be booked, the displayed nightly price, and the minimum stay. You already have a hotel_id. You pick the first date you care about and how many days to read.
👉 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
Get hotel_id from GET /v1/booking/hotels/search-by-coordinates or from GET /v1/booking/hotels/details. This calendar does not replace details. After you find dates where available is true, send that check-in and check-out to details for the stay total, or to GET /v1/booking/hotels/rooms for room names. Reviews are a different call.
Calendar for one hotel
Endpoint: GET /v1/booking/hotels/availability
Documentation:
https://docs.steadyapi.com/#bookingcom-GETapi-v1-booking-hotels-availability
Parameters
hotel_id— required property idstart_date— required start date,YYYY-MM-DDdays— optional length of the window, default 28, max 90language— optional, defaulten-usadults— optional, default 2rooms— optional, default 1, max 10children— optional count, default 0children_ages— optional comma-separated ages. When you send ages, the count must matchchildren.travel_purpose— optional integer,1or2, default2
start_date and days set the window. The default window is 28 days and the longest is 90. adults, rooms, and children change which price is displayed. travel_purpose is only 1 or 2. It is not a word. The rooms endpoint uses a different parameter, travel_reason, with the values LEISURE and BUSINESS. Do not send those words here.
Python
import requests
from datetime import date, timedelta
url = "https://api.steadyapi.com/v1/booking/hotels/availability"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {
"hotel_id": hotel["hotel_id"],
"start_date": (date.today() + timedelta(days=14)).isoformat(),
"days": 14,
"adults": 2,
"rooms": 1,
}
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
payload = response.json()
body = payload.get("body", {})
print(payload.get("meta", {}).get("has_availability"))
print(body.get("summary"))
for day in body.get("calendar", [])[:7]:
print(day.get("date"), day.get("available"), day.get("price_formatted"), day.get("min_stay"))
Annotated sample
{
"date": "2026-01-01",
"available": true,
"checkin": "2026-02-10",
"price_formatted": "$74",
"min_stay": 1,
"is_past_date": true
}
Store date, available, price_formatted, and min_stay. A date with available false is closed for that party. min_stay is the minimum number of nights. is_past_date marks days that are already behind you when the window starts in the past. body.summary has total_days, available_days, and available_percentage for the window. meta.has_availability is the yes-or-no for the whole window. meta.period echoes start_date, the end, and days_requested.
Practical use
start_date is required. There is no default day. days above 90 is rejected. A window that begins in the past still returns those days, with is_past_date set, so drop them before you offer a stay.
When children is greater than 0 and you also send children_ages, the number of ages has to equal children. A mismatch is a 422. Omitting children_ages is allowed. The check runs only when ages are present.
The nightly string on the calendar is not the stay total. Take a date where available is true and min_stay fits the trip, then call hotel details with that check-in and check-out for price_info.display_price.amount_per_stay.
👉 Get your API key and check a calendar: https://steadyapi.com/register