Zillow Listings Scraper — Homes for Sale, Rent & Sold
Pricing
Pay per usage
Zillow Listings Scraper — Homes for Sale, Rent & Sold
Scrape Zillow listings by location or search URL: price, beds, baths, sqft, lot size, home type, status, days on market, tax value, broker, coordinates and photos — with optional full details (year built, description, price/tax history, schools, Zestimate).
Pricing
Pay per usage
Rating
0.0
(0)
Developer
yossef Nagy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Zillow Listings Scraper
Scrape Zillow property listings in bulk — for sale, for rent, or recently sold — by location or search URL. No login, no API key.
What it does
Give it a Zillow search URL (or a location) and it paginates the whole search, returning structured data for every listing:
- Price (numeric + formatted), currency, listing status (for sale / for rent / sold)
- Home type, beds, baths, living area (sqft), lot size + unit
- Full address — street, city, state, ZIP — plus latitude / longitude
- Days on Zillow, tax-assessed value, broker name
- Photos (full-resolution URLs), main image, 3D-model / video flags
- Detail page URL and zpid
With Include full property details enabled, it also opens each listing's detail page and adds: year built, full description, price history, tax history, schools (name, rating, level, distance), Zestimate & rent Zestimate, monthly HOA fee, property tax rate, MLS ID, parcel ID and county.
How it works
Zillow is protected by PerimeterX bot defense, so the actor drives a real browser (Playwright) to pass the challenge, then reads Zillow's own server-rendered __NEXT_DATA__ JSON — no fragile DOM scraping. Images, media, fonts and stylesheets are blocked so each page is lean and cheap. It uses a residential proxy (required — datacenter IPs are blocked) with a sticky session per search, and automatically rotates the session if a block is detected.
Use cases
- Market research — pull every active listing in a city/ZIP to analyze price per sqft, inventory and trends.
- Real-estate investing — find properties by area, filter to recently sold for comps, pull tax-assessed value and price history.
- Lead generation — collect listing agent / broker names across a market.
- Rental analysis — scrape for-rent listings with rent Zestimates.
- Proptech / data pipelines — feed structured listing data (coordinates, facts, photos) into your own app or model.
- Comps & valuation — combine sold listings + tax history + Zestimate for valuation models.
Input
| Field | Type | Description |
|---|---|---|
searchUrls | array | Full Zillow search-results URLs (most reliable — pick your filters on Zillow, paste the URL). |
location | string | Alternative: a city + state or ZIP (e.g. Austin, TX). Used only if no searchUrls. |
listingStatus | string | for_sale, for_rent or sold — used with location. |
maxItems | integer | Max listings across all searches. 0 = no limit (Zillow caps a search at ~800 results). |
includePropertyDetails | boolean | Open each detail page for year built, description, price/tax history, schools, Zestimate. |
proxyConfiguration | object | Proxy. Defaults to Apify RESIDENTIAL (required to pass PerimeterX). |
maxConcurrency | integer | Search URLs processed in parallel. Default 1. |
Filters (price, beds, baths, home type, sort, etc.) are taken straight from the Zillow search URL you provide, so results match exactly what you see on the site.
Output
One dataset item per listing:
{"_kind": "listing","zpid": "145656008","detail_url": "https://www.zillow.com/homedetails/4619-Inicio-Ln-Austin-TX-78725/145656008_zpid/","status": "FOR_SALE","status_text": "Active","home_type": "SINGLE_FAMILY","price": 250000,"price_formatted": "$250,000","currency": "USD","beds": 3,"baths": 3,"area_sqft": 1321,"lot_area_value": 6194.232,"lot_area_unit": "sqft","address": "4619 Inicio Ln, Austin, TX 78725","street": "4619 Inicio Ln","city": "Austin","state": "TX","zipcode": "78725","latitude": 30.239851,"longitude": -97.57366,"days_on_zillow": 14,"tax_assessed_value": 266535,"broker_name": "LPT Realty, LLC","image_url": "https://photos.zillowstatic.com/fp/...-p_e.jpg","photos": ["https://photos.zillowstatic.com/fp/...-p_e.jpg"],"year_built": 2015,"description": "Charming 3-Bedroom Home in East Austin...","price_history": [{ "date": "...", "price": 250000, "event": "Listed for sale" }],"tax_history": [{ "year": 2024, "tax_paid": 5200, "assessed_value": 266535 }],"schools": [{ "name": "...", "rating": 7, "level": "Elementary", "distance": 0.4 }],"scrapedAt": "2026-05-14T22:00:00.000Z"}
Detail-only fields (year_built, description, price_history, tax_history, schools, zestimate, monthly_hoa_fee, mls_id, parcel_id, county, listing_agent) are populated only when Include full property details is enabled; otherwise they are null.
Pricing
Pay per result:
- $0.005 per listing scraped
- $0.006 per property when Include full property details is enabled (extra detail-page load)
You only pay for listings actually returned.
Notes
- A residential proxy is required — Zillow's PerimeterX protection blocks datacenter IPs. It's the default; keep it on.
- Zillow limits any single search to ~800 results. To get more, split your area into smaller searches (by ZIP, neighborhood or price band) and pass multiple
searchUrls.