Disclaimer: This is documentation for Zillow's undocumented internal API. I am not affiliated with Zillow. Use responsibly and follow Zillow's terms of service.
If this documentation has saved you time, consider supporting ongoing development and maintenance:
| Platform | Link |
|---|---|
| ☕ Buy Me a Coffee | buymeacoffee.com/pseudo_r |
| 💖 GitHub Sponsors | github.com/sponsors/Kloverdevs |
| 💳 PayPal Donate | PayPal (CAD) |
Every contribution helps keep this project updated as Zillow changes their API.
- Overview
- Base Domains
- Quick Start
- Versioned Endpoints
- Search / Discovery Endpoints
- Property / Listing Endpoints
- Rental Endpoints
- Market / Valuation Endpoints
- GraphQL Endpoints
- Media / Asset Endpoints
- Additional Domains / Endpoint Families
- Endpoint Relationships
- Headers & Cookies
- Parameters Reference
- Zillow Service (Django Implementation)
- Response Schemas
- CHANGELOG
Zillow provides undocumented internal APIs that power their website and mobile apps. These endpoints return JSON data for property listings, home values, rental data, market trends, and more.
Four main API families:
www.zillow.com— Main site API (search, property pages, rentals, nav)www.zillow.com/graphql/— GraphQL (property detail, estimates, scores)www.zillow.com/zg-graph— Secondary GraphQL (autocomplete, recent searches)mortgageapi.zillow.com— Mortgage rates API (live-verified, no auth)
Additional domains documented: zillowstatic.com (CDN/images) · zillow.com/search/ (legacy search) · zillow.com/rentals/api/rcf/ (rental fees microservice) · bridgeinteractive.com (official partner API, access-restricted)
- Unofficial: These APIs are not officially supported and may change without notice
- Bot Detection: Zillow actively blocks scrapers — browser-like headers and valid cookies are required
- Rate Limiting: Aggressive — implement delays and caching
- Session Required: Many endpoints require a valid browser session (
zguidcookie set on first page load) - No API Key: No authentication key needed, but session cookies are often required for reliable access
| Domain | Purpose |
|---|---|
www.zillow.com |
Main site — search, property pages, rentals, rent costs |
www.zillow.com/graphql/ |
GraphQL endpoint — property detail, Zestimate, scores |
www.zillow.com/zg-graph |
Secondary GraphQL — autocomplete, recent searches |
www.zillow.com/rentals/api/rcf/v1/ |
Rental costs and fees microservice |
www.zillow.com/search/ |
Legacy search endpoints (partially active) |
mortgageapi.zillow.com |
Mortgage rates API — no auth required |
zillowstatic.com |
CDN — listing images, map tiles |
bridgeinteractive.com |
Official partner/Zestimate API (requires approval) |
# Property search (for sale) in Seattle — PUT with JSON body
curl -X PUT "https://www.zillow.com/async-create-search-page-state" \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
-H "Accept: */*" \
-H "Accept-Language: en-US,en;q=0.9" \
-d '{
"searchQueryState": {
"pagination": {},
"usersSearchTerm": "Seattle, WA",
"mapBounds": {"west": -122.5, "east": -122.2, "south": 47.5, "north": 47.7},
"regionSelection": [{"regionId": 16163, "regionType": 6}],
"filterState": {"sortSelection": {"value": "globalrelevanceex"}},
"isMapVisible": true,
"isListVisible": true
},
"wants": {"cat1": ["listResults", "mapResults"], "cat2": ["total"]},
"requestId": 2,
"isDebugRequest": false
}'
# Autocomplete via GraphQL
curl -X POST "https://www.zillow.com/zg-graph" \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
-d '{
"operationName": "GetAutocompleteResults",
"variables": {"query": "Seattle, WA", "resultType": ["REGIONS", "FORSALE", "RENTALS"]},
"query": "query GetAutocompleteResults($query: String!, $resultType: [AutocompleteResultType!]) { zgsAutoComplete(query: $query, resultType: $resultType) { results { display metaData { regionId regionType } } } }"
}'Zillow does not use explicit /v1/, /v2/, /v3/ versioning in most cases.
| Family | Path Pattern | Notes |
|---|---|---|
| Main search (current) | www.zillow.com/async-create-search-page-state |
PUT — current primary search API |
| Legacy search | www.zillow.com/search/GetSearchPageState.htm |
GET/PUT — older, still partially active |
| GraphQL (current) | www.zillow.com/graphql/ |
POST or persisted GET — primary property data |
| GraphQL v2 | www.zillow.com/zg-graph |
POST — autocomplete and regional data |
| Property pages | www.zillow.com/homedetails/{address}/{zpid}_zpid/ |
HTML with embedded __NEXT_DATA__ JSON |
| Old API (deprecated) | api.zillow.com/webservice/GetDeepSearchResults.htm |
Zillow legacy XML API — no longer works |
| Bridge API | api.bridgeinteractive.com |
Partner access only, requires approval |
v1/v2/v3 verdict: Zillow does not use explicit version prefixes in URL paths. The "versioning" is implicit — the GraphQL schema evolves in-place, and old REST paths like
GetSearchPageState.htmcoexist alongsideasync-create-search-page-state.
Endpoint: https://www.zillow.com/async-create-search-page-state
Method: PUT
Version: Unversioned (current)
Verification: ✅ VERIFIED
Required Headers:
Content-Type: application/json
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept: */*
Accept-Language: en-US,en;q=0.9
Required Body:
{
"searchQueryState": {
"pagination": {},
"usersSearchTerm": "Seattle, WA",
"mapBounds": {
"west": -122.5,
"east": -122.2,
"south": 47.5,
"north": 47.7
},
"regionSelection": [
{"regionId": 16163, "regionType": 6}
],
"filterState": {
"sortSelection": {"value": "globalrelevanceex"}
},
"isMapVisible": true,
"isListVisible": true
},
"wants": {
"cat1": ["listResults", "mapResults"],
"cat2": ["total"]
},
"requestId": 2,
"isDebugRequest": false
}Optional filterState Keys:
| Key | Type | Example | Description |
|---|---|---|---|
price.min |
object | {"value": 200000} |
Minimum price |
price.max |
object | {"value": 800000} |
Maximum price |
beds.min |
object | {"value": 2} |
Min bedrooms |
baths.min |
object | {"value": 1} |
Min bathrooms |
sqft.min |
object | {"value": 1000} |
Min square footage |
sqft.max |
object | {"value": 3000} |
Max square footage |
isForRent |
object | {"value": true} |
Rental listings |
isForSaleByAgent |
object | {"value": false} |
Exclude agent listings |
isForSaleByOwner |
object | {"value": true} |
FSBO only |
isNewConstruction |
object | {"value": true} |
New construction only |
isRecentlySold |
object | {"value": true} |
Recently sold |
isComingSoon |
object | {"value": true} |
Coming soon listings |
isAuction |
object | {"value": false} |
Exclude auctions |
hasPool |
object | {"value": true} |
Has pool |
sortSelection |
object | {"value": "globalrelevanceex"} |
Sort order |
Sort Values:
| Value | Description |
|---|---|
globalrelevanceex |
Best match (default) |
days |
Newest listings |
priceDesc |
Price high to low |
priceAsc |
Price low to high |
beds |
Most bedrooms |
baths |
Most bathrooms |
sqftDesc |
Largest |
Pagination:
"pagination": {"currentPage": 2}Max ~40 results/page, up to 500 total per query. Use tighter
mapBoundsto get more results.
Example Response (trimmed):
{
"cat1": {
"searchResults": {
"listResults": [
{
"zpid": "2077091803",
"id": "2077091803",
"detailUrl": "/homedetails/123-Main-St-Seattle-WA-98101/2077091803_zpid/",
"statusType": "FOR_SALE",
"statusText": "House for sale",
"price": "$850,000",
"unformattedPrice": 850000,
"address": "123 Main St, Seattle, WA 98101",
"beds": 3,
"baths": 2,
"area": 1850,
"latLong": {"latitude": 47.6062, "longitude": -122.3321},
"imgSrc": "https://photos.zillowstatic.com/fp/abc123-uncropped_scaled_within_1536_1152.webp",
"hasVideo": false,
"isFeatured": false,
"shouldShowZestimate": true,
"zestimate": 845000,
"hdpData": {
"homeInfo": {
"zpid": 2077091803,
"zipcode": "98101",
"city": "Seattle",
"state": "WA",
"latitude": 47.6062,
"longitude": -122.3321,
"price": 850000,
"dateSold": null,
"homeType": "SINGLE_FAMILY",
"homeStatus": "FOR_SALE",
"livingArea": 1850,
"bedrooms": 3,
"bathrooms": 2,
"taxAssessedValue": 620000,
"zestimate": 845000,
"rentZestimate": 3200
}
}
}
],
"mapResults": [...]
},
"searchList": {
"totalPages": 12,
"totalResultCount": 489
}
},
"cat2": {
"total": {"totalResultCount": 489}
}
}Notes:
wants.cat1keys:listResults,mapResults— usemapResultsfor map view data onlywants.cat2:totalreturns count only (fast)- Start from a real Zillow search to get valid
regionIdandmapBoundsfrom__NEXT_DATA__ - Requires browser-like headers; returns 403 without proper
User-Agent - Session cookies (
zguid) improve reliability
Endpoint: https://www.zillow.com/search/GetSearchPageState.htm
Method: GET or PUT
Version: Legacy (older pattern)
Verification:
curl "https://www.zillow.com/search/GetSearchPageState.htm?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22usersSearchTerm%22%3A%22Seattle%2C+WA%22%7D&wants=%7B%22cat1%22%3A%5B%22listResults%22%5D%7D&requestId=2" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"Note: Same response structure as
async-create-search-page-state. The.htmsuffix is legacy. May return 403 or redirect. Preferasync-create-search-page-state.
Endpoint: https://www.zillow.com/zg-graph
Method: POST
Version: GraphQL (current)
Verification: ✅ VERIFIED
Headers:
Content-Type: application/json
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
client-id: search-sub-app-client
Request Body:
{
"operationName": "GetAutocompleteResults",
"variables": {
"query": "Seattle, WA",
"resultType": ["REGIONS", "FORSALE", "RENTALS", "SOLD"]
},
"query": "query GetAutocompleteResults($query: String!, $resultType: [AutocompleteResultType!]) { zgsAutoComplete(query: $query, resultType: $resultType) { results { display metaData { regionId regionType } } } }"
}resultType Values:
| Value | Description |
|---|---|
REGIONS |
City, zip, neighborhood, county |
FORSALE |
Active for-sale listings |
RENTALS |
Active rental listings |
SOLD |
Recently sold |
Example Response (trimmed):
{
"data": {
"zgsAutoComplete": {
"results": [
{
"display": "Seattle, WA",
"metaData": {
"regionId": 16163,
"regionType": 6,
"city": "Seattle",
"state": "WA",
"country": "United States",
"lat": 47.6062,
"lng": -122.3321
}
},
{
"display": "Seattle Hill-Silver Firs, WA",
"metaData": {
"regionId": 394855,
"regionType": 8
}
}
]
}
}
}Region Types:
| regionType | Description |
|---|---|
| 6 | City |
| 7 | ZIP code |
| 8 | Neighborhood |
| 4 | County |
| 2 | State |
Endpoint: https://www.zillow.com/async-create-search-page-state
Method: PUT
Verification: ✅ VERIFIED
Use wants.cat1: ["mapResults"] only for lightweight map pin data:
{
"searchQueryState": {
"mapBounds": {"west": -122.5, "east": -122.2, "south": 47.5, "north": 47.7},
"filterState": {}
},
"wants": {"cat1": ["mapResults"]},
"requestId": 3
}Returns minimal data per listing: zpid, latLong, price, statusType.
Endpoint: https://www.zillow.com/homedetails/{address-slug}/{zpid}_zpid/
Method: GET
Version: Unversioned (Next.js)
Verification: ✅ VERIFIED
Full property data is embedded in two script tags on the HTML page:
Option 1 — Next.js data cache (__NEXT_DATA__):
import httpx, json
from parsel import Selector
resp = httpx.get(
"https://www.zillow.com/homedetails/123-Main-St-Seattle-WA-98101/2077091803_zpid/",
headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"}
)
sel = Selector(resp.text)
data = json.loads(sel.css("script#__NEXT_DATA__::text").get())
property_data = json.loads(
data["props"]["pageProps"]["componentProps"]["gdpClientCache"]
)
prop = property_data[list(property_data)[0]]["property"]Option 2 — Apollo cache (hdpApolloPreloadedData):
data = json.loads(sel.css("script#hdpApolloPreloadedData::text").get())
cache = json.loads(json.loads(data)["apiCache"])
prop = next(v["property"] for k, v in cache.items() if "ForSale" in k)Key fields returned in property:
{
"zpid": 2077091803,
"streetAddress": "123 Main St",
"city": "Seattle",
"state": "WA",
"zipcode": "98101",
"price": 850000,
"bedrooms": 3,
"bathrooms": 2,
"livingArea": 1850,
"lotSize": 5200,
"yearBuilt": 1998,
"homeType": "SINGLE_FAMILY",
"homeStatus": "FOR_SALE",
"zestimate": 845000,
"rentZestimate": 3200,
"taxAssessedValue": 620000,
"taxAnnualAmount": 7800,
"description": "...",
"photos": [...],
"priceHistory": [...],
"taxHistory": [...],
"schools": [...],
"nearbyHomes": [...],
"resoFacts": {
"hasGarage": true,
"parkingSpaces": 2,
"hasCooling": true,
"hasHeating": true,
"hasFireplace": false,
"flooring": "Hardwood"
},
"listingAgent": {
"displayName": "...",
"profileUrl": "..."
}
}Notes:
zpidis obtainable from search results (hdpData.homeInfo.zpid) or from the URL- Requires browser-like headers and often valid session cookies
- Works for for-sale, rental, and sold properties
Endpoint: https://www.zillow.com/graphql/
Method: POST (or GET with persisted query hash)
Version: GraphQL (current)
Verification: ✅ VERIFIED
Zillow uses persisted queries (sha256 hashes) internally. Direct POST with inline query also works.
Headers:
Content-Type: application/json
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
client-id: hdp-react-web-client
x-caller-id: hdp-react-web-client
Operation: ZestimateDeepDiveQuery
{
"operationName": "ZestimateDeepDiveQuery",
"variables": {"zpid": 2077091803},
"query": "query ZestimateDeepDiveQuery($zpid: ID!) { property(zpid: $zpid) { zpid zestimate zestimateMinus zestimatePlus valuationRange { low high } priceHistory { date price priceChangeRate event source pricePerSquareFoot } } }"
}Operation: HomeValueChartDataQuery
{
"operationName": "HomeValueChartDataQuery",
"variables": {"zpid": 2077091803, "useHVChartDataSource": true},
"query": "query HomeValueChartDataQuery($zpid: ID!, $useHVChartDataSource: Boolean) { property(zpid: $zpid) { zpid zestimateHistory(useHVChartDataSource: $useHVChartDataSource) { t v } } }"
}Operation: WalkTransitAndBikeScoreQuery
{
"operationName": "WalkTransitAndBikeScoreQuery",
"variables": {"zpid": 2077091803},
"query": "query WalkTransitAndBikeScoreQuery($zpid: ID!) { property(zpid: $zpid) { zpid walkScore { walkscore description logo_url ws_link } transitScore { transit_score description logo_url } bikeScore { bikescore description } } }"
}Other known GraphQL operations:
| Operation | Description |
|---|---|
ZestimateDeepDiveQuery |
Zestimate value, range, history |
HomeValueChartDataQuery |
Home value time series |
WalkTransitAndBikeScoreQuery |
Walk/Transit/Bike scores |
PropertyClimateRiskQuery |
Flood, fire, wind, heat risk scores |
SimilarSalesQuery |
Comparable recently sold homes |
NearbyHomesQuery |
Nearby active listings |
SchoolsQuery |
School ratings and proximity |
HdpMortgageCalculatorQuery |
Mortgage calculator data |
ListingDetailsQuery |
Full listing detail |
RentEstimateQuery |
Rent Zestimate detail |
Example Response — ZestimateDeepDiveQuery (trimmed):
{
"data": {
"property": {
"zpid": "2077091803",
"zestimate": 845000,
"zestimateMinus": 760500,
"zestimatePlus": 929500,
"valuationRange": {"low": 760500, "high": 929500},
"priceHistory": [
{
"date": "2024-03-15",
"price": 850000,
"priceChangeRate": 0.0,
"event": "Listed for sale",
"source": "MLS #12345",
"pricePerSquareFoot": 459
},
{
"date": "2021-08-10",
"price": 720000,
"priceChangeRate": null,
"event": "Sold",
"source": "MLS"
}
]
}
}
}Price history is embedded within priceHistory array in both __NEXT_DATA__ and graphql ZestimateDeepDiveQuery. No separate dedicated endpoint.
Fields per entry:
{
"date": "2024-03-15",
"price": 850000,
"priceChangeRate": -0.058,
"event": "Price cut",
"source": "MLS #12345",
"pricePerSquareFoot": 459,
"sellerAgent": {"displayName": "...", "profileUrl": "..."},
"buyerAgent": null
}Embedded in taxHistory array in __NEXT_DATA__:
{
"time": 2023,
"taxPaid": 7800,
"taxIncreaseRate": 0.04,
"value": 620000,
"valueIncreaseRate": 0.08
}Endpoint: https://www.zillow.com/async-create-search-page-state
Method: PUT
Verification: ✅ VERIFIED
Use isForRent: {value: true} in filterState:
{
"searchQueryState": {
"pagination": {},
"usersSearchTerm": "Seattle, WA",
"mapBounds": {"west": -122.5, "east": -122.2, "south": 47.5, "north": 47.7},
"regionSelection": [{"regionId": 16163, "regionType": 6}],
"filterState": {
"isForRent": {"value": true},
"isForSaleByAgent": {"value": false},
"isForSaleByOwner": {"value": false},
"isNewConstruction": {"value": false},
"isComingSoon": {"value": false},
"isAuction": {"value": false},
"isForSaleForeclosure": {"value": false},
"monthlyPayment": {"max": 3000},
"beds": {"min": 1},
"sortSelection": {"value": "days"}
},
"isMapVisible": true,
"isListVisible": true
},
"wants": {"cat1": ["listResults", "mapResults"], "cat2": ["total"]},
"requestId": 2
}Response — same cat1.searchResults.listResults structure, with additional rental fields:
{
"zpid": "123456",
"price": "$2,800/mo",
"unformattedPrice": 2800,
"statusType": "FOR_RENT",
"hdpData": {
"homeInfo": {
"rentZestimate": 2750,
"priceChangeDate": null,
"unit": "Apt 4B"
}
}
}Endpoint: https://www.zillow.com/b/{building-slug}/{building-id}_bld/
Method: GET (HTML with embedded JSON)
Verification:
Building pages for multi-family/apartment complexes — same __NEXT_DATA__ pattern applies. The bld suffix indicates building-level data.
Endpoint: https://www.zillow.com/graphql/
Method: POST
Verification:
{
"operationName": "RentEstimateQuery",
"variables": {"zpid": 2077091803},
"query": "query RentEstimateQuery($zpid: ID!) { property(zpid: $zpid) { zpid rentZestimate rentZestimateMinus rentZestimatePlus } }"
}Endpoint: https://www.zillow.com/rentals/api/rcf/v1/rcf
Method: POST
Verification: ✅ VERIFIED (live network capture)
A dedicated microservice returning transparent fee breakdowns for rental properties and apartment buildings. Powers the "Total monthly cost" breakdown shown on rental listings.
Headers:
Content-Type: application/json
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
Request Body:
{
"zpid": 2077091803,
"listingId": "<listing-id>"
}Example Response (trimmed):
{
"zpid": 2077091803,
"monthlyRent": 2800,
"fees": [
{"name": "Parking", "amount": 150, "frequency": "monthly", "required": false},
{"name": "Pet fee", "amount": 50, "frequency": "monthly", "required": false}
],
"utilities": [
{"name": "Water", "includedInRent": true},
{"name": "Trash", "includedInRent": true},
{"name": "Electricity", "includedInRent": false}
],
"totalMonthlyMin": 2800,
"totalMonthlyMax": 3000
}Also available via
graphql/asRentalCostAndFeesBuildingQueryfor building-level fee data.
Endpoint: https://www.zillow.com/graphql/
Method: POST
Operation: HomeValueChartDataQuery
Verification: ✅ VERIFIED
curl -X POST "https://www.zillow.com/graphql/" \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
-H "client-id: hdp-react-web-client" \
-d '{
"operationName": "HomeValueChartDataQuery",
"variables": {"zpid": 2077091803, "useHVChartDataSource": true},
"query": "query HomeValueChartDataQuery($zpid: ID!, $useHVChartDataSource: Boolean) { property(zpid: $zpid) { zpid zestimateHistory(useHVChartDataSource: $useHVChartDataSource) { t v } } }"
}'Example Response:
{
"data": {
"property": {
"zpid": "2077091803",
"zestimateHistory": [
{"t": 1704067200000, "v": 820000},
{"t": 1706745600000, "v": 828000},
{"t": 1709251200000, "v": 839000},
{"t": 1711929600000, "v": 845000}
]
}
}
}
t= Unix timestamp (ms),v= Zestimate value in USD
Endpoint: https://www.zillow.com/graphql/
Method: POST
Operation: PropertyClimateRiskQuery
Verification:
{
"operationName": "PropertyClimateRiskQuery",
"variables": {"zpid": 2077091803},
"query": "query PropertyClimateRiskQuery($zpid: ID!) { property(zpid: $zpid) { zpid climateRiskData { floodFactor fireFactor heatFactor windFactor } } }"
}Endpoint: https://www.zillow.com/graphql/
Method: POST
Operation: SimilarSalesQuery
Verification:
{
"operationName": "SimilarSalesQuery",
"variables": {"zpid": 2077091803},
"query": "query SimilarSalesQuery($zpid: ID!) { property(zpid: $zpid) { zpid comparables { zpid address price dateSold livingArea bedrooms bathrooms } } }"
}Endpoint: https://www.zillow.com/graphql/
Method: POST
Operation: WalkTransitAndBikeScoreQuery
Verification: ✅ VERIFIED
Example Response:
{
"data": {
"property": {
"zpid": "2077091803",
"walkScore": {
"walkscore": 92,
"description": "Walker's Paradise",
"logo_url": "https://cdn.walkscore.com/...",
"ws_link": "https://www.walkscore.com/..."
},
"transitScore": {
"transit_score": 75,
"description": "Excellent Transit"
},
"bikeScore": {
"bikescore": 68,
"description": "Bikeable"
}
}
}
}| Endpoint | Primary Use |
|---|---|
www.zillow.com/graphql/ |
Property detail, Zestimate, scores, history, comps |
www.zillow.com/zg-graph |
Autocomplete, region search, map data |
Zillow internally uses persisted queries (APQ — Automatic Persisted Queries):
GET https://www.zillow.com/graphql/?operationName=ZestimateDeepDiveQuery&variables={"zpid":2077091803}&extensions={"persistedQuery":{"version":1,"sha256Hash":"<hash>"}}
The sha256Hash values change with Zillow deployments. Use POST with inline query for reliability.
| Operation | Endpoint | Variables | Returns |
|---|---|---|---|
GetAutocompleteResults |
/zg-graph |
query, resultType[] |
Location suggestions |
CollectionOfRecentSearches |
/zg-graph |
(session) | User's recent searches |
GetCarouselPhotos |
/zg-graph |
zpid |
Listing photo carousel URLs |
ForSalePriorityQuery |
/graphql/ |
zpid |
Core property facts (price, beds, baths, Zestimate) |
ForSaleNonPriorityQuery |
/graphql/ |
zpid |
Secondary property data (days on market, open house schedule) |
RichMediaWebHDPQuery |
/graphql/ |
zpid |
High-res photos, virtual tour URLs |
ZestimateDeepDiveQuery |
/graphql/ |
zpid |
Zestimate, value range, history |
HomeValueChartDataQuery |
/graphql/ |
zpid, useHVChartDataSource |
Value time series |
WalkTransitAndBikeScoreQuery |
/graphql/ |
zpid |
Walk/transit/bike scores |
OfferStrengthQuery |
/graphql/ |
zpid |
Market competitiveness / offer strength |
GetContactButtonForProperty |
/graphql/ |
zpid |
Contact agent lead form config |
GetBuyabilityFinancialProfile |
/graphql/ |
zpid, downPayment, loanType |
Mortgage calculator payment breakdown |
LocalLegalProtectionQuery |
/graphql/ |
zpid |
Fair housing + legal disclosure notices |
GetUserAccountQuery |
/graphql/ |
(session cookie) | Viewer auth state, saved homes |
PropertyClimateRiskQuery |
/graphql/ |
zpid |
Flood, fire, heat, wind risk |
SimilarSalesQuery |
/graphql/ |
zpid |
Comparable sold homes |
NearbyHomesQuery |
/graphql/ |
zpid |
Nearby active listings |
SchoolsQuery |
/graphql/ |
zpid |
Nearby school ratings |
HdpMortgageCalculatorQuery |
/graphql/ |
zpid, price |
Monthly payment estimates |
ListingDetailsQuery |
/graphql/ |
zpid |
Full listing detail |
RentEstimateQuery |
/graphql/ |
zpid |
Rent Zestimate detail |
RentalCostAndFeesBuildingQuery |
/graphql/ |
zpid |
Rental costs, fees, utilities |
BuildingPageOverviewQuery |
/graphql/ |
zpid |
Unit availability, rent ranges, amenities |
AgentReviewQuery |
/graphql/ |
encodedZuid |
Agent reviews, ratings, recent sales |
Photos are served from zillowstatic.com. URLs are returned in the photos array within property detail data.
Pattern:
https://photos.zillowstatic.com/fp/{photo-id}-uncropped_scaled_within_{width}_{height}.webp
https://photos.zillowstatic.com/fp/{photo-id}-p_e.webp
Size variants:
| Suffix | Approx Size |
|---|---|
uncropped_scaled_within_1536_1152 |
1536×1152 (full) |
scaled_within_800_600 |
800×600 (medium) |
cc_ft_384 |
384px (thumbnail) |
p_e |
Extra large |
Example:
https://photos.zillowstatic.com/fp/abc123def456-uncropped_scaled_within_1536_1152.webp
Pattern:
https://maps.zillowstatic.com/...
https://www.zillowstatic.com/bedrock/app/maps/...
Used for map overlay tiles (heat maps, region overlays). Not easily consumable outside browser context.
| Domain | Purpose | Status |
|---|---|---|
www.zillow.com |
Main site — search, detail, rentals | ✅ Current, primary |
www.zillow.com/graphql/ |
GraphQL — property data, scores, estimates | ✅ Current, primary |
www.zillow.com/zg-graph |
GraphQL — autocomplete, recent searches | ✅ Current |
www.zillow.com/rentals/api/rcf/v1/ |
Rental costs and fees microservice | ✅ Current |
www.zillow.com/myzillow/api/v1/ |
User navigation state, saved homes, alerts | ✅ Current |
www.zillow.com/search/GetSearchPageState.htm |
Legacy REST search | |
mortgageapi.zillow.com |
Mortgage rates + CMS disclaimers — no auth required | ✅ Current |
settings.zillowhomeloans.com |
Home loans disclaimers / NMLS content | ✅ Current |
www.zillow.com/rental-manager/proxy/rental-manager-api/ |
Rental Manager user + listing API | 🔒 Requires account login |
photos.zillowstatic.com |
Property listing photos (CDN) | ✅ Current, static |
maps.zillowstatic.com |
Map tile CDN | ✅ Current, static |
www.zillowstatic.com |
Static assets (JS, CSS, images) | ✅ Current, static |
api.zillow.com |
Old official XML API (GetDeepSearchResults, GetUpdatedPropertyDetails) |
❌ Deprecated/offline |
api.bridgeinteractive.com |
Official partner API — Zestimate, public records data | 🔒 Requires approval, access-restricted |
zillow.com/rental-manager |
Rental syndication portal | 🔒 Requires account login |
The old api.zillow.com SOAP/XML API (GetDeepSearchResults.htm, GetUpdatedPropertyDetails.htm) is no longer publicly accessible. Requests return 404 or blank responses. All requests via pyzillow and similar old wrappers will fail.
The official, access-gated Zillow data API. Provides: public records, Zestimates, market data. Requires approval. Not reverse-engineered here.
Autocomplete (zg-graph GetAutocompleteResults)
→ regionId + region metadata
→ used in searchQueryState.regionSelection[]
Recent Searches (zg-graph CollectionOfRecentSearches)
→ requires session cookie (zguid)
→ returns user's last N searched locations
Search (async-create-search-page-state)
→ returns zpid for each listing
→ returns hdpData.homeInfo (price, beds, baths, coords)
zpid
→ Property Detail Page (__NEXT_DATA__ / hdpApolloPreloadedData)
→ photos[], priceHistory[], taxHistory[], schools[], resoFacts
→ GraphQL /graphql/
→ ZestimateDeepDiveQuery → Zestimate, value range, history
→ HomeValueChartDataQuery → value time series
→ WalkTransitAndBikeScoreQuery → Walk/Transit/Bike scores
→ PropertyClimateRiskQuery → climate risk scores
→ SimilarSalesQuery → comparable homes
→ HdpMortgageCalculatorQuery → payment estimates
→ RentalCostAndFeesBuildingQuery → rent fees (rentals only)
→ /rentals/api/rcf/v1/rcf → rental costs + utilities breakdown
Mortgage rates (mortgageapi.zillow.com/getCurrentRates)
→ no auth, GET with params
→ returns current rates by loan program, credit score, loan amount
photos[] from property
→ zillowstatic.com image CDN
→ URL pattern with size variants
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept: */*
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
| Endpoint | Additional Headers |
|---|---|
async-create-search-page-state |
Content-Type: application/json |
www.zillow.com/graphql/ |
client-id: hdp-react-web-client, x-caller-id: hdp-react-web-client |
www.zillow.com/zg-graph |
client-id: search-sub-app-client |
| Cookie | Description |
|---|---|
zguid |
Zillow user GUID — set on first page load, improves reliability |
JSESSIONID |
Java session ID |
AWSALB |
AWS load balancer affinity cookie |
search |
Stores local search context |
zjs_anonymous_id |
Analytics anonymous ID |
Getting cookies: Load
https://www.zillow.comin a browser once, copy cookies from DevTools → Application → Cookies. Add as-H "Cookie: zguid=...; JSESSIONID=..."to curl.
| Field | Type | Description |
|---|---|---|
pagination |
object | {} = page 1, {currentPage: N} = page N |
usersSearchTerm |
string | Human-readable search text |
mapBounds |
object | {west, east, south, north} bounding box |
regionSelection |
array | [{regionId, regionType}] from autocomplete |
filterState |
object | All filter criteria |
isMapVisible |
bool | Include map results |
isListVisible |
bool | Include list results |
| Key | Values | Description |
|---|---|---|
cat1 |
listResults, mapResults |
Main listing data |
cat2 |
total |
Total result count only |
| Field | Description |
|---|---|
zpid |
Zillow Property ID (primary key) |
detailUrl |
Relative URL to property detail page |
statusType |
FOR_SALE, FOR_RENT, RECENTLY_SOLD |
price |
Formatted price string |
unformattedPrice |
Numeric price |
hdpData.homeInfo |
Core property facts |
latLong |
{latitude, longitude} |
imgSrc |
Primary listing photo URL |
zestimate |
Zillow estimated value |
rentZestimate |
Zillow estimated monthly rent |
This repository includes a Django REST API that wraps Zillow's endpoints.
- Property search (for-sale, rental, recently-sold)
- Property detail retrieval via ZPID
- Zestimate and home value history
- Walk/Transit/Bike score lookup
- Autocomplete / location suggestions
- Background ingestion (Celery)
- Docker support
- OpenAPI documentation via drf-spectacular
cd zillow_service
docker compose up --build
# API: http://localhost:8001
# Docs: http://localhost:8001/api/docs/| Endpoint | Method | Description |
|---|---|---|
/healthz |
GET | Health check |
/api/v1/search/ |
POST | Property search |
/api/v1/properties/{zpid}/ |
GET | Property detail |
/api/v1/properties/{zpid}/zestimate/ |
GET | Zestimate + history |
/api/v1/properties/{zpid}/scores/ |
GET | Walk/Transit/Bike scores |
/api/v1/autocomplete/ |
GET | Location suggestions (?q=Seattle) |
/api/v1/ingest/property/ |
POST | Ingest property by ZPID |
| Category | Methods |
|---|---|
| Search | search_for_sale(), search_for_rent(), search_recently_sold() |
| Property | get_property_detail(), get_property_from_page() |
| Estimates | get_zestimate(), get_zestimate_history(), get_rent_zestimate() |
| Scores | get_walk_bike_transit_scores(), get_climate_risk() |
| Search Tools | autocomplete(), get_region_id() |
| Comps | get_comparable_sales(), get_nearby_homes() |
See zillow_service/README.md for full service documentation.
- 403 responses: Almost always a header/cookie issue. Add a full browser
User-Agentand azguidcookie. - Rate limiting: Zillow actively rate-limits and blocks IPs. Use delays of 2–5 seconds between requests.
- Result cap: Search returns a maximum of ~500 results per query region. Use smaller
mapBoundsareas to paginate through large markets. - ZPID in URLs: Format is
https://www.zillow.com/homedetails/{slug}/{zpid}_zpid/ - GraphQL schema changes: Zillow updates its GraphQL schema frequently. Monitor for
nullfields in responses. __NEXT_DATA__vs Apollo cache: Newer property pages use Apollo cache (hdpApolloPreloadedData). Try both.- Rentals vs For-Sale: Same endpoint, different
filterState. Rental prices are per-month. - RCF endpoint:
/rentals/api/rcf/v1/rcfreturns detailed fee/utility breakdowns for rentals — useful for "total monthly cost" displays. - Mortgage rates:
mortgageapi.zillow.com/getCurrentRatesworks without auth or cookies — great for a standalone rate widget. - Mortgage CMS:
mortgageapi.zillow.com/getMarkdownCMSDocument?id=zhl-nmls-disclaimerreturns legal/NMLS disclaimer markdown — useful if building a rate widget. - Home Loans disclaimers:
settings.zillowhomeloans.com/api/v1/public/values/disclaimers.footerreturns footer legal text for Zillow Home Loans pages. - User nav state:
www.zillow.com/myzillow/api/v1/userNavigationreturns logged-in user's saved homes, alerts, and nav state — requires valid session cookie. - Rental Manager API:
www.zillow.com/rental-manager/proxy/rental-manager-api/api/v1/users/getfetches landlord user profile — requires account login. api.zillow.comis dead: The old official XML API no longer works. Do not usepyzillowor similar old wrappers.- No versioned paths: Zillow does not use
/v1//v2//v3/in public-facing URLs.
Found a new endpoint? Please open an issue or PR!
MIT License — See LICENSE file
Last Updated: March 2026 · 17+ endpoints · 3 API domains · GraphQL + REST