Zillow Home Price Data Scraper API
Our Zillow home price data API takes a location, a city, a ZIP, or a neighborhood, and returns every for-sale listing with its list price, Zestimate, beds, baths, and square footage as structured JSON, so you can build price and sales data by ZIP code without a manual export.
Why Zillow Home Price data is tough at scale
Zillow publishes market data as bulk research CSVs and its ZHVI index, but there is no public API that returns priced listing data for a given ZIP, and every for-sale page hides its numbers in a hydration blob behind PerimeterX. So a simple question like the current list prices and Zestimates in a ZIP means scraping a challenge-walled page and parsing JSON out of an HTML comment.
Run the Zillow Home Price Data Scraper API in one call
curl "https://api.zillowscraperapi.com/api/v1/zillow/search?location=Seattle,%20WA&page=1&api_key=$API_KEY" import requests
BASE = "https://api.zillowscraperapi.com"
API_KEY = "YOUR_API_KEY"
# Pass a city, ZIP, or neighborhood. Read list price and Zestimate per home.
data = requests.get(
f"{BASE}/api/v1/zillow/search",
params={"location": "Seattle, WA", "page": 1, "api_key": API_KEY},
timeout=30,
).json()
print(data["total_results"], "listings in", data["location"])
for home in data["results"]:
gap = None
if home["zestimate"] and home["price"]:
gap = home["zestimate"] - home["price"]
print(home["address_zip"], f"${home['price']:,}", "zestimate", home["zestimate"], "delta", gap) Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
location | required | - | The place to pull prices for: a city and state (Seattle, WA), a ZIP code, or a neighborhood. This is the primary parameter. |
url | optional | - | A Zillow for-sale results URL to scrape directly, as an alternative to building the location slug yourself. |
page | optional | 1 | 1-based results page. Zillow paginates the for-sale list; page holds about 40 homes. Range 1 to 20. |
status | optional | for_sale | Listing status filter: for_sale, for_rent, or sold. Use sold to pull recent sales data for a location. |
limit | optional | 100 | Maximum rows to return, from 1 to 500. The page itself holds roughly 40 listings. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
The Zillow Home Price Data Scraper API JSON response
{
"query": "Seattle, WA",
"location": "Seattle, WA",
"page": 1,
"total_results": 10,
"results_count": 10,
"results": [
{
"position": 1,
"id": "463504654",
"title": "6505 44th Avenue NE, Seattle, WA 98115",
"url": "https://www.zillow.com/homedetails/6505-44th-Ave-NE-Seattle-WA-98115/463504654_zpid/",
"price": 899900,
"currency": "USD",
"beds": 3,
"baths": 3,
"sqft": 1422,
"zpid": "463504654",
"address_street": "6505 44th Avenue NE",
"address_city": "Seattle",
"address_state": "WA",
"address_zip": "98115",
"zestimate": null,
"status": "FOR_SALE",
"status_text": "Active",
"home_type": "SINGLE_FAMILY",
"latitude": 47.675953,
"longitude": -122.281136,
"has_image": true,
"builder_name": "Enduring Estates LLC"
},
{
"position": 2,
"id": "48725548",
"title": "2218 E Prospect Street, Seattle, WA 98112",
"url": "https://www.zillow.com/homedetails/2218-E-Prospect-St-Seattle-WA-98112/48725548_zpid/",
"price": 5000000,
"currency": "USD",
"beds": 5,
"baths": 6,
"sqft": 8010,
"zpid": "48725548",
"address_street": "2218 E Prospect Street",
"address_city": "Seattle",
"address_state": "WA",
"address_zip": "98112",
"zestimate": 5015900,
"status": "FOR_SALE",
"status_text": "Active",
"home_type": "SINGLE_FAMILY",
"latitude": 47.62881,
"longitude": -122.30269,
"has_image": true,
"builder_name": null
}
]
} | Field | Type | Description |
|---|---|---|
query | string | The location you searched, echoed back. |
location | string | The resolved location string for the results. |
page | integer | The results page returned, starting at 1. |
total_results | integer | Number of listings in the results array for this page. |
results | array | The listings for this location, each with the price and value fields below. |
results[].price | integer | The current list price in whole dollars. |
results[].zestimate | integer or null | Zillow's Zestimate value for the home, or null when Zillow does not publish one for that listing. |
results[].beds | integer | Bedroom count for the home. |
results[].baths | integer | Bathroom count for the home. |
results[].sqft | integer | Living area in square feet, used for price-per-square-foot math. |
results[].address_zip | string | ZIP code of the listing, for grouping price data by ZIP. |
results[].status | string | Raw listing status, e.g. FOR_SALE, SOLD. |
results[].status_text | string | Human-readable status such as Active. |
results[].home_type | string | Property type, e.g. SINGLE_FAMILY, CONDO. |
results[].zpid | string | The stable Zillow id, ready to pass to the property endpoint for full detail. |
results[].latitude | number | Listing latitude for mapping and geographic joins. |
results[].longitude | number | Listing longitude for mapping and geographic joins. |
Ways teams use this data
Price data by ZIP code
Recent sales and comps
List-price vs Zestimate gaps
Market dashboards
Investment screening
Appraisal and lending support
Where our Zillow Home Price Data Scraper API stands out
Give us a location and we run the proxied fetch, PerimeterX handling, and parsing, then return every listing's price, Zestimate, size, and status as a ranked JSON array. One request covers a whole page of a market in about 2.6 seconds, with a stable schema verified at 100% parity, no bulk-CSV download to wrangle, and a 1,000-request free tier.
Location or URL input
List price and Zestimate together
Sold-status pricing
PerimeterX handling built in
Chains into the property endpoint
Honest nulls
Zillow Home Price Data Scraper API vs DIY and the Zillow API
| Our API | Zillow research CSVs | DIY (requests / headless) | |
|---|---|---|---|
| Priced listings by ZIP | Live JSON per location | Aggregate index only | Manual fetch and parse |
| Per-home Zestimate | Included when published | Not in the bulk files | You parse it yourself |
| Sold and for-sale | status filter on one endpoint | Separate research datasets | Separate pages to parse |
| Freshness | Current page at request time | Periodic file refresh | Current, if unblocked |
| Anti-bot (PerimeterX) | Handled for you | Not applicable | You solve the challenge |
| Output shape | Stable flat JSON | CSV you reshape | Whatever you parse |
Free to test, cheap to scale
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
Our Zillow home price data API works as one. Pass a ZIP or city as the location parameter and it returns every listing on that results page with its list price, Zestimate, beds, baths, square footage, and status as JSON. Set status to sold to pull recent sales instead of active listings, so you can assemble price and sales data for a ZIP programmatically without downloading and reshaping a bulk CSV.
Zillow publishes market-level research data, including the Zillow Home Value Index, as downloadable CSV files, but it does not offer a public API that returns priced listing data for a specific ZIP or city. Our endpoint reads the public for-sale and sold results pages and returns each home's price and Zestimate as structured JSON, filling the gap the research downloads leave for listing-level data.
Yes, when Zillow publishes one. Each result carries a zestimate field with Zillow's value estimate for that home. Some listings, often brand-new construction, have no Zestimate yet, and for those we return null and never a fabricated value. Comparing zestimate against the list price across a ZIP is a common way to spot homes priced above or below Zillow's own estimate.
Set the status parameter to sold. The endpoint then returns recently sold homes for the location with the same fields, price, beds, baths, sqft, and address, so you can build comparable-sales sets and track sale activity by ZIP. Use for_sale for active inventory and for_rent for rentals from the same call.
One request returns a single results page, which holds roughly 40 homes, and you can raise the limit parameter up to 500 or walk deeper with the page parameter (1 to 20). Zillow caps a given search around a few hundred results, so covering a large metro means splitting it into tighter locations or ZIP codes and paging through each.
Median end-to-end response is about 2.6 seconds per page, including proxy routing, PerimeterX handling, retries, and parsing. You are billed only for successful requests, so blocked fetches that we retry behind the scenes do not land on your bill. The free tier includes 1,000 requests to test against real ZIP codes first.