Zillow Scraper: Listings, Agents, Zestimate & Filters
Pricing
from $0.99 / 1,000 zillow listings
Zillow Scraper: Listings, Agents, Zestimate & Filters
Scrape Zillow for-sale, sold, and rental listings by city, ZIP, URL, ZPID, or dataset. Get prices, Zestimate, agent contacts, photos, property details, and history. Use fast search, full-detail enrichment, advanced filters, and listing change monitoring.
Pricing
from $0.99 / 1,000 zillow listings
Rating
5.0
(2)
Developer
Blynx
Maintained by CommunityActor stats
1
Bookmarked
99
Total users
17
Monthly active users
0.83 hours
Issues response
2 days ago
Last modified
Categories
Share
π‘ Zillow Scraper β Extract Zillow Real Estate Data at Scale
A fast, no-browser Zillow scraper for Apify. Extract full listing details, agent contacts, price history, Zestimate, photos, and search results from Zillow.com without the official Zillow API or a headless browser. Built on pure HTTP requests with Chrome TLS-fingerprint impersonation, US residential proxies, challenge detection, and automatic retry recovery.
Scrape For Sale, Sold, and For Rent Zillow listings. Search by city, ZIP code, neighborhood, or region URL. Collect up to 20 pages / approximately 820 candidates per query, then deduplicate, filter, sort, and apply one global result limit.
π₯ What does Zillow Scraper do?
Zillow Scraper is an HTTP-only alternative for collecting a broad public Zillow property payload and paginated search results. Use it to:
- ποΈ Extract Zillow listing data at scale β price, beds, baths, square footage, lot size, year built, home type
- π Search Zillow by ZIP code, city, neighborhood, or address with full pagination across all result pages
- ποΈ Filter the complete result set by price, beds, baths, property type, area, lot size, year built, photos, open houses, or price reductions
- βοΈ Sort globally across every query and page before applying the final result limit
- π Scrape For Sale, Sold, and For Rent properties from any US region
- π© Build real estate agent contact lists β listing agent name, phone, email, license number, broker info
- π° Capture full price history, tax history, and Zestimate (including rent Zestimate)
- π Pull property amenities β pool, fireplace, parking, security, HOA, schools, nearby homes
- πΌοΈ Collect available high-resolution property photo URLs
- π Export Zillow data to JSON, CSV, Excel, XML, or RSS
- π Integrate with Make, Zapier, n8n, Google Sheets via Apify webhooks and integrations
βοΈ Four scraping modes
Mode 1 β SEARCH: paginated listing cards
Provide a search query ("Beverly Hills, CA", "90210", "sonoma-ca") or a full Zillow search URL. The scraper paginates up to maxPagesPerSearch, deduplicates listings across all supplied queries, applies optional filters and global sorting, then saves up to maxResults rows.
Mode 2 β SEARCH_DETAILS: search with full property enrichment
Runs the same global search and filtering pipeline, then fetches the complete DETAIL payload only for the final selected properties. maxDetailUrls can apply an additional cap to these full-property requests.
Mode 3 β DETAIL: full property data per listing
Provide individual Zillow listing URLs, raw ZPIDs, or an Apify input dataset. The scraper returns the complete native property payload extracted from the listing page.
Mode 4 β MONITOR: changes between repeated searches
The first clean run stores a persistent snapshot and returns no change rows. Later runs with the same monitorKey return only NEW, UPDATED, or REMOVED listings. Updated rows identify price, status, Zestimate, agent, broker, or photo-count changes.
π‘ Pro tip: chain
SEARCH β DETAILby selecting the output dataset of a SEARCH run in thedatasetId/ Input Dataset field of a DETAIL run.
π₯ Input
SEARCH mode
{"mode": "SEARCH","searchQueries": ["Beverly Hills, CA", "90210", "https://www.zillow.com/sonoma-ca/"],"propertyStatus": "FOR_SALE","maxPagesPerSearch": 2,"minPrice": 500000,"maxPrice": 2000000,"minBedrooms": 3,"propertyType": "HOUSE","onlyWithPhotos": true,"sortBy": "PRICE_ASC","maxResults": 50,"maxConcurrency": 5,"proxy": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
DETAIL mode
{"mode": "DETAIL","startUrls": [{ "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/" }],"zpids": ["15800416"],"datasetId": "optional-id-from-a-previous-SEARCH-run"}
| Field | Mode | Description |
|---|---|---|
mode | all | SEARCH, SEARCH_DETAILS, DETAIL, or MONITOR |
startUrls | DETAIL | Zillow /homedetails/ URLs |
zpids | DETAIL | Raw ZPIDs (e.g. "15800416") |
datasetId | DETAIL | Apify dataset from a previous SEARCH or third-party Zillow scraper run. In Apify Console, select it with the Input Dataset picker so the run receives read permission. |
searchQueries | SEARCH | Free-text queries, region slugs, or full Zillow URLs |
maxPagesPerSearch | SEARCH | Pagination cap per query (1β20, default 1) |
maxDetailUrls | DETAIL | Optional cap for URLs collected from startUrls, zpids, and datasetId; 0 means no separate DETAIL cap |
propertyStatus | all | Search routes: FOR_SALE / SOLD / FOR_RENT / ANY; informational expectation in DETAIL mode |
minPrice, maxPrice | all | Inclusive price range in USD |
minBedrooms, maxBedrooms | all | Inclusive bedroom range |
minBathrooms, maxBathrooms | all | Inclusive bathroom range; decimals such as 1.5 are supported |
propertyType | all | ANY, HOUSE, CONDO, TOWNHOUSE, MULTI_FAMILY, MANUFACTURED, LOT_LAND, or APARTMENT |
minLivingArea, maxLivingArea | all | Interior living area range in square feet |
minLotSize, maxLotSize | all | Lot size range in square feet; Zillow acre values are converted automatically |
minYearBuilt, maxYearBuilt | all | Inclusive construction-year range from 1700 to 2100 |
hoaStatus | all | ANY, WITH_HOA, or NO_HOA |
minHoaFee, maxHoaFee | all | Inclusive reported monthly HOA fee range |
minDaysOnZillow, maxDaysOnZillow | all | Inclusive Days on Zillow range |
onlyWithPhotos | all | Keep only properties with an image or photo collection |
onlyOpenHouses | all | Keep only listings currently advertising an open house |
onlyPriceReductions | all | Keep only listings with a detected price cut |
sortBy | all | Relevance, price, beds, baths, living area, lot size, year built, newest listing, or largest price reduction |
maxResults | all | Global paid-output limit after deduplication, filtering, and sorting (1β10,000, default 50) |
monitorKey | MONITOR | Stable identifier for one persistent snapshot; derived automatically when empty |
resetMonitor | MONITOR | Replace the previous snapshot and create a fresh baseline |
maxConcurrency | all | Parallel requests (default 5) |
maxRetries | all | General retry budget per URL (default 5) |
maxProxyRetries | all | Dedicated proxy/transport retry budget per URL (default 5) |
maxCaptchaRetries | all | Dedicated challenge-response retry budget per URL (default 5) |
proxy | all | Apify proxy config β US residential by default |
rawOutput | DETAIL | Include raw GraphQL cache under _raw |
How filtering works
All queries and pagesβGlobal deduplication by ZPID / listing URLβOptional detail enrichment for missing filter fieldsβFilters β global sorting β maxResultsβPaid Results dataset
- Filters are applied to both SEARCH cards and DETAIL records.
- If a required year-built, lot-size, or property-type value is absent from a SEARCH card, the Actor may fetch that property's DETAIL payload before deciding whether it matches.
- A listing without a value required by an active numeric filter is excluded rather than returned with an unknown match.
- Invalid ranges such as
minPrice > maxPricefinish safely with no paid results and an explanation in the Errors dataset.
π€ Output
DETAIL mode (one item per listing)
Mirrors Zillow's native property payload β over 150 fields including:
- Identity:
zpid,hdpUrl,mlsid,parcelId,countyFIPS - Address:
streetAddress,city,state,zipcode,latitude,longitude,county,neighborhoodRegion - Listing:
homeStatus(FOR_SALE / SOLD / FOR_RENT),price,lastSoldPrice,daysOnZillow,datePostedString - Property:
bedrooms,bathrooms,livingArea,lotSize,yearBuilt,homeType - Detailed facts (
resoFacts): appliances, cooling, heating, parking, HOA, view, flooring, roofing, foundation, schools - Agent / broker (
attributionInfo):agentName,agentPhoneNumber,agentEmail,agentLicenseNumber,brokerName,brokerPhoneNumber,mlsId,mlsName - Financial:
zestimate,rentZestimate,taxHistory[],priceHistory[],monthlyHoaFee,propertyTaxRate,mortgageZHLRates - Media:
responsivePhotos[](high-res),photoCount,virtualTourUrl,hiResImageLink,desktopWebHdpImageLink - Locale:
nearbyCities[],nearbyNeighborhoods[],nearbyZipcodes[],nearbyHomes[],comps[],schools[] - Scheduling:
tourEligibility,openHouseSchedule
SEARCH mode (one item per result row)
searchQuery,page,sourceUrlzpid,detailUrl,imgSrcprice,unformattedPrice,displayAddress,address,addressStreet,addressCity,addressState,addressZipcodebeds,baths,area,latLonghomeStatus,homeType,daysOnZillow,zestimate,rentZestimatebrokerName,listing_sub_type,hdpData.homeInfo.*
Values needed for filtering, including yearBuilt, homeType, and normalized lotSize, are promoted to convenient top-level fields when they can be recovered from the detail payload.
Rental-building cards retain Zillow's units[]. When price or bedroom filters are active, matchedUnits, matchedUnitCount, and matchedUnitMinPrice show exactly which unit options satisfied the selected ranges.
SEARCH + DETAILS mode
Returns the same rich property shape as DETAIL while preserving searchQuery, searchPage, and searchSourceUrl. Full details are requested only for the final filtered and limited rows; filter enrichment already fetched during the run is reused.
MONITOR mode
Change rows include changeType, detailed changeTypes, previous, current, monitorKey, ZPID, address, price, status, Zestimate, contacts, photo count, and detection time. If a source run is partial, removal detection and snapshot replacement are suppressed to prevent false removals.
Output destinations
| Output | Contents |
|---|---|
| Results | Paid Zillow listing rows in the default dataset |
| Errors | Validation, source, enrichment, proxy, parsing, and write issues in a separate non-result dataset |
| Run summary | Status, duration, saved count, issues, deduplication totals, filtered count, applied filters, sorting, enrichment count, and charge-limit state in the OUTPUT key-value record |
The Actor checks the maximum charge before saving each result. If the run charge limit is reached, it stops writing additional paid rows and records the reason in Errors and Run summary.
π‘οΈ Reliability and anti-block handling
Most public Zillow scrapers fail because Zillow fingerprints the TLS handshake and HTTP/2 SETTINGS frame before any header or cookie is checked. This scraper uses:
curl_cffiwith Chrome TLS impersonation β every request looks identical to a real Chrome browser at the byte level (cipher suites, ALPN, JA3/JA4, HTTP/2 priority frames).- US residential proxies by default β Zillow only serves data to US visitors and aggressively blocks datacenter ASNs.
- Fresh proxy session ID per retry β
uuidrotates the Apify exit IP after proxy failures or detected challenge pages. - Dedicated retry budgets: 5 retries for proxy errors + 5 retries for challenge responses by default, independent of the general retry counter.
- 15-second timeout, exponential backoff with jitter.
- No headless browser keeps runs lighter than browser-automation scrapers.
The Actor does not interact with or solve visual captchas. It detects blocked/challenge responses, discards that session, and retries through a fresh proxy session. If recovery is exhausted, the affected source is reported transparently in Errors.
πΌ Use cases
- π Real estate market research and competitive price analysis
- π― Lead generation β build targeted real estate agent contact lists
- π€ Train ML models on US housing data (Zestimate validation, price prediction)
- π Investor dashboards monitoring new listings in target neighborhoods
- π΅ Compare Zestimate vs actual sale price for valuation accuracy
- ποΈ Custom real estate search engines and aggregators
- π° News and journalism β track housing trends by ZIP code
- π Price-drop alerts for specific properties
π° Pricing
The Actor uses pay-per-result pricing. Only rows successfully saved to the default Results dataset are result events. Error diagnostics and the run summary are stored separately.
See the Actor's current Apify Store pricing panel for the active per-result rate and subscription discounts. Use maxResults and Apify's maximum cost per run setting to control the final charge.
β FAQ
Q: Do I need a Zillow API key? No. This scraper extracts only publicly visible Zillow data β exactly what any visitor to zillow.com can see.
Q: Is it legal to scrape Zillow? You are responsible for ensuring that your use complies with Zillow's terms, applicable laws, and privacy requirements. Treat contact information and other personal data appropriately for your jurisdiction and use case.
Q: Does the scraper paginate automatically?
Yes. In SEARCH mode it walks through pages up to maxPagesPerSearch (default 1, maximum 20). It then deduplicates, filters, sorts, and applies the global maxResults limit (default 50).
Q: Can I filter and sort across multiple locations?
Yes. Add multiple searchQueries. Sorting and maxResults are global across every collected query and page, not applied separately to each location.
Q: Can I scrape sold and for-rent properties?
Yes. Set propertyStatus to SOLD or FOR_RENT in any search-based mode, or provide a /homedetails/ URL in DETAIL mode. City/state, region-slug, and ZIP inputs are routed to the correct Zillow status pages.
Q: Can I integrate this with Zapier / Make / n8n / Google Sheets? Yes. Apify provides native integrations and webhooks for all major automation platforms. Trigger a Zillow scrape from a Google Sheet, send results to Slack, or pipe new listings directly into your CRM.
Q: What proxy should I use? US residential is configured by default and is the recommended choice for Zillow. Other proxy types or countries may have lower coverage or receive more challenge responses.
Q: How fast is it?
Speed depends on query size, proxy response time, retries, and whether active filters require DETAIL enrichment. Increase maxConcurrency carefully for larger runs; the default is 5.
Q: What happens if a listing is blocked? The scraper rotates the Apify proxy session and retries according to the configured budgets. Exhausted URLs are written to the separate Errors dataset and counted in Run summary; they are not mixed with paid listing rows.
Q: Can I export to CSV / Excel? Yes. Apify datasets export to JSON, CSV, Excel, XML, RSS, and HTML out of the box. You can also stream results via the Apify API in any language (Python, Node.js, Go, etc.).
π οΈ Run locally
git clone <repo>cd zillow_apifypip install -r requirements.txtapify run # uses storage/key_value_stores/default/INPUT.json# orpython -m src
Deploy to Apify with one command:
deploy.bat # Windows# orapify push --force
π·οΈ Tags
zillow scraper Β· zillow api Β· zillow data extraction Β· real estate scraper Β· property scraper Β· mls scraper Β· home listings Β· for sale Β· sold homes Β· for rent Β· zestimate Β· real estate api Β· housing data Β· zillow zip code search Β· zillow agents Β· real estate web scraping Β· python zillow scraper Β· apify zillow Β· zillow listing data Β· real estate lead generation Β· property data api Β· us housing market data Β· mls data Β· realtor scraper Β· homes for sale data
π Built for Apify Β· Pure HTTP, no browser Β· US residential proxies Β· SEARCH Β· SEARCH + DETAILS Β· DETAIL Β· MONITOR