How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
Austin, TXin Cities or ZIP codes. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
This Zillow scraper gets home listings from Zillow for a US city, ZIP code, map area or search URL. It returns one row per home with price, Zestimate, rent estimate, beds, baths, size and status. It can also read full property details and tell you what changed since the last run.
- a city with a state, or a ZIP code (
Austin, TX,78701); - a Zillow search URL that you copy from your browser, with its map area and filters;
- a point on the map and a radius in miles;
- exact homes: property URLs, Zillow property IDs (zpid) or street addresses;
- an apartment building page, to get the units that are available now.
Good for
- Export homes for sale, for rent or recently sold in a city or ZIP code to CSV or Excel.
- Watch a market every day and get only new listings, price cuts and status changes.
- Check a list of exact properties: Zestimate, rent estimate, price and tax history, schools.
- Compare price per square foot and rough rental yield before a deeper look.
- Turn on investor metrics to get a rough monthly payment, cash flow, cap rate, cash-on-cash return and maximum allowable offer for each home.
- Re-check the homes from an earlier run by its Dataset ID and see what changed in price, Zestimate and status.
Who uses it
Home buyers and agents
Export homes for sale in a city to a spreadsheet.
Real estate investors
Compare price per square foot and rough rental yield.
Market watchers
Get only new listings and price cuts each day.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Search page checked | $0.004 (from $0.0028 on paid Apify plans) | One requested Zillow search, building, or address page. Empty pages, unchanged monitoring pages, and failed source checks are billed. Retries are included. |
| Listing saved | $0.0019 (from $0.00133 on paid Apify plans) | One basic property or building listing saved to the dataset. |
| Property checked | $0.0033 (from $0.00231 on paid Apify plans) | One Zillow property ID lookup, including a not-found or failed source response. The detailed result is included. |
| Property checked with scores or comparables | $0.0045 (from $0.00315 on paid Apify plans) | One property lookup with optional mobility scores or nearby comparable homes. The detailed result is included. Not-found and failed checks are billed. |
Examples
- One result: about $0.0019.
- 1,000 results: about $1.90.
- Every day 100 results, for 30 days: about $5.70 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,600 results.
Prices checked on 8 November 2026. See the current price on Apify.
Questions
Do I need a Zillow account or API key?
No. The tool reads public Zillow pages. You need only an Apify account.
Why is the Zestimate empty for some homes?
Zillow does not show a Zestimate for every home. The tool leaves the field empty and does not guess.
Does it work outside the US?
No. It reads US Zillow only.
How do I get only new listings and price cuts?
Set mode to monitor, turn on onlyChanges and give a stateName. Run it on a schedule. The first run saves all homes; later runs save only changes.
Can I export recently sold homes?
Yes. Set status to sold. You can add soldInLastDays, for example "30".
Details
Step by step on Apify
- Open the Input tab. Cities or ZIP codes already has
Austin, TX(box 1 in the picture). Keep it or type your own city with a state, or a ZIP code. - Keep Task empty. It means
Search listings, and the search uses homes for sale. - Keep Maximum properties at
10for a first test (box 2). Use0later to read all results. - Click the start button under the form.
- When the run ends, open the Output tab. Check the
address,price,zestimateandrentZestimatecolumns (box 1). Zillow does not show an estimate for every home, sozestimateandrentZestimateare often empty (in our latest test, 3 homes out of 10 had a Zestimate and rent Zestimate). Click Export to download CSV, Excel or JSON (box 2).
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Export a market | locations or searchUrls, status | Property row | address, price, zestimate, beds, sqft | CSV/Excel export, Google Sheets |
| Watch new listings and price cuts | mode: monitor, onlyChanges, stateName | Changed property row | changes, price, status, url | Schedule + Slack or Notion summary |
| Check exact homes | propertyUrls, zpids or addresses | Property row with details | zestimate, rentZestimate, priceHistory, taxHistory, schools | API, Make, Zapier |
| Rental research | status: forRent, extractBuildingUnits | Rental or building unit row | price, rentZestimate, grossRentalYield, buildingName | Spreadsheet model |
| Recent sales | status: sold, soldInLastDays | Sold property row | price, zestimate, pricePerSqft, daysOnZillow | Comparison in a spreadsheet |
Tips for better results
- Copy a Zillow search URL from your browser to keep its map and filters.
- Always add the state to a city, for example Austin, TX.
- Use monitor mode with a schedule and save only changed homes.
Limits and good to know
- US Zillow only. The Actor does not log in and reads only public pages
- Dataset ID import reads at most 10000 rows and checks at most
maxItemshomes - Zillow changes often and sometimes blocks requests or hides a field. Missing values stay
null; the Actor does not guess them - Zillow shows a limited number of homes per map view. With
splitMapon, the Actor splits the map, but a very dense area can still end withSOURCE_RESULT_WINDOWand partial results maxItems: 0means all homes the run can read before the run timeout or your cost limitMARKET_SUMMARYmedians use only the homes seen in this run. They are not a full market census- Investor metrics are a rough screening tool, not financial advice. They use the Zillow rent estimate and simple default assumptions (20% down, Zillow 30-year rate or 7%, 30% operating costs). Check
investorAssumptionsin each row and set your own numbers for a serious decision - The Actor does not return flood, fire, heat or other climate risk scores. Zillow does not publish them on a page we can read without a login, and we did not find a public route to them
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"zpid": "64625418",
"recordType": "property",
"url": "https://www.zillow.com/homedetails/11008-Sierra-Ridge-Ct-Austin-TX-78739/64625418_zpid/",
"address": "11008 Sierra Ridge Ct, Austin, TX 78739",
"price": 1375000,
"zestimate": 1338600,
"rentZestimate": 6427,
"beds": 5,
"baths": 4,
"sqft": 4395,
"status": "FOR_SALE",
"homeType": "SINGLE_FAMILY",
"daysOnZillow": 23,
"pricePerSqft": 312.86,
"priceToZestimate": 1.027,
"grossRentalYield": 0.0561,
"rentalYieldValueBasis": "listingPrice",
"yearBuilt": null,
"description": null,
"changes": "[]",
"fetchedAt": "2026-11-01T08:17:29.253Z"
}Use it from code
Actor ID: cliqtomedia/zillow-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/zillow-scraper").call(run_input={
"mode": "search",
"locations": [
"Austin, TX"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~zillow-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "search", "locations": ["Austin, TX"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/zillow-scraper")
result = tool.invoke({"run_input": {"mode": "search", "locations": ["Austin, TX"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
zpid | string | Zillow property ID. |
url | string | Public Zillow property page. |
address | string | Street address shown by Zillow. |
price | number | Listing price in US dollars. |
zestimate | number | Zillow estimated value, when available. |
rentZestimate | number | Zillow estimated monthly rent, when available. |
beds | number | Bedrooms. |
baths | number | Bathrooms. |
sqft | number | Living area in square feet. |
status | string | Listing status from Zillow. |
daysOnZillow | number | Days on Zillow, when available. |
pricePerSqft | number | Listing price divided by living area. |
priceToZestimate | number | Listing price divided by Zestimate. |
grossRentalYield | number | Estimated annual rent divided by listing price for sale homes, or Zestimate for rentals, before costs. A value of 0.08 means 8%. |
fetchedAt | string | UTC time this property was read. |
id | string | Stable property or building identifier. |
recordType | string | Property or apartment-building row. |
buildingId | string | Public building identifier for a building row. |
buildingName | string | Apartment complex name. |
priceMin | number | Lowest advertised rent for a building. |
priceMax | number | Highest advertised rent, when the source gives a closed range. |
lat | number | Latitude. |
lng | number | Longitude. |
yearBuilt | number | Year the property was built. |
monthlyHoaFee | number | Monthly HOA fee in US dollars. |
description | string | Public property description with phone numbers and email addresses removed. |
photos | array/string | Public photo URLs. Flat output uses JSON text. |
priceHistory | array/string | Public price events. Flat output uses JSON text. |
taxHistory | array/string | Public tax assessments and payments. Flat output uses JSON text. |
schools | array/string | Nearby public school names, ratings, grades, and distances. Flat output uses JSON text. |
zestimateHistory | array/string | Public historical estimated values when Zillow provides them. |
changes | array/string | New, priceDown, priceUp, pending, sold, removed, or statusChanged. |
priceCutCount | number | Number of price reductions in the available price history. |
walkScore | number | Public Walk Score when requested and available. |
nearbyHomes | array/string | Nearby comparable homes when requested and available. |
source | string | Data source name. |
sourceUrl | string | Search or property URL that produced the row. |
rentalYieldValueBasis | string | Value used for gross rental yield: listingPrice for sale listings, zestimate for rentals. |
unitCount | number | Total building units reported by Zillow, when available. |
investorMetrics | object/string | Estimated monthly cash flow, cap rate, cash-on-cash return, rent-to-price, ARV and 70% rule offer. Present only when Add investor metrics is on. |
Input settings (25)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Task | mode | string | "search" |
| Cities or ZIP codes | locations | array | ["Austin, TX"] |
| Zillow search URLs | searchUrls | array | |
| Property URLs | propertyUrls | array | |
| Zillow property IDs | zpids | array | |
| Street addresses | addresses | array | |
| Listing status | status | string | "fromUrl" |
| Maximum properties | maxItems | integer | 10 |
| Include full property details | includeDetails | boolean | false |
| Output format | outputFormat | string | "flat" |
| Save only changed listings | onlyChanges | boolean | false |
| Monitor storage name | stateName | string | "zillow-scraper-monitor" |
| Split large map searches | splitMap | boolean | true |
| Search page connection route | proxyMode | string | "auto" |
| Maximum source requests | maxRequests | integer | |
| Sort listings | sort | string | |
| Home types | homeTypes | array | |
| Listing keywords | keywords | string | |
| Minimum price | minPrice | number | |
| Maximum price | maxPrice | number | |
| Minimum bedrooms | minBeds | number | |
| Maximum bedrooms | maxBeds | number | |
| Minimum bathrooms | minBaths | number | |
| Minimum living area | minSqft | number | |
| Maximum living area | maxSqft | number |






