Zillow Property Details API: Zestimate, Tax History, and Agent Data by URL
Pull full Zillow property records by URL or ZPID in Python — price history, tax history, schools, HOA, and agent data the official API never exposed.
The actor referenced in this article. Pay only for results delivered.
Even when Zillow’s old third-party API was still active, it never exposed the full detail record you can see on a property page in a browser — price history, tax history, school assignments, HOA fees, parking, and heating/cooling details were never part of the public feed. Today that API is deprecated and gone, replaced by partner-gated data agreements that are out of reach for most use cases. If you need the complete record for a specific property, not just the search-card summary, there’s no official path to it.
The Zillow Property Details Scraper reads the property page directly and parses Zillow’s own embedded property JSON — the same data the page renders from, minus the browser. Give it a Zillow URL or a raw ZPID and it returns the deep record: price history, tax history, nearby schools with ratings, HOA fee, parking, stories, heating/cooling, appliances, the full description, and up to 10 photos. It’s built to chain off the Zillow Search Scraper — pass its detailUrl or zpid output straight into this actor’s urls input. HTTP-only, 512 MB, $1 per 1,000 results ($0.001 each), nothing charged on failed lookups.
What You Get
For each property the actor returns:
- address, city, state, zipCode, country — full location
- price, priceLabel — current list price
- beds, baths, fullBaths, halfBaths — bedroom and bathroom breakdown
- sqft, lotSizeSqft, lotSizeAcres — living area and lot size
- yearBuilt, propertyType, homeStatus, daysOnZillow — core listing facts
- zestimate, rentZestimate — Zillow’s sale and rent valuation
- hoaFee — monthly HOA where published
- parkingType, parkingSpaces, stories — parking and layout
- heating, cooling, appliances — systems and included appliances (arrays)
- description — the full listing description text
- priceHistory — array of
{ date, price, event, pricePerSqft, source }— every price change on record - taxHistory — array of
{ year, taxPaid, value }— annual tax and assessed value - schools — array of
{ name, rating, type, grades, distance }— nearby schools - photos — up to 10 photo URLs
- latitude, longitude, zpid, mlsId — coordinates and IDs
- agentName, brokerName, listedDate — listing agent, brokerage, and list date
Optional sections (includePriceHistory, includeTaxHistory, includeSchools) can be toggled off if you only need the core fields.
Pull Full Details by URL or ZPID
import os
from apify_client import ApifyClient
apify = ApifyClient(os.environ["APIFY_TOKEN"])
run = apify.actor("themineworks/zillow-property-details").call(run_input={
"urls": [
"https://www.zillow.com/homedetails/4501-Red-River-St-Austin-TX-78751/29488283_zpid/",
"89361344", # raw ZPID also accepted
],
"includePriceHistory": True,
"includeTaxHistory": True,
"includeSchools": True,
})
for home in apify.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{home['address']} — {home.get('priceLabel')}")
print(f" Zestimate: ${home.get('zestimate'):,}")
for event in home.get("priceHistory", []):
print(f" {event['date']}: {event['event']} — ${event['price']:,}")
for school in home.get("schools", []):
print(f" {school['name']} (rating {school.get('rating')}, {school.get('distance')} mi)")
Chain Off Search Results
The most common pattern is running the Zillow Search Scraper first to find matching properties in a location, then enriching each with this actor:
search_run = apify.actor("themineworks/zillow-search-scraper").call(run_input={
"location": "Austin, TX",
"maxItems": 50,
"minBeds": 3,
})
zpids = [
item["zpid"]
for item in apify.dataset(search_run["defaultDatasetId"]).iterate_items()
]
details_run = apify.actor("themineworks/zillow-property-details").call(run_input={
"urls": zpids,
"includeTaxHistory": True,
})
Use in Claude, ChatGPT & Any MCP Agent
This actor is available as a hosted MCP server:
https://mcp.apify.com/?tools=themineworks/zillow-property-details
{
"mcpServers": {
"zillow-property-details": {
"command": "npx",
"args": ["-y", "@apify/mcp-client"],
"env": {
"APIFY_TOKEN": "your-token-here",
"MCP_ACTOR_URL": "https://mcp.apify.com/?tools=themineworks/zillow-property-details"
}
}
}
}
Connect it to Claude Desktop or any MCP-compatible client and ask it to pull the full history and school ratings for a specific listing URL — no script required for a one-off lookup.
Use Cases
Comparative market analysis (CMA). Combine priceHistory and taxHistory across a handful of comparable properties to ground a valuation in actual price movement and assessed value, not just current list price.
Listing enrichment. Take a thin search dataset (address, price, beds) and attach schools, HOA fee, parking, and photos to build a complete property record for a data product or internal dashboard.
Investor underwriting. Pull taxHistory and hoaFee for a shortlist of properties to model true carrying cost before making an offer.
Agent and broker lead lists. agentName and brokerName are included on every record, letting you build outreach lists straight from a details pull without a separate lookup.
Pricing
$1 per 1,000 results ($0.001 per property). Enriching 200 properties from a search run costs $0.20. Roughly 2 properties per second at 512 MB, with a 1-second delay between requests to keep the run stable.
Frequently Asked Questions
Do I need a Zillow account or API key?
No. The scraper requires no login, no cookies, and no API key — only an Apify account.
Can I feed the Zillow Search Scraper’s output straight in?
Yes. The detailUrl and zpid fields from the Zillow Search Scraper (and the Recently Sold and Rental Listings actors) drop directly into this actor’s urls input for a clean search-to-detail pipeline.
What extra data do I get versus the search scraper?
Price history, tax history, school ratings, HOA fee, parking, stories, heating/cooling, appliances, the full description, and up to 10 photos — none of which appear on search result cards.
Does it accept a raw ZPID instead of a full URL?
Yes. Pass either the full Zillow property URL or just the numeric ZPID string in the urls array; both are accepted.
How does this fit with Redfin and Realtor.com data?
This actor covers Zillow’s detail record specifically. For a combined pipeline across all three portals, see our guide to building a full real-estate data stack with Zillow, Redfin, and Realtor.com.
Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.
Airbnb Scraper: Listing Prices, Ratings, and Availability Without the API
Airbnb has no public listings API. Here's how to pull nightly price, rating, superhost status and coordinates from Airbnb search results using Python.
Maps Leads: Verified Email Extraction from Google Maps Business Listings
How to pull B2B leads from Google Maps with MX-verified emails, past the official API's 120-result cap, and pay only for contactable businesses.
Realtor.com Scraper: Property and Agent Data Without the MLS Paywall
Scrape Realtor.com listings in Python — price, beds, baths, county, and the listing agent + brokerage office on every record. No login, no API key.