image

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, default 20, maximum 200
  • offset — optional, default 0

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

How to Read a Tweet Using SteadyAPI Oct 13, 2026

How to Read a Tweet Using SteadyAPI

Read one tweet by id. The text and counts are on legacy. meta.reply_count is how many replies were included.

How to Get an NHL Roster Using SteadyAPI Oct 12, 2026

How to Get an NHL Roster Using SteadyAPI

Load forwards, defensemen, and goalies for one NHL abbreviation. Player names are objects with a default field.

How to Find Vehicles for Sale Using SteadyAPI Oct 11, 2026

How to Find Vehicles for Sale Using SteadyAPI

Search vehicle listings by make, model, and ZIP. Price and mileage on each row are numbers.

How to Track Amazon New Releases Using SteadyAPI Oct 10, 2026

How to Track Amazon New Releases Using SteadyAPI

Pull one category’s new-release ranking. Store each row’s ASIN, rank, and price string.