Skip to content

Properties

Single-property lookups by URL, address, or zpid. Returns the full property record.

GET /v1/properties/by-url

Cost · 1 credit per record returned (minimum 1) · failed calls are free

QueryTypeRequiredNotes
urlstringyesFull Zillow URL: homedetails, b, community, or apartments
statusenumnoFOR_SALE (default), RECENTLY_SOLD, FOR_RENT
extract_unitsenumnodisabled (default), all, for_sale, recently_sold, for_rent, off_market — for building URLs
fieldsstringnoField projection (see Field projection)

200 response

{
"data": { "zpid": "11026031", "address": {...}, "price": 295000, "...": "..." },
"request_id": "..."
}

When extract_units != disabled and the URL is a multi-unit building, data is an array.

Errors: invalid_url, invalid_status, invalid_extract_units, not_found, upstream_timeout, upstream_error.

GET /v1/properties/by-address

Cost · 3 credits per successful call (we resolve the address upstream) · failed calls are free

QueryTypeRequired
addressstringyes
statusenumno
fieldsstringno

address should be the full street + city + state + zip. We geocode it upstream.

GET /v1/properties/{zpid}

Cost · 1 credit per call · failed calls are free

zpid-based lookup. Returns the full property record.

{
"data": { "zpid": "11026031", "...": "..." },
"request_id": "..."
}

Sub-resources

Each sub-resource returns just the slice you need — no need to parse a 5 MB detail blob if you only want photos or schools.

GET /v1/properties/{zpid}/photos

Cost · 1 credit per call · failed calls are free

{
"data": [
{
"url": "https://photos.zillowstatic.com/fp/.../p_d.jpg",
"caption": "",
"subjectType": null,
"mixedSources": {
"jpeg": [
{ "url": "...", "width": 192 },
{ "url": "...", "width": 384 },
{ "url": "...", "width": 768 },
{ "url": "...", "width": 1536 }
],
"webp": [{ "url": "...", "width": 192 }, { "url": "...", "width": 1536 }]
}
}
],
"meta": { "count": 35, "photo_count": 35, "has_3d": false, "has_video": false }
}

Top-level url is the default-resolution JPEG. mixedSources.jpeg and mixedSources.webp give you each photo at multiple widths so you can pick the smallest size that fits your UI.

GET /v1/properties/{zpid}/price-history

Cost · 1 credit per call · failed calls are free

{
"data": [
{ "date": "2024-08-15", "event": "Listed for sale", "price": 295000, "priceChangeRate": 0 },
{ "date": "2018-03-22", "event": "Sold", "price": 211000, "priceChangeRate": 0.18 }
]
}

GET /v1/properties/{zpid}/tax-history

Cost · 1 credit per call · failed calls are free

{ "data": [{ "time": 1704067200000, "taxPaid": 2841, "value": 248000, "valueIncreaseRate": 0.04 }], "meta": {...} }

GET /v1/properties/{zpid}/schools

Cost · 1 credit per call · failed calls are free

{ "data": [{ "name":"Mountain View Elementary", "rating":7, "distance":0.4, "type":"public", "level":"Elementary" }], "meta": {...} }

GET /v1/properties/{zpid}/nearby

Cost · 1 credit per call · failed calls are free

Comparable nearby listings (top ~12 from the upstream).

GET /v1/properties/{zpid}/agent

Cost · 1 credit per call · failed calls are free

{
"data": {
"agentName": "...", "agentEmail": "...", "agentPhoneNumber": "...", "agentLicenseNumber": "...",
"brokerName": "...", "brokerPhoneNumber": "...", "attributionInfo": {...}
}
}

GET /v1/properties/{zpid}/zestimate

Cost · 1 credit per call · failed calls are free

{
"data": {
"zestimate": 305100, "rent_zestimate": 1850,
"tax_assessed_value": 248000, "last_sold_price": 211000, "currency": "USD"
}
}

GET /v1/properties/{zpid}/open-houses

Cost · 1 credit per call · failed calls are free

{
"data": [{ "startTime": "2026-05-04T18:00:00Z", "endTime": "2026-05-04T20:00:00Z" }],
"meta": { "tour_eligibility": {...} }
}

GET /v1/properties/{zpid}/facts

Cost · 1 credit per call · failed calls are free

Full resoFacts blob (MLS attribute set — appliances, flooring, parking, view, etc.).

POST /v1/properties/batch

Cost · 1 credit per record returned (settled when the async job completes) · failed calls are free

Async. Up to 500 entries per job.

Body

{
"urls": ["https://www.zillow.com/homedetails/.../11026031_zpid/", "..."],
"addresses": ["18 Zelma Dr, Greenville, SC 29617"],
"propertyStatus": "FOR_SALE",
"extractBuildingUnits": "disabled",
"maxItems": 500
}

202 response

{ "data": { "job_id": "8c2a...", "status": "running" }, "request_id": "..." }

Then poll GET /v1/jobs/{job_id} or use a webhook.