Zillow Scraper API - Listings, Zestimate, Agents & Cash Flow
Pricing
from $2.00 / 1,000 zillow listings
Zillow Scraper API - Listings, Zestimate, Agents & Cash Flow
Extract Zillow listings, full property details, agent contacts, photos and price history. Compare Zestimate ranges, model rental cash flow and test lower-rent or higher-rate scenarios. Search by location or collect known properties by URL, ZPID or dataset.
Pricing
from $2.00 / 1,000 zillow listings
Rating
5.0
(2)
Developer
Kelopr_bk
Maintained by CommunityActor stats
4
Bookmarked
188
Total users
27
Monthly active users
5 days ago
Last modified
Categories
Features
Share

Zillow Scraper
Listings, Zestimate, agent contacts, comparables and rental cash flow โ in one run
Turn any Zillow search or property page into clean, structured data: prices, photos, agent and broker contacts, valuations, price and tax history, schools, nearby homes and more. Switch on Deals and every property also gets rental cash flow, cap rate, comparable nearby homes and seller-motivation signals โ all computed from data already on the page, so they cost no extra requests.
- ๐ Four workflows โ fast search cards, full property records, investment analysis, or known-property lookups.
- ๐ธ Underwriting built in โ cap rate, cash-on-cash, break-even rent and a four-way stress test with assumptions you control.
- ๐งพ Export anywhere โ JSON, CSV or Excel, through the UI or the API, with flat spreadsheet-friendly aliases next to native Zillow fields.
- ๐งญ Honest by design โ a field appears only when Zillow actually publishes it; errors go to a separate dataset and are never billed as results.
โถ๏ธ Your first run
- Open the Input tab and pick a workflow (
Search,Search + details,DealsorDetail). - For a search, type a city, ZIP, neighborhood, region slug or full Zillow search URL. For
Detail, paste property URLs or ZPIDs. - Choose a listing status (
For sale,Recently sold,For rentorAny). - Set Maximum saved results โ start small, inspect the output, then scale up.
- Click Start, open Output, and export as JSON, CSV or Excel.
{"mode": "SEARCH_DETAILS","targets": ["Sonoma, CA"],"propertyStatus": "FOR_SALE","maxResults": 20}
Everything below is optional. The defaults return useful data on the first run.
๐ Pick your goal
Choose one workflow. Search modes take a location; Detail takes properties you already know.
| Mode | Best for | What you get |
|---|---|---|
โก SEARCH | Scanning a market fast and cheap | Listing cards: price, address, beds/baths, basic features, images, coordinates and source coverage |
โจ SEARCH_DETAILS | Complete records for a search | Every search card enriched with the full property page โ history, schools, agents, photos, nearby homes |
๐ DEALS | Finding and underwriting investments | Full properties plus cash flow, cap rate, comparable nearby homes, valuation gaps, seller signals and a stress test |
๐ DETAIL | Properties you already have | Full records from Zillow URLs, ZPIDs, or a dataset from an earlier run |
Search covers for-sale, sold and rental results. Rental search can return building-summary cards; full-detail modes skip those containers and collect individual listings instead of silently expanding an apartment building into every unit.
{"mode": "DETAIL","targets": ["15800416"],"analyzeDeals": true,"maxResults": 1}
โจ What makes the output easy to use
- ๐งฑ Native + flat aliases. Zillow's original structure is preserved, and spreadsheet-friendly keys such as
listingPrice,listingAddress,agent,broker,mls,listingPhotos,listingPriceHistoryandlistingTaxHistorysit next to it. - ๐ข Zeros and false are kept. A real
0favorite count orfalsegarage flag is preserved, not dropped. - ๐ซ No invented data. A field is returned only when Zillow publishes a value; otherwise it is absent and the reason is noted.
- ๐๏ธ Grouped views. Listings, property details, agents, photos, price history, tax history, schools, deals, stress tests and errors each get their own table view.
- ๐งฎ Transparent math. Every derived number travels with its assumptions, so a cap rate or stress scenario can be audited, not just trusted.
- ๐งฏ Separated errors. Source failures and diagnostics land in a dedicated
errorsdataset and never consume a result charge.
๐ Listing & valuation fields
Each property carries identity, pricing, valuation, interest and media fields when Zillow publishes them.
๐ชช Identity & location
zpid ยท propertyUrl ยท displayAddress ยท city ยท state ยท zipcode ยท coordinates (latitude/longitude) ยท homeStatus ยท homeType
๐ฐ Price & property
unformattedPrice ยท price ยท currency ยท bedrooms ยท bathrooms ยท livingArea ยท lotArea ยท yearBuilt ยท parking ยท published amenities and resoFacts
๐ Valuation
zestimate ยท rentZestimate ยท zestimateRangeLow / zestimateRangeHigh ยท rentEstimateRangeLow / rentEstimateRangeHigh ยท source range percentages
๐ Interest
pageViewCount ยท favoriteCount ยท calculated saveToViewRatioPct
๐ผ๏ธ Media & history
listingPhotos ยท mainImage ยท tours and floor plans ยท listingPriceHistory ยท listingTaxHistory ยท lastSoldPrice ยท open-house info ยท nearbySchools
{"zpid": "15800416","displayAddress": "17199 Park Ave, Sonoma, CA 95476","unformattedPrice": 1250000,"bedrooms": 3,"bathrooms": 2,"livingArea": 1894,"zestimate": 1310000,"rentZestimate": 4600,"saveToViewRatioPct": 3.1}
Illustrative shape โ real values come from Zillow at run time.
๐ค Agent & contact fields
When a listing publishes them, you receive normalized contact objects:
agentโname,phoneNumber,email,licenseNumber,coAgentNamebrokerโname,phoneNumbermlsโid,name,lastChecked,lastUpdated
Only contacts actually published for a listing are returned. Zillow's promoted contact forms are not treated as verified listing-agent details, so a phone or email can legitimately be missing on some records. Use the flat agent / broker / mls aliases for a clean CSV export.
๐ธ Cash flow & stress test
Enable Deals (or analyzeDeals) and every purchasable listing with an asking price and a Rent Zestimate receives four scenarios โ no separate analysis service required.
| Scenario | Rent | Mortgage rate |
|---|---|---|
| Base | Zillow Rent Zestimate | Your input, the Zillow rate, or the documented fallback |
| Lower rent | 10% below estimate | Base rate |
| Higher rate | Base estimate | Base rate + 2 pts |
| Combined stress | 10% below estimate | Base rate + 2 pts |
Key fields: analysis.capRatePct, analysis.monthlyCashFlowUsd, analysis.cashOnCashPct, analysis.grossYieldPct, analysis.breakEvenRentUsd, analysis.scenarios, stressMonthlyCashFlowUsd, stressCashFlowPositive, debtServiceCoverageRatio, rentBufferPct.
{"mode": "DEALS","targets": ["Sonoma, CA"],"maxResults": 10,"dealSettings": {"downPaymentPct": 25,"interestRatePct": "7","vacancyPct": 5,"maintenancePct": 5}}
The model also uses the loan term, insurance rate and closing-cost assumptions. Tax uses a published annual amount when available, otherwise price ร the source tax rate; it does not predict reassessment after purchase. Missing taxes or HOA are flagged in notes and modelInputsComplete.
Rental listing prices are monthly rent, so they are never used as acquisition prices. sellerEquityUsd stays null because outstanding debt is unknown. Zestimate and Rent Zestimate are estimates, not guaranteed sale prices or achievable rents, and seller and demand scores are rules-based research signals, not predictions of intent.
๐๏ธ Comparable nearby homes
When Zillow's property page carries nearby homes, Deals adds an analysis.comparables block built from that same payload โ no extra request.
| Field | Meaning |
|---|---|
count, statusCounts | How many comparables, split by sold / for-sale / other |
medianPriceUsd, medianPricePerSqft | The block's median price and $/sqft |
subjectPricePerSqft | This property's own $/sqft |
subjectVsComparablesPct | How far above (+) or below (โ) the block this property is priced per sqft |
comparables[] | Each nearby home: address, status, price, beds, baths, living area, $/sqft |
The flat alias comparablePriceDeltaPct mirrors subjectVsComparablesPct for spreadsheets. Comparables are Zillow nearby homes for quick context, not a formal appraisal.
๐ Market report
With analysis enabled, the run writes a self-contained HTML market report to the key-value store (market-report). Beyond the medians it shows:
- ๐ต Price and
$/sqftspread โ P25โP75 quartiles, not just a midpoint. - ๐ Median price-vs-Zestimate across the run.
- ๐ท๏ธ The property-type mix of what you collected.
- โณ A days-on-market breakdown (fresh / recent / aging / stale).
- ๐ฅ A ranked table of the best yields or the most motivated sellers in the run.
It summarizes up to 2,000 saved properties and is an orientation tool, not an exhaustive market valuation.
๐ฅ Simple input
The form has four visible controls:
| Field | What to enter |
|---|---|
mode | SEARCH, SEARCH_DETAILS, DEALS or DETAIL |
targets | One target per line: locations/search URLs for search modes, property URLs/ZPIDs for Detail |
propertyStatus | For sale, for rent or recently sold for location searches; leave Any to use the status already in a pasted URL |
maxResults | Maximum successful unique results for the whole run, across all targets; default 50 |
The simpler form keeps the existing output. Full property, contact, history, media, school, comparable and analysis fields remain available in their corresponding workflows. Search stays the quick listing-card workflow; choose Search + details for the complete property record, or Deals for the same data plus the analysis layer.
Locations and links
Search targets can be cities (Sonoma, CA), ZIPs (90210), neighborhoods, region slugs, or Zillow search URLs. A pasted search URL preserves the filters and map area already set on Zillow. The listing-status selector applies to plain locations; direct property lookups retain the actual source status.
Internal price, beds/baths, HOA, age, photo, yield and seller-signal result filters, plus custom result sorting, have been removed. Old requests with active filters receive a clear input diagnostic before collection starts. Neutral legacy defaults are accepted. To narrow a search, configure it on Zillow and paste its search URL.
Result limit, pagination and immediate output
maxResults applies globally after duplicate removal. A failed, duplicate or unsupported container card does not consume a saved-result slot. Results stream as each requested record finishes; the Actor processes a page before requesting more instead of waiting for all searches to finish. Collection stops at the saved-result or run-charge limit, source exhaustion, or an explained source limit.
The Actor follows up to 20 visible result pages per location automatically when needed. Zillow can expose fewer listings than its reported total, and a broad location can hit its visible-page cap. OUTPUT distinguishes a result limit, page limit and source cap. For broader coverage, add smaller ZIP or neighborhood searches. A limit of 10,000 does not imply that one location exposes 10,000 listings.
Existing API integrations and model settings
Legacy searchQueries, startUrls, zpids and datasetId remain supported through the API. Use either targets or the legacy target fields, rather than supplying both. datasetId remains an optional hidden Detail input with read permissions, so existing dataset-to-detail workflows still work. Explicit legacy maxPagesPerSearch caps are honored.
Deal calculations keep their existing assumptions. API callers may set analyzeDeals: true for Search + details or Detail, and may pass dealSettings containing assumptions such as downPaymentPct, interestRatePct, loanTermYears, vacancyPct, maintenancePct, insuranceRatePct and closingCostPct. These settings change calculations, not source collection or result filtering. Every calculated scenario retains its assumptions in the output.
๐ฆ Outputs & table views
The run writes several datasets and one report:
| Destination | Contents |
|---|---|
| Results (default dataset) | Compact overview and valuation view of every saved property |
| Property details & contacts | Facts, agents, photos, price/tax history and schools |
| Deal analysis | Cap rate, cash flow, cash-on-cash, comparables delta and seller signals |
| Stress test | Base vs stressed cash flow, DSCR and rent cushion |
| Errors | Unavailable sources and diagnostics, separate from paid results |
| Market report (key-value store) | The HTML summary described above |
| OUTPUT / Run summary | Saved counts, effective options, source coverage and stop reasons |
Grouped views are included copies of the same records; they do not add result charges.
๐ค Deal analysis example
{"displayAddress": "17199 Park Ave, Sonoma, CA 95476","unformattedPrice": 1250000,"analysis": {"capRatePct": 4.1,"monthlyCashFlowUsd": -320,"cashOnCashPct": -1.2,"pricePerSqft": 660,"priceVsZestimatePct": -4.6,"motivatedSellerScore": 38,"comparables": {"count": 6,"medianPricePerSqft": 705,"subjectVsComparablesPct": -6.4},"scenarios": [{ "scenario": "base", "monthlyCashFlowUsd": -320 },{ "scenario": "combined_stress", "monthlyCashFlowUsd": -980 }]},"comparablePriceDeltaPct": -6.4}
Illustrative โ values depend on the live listing and your assumptions.
๐ API examples
Run the Actor with your token and retrieve the dataset. Replace YOUR_TOKEN.
cURL โ start a run
curl -X POST "https://api.apify.com/v2/acts/trakk~zillow-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"SEARCH","targets":["Austin, TX"],"maxResults":25}'
cURL โ run synchronously and get the dataset
curl -X POST "https://api.apify.com/v2/acts/trakk~zillow-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"DEALS","targets":["Austin, TX"],"maxResults":10}'
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("trakk/zillow-scraper").call(run_input={"mode": "SEARCH_DETAILS","targets": ["Austin, TX"],"maxResults": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["displayAddress"], item.get("unformattedPrice"))
The same JSON input works from the Apify Console, the API, the JavaScript/Python clients and any MCP-compatible client.
โ๏ธ Following a run
- ๐ Run summary (
OUTPUT) reports saved counts, effective limits, source coverage and why collection stopped. - ๐งพ Errors dataset separates source failures from real results.
- ๐งฎ Charge protection: set a maximum run charge in the Console; the Actor checks it before more work and stops when another result cannot be charged.
- ๐บ๏ธ Coverage fields distinguish a full page sweep, your page limit, a source error and Zillow's own paging limit โ an empty run is explained, never guessed.
๐ฒ Pricing
The result-event rate is $0.002 per saved listing ($2 per 1,000), including Search, Search + details, Deals and Detail. Stress scenarios, comparables and source-backed compatibility fields are included at no extra charge.
Only useful successful records saved to Results receive a result charge. Source failures, invalid inputs and diagnostic records are not sold as property results. Removed filters do not trigger an excluded-property analysis charge. Set the maximum run charge in Apify to bound result spending; the live Pricing tab is authoritative.
โ FAQ
Which mode should I start with?
Use Search to scan a market cheaply, Search + details for complete records, Deals for investment analysis, and Detail when you already have URLs or ZPIDs.
Do I need the Deals mode for cash flow?
Yes for the automatic always-on analysis. You can also set analyzeDeals: true in Search + details or Detail. The fast Search mode has no detail page to analyze.
Are agent phone numbers and emails always included?
No. Only contacts a listing actually publishes are returned. Zillow's promoted contact forms are not treated as verified agent details.
What are comparables based on?
The nearby homes Zillow already returns on the property page. They give quick $/sqft context versus the block; they are not a formal appraisal.
Can a successful run return no results?
Yes. Invalid input, unavailable properties and empty source searches each have a separate explanation in the run summary. No placeholder listing is ever created.
How is rent handled for rental listings?
A rental price is monthly rent, so it is never used as a purchase price. Income metrics are unavailable for those records.
Why is a field missing on some properties?
Because Zillow did not publish that value for that listing. The Actor never fills a gap with an invented number.
Can I reuse a previous run as input?
Yes. Through the API, use mode: "DETAIL" and datasetId for the earlier dataset; records must contain a zpid, detailUrl, hdpUrl or url. The compact form accepts property URLs and ZPIDs in Targets.
Will removed filters still charge for excluded properties?
No. Active legacy result filters are rejected before source collection. This release does not charge excluded-property-analysis. A search narrowed on Zillow returns its matching source listings directly.
Which locations are supported?
Any city, state, county, ZIP or neighborhood Zillow can resolve, plus full Zillow search URLs and region slugs. Results reflect Zillowโs available US property coverage.
What export formats are available?
JSON, CSV and Excel from the Output tab, or any format via the API.
Is this affiliated with Zillow?
No. This is an independent scraper for publicly available data. Zestimate and Rent Zestimate are Zillow estimates, not guaranteed values.