Rental search takes a location string and returns a page of listings. Each row has a property id, a price range, a bed and bath summary, and a full address. The price you show a person is price.display. The numbers underneath are price.min and price.max.
👉 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
If you only have a fragment of a city name, resolve it before this call. Then pass a location such as San Francisco, CA. The property_id on a row is the id for GET /v1/real-estate/property-estimates. Bedroom and price filters live on GET /v1/real-estate/nearby-rentals, not on this search.
Search rental listings
Endpoint: GET /v1/real-estate/rentals-search
Documentation:
https://docs.steadyapi.com/#real-estate-GETapi-v1-real-estate-rentals-search
Parameters
location— required, max 255 characters (example:San Francisco, CA)limit— optional, default20, maximum200offset— optional, default0
Location is the whole query. There is no bedroom, bath, or price parameter on this path. limit and offset only change the page. meta.total is the size of the result set. meta.returned is how many rows are in this response. For the sample location, total is 678 and the first page returns 20.
Python
import requests
url = "https://api.steadyapi.com/v1/real-estate/rentals-search"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={
"location": "San Francisco, CA",
"limit": 20,
"offset": 0,
})
response.raise_for_status()
payload = response.json()
meta = payload.get("meta") or {}
print(meta.get("total"), meta.get("returned"))
for listing in payload.get("body") or []:
price = listing.get("price") or {}
print(listing.get("property_id"), price.get("display"))
Annotated sample
{
"property_id": "2473364190",
"price": {
"min": 1495,
"max": 1895,
"display": "$1,495 - $1,895"
},
"description": {
"name": "765 Geary",
"type": "apartment",
"beds": { "min": 0, "max": 0, "display": "Studio" },
"baths": { "min": 1, "max": 1, "display": "1 bath" }
},
"address": {
"line": "765 Geary St",
"city": "San Francisco",
"state": "CA",
"zip": "94109",
"full": "765 Geary St, San Francisco, CA, 94109"
}
}
Store property_id. Show price.display and address.full. price.min and price.max are numbers. When they differ, display is a range. Beds 0 is rendered as Studio in beds.display. photo_url may be present on the same row. permalink for this listing is 765-Geary-St_San-Francisco_CA_94109_M24733-64190.
Practical use
The next page is offset + limit, while offset is still below meta.total. Do not invent a page parameter. This endpoint does not have one.
price.min of 1495 is 1495 dollars, not cents. display already includes the dollar sign and the comma. Use that string in the UI.
A studio is beds.min 0, not a missing field. If you drop rows where beds is 0, you drop studios.
👉 Get your API key and search rentals: https://steadyapi.com/register