Zillow Search Scraper with Property Detail & Agent Leads
Pricing
$19.99/month + usage
Zillow Search Scraper with Property Detail & Agent Leads
๐ Zillow Search Scraper with Property Detail & Agent Leads extracts data from Zillow search results โ listings, prices, beds/baths, addresses, for sale/rent, photos & URLs. ๐ Supports cities, ZIPs, filters & pagination. ๐ Export CSV/JSON for comps, market analysis, lead gen & research.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraply
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
A Zillow property listings scraper for Apify that extracts search-result data (price, beds, baths, address, status, Zestimate, days on market, and more) and can optionally enrich each listing with its own property detail page โ agent/broker contact leads, price history, tax history, and school ratings โ plus locally computed investment-analytics fields (price per sqft, rent-to-price ratio, Zestimate vs. list price, school quality score).
Use it as a Zillow real estate data scraper for market research, a Zillow API alternative for property listings, or a real estate lead generation tool that surfaces the listing agent's name, license number, and brokerage for every enriched home.
Key Features
- โ Real estate search scraping via Zillow's own search API, with an automatic dynamic-zoom split for large result sets (breaks past Zillow's ~800-result cap per query)
- โ HTML-pagination fallback method for reliability
- โ Automatic connection fallback if the default connection is interrupted
- โ Live data saving to the Apify dataset (results appear as they're collected)
- โ Bulk URL/keyword input, configurable delay, limits, and sort order
- โ Property Detail Enrichment โ optional per-listing fetch of the full detail page, returning agent name, license number, brokerage name, price history, tax history, school ratings/distance, description, and year built
- โ
Investment-Analytics Fields โ
pricePerSqft,rentToPriceRatioPct,zestimateVsListPricePct, and a distance-weightedschoolQualityScore, all computed locally from the enriched data - โ
Category-A search-result fields most Zillow scrapers miss:
daysOnZillow,rentZestimate,taxAssessedValue,lotAreaValue,homeType, open-house and price-reduction flags - โ
Absolute
scrapedAttimestamp on every row
Input
Required Fields
- searchUrls (array): List of Zillow search URLs (full URLs with
searchQueryStateare recommended) or location keywords.
Optional Fields
- extractionMethod (string):
"PAGINATION_WITH_DYNAMIC_ZOOM_INCREASE"(default, API-based, auto-splits large areas),"PAGINATION_WITHOUT_ZOOMING_IN"(HTML-based fallback), or"MAP_MARKERS"(capped at ~500 results per URL). - maxItems (integer): Maximum number of listings to scrape (1-10000, default: 10).
- delay (integer): Delay between requests in seconds (0-10, default: 2).
- sortOrder (string): Optional Zillow sort value, e.g.
globalrelevanceex,price_asc,price_desc,days,zest_desc. Leave blank to keep each URL's own sort order. - fetchDetails (boolean): Enable per-listing property detail page enrichment (default:
false). - maxDetailFetches (integer): Maximum number of listings to enrich when
fetchDetailsis on (0-500, default: 20). - proxyConfiguration (object): Proxy settings (default: no proxy, with automatic fallback).
Input Example
{"searchUrls": ["https://www.zillow.com/dallas-tx/?category=SEMANTIC&searchQueryState=..."],"extractionMethod": "PAGINATION_WITH_DYNAMIC_ZOOM_INCREASE","maxItems": 100,"delay": 2,"fetchDetails": true,"maxDetailFetches": 20,"proxyConfiguration": {"useApifyProxy": false}}
Output
Every run produces two row shapes in the same dataset, distinguished by type.
type: "listing" โ one row per search result
{"type": "listing","zpid": "55826232","id": "55826232","price": "$1,000,000","unformattedPrice": 1000000,"address": "3810 Hawthorne Ave, Dallas, TX 75219","addressCity": "Dallas","addressState": "TX","beds": 3,"baths": 3.0,"area": 2622,"detailUrl": "https://www.zillow.com/homedetails/...","statusType": "FOR_SALE","zestimate": 994000,"daysOnZillow": 14,"rentZestimate": 4200,"taxAssessedValue": 812000,"homeType": "SINGLE_FAMILY","hasOpenHouse": false,"scrapedAt": "2026-08-15T10:22:31.000Z","...": "..."}
type: "detail" โ one row per enriched listing (only when fetchDetails is on)
{"type": "detail","zpid": "55826232","agentName": "Jane Doe","agentLicense": "0123456","brokerName": "Example Realtors","priceHistory": [{"date": "2026-08-07", "event": "Listed for sale", "price": 1000000}],"taxHistory": [{"year": 2025, "taxPaid": 18420}],"schools": [{"name": "Example Elementary", "rating": 8, "distance": 0.4}],"description": "...","yearBuilt": 1996,"pricePerSqft": 381.39,"rentToPriceRatioPct": 5.04,"zestimateVsListPricePct": -0.6,"schoolQualityScore": 7.6,"isDetailValid": true,"scrapedAt": "2026-08-15T10:22:41.000Z"}
Output Fields (listing rows)
- zpid / id: Zillow Property ID
- price / unformattedPrice: Formatted and numeric list price
- pricePerSqft: List price divided by area, computed when both are available
- address / addressStreet / addressCity / addressState / addressZipcode: Address components
- beds / baths / area: Bedrooms, bathrooms, square footage
- detailUrl: Link to the property detail page
- statusType / statusText: Property status (
FOR_SALE, etc.) - zestimate / zestimateVsListPricePct: Zillow's estimated value and its percentage difference from the list price
- daysOnZillow / timeOnZillow: Time on market
- rentZestimate / rentToPriceRatioPct: Estimated monthly rent and its annualized ratio to the list price
- taxAssessedValue / lotAreaValue / lotAreaUnit / homeType: Property attributes
- hasOpenHouse / openHouseDescription / openHouseStartDate / openHouseEndDate: Open-house details
- priceChange / priceReduction / datePriceChanged / comingSoonOnMarketDate: Price/market-timing signals
- scrapedAt: ISO timestamp of extraction
- And more fields in the raw JSON โ every field above is also visible directly in the Output table.
Output Fields (detail rows, only with fetchDetails on)
- agentName / agentLicense / brokerName / agentPhone / agentEmail: Listing agent and brokerage contact
- priceHistory: Array of historical listing/sale events
- taxHistory: Array of yearly tax assessment records
- schools: Array of assigned schools with name, rating, distance, and grade range
- description: Full listing description text
- yearBuilt: Year the property was built
- schoolQualityScore: Distance-weighted average of assigned school ratings (closer schools weighted more heavily)
- isDetailValid:
trueif the detail page returned real data,falseif it could not be fetched (never a faked row)
How Property Detail Enrichment Works
When fetchDetails is enabled, the actor fetches the property detail page for up to maxDetailFetches listings, in addition to the search-result data it already collects. Each enriched listing produces one extra type:"detail" row. This uses additional requests per listing, so it is off by default โ enable it when you need agent leads, price/tax history, or school data on top of the base listing set.
Best Use Cases
- Real estate market research and price/status monitoring
- Property investment analysis (price per sqft, rent-to-price ratio, Zestimate spread)
- Real estate lead generation โ listing agent and brokerage contact data
- School-quality-aware home search
- Competitive and comparable-sale analysis
Frequently Asked Questions
Q: Which extraction method should I use?
A: PAGINATION_WITH_DYNAMIC_ZOOM_INCREASE is the default and handles large result sets by auto-splitting the search area. Use PAGINATION_WITHOUT_ZOOMING_IN as a fallback.
Q: How does the connection fallback work? A: The actor starts with a direct connection. If it runs into trouble, it automatically escalates to a residential connection with retries. Once escalated, it stays on that connection for the rest of the run.
Q: Can I scrape multiple locations at once?
A: Yes โ add multiple entries to the searchUrls array to process them in bulk.
Q: What happens if the actor stops mid-scrape? A: All data collected so far is saved live to the dataset, so partial runs are not lost.
Q: Does Property Detail Enrichment cost more?
A: It uses one extra fetch per enriched listing (capped by maxDetailFetches), so runs with it enabled take proportionally longer and use more requests than listing-only runs.
Cautions
- Data is collected only from publicly available sources.
- No data is taken from private accounts or password-protected content.
- The end user is responsible for ensuring legal compliance (spam laws, privacy, data protection, etc.).
- Please respect Zillow's terms of service and rate limits.