Zillow Search Scraper with Property Detail & Agent Leads avatar

Zillow Search Scraper with Property Detail & Agent Leads

Pricing

$19.99/month + usage

Go to Apify Store
Zillow Search Scraper with Property Detail & Agent Leads

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

Scraply

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

1

Monthly active users

14 days ago

Last modified

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-weighted schoolQualityScore, 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 scrapedAt timestamp on every row

Input

Required Fields

  • searchUrls (array): List of Zillow search URLs (full URLs with searchQueryState are 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 fetchDetails is 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: true if the detail page returned real data, false if 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.