Zillow Detail Scraper πŸ’° From $1.4/1K Β· URL, ZPID or Address avatar

Zillow Detail Scraper πŸ’° From $1.4/1K Β· URL, ZPID or Address

Pricing

from $1.40 / 1,000 results

Go to Apify Store
Zillow Detail Scraper πŸ’° From $1.4/1K Β· URL, ZPID or Address

Zillow Detail Scraper πŸ’° From $1.4/1K Β· URL, ZPID or Address

Paste Zillow property URLs, ZPIDs or plain addresses and get the full record for each: price, beds, baths, sq ft, lot size, description, agent and broker contacts, schools, zoning, price and tax history. Works on sale, rent and sold listings. JSON, CSV or Excel export.

Pricing

from $1.40 / 1,000 results

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

🏠 Zillow Detail Scraper

Hand it Zillow property URLs, ZPIDs, or plain street addresses and get the complete record for each one β€” price, beds, baths, sq ft, lot size, the full description, listing agent and broker contacts, schools, zoning, and the price and tax history.

No search to configure and no filters to set. Paste a list, press Start, and get one fully detailed row per property as JSON, CSV, or Excel.

⭐ Why use this Zillow detail scraper?

  • Three ways in β€” a /homedetails/ URL, a bare ZPID, or an address like 2307 Cheyenne Cir, Austin, TX. Mix all three in one run.
  • Everything on the page β€” description, photos, price history, tax history, Zestimate, schools, HOA, lot size, zoning, and agent/broker contact details.
  • Other Zillow URL types too β€” building (/b/), new-construction community, and agent (/profile/) URLs are detected automatically and sent to the right parser.
  • Works on sale, rent and sold β€” the same column set whatever the listing status.
  • Agent email enrichment (optional) β€” match the listing agent against a 1,200,000+ US agent database and add their direct email and phone.
  • Proxies included on paid plans β€” on any paid Apify plan the actor routes itself through its own residential proxy pool at no extra cost, and the proxy field is not read at all. Free-plan runs go out through Apify's default datacenter proxy, which Zillow refuses, so on the free plan put your own residential proxy URLs in the proxy field, or pick Apify Proxy with the RESIDENTIAL group.

πŸ“‹ What data does it extract?

Field groupColumns
IdentityID (ZPID), URL, Address, City, State, Zip Code, Latitude, Longitude
ListingPrice, Status, Property Subtype, Acres, Description
PeopleAgent Name, Agent Number, Broker Name, Broker Number
Land & legalZoning, Zoning Description
Run metadataDate (the date the run executed, not a listing date), Source
Full recorddetails β€” Zillow's property object: price history, tax history, Zestimate, photos, schools, HOA, resoFacts (~200 fields)
Raw Zillow keyszpid, detailUrl, price, address, beds, baths, area, latLong, imgSrc, statusType β€” Zillow's own field names, carried next to the columns above on property rows

The standard column set is fixed, so a few of its columns always arrive empty on this actor: Change Type and Previous Status (monitoring columns), School 1–School 3, and Subtype 1–Subtype 4. The school data itself is inside the details blob, as details.schools and details.assignedSchools.

🧾 Supported inputs

InputExample
Property URLhttps://www.zillow.com/homedetails/2307-Cheyenne-Cir-Austin-TX-78745/58313397_zpid/
ZPID58313397
Address2307 Cheyenne Cir, Austin, TX
Buildinghttps://www.zillow.com/b/the-tower-new-york-ny-5XsKjq/
Communityhttps://www.zillow.com/community/farmlore-villas/30499782_plid/
Agent profilehttps://www.zillow.com/profile/BrettHull

A property URL, ZPID or address returns one row. Two kinds of input expand instead: a /community/ page becomes one row per home in that community, and a Zillow search URL or an /apartments/ page carrying search results fills rows up to maxItems. Every one of those rows counts against maxItems (default 100), so raise it before pasting anything that is not a single property.

πŸ’‘ Use cases

  • Agents & teams β€” turn a list of addresses from a farm area or a CRM export into full listing records with contacts.
  • Investors & wholesalers β€” pull price history, tax history and lot data for a shortlist before making offers.
  • Appraisers & analysts β€” build comparable sets from exact properties rather than whole-market sweeps.
  • Proptech & data teams β€” resolve a stream of Zillow URLs into structured rows for an app, map or warehouse.
  • Lead workflows β€” enrich a property list with the listing agent's direct email and phone.

πŸš€ How it works

Each input is resolved to a ZPID β€” an address goes through Zillow's own autocomplete first β€” and the property is then fetched from Zillow's GraphQL API. When that endpoint is blocked, the actor falls back through a second query shape and finally reads the listing page itself through a managed unblocker, so a row comes back rather than an empty cell. That last step is capped at 60 properties per run; past the cap a blocked property still produces a row, but without its details record.

βš™οΈ Input configuration

FieldTypeNotes
startUrlsarrayOne Zillow property URL per line
zpidsarrayBare ZPIDs, one per line
addressesarray123 Main St, City, State
includePropertyDetailsbooleanOn by default; a property URL, ZPID or address always fetches the full record
includeAgentDetailsbooleanAdds the agent's own profile record under details.agentDetails
includeSaleDetailsbooleanAdds Zillow's secondary listing hub under details.saleDetails
includeNearbyHomesbooleanKeeps Zillow's nearby-homes blob inside details
flatOutputbooleanAdds spreadsheet-friendly columns and drops details (the payload stays on the row as hdpData.homeInfo)
enrichEmailsbooleanAgent email lookup, billed per email found
maxItemsintegerStop after this many properties; default 100. A /community/ page counts as one row per home, not one row

