Hotel details describe the building. Nearby attractions describe what sits around it: airports, landmarks, restaurants, beaches, transit, and natural sites, each with a distance. You already have a hotel_id from search or from details. This call does not take a city name.
👉 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
Search with GET /v1/booking/hotels/search-by-coordinates or open GET /v1/booking/hotels/details, then pass hotel_id here. Rooms, reviews, and availability are separate calls on that same id. They do not return this place list. There is no follow-up id on an airport or a landmark in these routes.
Places around one hotel
Endpoint: GET /v1/booking/hotels/nearby-attractions
Documentation:
https://docs.steadyapi.com/#bookingcom-GETapi-v1-booking-hotels-nearby-attractions
Parameters
hotel_id— required integerlanguage— optional, defaulten-usinclude_ski— optional boolean, default falseinclude_commute— optional boolean, default falsemax_airports— optional, default 3, max 10max_landmarks— optional, default 10, max 20max_restaurants— optional, default 3, max 20max_beaches— optional, default 5, max 10max_transport— optional, default 2, max 10max_natural— optional, default 1, max 10
Matching distance caps are max_airport_distance (default 100), max_landmark_distance (default 20), max_restaurant_distance (default 50), max_beach_distance (default 10), max_transport_distance (default 20), and max_natural_distance (default 15). Raising a max_* count returns more places in that group, up to the max on that parameter. include_ski adds ski places when you set it true. include_commute fills the commute field. It defaults to false, so commute is null unless you turn it on. Distance text is still on distance.localized either way.
Python
import requests
url = "https://api.steadyapi.com/v1/booking/hotels/nearby-attractions"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={"hotel_id": hotel["hotel_id"]})
response.raise_for_status()
payload = response.json()
attractions = payload.get("body", {}).get("attractions", {})
for airport in attractions.get("airports", [])[:5]:
print(airport.get("name"), airport.get("distance", {}).get("localized"))
Annotated sample
{
"id": "67559",
"name": "Will Rogers World Airport",
"type": "airport",
"location": { "latitude": 35.3953, "longitude": -97.5962 },
"distance": { "raw": 5.238, "localized": "3.3 mi" },
"commute": null
}
Store name, type, and distance.localized. distance.raw is the numeric distance. location is the place, not the hotel. commute stays null until include_commute is true. Groups live under body.attractions: airports, beaches, landmarks, public_transport, and natural_beauty are lists. dining is an object with restaurants and cafe_bars. meta.categories_found tells you which of those groups came back. body.summary.total_items counts places across them.
Practical use
A hotel with no beach still returns the call. That group is simply absent. Read meta.categories_found before you assume beaches or airports exists.
The default max_natural is 1 and max_transport is 2. If a category looks short, raise its max_* parameter. Do not raise it past the max in the list above.
This list is not the hotel’s own address. The address is on hotel details, location.formatted_address. Use that when you want the property, and this endpoint when you want what is around it.
👉 Get your API key and open nearby places: https://steadyapi.com/register