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
175
Total users
23
Monthly active users
4 days ago
Last modified
Categories
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","searchQueries": ["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","zpids": ["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, excluded 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","searchQueries": ["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.
๐ Filters & sorting
Narrow the search before you pay for detail:
- ๐ก Property:
propertyType,minPrice/maxPrice,minBedrooms/maxBedrooms,minBathrooms/maxBathrooms. - ๐ Advanced: living area, lot size, build year, HOA status and fees, days on Zillow, photos, open houses, price reductions.
- ๐ Deal filters:
onlyDistressed,onlyNonOwnerOccupied,onlyPriceReducedDeals,onlyComingSoon,maxPriceVsZestimatePct,minCapRatePct,minMonthlyCashFlowUsd,minMotivatedSellerScore. - โ๏ธ Sort: relevance, price, bedrooms, bathrooms, living area, lot size, year built, newest listings or largest price reduction.
maxResults counts successfully saved matching rows; duplicates never consume a slot. Relevance streams rows as they complete. A custom sort ranks the loaded candidate set first, so a sorted partial search is not a ranking of the whole market.
๐ฅ Input reference
| Field | Type | Default | Notes |
|---|---|---|---|
mode | string | SEARCH | SEARCH, SEARCH_DETAILS, DEALS, DETAIL |
propertyStatus | string | FOR_SALE | ANY, FOR_SALE, SOLD, FOR_RENT |
searchQueries | array | ["Sonoma, CA"] | Cities, ZIPs, slugs or Zillow search URLs (one search per row) |
startUrls | array | โ | Detail mode: Zillow property page URLs |
zpids | array | [] | Detail mode: 5โ10 digit Zillow IDs |
datasetId | string | โ | Detail mode: dataset from an earlier run |
maxPagesPerSearch | integer | 1 | Result pages per location (1โ20) |
maxResults | integer | 50 | Max paid rows saved (1โ10000) |
propertyType | string | ANY | House, condo, townhouse, multi-family, manufactured, lot/land, apartment |
minPrice / maxPrice | number | โ | Price band in USD |
minBedrooms / maxBedrooms | number | โ | Bedroom band |
minBathrooms / maxBathrooms | number | โ | Bathroom band (decimals allowed) |
advancedFilters | object | โ | Living area, lot, year, HOA, days-on-Zillow, photos, open houses, price cuts |
analyzeDeals | boolean | false | Add the analysis block (always on in DEALS) |
dealSettings | object | see below | Underwriting assumptions and deal filters |
sortBy | string | RELEVANCE | Sorting of saved results |
rawOutput | boolean | false | Include the raw source payload under _raw |
dealSettings: downPaymentPct (25), interestRatePct (source/fallback), loanTermYears (30), vacancyPct (5), maintenancePct (5), insuranceRatePct (~0.35%), closingCostPct (3), plus the deal filters listed above.
Flat API keys (for example downPaymentPct, minCapRatePct) remain accepted for saved tasks and existing integrations.
๐ฆ 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 |
| Excluded after analysis | Fully analyzed properties dropped by your filters (with billedEvent) |
| 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","searchQueries":["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","searchQueries":["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","searchQueries": ["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.003 per saved listing ($3 per 1,000). Stress scenarios, comparables and source-backed compatibility fields are included at no extra charge.
A previously scheduled change takes effect on September 18, 2026, 00:00 UTC: a property fetched in full, analyzed and then excluded by your filters is billed once at $0.003 through excluded-property-analysis and delivered in the separate excluded dataset (tagged with billedEvent). Properties excluded before full-detail work, source errors and diagnostics are not charged as this event. The active price in the Apify Console is always 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 or strict filters 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. In Detail mode, select the earlier dataset; records must contain a zpid, detailUrl, hdpUrl or url.
Will filtered-out properties cost me anything?
Only under the excluded-property-analysis event described in Pricing, and only for properties fully analyzed before exclusion. Everything excluded earlier, plus errors, is free.
Which locations are supported?
Any city, state, county, ZIP or neighborhood Zillow can resolve, plus full Zillow search URLs and region slugs. US residential access is preconfigured because Zillow data is region-sensitive.
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.