Zillow Property Data Scraper API
Scraping property information from Zillow gets easier with one call: pass a homedetails URL or a zpid and our Zillow property data API returns the full listing record as clean JSON, address, price, beds, baths, living area, year built, every photo, and the listing agent.
Why Zillow Property data is tough at scale
Zillow has no public listings API since it retired its Bridge and GetSearchResults endpoints, so the data only lives in the page. That page sits behind PerimeterX, and the home record is buried in a stringified gdpClientCache blob inside __NEXT_DATA__ that shifts shape often enough to break hand-written parsers.
Run the Zillow Property Data Scraper API in one call
curl "https://api.zillowscraperapi.com/api/v1/zillow/property?url=https://www.zillow.com/homedetails/6505-44th-Ave-NE-Seattle-WA-98115/463504654_zpid/&api_key=$API_KEY" import requests
BASE = "https://api.zillowscraperapi.com"
API_KEY = "YOUR_API_KEY"
# Pass a Zillow homedetails URL (or a zpid) and read the parsed record.
data = requests.get(
f"{BASE}/api/v1/zillow/property",
params={
"url": "https://www.zillow.com/homedetails/6505-44th-Ave-NE-Seattle-WA-98115/463504654_zpid/",
"api_key": API_KEY,
},
timeout=30,
).json()
sale = data["trade_info"][0]
print(data["name"])
print(f"${sale['price']:,} - {data['area']['value']} sqft - built {data['year_built']}")
print("Listed by", data["listing_agent"])
# zpid also works instead of url:
# params={"zpid": "463504654", "api_key": API_KEY} Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
url | required | - | The Zillow homedetails page URL, e.g. https://www.zillow.com/homedetails/.../463504654_zpid/. Required unless you pass zpid. |
zpid | optional | - | The numeric Zillow property id. We build the canonical /homedetails/{zpid}_zpid/ URL from it. One of url or zpid is required. |
country | optional | - | Optional two-letter country hint. Zillow is US-only, so this is rarely needed. |
add_html | optional | false | Set to true to include the raw page HTML alongside the parsed record for debugging or custom extraction. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
The Zillow Property Data Scraper API JSON response
{
"name": "6505 44th Avenue NE, Seattle, WA, 98115",
"address": {
"address_country": null,
"address_locality": "Seattle",
"address_region": "WA",
"postal_code": "98115",
"raw": "6505 44th Avenue NE, Seattle, WA, 98115",
"street_address": "6505 44th Avenue NE"
},
"location": { "city": "Seattle", "region": "WA" },
"area": { "raw": "1,422 sqft", "value": 1422, "unit_code": "sqft" },
"trade_info": [
{ "currency": "USD", "price": 899900, "price_per_area_unit": 633, "trade_type": "sale" }
],
"property_type": "house",
"listing_type": "sale",
"availability_status": "available",
"description": "Welcome to this stunning new construction home in the desirable View Ridge neighborhood! This 3-bedroom, 2.5-bath residence features an open-concept floor plan...",
"year_built": 2026,
"number_of_rooms": 3,
"rooms": [
{ "count": 3, "room_type": "bedroom" },
{ "count": 3, "room_type": "bathroom" }
],
"images": [
"https://photos.zillowstatic.com/fp/13d6cb3a35a235ffd25f90309ad7bc78-p_d.jpg",
"https://photos.zillowstatic.com/fp/670373072a67ee2f912f640135170a8a-p_d.jpg"
],
"main_image": "https://photos.zillowstatic.com/fp/13d6cb3a35a235ffd25f90309ad7bc78-p_h.jpg",
"listing_agent": "Eric Nissen, Real Property Associates, Inc.",
"url": "https://www.zillow.com/homedetails/6505-44th-Ave-NE-Seattle-WA-98115/463504654_zpid/",
"zpid": "463504654",
"home_status": "FOR_SALE",
"parcel_id": "260280002007",
"lot_size": 1707,
"latitude": 47.675953,
"longitude": -122.281136
} | Field | Type | Description |
|---|---|---|
name | string | The full property address as a single line, e.g. 6505 44th Avenue NE, Seattle, WA, 98115. |
address | object | Structured address with street_address, address_locality, address_region, postal_code, address_country, and the raw string. |
location | object | Shorthand city and region for the property. |
area | object | Living area as raw (1,422 sqft), value (1422), and unit_code (sqft). |
trade_info | array | One entry per active offer, each with currency, price, price_per_area_unit, and trade_type (sale or rent). |
property_type | string | Normalized type: house, apartment, or land, mapped from Zillow's homeType enum. |
listing_type | string | Whether the listing is for sale or for rent. |
availability_status | string | Listing availability, e.g. available. |
description | string | The full listing description text from the property page. |
year_built | integer | The year the home was built. |
number_of_rooms | integer | Bedroom count, surfaced for the Scrapfly-parity schema. |
rooms | array | Room breakdown, each with count and room_type (bedroom, bathroom). |
images | array | Every listing photo URL from the gallery (up to 50 per call). |
main_image | string | The primary hero photo URL for the listing. |
listing_agent | string | The listing agent and brokerage, e.g. Eric Nissen, Real Property Associates, Inc. |
url | string | The canonical homedetails URL for the property. |
zpid | string | The stable Zillow property id. |
home_status | string | Zillow's raw status, e.g. FOR_SALE, FOR_RENT, SOLD. |
parcel_id | string | The county parcel identifier for the property. |
lot_size | integer | Lot size in square feet. |
latitude | number | Property latitude. |
longitude | number | Property longitude. |
Ways teams use this data
Comp and valuation models
Listing enrichment
Real-estate portals and apps
Market and inventory tracking
Photo and media pipelines
Geospatial mapping
Where our Zillow Property Data Scraper API stands out
Pass a homedetails URL or a zpid and we resolve the page for you, running residential proxies, PerimeterX handling, and retries, then parse the buried gdpClientCache record into a stable flat schema. One request returns the whole listing, address, price, area, rooms, photos, and agent, as validated JSON in about 2.6 seconds, with no Zillow API key to apply for.
URL or zpid input
PerimeterX handling built in
Full parsed record
Auto-retry across pools
Stable Scrapfly-parity schema
Every photo in one call
Zillow Property Data Scraper API vs DIY and the Zillow API
| Our API | DIY (requests / headless) | Official Zillow API | |
|---|---|---|---|
| Property data access | Parsed JSON from URL or zpid | Manual fetch and parse of __NEXT_DATA__ | Retired: no public listings API |
| Setup | API key only | Residential proxies, headless browser, parsers | Partner approval, where available |
| Anti-bot (PerimeterX) | Handled for you | You solve the challenge yourself | Not applicable |
| Photos and description | Full gallery plus text in one call | Extra parsing of the photo blob | Not exposed |
| Output shape | Stable flat JSON, parity-checked | Whatever you parse from the page | Not applicable |
| Billing | Pay per successful request | You absorb blocked-request cost | Not applicable |
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
Send one GET request to our zillow/property endpoint with a homedetails URL (or a zpid) and your api_key. We route the request through residential proxies, clear Zillow's PerimeterX check, retry on failure, and parse the page's embedded home record, so you get back clean JSON with the address, price, beds, baths, living area, year built, photos, and the listing agent. There is nothing to install and no parser to maintain.
Not a public one. Zillow retired its Bridge Interactive listing feeds and older GetSearchResults and GetDeepSearchResults endpoints, so there is no open API that returns for-sale listing data to general developers. The data still renders on the public property page, which is what our Zillow property data API reads and returns as structured JSON.
Yes. Pass the numeric zpid parameter and we build the canonical https://www.zillow.com/homedetails/{zpid}_zpid/ URL and resolve it. Either url or zpid is required on every call, and the zpid also comes back in the response so you can store it as the stable key for a property.
Each call returns the address (both a raw string and structured parts), living area in square feet, the price and price per square foot under trade_info, property_type, year_built, a rooms breakdown for beds and baths, the full images gallery, the main_image, the listing_agent and brokerage, home_status, parcel_id, lot_size, and latitude and longitude. The response above is a real, unedited example.
Zillow uses PerimeterX, which serves a Press-and-Hold challenge to traffic it does not trust and returns a page with no listing data. Our API routes property requests through residential proxies with anti-bot handling and automatic retries, so the real page loads and the embedded gdpClientCache record is parsed. You never handle the challenge or manage a proxy pool yourself.
Scraping publicly visible web pages is generally treated as lawful in the United States, and courts have declined to treat access to public data as a Computer Fraud and Abuse Act violation, though Zillow's Terms of Use restrict automated collection, so review the terms and robots.txt for your use case and avoid personal or copyrighted data you do not have the right to use. This is general information, not legal advice.
Median end-to-end response is about 2.6 seconds, which includes proxy routing, PerimeterX handling, retries, and parsing. One call returns the entire property record, so you do not chain extra requests to assemble a listing, and you are billed only for successful requests.