Zillow API: How to Access Real Estate Data in 2026
Zillow shut down its public API in 2021. There is no replacement. Teams that need Zillow real estate data — property listings, prices, Zestimates, rental rates, sold history — have two options: use Zillow’s internal search API endpoints directly (reverse-engineered from browser traffic) or use a managed data provider that handles the extraction infrastructure. This guide covers both: how Zillow’s internal API works, what data it returns, and where DIY breaks down at scale.
If your use case is bulk data delivery rather than building your own extraction layer, see how Webparsers handles enterprise price monitoring — the same pipeline model applies to real estate data feeds from Zillow and competitors.
What Happened to the Zillow API
Zillow’s public API (Zillow Web Services API, ZWS) launched in 2006 and was deprecated in August 2021. Zillow stated the shutdown was due to data quality and consistency concerns. No replacement API was announced. The Zestimate API, which provided property valuation data, was also discontinued.
What remains is Zillow’s internal API — the same endpoints the Zillow website uses to power its own search interface. These are not documented or officially available, but they are accessible via browser network inspection and can be replicated programmatically.
What Data Is Available from Zillow
| Data Type | Source | Notes |
|---|---|---|
| Listings (for sale) | Search API / property page | Price, address, beds/baths, sqft, days on market |
| Rental listings | Search API (isForRent filter) | Monthly rent, available date, unit count |
| Sold properties | Search API (recentlySold filter) | Sale price, sale date, prior listing price |
| Property details | Property page (__NEXT_DATA__ JSON) | Full detail: year built, lot size, tax history, HOA, photos |
| Zestimate (valuation) | Property page JSON | Current Zestimate + 30-day change |
| Agent / contact info | Property page JSON | Listing agent name, phone, brokerage |
How Zillow’s Internal Search API Works
Zillow’s search is powered by a single endpoint: https://www.zillow.com/async-create-search-page-state. It accepts PUT requests with a JSON body containing a geographic bounding box and filter state. The bounding box must be extracted from the HTML of a Zillow search page first — it’s embedded in the __NEXT_DATA__ script tag.
Minimal request body structure:
{
"searchQueryState": {
"pagination": {},
"usersSearchTerm": "New Haven, CT",
"mapBounds": {
"west": -73.030,
"east": -72.827,
"south": 41.230,
"north": 41.366
}
},
"wants": {
"cat1": ["listResults", "mapResults"],
"cat2": ["total"]
},
"requestId": 2
}
The response returns paginated listing results under cat1.searchResults.listResults. One limitation: the search API caps results at 500 per bounding box query. For city-level or national data collection, you need to tile the geography into smaller bounding boxes and stitch results together — Zillow’s zip code index pages are a practical seed for this.
For property-level detail, each listing includes a detailUrl field. Property pages embed full structured data in the __NEXT_DATA__ JavaScript variable (or hdpApolloPreloadedData as a fallback), eliminating the need to parse HTML:
from parsel import Selector
import json
selector = Selector(response.text)
# Primary: NEXT_DATA cache
data = selector.css("script#__NEXT_DATA__::text").get()
if data:
parsed = json.loads(data)
property_data = json.loads(
parsed["props"]["pageProps"]["componentProps"]["gdpClientCache"]
)
property_data = property_data[list(property_data)[0]]["property"]
# Fallback: Apollo cache
else:
data = selector.css("script#hdpApolloPreloadedData::text").get()
parsed = json.loads(json.loads(data)["apiCache"])
property_data = next(
v["property"] for k, v in parsed.items() if "ForSale" in k
)
Where DIY Breaks Down: Zillow’s Anti-Bot Layer
Zillow runs Cloudflare for front-end protection and its own rate limiting on search API requests. A plain Python httpx or requests client fails quickly at any meaningful scale. The specific failure modes:
- Datacenter IP blocks: AWS, GCP, and other cloud provider ASNs are pre-flagged. Any request from a recognizable datacenter subnet gets 403’d before header inspection even occurs.
- Header fingerprint mismatch: Zillow’s Cloudflare integration checks for
sec-ch-uaclient hints andsec-fetch-*headers. A Chrome User-Agent without these headers is an immediate fingerprint flag. See our breakdown of anti-bot systems for the full detection model. - Session cold starts: The search API requires valid session cookies from a prior browser-like GET to a Zillow search page. Calling the API endpoint directly without an established session returns 400 or 403.
- Rate limits on search API: Zillow enforces request rate limits per IP and per session. Concurrent requests without delays trigger exponential backoff from the server — you’ll see increasing response times before outright blocks.
For production pipelines, this means residential proxies are required — not optional. See the technical details in our proxy management guide.
How Webparsers Handles Zillow Data at Scale
- Residential proxy routing matched to Zillow’s expected traffic profile: Zillow search traffic originates predominantly from US residential ISPs. Our proxy pool uses US consumer ASN IPs, rotated at the session level to maintain session continuity while avoiding IP-level rate limits.
- Full browser fingerprint replication: Requests include complete Chrome header sets —
sec-ch-ua,sec-fetch-dest,sec-fetch-mode, TLS fingerprint — consistent with the declared browser version. Cloudflare challenge passes without JS execution for well-formed requests. - Session warm-up before API calls: Each collection session establishes cookies via a browser-like GET to a Zillow search page before hitting the search API. This mirrors what a real browser does and avoids the cold-start 403.
- Geographic tiling for national coverage: For datasets requiring city-level or national coverage, we tile the search area into sub-bounding boxes using zip code centroids, collect in parallel, and deduplicate on property ID.
- Schema drift monitoring: Zillow updates its
__NEXT_DATA__structure periodically. Our parsers include automated diff monitoring — when the JSON schema changes, the pipeline alerts before it starts returning empty records rather than after. - Normalized delivery: Extracted Zillow data — listings, property details, Zestimates, sold history — is normalized to a consistent schema and delivered to your warehouse or via webhook. Details on output schema in our data normalization guide.
Frequently Asked Questions
Does Zillow have a public API?
No. Zillow’s public API (Zillow Web Services) was shut down in August 2021 with no replacement. Zillow does not offer a documented, publicly available API for property data. Teams accessing Zillow data programmatically use Zillow’s internal search API endpoints (reverse-engineered from browser traffic) or a managed data provider.
What data can you get from the Zillow API?
Via Zillow’s internal endpoints: for-sale listings, rental listings, recently sold properties, property details (beds/baths/sqft/year built/lot size), Zestimate valuations, price history, photos, days on market, and listing agent contact information. The search API supports geographic bounding box queries with filter state for sale type, price range, property type, and more.
Is scraping Zillow legal?
Zillow’s listing data is publicly accessible, which generally favors legality under the hiQ v. LinkedIn CFAA precedent. Zillow’s Terms of Use prohibit automated access, creating contractual risk separate from the legal question. GDPR applies to any personal data (contact info) of EU residents. Enterprise use cases should be reviewed by legal counsel. Our web scraping compliance overview covers the full legal framework.
Why does Zillow return 403 errors when scraping?
The most common causes: datacenter IP address (Cloudflare pre-blocks known cloud provider ASNs), missing sec-ch-ua client hint headers, calling the search API without a prior session cookie from a Zillow page GET, and request rates above human browsing speed. All four need to be addressed simultaneously — fixing only one doesn’t resolve the blocks.
What is the Zillow search API endpoint?
The endpoint is https://www.zillow.com/async-create-search-page-state (PUT). It requires a JSON body with a searchQueryState object containing a map bounding box and search term. The bounding box coordinates must be extracted from the __NEXT_DATA__ script tag on a Zillow search page before calling the API. Results are capped at 500 per query — national coverage requires geographic tiling.