Every field, with its type and default, is also listed on the actor’s own input schema page.

πŸ“¦ Output sample

{
"ID": "58313397",
"URL": "https://www.zillow.com/homes/58313397_zpid/",
"Address": "2307 Cheyenne Cir",
"City": "Austin",
"State": "TX",
"Zip Code": "78745",
"Price": 995000,
"Status": "FOR_SALE",
"Property Subtype": "SINGLE_FAMILY",
"Agent Name": "Brooke Roeder",
"Agent Number": "(512) 964-8379",
"Broker Name": "Christies Intl Real Estate Lone Star",
"Acres": "0.33 Acres",
"Latitude": 30.224419,
"Longitude": -97.79659
}

That is an excerpt of a default row: the same row also carries the raw Zillow keys listed above and the full details blob.

πŸ”‘ Key output fields

  • ID β€” the ZPID on a property row, matching the zpid inside that row's own URL. A building (/b/) row carries Zillow's building id and a /b/ URL that holds no zpid.
  • Price β€” the asking price, or the sold price on a closed sale. Left blank rather than zero where Zillow publishes no figure.
  • Acres β€” Zillow's own lot-size string, copied as given (8,276 sqft or 0.29 Acres).
  • Agent Name / Agent Number β€” the listing agent, resolved through listedBy, then attribution data, then the contact module.
  • Date β€” the date the run executed, not the date the home was listed. Zillow's posted date is details.datePostedString (and the Listing Date column when flatOutput is on).
  • details β€” Zillow's property record, present unless flatOutput is on, which moves the same payload to hdpData.homeInfo. The nearby- and similar-homes blobs (collections, nearbyHomes, relatedHomes, homeRecommendations, homeValuation) are stripped unless includeNearbyHomes is on, which puts them back; the submitFlow form template is always stripped.

The standard columns are Title Case (Address, Zip Code, Agent Name) so they read cleanly as spreadsheet headers. Every property row also carries Zillow's own raw keys next to them β€” zpid, detailUrl, price, address, beds, baths, area, latLong, imgSrc, statusType and a few more β€” so a handful of values arrive twice under two names. flatOutput adds further Title Case columns but does not remove the raw ones. An agent-profile URL returns the agent's own record instead, which has neither of those two column sets.

❓ FAQ

Can I pass hundreds of URLs? Yes. Raise maxItems and the run's "Maximum cost per run" limit so the run is not cut short partway.

Why is Price empty on a sold home? In non-disclosure states, Texas among them, a sale price is not public record β€” Zillow publishes no figure there, so the column is left blank rather than filled with a wrong number.

Do I need a Zillow API key? No. Nothing to configure and no login is used.

Do I need proxies? Not on a paid Apify plan β€” the actor brings its own residential pool at no extra cost, and the proxy field is not read there. On the free plan the run goes out through Apify's default datacenter proxy, which Zillow refuses, so supply your own residential proxy URLs in the proxy field, or pick Apify Proxy with the RESIDENTIAL group.

What if an address does not resolve? The actor tries progressively cleaned variants of the address before giving up, so unit noise and ranges usually still resolve. If nothing matches, that input is skipped and the rest of the run continues.

How fresh is the data? Every run reads Zillow live at the moment it executes.

πŸ›Ÿ Support

Found an issue or missing a field? Open an issue on the actor's Issues tab with the run ID β€” that is all that is needed to trace exactly what happened.

🧩 Additional services

Need a custom pipeline (specific columns, delivery to your DB/S3/webhook, merged multi-source feeds)? Open an issue describing what you need or contact the author through the actor page.

πŸ”Ž Explore more scrapers

Eleven Zillow actors, all maintained by the same author. The six under Listings and properties share the same standard columns as this actor β€” some add extra columns of their own on top β€” so rows from any of them line up in one sheet.

Listings and properties

People and contacts

Beyond Zillow: all actors by memo23, 100+ maintained scrapers for real estate, jobs, directories and reviews.

πŸ€– For AI Agents & LLM Apps

This actor is MCP-ready: call it from AI agents (Claude, GPT, LangChain, LlamaIndex, or the Apify MCP server) to answer questions like "what is the tax history and lot size of 2307 Cheyenne Cir, Austin TX?". It takes a plain address, so an agent does not need to construct a Zillow URL first, and the structured JSON with stable field names makes rows directly usable as tool results β€” details for grounded property Q&A, Agent Name / Agent Number for outreach steps.

To wire it up: the ready-made Node.js and Python client snippets call this actor in a few lines, the MCP tab exposes it as a tool to an MCP client, and once you have run the actor, its integrations tab in your Apify Console pushes each run straight to Google Sheets, Slack, a webhook or your own storage (how integrations work).

⚠️ Disclaimer

This actor is not affiliated with, endorsed by, or connected to Zillow Group. It extracts only publicly visible listing information for lawful purposes such as market research and personal planning; no login is used and no private data is accessed. You are responsible for how you use the data β€” respect Zillow’s terms and applicable laws. Apify’s own write-up on the legality of web scraping is a good starting point, and personal data in the output (agent names, phone numbers, emails) falls under rules such as EU Regulation 2016/679.


zillow detail scraper Β· scrape zillow property details Β· zillow zpid lookup Β· zillow address to property data Β· zillow property data extractor Β· zillow detail API Β· zillow price history scraper Β· export zillow property details to excel