Zillow Scraper at a glance
Zillow Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes id, link, change type (incremental mode), channel and status, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 39 options
Scrape zillow.com properties for sale, for rent and recently sold across the US: price, beds, baths, area, address, GPS, photos, home value and rent estimates. Optional property page read adds HOA fee, tax rate, MLS id, agent, brokerage and the fact sheet. 25 filters, or paste links.
What Zillow Scraper: Sale, Rent and Sold Property Listings can do
- Coverage past the site's own ceiling. One read of a map area returns at most 500 records however many properties exist inside it. This actor splits a busy area into quarters and reads each one, so a city with thousands of homes is genuinely covered instead of truncated at the first few hundred.
- Honest completeness. Every run reports whether it scanned an area end to end. A refused read, an unresolved place or a run cap all mark the scan partial, and expiry tracking refuses to act on a partial scan.
- Three channels, one shape. For sale, for rent and recently sold return the same columns, so a rental feed and a sold-comparables feed line up without post-processing.
- 25 search filters. Channel, price, beds, baths, area, lot size, year built, HOA fee, property type, keyword, time on market, sort order and eight feature toggles.
- Recurring monitoring built in. Run the same search on a schedule and get only what changed, marked NEW, UPDATED, REAPPEARED or EXPIRED, with the exact list of fields that moved.
- Pay for results, not for pages. The search-level record costs one result event. Reading each property's own page is optional and billed separately, so you never pay for detail you did not ask for.
Choose what to collect
These inputs let you configure Zillow Scraper: Sale, Rent and Sold Property Listings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start. 'Search by location' builds the search from the location and filters below. 'Direct URLs' takes zillow.com search or property links you already have. |
locationsarray | Search mode only. One or more US places, written the way you would type them into the site: 'Austin, TX', 'Brooklyn, NY', '90210'. Each one is walked separately, and the run cap below is shared evenly between them. |
listingTypestring | Search mode only. For sale, for rent, or recently sold properties. |
homeTypesarray | Search mode only. Leave empty for every type. Selecting one or more returns only those types. |
minPriceinteger | Search mode only. Lowest price in USD. On a for-rent search this is the lowest monthly rent. |
maxPriceinteger | Search mode only. Highest price in USD. On a for-rent search this is the highest monthly rent. |
minBedsinteger | Search mode only. Fewest bedrooms. |
Show 32 more inputs
| Input | What it controls |
|---|---|
maxBedsinteger | Search mode only. Most bedrooms. |
minBathsinteger | Search mode only. Fewest bathrooms. |
minSqftinteger | Search mode only. Smallest interior area in square feet. |
maxSqftinteger | Search mode only. Largest interior area in square feet. |
minLotSizeinteger | Search mode only. Smallest lot in square feet. One acre is 43560 square feet. |
maxLotSizeinteger | Search mode only. Largest lot in square feet. |
minYearBuiltinteger | Search mode only. Earliest year built. |
maxYearBuiltinteger | Search mode only. Latest year built. |
maxHoaFeeinteger | Search mode only. Highest monthly HOA fee in USD. Set 0 to return only properties with no HOA fee. |
keywordsstring | Search mode only. Narrows to properties whose listing text mentions this word, for example pool, casita, cul-de-sac. Leave empty for no keyword filter. |
daysOnZillowstring | Search mode only. How recently the property was listed. On a recently-sold search this is how recently it sold. |
sortBystring | Search mode only. Result ordering. This changes the order results arrive in, it does not change which properties match. |
hasPoolboolean | Search mode only. |
hasGarageboolean | Search mode only. |
hasAirConditioningboolean | Search mode only. |
isWaterfrontboolean | Search mode only. |
singleStoryOnlyboolean | Search mode only. |
has3dTourboolean | Search mode only. |
openHouseOnlyboolean | Search mode only. |
priceReducedOnlyboolean | Search mode only. |
startUrlsarray | URL mode only. Paste zillow.com search links (walked automatically) or property links ending in _zpid (returned as one record each). Multiple links supported (search pages, city pages, page-numbered pages, for-rent searches and property pages). Left untouched, the field scrapes one example of each shape. The filters above are ignored in this mode, because a pasted link already carries its own. |
fetchDetailsboolean | Adds description, year built, HOA fee, property tax rate, MLS id and name, listing agent and brokerage, full photo gallery, parking and the property fact sheet. Costs one extra read per result and is billed per enriched result under the surcharge named in this section. Leave off for the search-level record, which already carries price, beds, baths, address, GPS, home value estimate, rent estimate and a photo. |
maxItemsinteger | Maximum number of results to return across every location or link. This is the run cap. Set 0 for unlimited. |
maxPagesinteger | Optional safety cap on how many search reads to spend on each location or link. A large area is covered by splitting it into smaller areas, so a big city needs more than one read. 0 means no read limit; the run still stops at Max results. |
incrementalModeboolean | Turn this on for recurring monitoring. The first run returns every match as NEW. Later runs return only NEW, UPDATED and REAPPEARED results. State is kept separately per mode, locations or links, every filter and the property-page setting, so two different searches never mix. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key from the mode, locations or links, every filter and the property-page setting. |
emitUnchangedboolean | Off by default. Turn on to also return results that have not changed since the last run, marked UNCHANGED. This returns, and bills for, extra rows you already have, so leave it off unless you want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return results that were present in a previous run and are no longer found, marked EXPIRED, once a run has scanned the whole search end to end. Adds, and bills for, extra rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names that should never, on their own, turn a property into UPDATED. Always ignored, so you do not need to list them: the scrape time and the counters that move by themselves (days on Zillow, favourite count, page view count), and the added card fields sourceSearchUrl, cardType, units, isValid, hasImage, marketingTagline, cardHighlight, priceReduction, priceIncludesMonthlyFees, isRentalWithBasePrice, marketingTreatments, availabilityDate, dateSold, listingSoldPrice, listingSubType and openHouseSchedule (a change to only one of these does not, on its own, make a property UPDATED). Add more if a field is noisy for your search, for example zestimate or rentZestimate (Zillow's own estimates, which are recomputed regularly). Use a dotted name such as resoFacts.hoaFee for a field inside a nested object. Ignored fields are still returned in every row. Changing this list never marks the whole saved baseline as updated. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (address plus key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idIDurlLink (link)changeTypeChange type (incremental mode) (text)listingTypeChannelhomeStatusStatuspropertyTypeTypepricePriceformattedPricePrice (display)zestimateHome value estimaterentZestimateRent estimatestreetAddressAddresscityCityShow 20 more fields
stateStatezipCodeZIPlatitudeLatlongitudeLngbedroomsBedsbathroomsBathslivingAreaArea (sqft)yearBuiltBuiltmonthlyHoaFeeHOA per monthbrokerageNameBrokeragelistingAgentNameAgentmlsIdMLS idheroImagePhoto (image)detailFetchedProperty page readchangedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)scrapedAtScraped at (date)descriptionDescriptionpropertyTaxRateTax rateExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "00000001",
"zpid": "00000001",
"url": "https://www.zillow.com/homedetails/00000001_zpid/",
"listingType": "FOR_SALE",
"homeStatus": "FOR_SALE",
"statusText": "Active",
"propertyType": "SINGLE_FAMILY",
"price": 612000,
"formattedPrice": "$612,000",
"currency": "USD",
"zestimate": 604800,
"rentZestimate": 2875,
"taxAssessedValue": 498000,
"priceChange": -9000,
"priceChangeDate": "2026-02-01T00:00:00.000Z",
"streetAddress": "142 Sample Ridge Dr",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "USA",
"address": "142 Sample Ridge Dr, Austin, TX 78701",
"latitude": 30.3,
"longitude": -97.7,
"bedrooms": 4,
"bathrooms": 3,
"livingArea": 2100,
"lotAreaValue": 8000,
"lotAreaUnit": "sqft",
"daysOnZillow": 14,
"heroImage": "https://photos.zillowstatic.com/fp/00000000-p_e.jpg",
"photos": [
"https://photos.zillowstatic.com/fp/00000000-p_e.jpg"
],
"description": "Single story home with an open kitchen and a covered patio.",
"yearBuilt": 1995,
"monthlyHoaFee": 60,
"propertyTaxRate": 1.9,
"pricePerSquareFoot": 291,
"mlsId": "1234567",
"mlsName": "Sample MLS",
"listingAgentName": "Jordan Example",
"listingAgentPhone": "(555) 010-0100",
"brokerageName": "Sample Realty Group",
"resoFacts": {
"parkingCapacity": 2,
"propertySubType": [
"Single Family Residence"
]
},
"detailFetched": true,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Property investors and flippers: screen a whole metro for price, days on market and lot size, then compare against the home value estimate.
- Rental market research: track asking rent by bedroom count and neighborhood across several cities at once.
- Comparable sales analysis: pull recently sold homes near a subject property to support a valuation or an offer.
- Lead generation for agents and lenders: monitor a farm area on a schedule and get only the new listings and price changes.
- Market dashboards and reports: build a standing dataset of active inventory, price trends and property mix for a region.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Zillow Scraper return?
The documented output for Zillow Scraper includes id, link, change type (incremental mode), channel, status, type, price and price (display). Availability of each field depends on the source page and the selected mode.
How much does Zillow Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated properties, and unchanged ones are not billed. Keep Max results high (or 0) on these runs; a small cap can cause the run to stop scanning before it reaches a genuinely new or changed listing, and can return fewer rows, or none, even though changes exist. See the tips under How to Use for the exact mechanics.
Why did a scheduled run suddenly return a lot of EXPIRED rows?
Once a run scans its tracked search completely, previously tracked properties that are no longer found are returned as EXPIRED in that same run. These rows count toward Max results (the whole run, minus the rows already returned), so with a cap the leftover properties stay tracked and a later run reports them; with Max results 0 the whole batch comes at once, and a large swing in local inventory can make it bigger than you expect. Turn emitExpired off if you only want the new and updated delta.
What does it not return?
Coverage is US only. Price history, tax history and school assignments are not returned, because those tables are not published on the pages this actor reads.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
