Search Zillow listings
TL;DR
About
Most people point this at one neighborhood and run it on a schedule instead of refreshing Zillow by hand. Say an investor watching 78704 in South Austin runs it every morning for homes for sale under $650,000, newest first (sort "days"), diffs the zpids against yesterday's run and pulls full details only for the new ones. The filters are the ones on Zillow's own filter bar, and switching status to recently_sold gives you the recent sales in a ZIP, which is where most comp checks start. On rentals and sold searches, an apartment building comes back as a single card with price, beds, baths and area all null; the per-unit numbers sit in units as Zillow's own strings, like "$2,150+" for a starting rent. When filters are tight, Zillow pads the page with listings from outside the area and marks them nearby:true. Drop those cards before you count anything.
Input
location requiredA human-readable location: city+state ("Austin, TX"), a ZIP code ("90210"), or a neighborhood. The path form resolves it to a Zillow region server-side.
page optional1-based result page (up to 41 cards each). Default 1. Zillow caps pagination at 20 pages (~820 listings) regardless of total matches. The site's "N rentals available" counts every unit of a building, so a search can have fewer pages than N/41; when fewer than 41 cards come back, it is the last page. A page past the last one throws.
Default: 1sort optionalSort order. Default "globalrelevanceex" (Homes for You) matches the site. When paging across independent browsers at the same time, pass a deterministic sort (e.g. "days" = newest) so pages partition identically — the default relevance order can drift between sessions.
Default: "globalrelevanceex"space optionalThe site's Space filter, rentals only. Omit for the site's default, "entire_place"; "room" = rooms for rent only; "any" = both.
status optionalWhich Zillow listing category to search — the site's own For sale / For rent / Sold toggle, passed as its URL path segment. Default "for_sale". For-rent and recently-sold results include multi-unit building cards, which have no single price/beds/baths/area — those fields are null and the per-unit numbers are in `units` instead.
Default: "for_sale"maxBeds optionalUpper bedroom bound. Pass the same value as minBeds for the site's "Use exact match".
minBeds optionalThe site's Bedrooms filter ("2+"). 0 = studio.
maxPrice optionalThe site's Price filter, upper bound in USD. Monthly rent when status is for_rent, list price otherwise. Zillow matches a multi-unit building when at least one of its units falls in range, so its card can still show units above this.
minBaths optionalThe site's Bathrooms filter: 1, 1.5, 2, 3 or 4 ("1.5+").
minPrice optionalThe site's Price filter, lower bound in USD. Monthly rent when status is for_rent, list price otherwise.
furnished optionalRestrict to Zillow's own "Furnished" rental filter. Only meaningful when status is for_rent — ignored for sale/sold listings. Default false = no restriction (all listings, furnished or not).
Default: falsehomeTypes optionalThe site's Property type filter; omit for all types. For rent it offers houses, townhomes and apartments_condos. For sale and sold it offers houses, townhomes, multi_family, condos, lots_land, apartments and manufactured. A type the chosen status does not offer throws.
Output
region requiredThe place Zillow searched, as its search box shows it after the search (e.g. "Mission San Francisco CA", "San Francisco CA 94110"). Zillow never refuses a location: one it does not recognise is searched as the nearest place it does, with no error ("Mission District, San Francisco, CA" → "San Francisco CA"; "Nonexistentville, ZZ" → "Austin TX"). Compare it with what you asked for before treating the results as being in that place. Aliases are normal ("SoMa" → "South of Market San Francisco CA").
results requiredThe cards the site shows for this search, in the site's order: the in-boundary results first, then the relaxed (nearby) ones. Never empty: Zillow relaxes the boundary rather than showing nothing, so an empty array means a bucket of the answer went unread, not that the region is empty.
Example output
Shape only: placeholder values generated from the output schema, not a real run.
{
"region": "…",
"results": [
{
"lat": "2026-01-15T09:30:00Z",
"lng": 3.5,
"area": 3.5,
"beds": 3.5,
"zpid": "…",
"baths": 3.5,
"price": 3.5,
"units": [
{
"beds": "…",
"price": "…",
"roomForRent": true
}
],
"broker": "…",
"imgSrc": "…",
"nearby": true,
"address": "…",
"detailUrl": "https://example.com/item/123",
"priceText": "…",
"statusText": "…"
}
]
}