Zillow Scraper: Listings, Agents, Zestimate & Filters avatar

Zillow Scraper: Listings, Agents, Zestimate & Filters

Pricing

from $0.99 / 1,000 zillow listings

Go to Apify Store
Zillow Scraper: Listings, Agents, Zestimate & Filters

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

Blynx

Maintained by Community

Actor stats

1

Bookmarked

99

Total users

17

Monthly active users

0.83 hours

Issues response

2 days ago

Last modified

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 β†’ DETAIL by selecting the output dataset of a SEARCH run in the datasetId / 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"
}
FieldModeDescription
modeallSEARCH, SEARCH_DETAILS, DETAIL, or MONITOR
startUrlsDETAILZillow /homedetails/ URLs
zpidsDETAILRaw ZPIDs (e.g. "15800416")
datasetIdDETAILApify 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.
searchQueriesSEARCHFree-text queries, region slugs, or full Zillow URLs
maxPagesPerSearchSEARCHPagination cap per query (1–20, default 1)
maxDetailUrlsDETAILOptional cap for URLs collected from startUrls, zpids, and datasetId; 0 means no separate DETAIL cap
propertyStatusallSearch routes: FOR_SALE / SOLD / FOR_RENT / ANY; informational expectation in DETAIL mode
minPrice, maxPriceallInclusive price range in USD
minBedrooms, maxBedroomsallInclusive bedroom range
minBathrooms, maxBathroomsallInclusive bathroom range; decimals such as 1.5 are supported
propertyTypeallANY, HOUSE, CONDO, TOWNHOUSE, MULTI_FAMILY, MANUFACTURED, LOT_LAND, or APARTMENT
minLivingArea, maxLivingAreaallInterior living area range in square feet
minLotSize, maxLotSizeallLot size range in square feet; Zillow acre values are converted automatically
minYearBuilt, maxYearBuiltallInclusive construction-year range from 1700 to 2100
hoaStatusallANY, WITH_HOA, or NO_HOA
minHoaFee, maxHoaFeeallInclusive reported monthly HOA fee range
minDaysOnZillow, maxDaysOnZillowallInclusive Days on Zillow range
onlyWithPhotosallKeep only properties with an image or photo collection
onlyOpenHousesallKeep only listings currently advertising an open house
onlyPriceReductionsallKeep only listings with a detected price cut
sortByallRelevance, price, beds, baths, living area, lot size, year built, newest listing, or largest price reduction
maxResultsallGlobal paid-output limit after deduplication, filtering, and sorting (1–10,000, default 50)
monitorKeyMONITORStable identifier for one persistent snapshot; derived automatically when empty
resetMonitorMONITORReplace the previous snapshot and create a fresh baseline
maxConcurrencyallParallel requests (default 5)
maxRetriesallGeneral retry budget per URL (default 5)
maxProxyRetriesallDedicated proxy/transport retry budget per URL (default 5)
maxCaptchaRetriesallDedicated challenge-response retry budget per URL (default 5)
proxyallApify proxy config β€” US residential by default
rawOutputDETAILInclude 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 > maxPrice finish 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, sourceUrl
  • zpid, detailUrl, imgSrc
  • price, unformattedPrice, displayAddress, address, addressStreet, addressCity, addressState, addressZipcode
  • beds, baths, area, latLong
  • homeStatus, homeType, daysOnZillow, zestimate, rentZestimate
  • brokerName, 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

OutputContents
ResultsPaid Zillow listing rows in the default dataset
ErrorsValidation, source, enrichment, proxy, parsing, and write issues in a separate non-result dataset
Run summaryStatus, 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_cffi with 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 β€” uuid rotates 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_apify
pip install -r requirements.txt
apify run # uses storage/key_value_stores/default/INPUT.json
# or
python -m src

Deploy to Apify with one command:

deploy.bat # Windows
# or
apify 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