# Zillow Property Details Scraper: Price History (`automation_craft/zillow-property-details-scraper`) Actor

Get full Zillow property records by home link, zpid or street address, or for every home of a Zillow search: price and tax history, Zestimate, schools, facts, HOA, MLS id, page views, saves and mortgage rates. Buildings bring their unit homes. No login; misses are free. JSON, CSV, API.

- **URL**: https://apify.com/automation_craft/zillow-property-details-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 1,000 properties

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Zillow Property Details Scraper: Price History

**Zillow property details scraper**: give Zillow home links, zpids or street addresses and get each home's full Zillow record as
one row: price, Zestimate and rent Zestimate, beds, baths, living area, lot, year built, description, facts and features, price
history, tax history, schools with ratings, HOA, parcel id, MLS id, county, brokerage, nearby homes, climate risk, every photo, the
home's page views and saves on Zillow and current mortgage rates. It also takes apartment and condo building links (and the unit
homes in them), new construction community links, an earlier dataset of zpids, and whole Zillow searches (places, ZIP codes, map
areas, search links with filters), each home delivered with its full record. Add **Home insights** for the Walk Score, Transit
Score and Bike Score, 10 years of Zestimate history and the comparable homes behind the Zestimate. No login, no Zillow API key, no
browser. A home Zillow does not have, an address that matches no home exactly, or a link that is not a home is a free row, never a
charge.

Who uses it: real estate investors checking a list of deals, agents, brokers and lenders preparing comps and valuations, proptech,
valuation and data teams enriching their own lists of addresses or zpids, landlords and property managers, and AI agents that need
one home's facts.

### Quick start

1. Open the **Input** tab and put homes into **Homes**, one per line: a Zillow home link
   (`https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/`), a zpid (`29412761`) or a full street
   address (`1704 Shelbourne Dr, Austin, TX 78752`). Building links and community links work too.
2. To get every home of a search instead, use **Places**, **Zillow search links**, **ZIP codes** or **Map areas** with the
   **Listing status** and filters you need (all optional).
3. Turn on **Home insights** if you need the scores, the Zestimate history and the comparables.
4. Set **Maximum homes (whole run)** and click **Start**. Download the rows as JSON, CSV or Excel, or read them through the Apify
   API.

### What you get

One row per home (`type: "home"`), each with its full Zillow record in `details`; one free coverage row per search
(`type: "search"`); free status rows for anything that could not be delivered (`type: "status"`); and a free run summary
(`type: "summary"`).

Fill rates below were measured on the Actor's own run of 2026-10-27 on its real build (run ajZyefWZ3cDkc60fc): 400 home records
looked up by zpid, drawn at random from Zillow's own sitemaps: for sale 194, pending 64, sold 49, off market 61, for rent 32.

| Field | What it is | Filled on (400 records) |
|---|---|---|
| `id`, `zpid`, `buildingId`, `url` | the row's id, Zillow's property id (a string), a building's id instead of a zpid, the home's Zillow link | every row |
| `listingStatus`, `homeStatus`, `statusText` | `forSale`, `pending`, `sold`, `forRent`, `offMarket`, `foreclosure`; Zillow's own status words | every row |
| `price`, `soldPrice`, `soldDate` | the list price, the monthly rent for rentals, the sold price and date where Zillow shows them | price 98.5 percent |
| `zestimate`, `rentZestimate`, `taxAssessedValue` | Zillow's value and rent estimates, the tax assessed value | 58.2, 79.8 and 70.0 percent |
| `beds`, `baths`, `livingArea`, `lotArea`, `lotAreaUnit` | bedrooms, bathrooms, living area in square feet, the lot in `sqft` or `acres` | 94.2, 95.2, 92.2 and 77.5 percent |
| `homeType` | `SINGLE_FAMILY`, `CONDO`, `TOWNHOUSE`, `MULTI_FAMILY`, `APARTMENT`, `MANUFACTURED`, `LOT` | 100 percent |
| `address` (`full`, `street`, `city`, `state`, `zipcode`), `latitude`, `longitude` | the home's address and coordinates | ZIP code 100, coordinates 89.2 percent |
| `availabilityDate` | a rental's move in date from its record | rentals that give one |
| `deal` | price per square foot, price as a percent of the Zestimate, gross rent yield, from the row's own figures | where the figures exist |
| `summary` | one plain sentence about the home, for people and AI agents | every row |
| `details.description` | the listing description, exactly as Zillow serves it | 99.8 percent |
| `details.yearBuilt`, `county`, `countyFips`, `neighborhood` | year built, county, county FIPS code, neighbourhood | year built 86.5, county 100 percent |
| `details.priceHistory` | every price event: day, event, price, price per square foot, change rate, source | 88.0 percent |
| `details.taxHistory` | per year: tax paid, assessed value and their change rates | 70.5 percent |
| `details.schools` | nearby schools: name, GreatSchools rating, grades, distance in miles, link | 97.5 percent |
| `details.parcelId`, `mlsId`, `mlsName` | the parcel id, the MLS number and the MLS's name | 73.0 and 56.5 percent (rentals and off market homes carry no MLS id) |
| `details.hoaFee`, `hoaFeeText`, `propertyTaxRate` | the HOA fee, as a number and as Zillow writes it; the property tax rate | HOA fee 20.2 percent |
| `details.lastSoldPrice`, `zestimateLowPercent`, `zestimateHighPercent`, `datePosted`, `timeOnZillow` | the last sold price, the Zestimate's range, the record's dates | last sold price 53.8 percent |
| `details.facts` | Zillow's facts and features (heating, cooling, parking, appliances, construction, rooms and many more) | 100 percent |
| `details.nearbyHomes` | nearby homes with zpid, price, beds, baths, area, status, address and coordinates | 100 percent |
| `details.photos`, `photoCaptions`, `photoCount`, `virtualTourUrl`, `hasPublicVideo` | every photo at its largest size, the captions a listing gives its photos (few do), a virtual tour link, a video | photos 100, captions 2.5 percent |
| `details.climateRisk` | First Street's flood, fire, heat, wind and air quality risk as Zillow serves it | 82.5 percent |
| `details.brokerage` (`name`, `phone`), `buyerBrokerage` | the listing brokerage and its phone, the buyer's brokerage (business data, always delivered) | brokerage 69.0 percent |
| `details.pageViews`, `saves`, `viewsStatus` | how many times the home's Zillow page was viewed and how many people saved it, as Zillow counts them; read last, so a run short of its unpaid work allowance skips them rather than stop (`viewsStatus` says so) | 100 percent |
| `details.mortgageRates` | Zillow's current 30 year fixed, 15 year fixed and 5/1 ARM rates for the home, with the date Zillow updated them | 55.8 percent (homes for sale, pending, sold and off market; never rentals) |
| `details.openHouseSchedule`, `foreclosure`, `downPaymentAssistance`, `tourViewCount` | open house times, foreclosure facts, down payment assistance, tour views | where Zillow has them |
| `details.listingAgent`, `coAgent`, `buyerAgent`, `listingContactPhone`, `listedBy` | persons: only with **Include personal data** (below) | with the switch on |
| `detailsStatus` | `delivered` on every row (a home whose record could not be read is never delivered) | every row |
| `insights`, `insightsStatus` | the Home insights block (below) | with Home insights |
| `search` (`key`, `input`, `page`, `position`) | which input, search, page and place delivered the row | every row |
| `scrapedAt` | when the row was written | every row |

#### Buildings and their unit homes

A building link (`/b/...` or `/apartments/...`) gives one row for the building, with its own page in `details`: name, address,
phone, amenities, floor plans (beds, baths, square feet, prices, deposits and fees, pets) and every unit the page lists (unit
number, beds, baths, square feet, price or rent, availability, listing). With **Building links: also the unit homes**
(`buildingUnits`), every unit home of the statuses you pick (`forSale`, `sold`, `forRent`, `offMarket`) that the page lists with
its own zpid is also delivered as its own row with its full record. A building met in a search keeps its units inside its own row;
to get them as rows, run the search, then give its dataset id in `datasetId` with `buildingUnits` (search filters are never
judged on a unit home). A building Zillow keeps a page for while nothing in it is listed is a free row
(`building_off_market`) naming the building. A building link by map position (`/b/<name>/<latitude>,<longitude>_ll/`) is not read:
paste the building's own page link.

#### New construction communities

A community link (`/community/<name>/<id>_plid/` or `/community/<name>/<zpid>_zpid/`) gives one row per builder plan, move in ready
home and lot (pick them with `communityHomeTypes`), each with its full record.

#### Home insights (add-on)

With **Home insights** on, `insights` carries `walkScore`, `transitScore` and `bikeScore` (score and description),
`zestimateHistory` and `rentZestimateHistory` (monthly points over 10 years) and `zestimateComparables` (the comparable homes
behind the Zestimate, with price, beds, baths, area, address and link). `insightsStatus` says `delivered` when at least one of them
was read.

#### Street addresses

An address is delivered only when exactly one Zillow home matches it under one rule: the house number, every street word both ways
(with the usual abbreviations, `Street` and `St`, `North` and `N`), the unit both ways (`#C-167`, `Apt 44K`, `Unit B`, `Lot 40`,
`Space 270`), and the town or the ZIP code. The record Zillow returns is checked again against the same rule before the row is
delivered. Several matching homes, or none, give a free row with Zillow's candidates. In the build's spike (run RifdhVlkxLNHnJaY0), 40
homes were written five ways each (Zillow's own form, without ZIP code, long words, lower case without commas, street and ZIP code
only): 35 of them were delivered, each the home asked for and never another home, and the three causes of the misses found there
are fixed.

#### The coverage row

Each search gets one free row (`type: "search"`) with Zillow's total for it, the homes met and delivered, repeats, homes left out
by reason (`skipped`, including `record_not_found` and `record_not_read` for homes whose record could not be read), pages read and
failed, price bands, whether the search was read to its end (`complete`) and why it stopped (`stoppedBy`), with a plain `note`.

### How much does it cost to scrape Zillow property details?

You pay per event, with Apify's store discounts by plan:

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Property (one home with its full record) | $1.19 per 1,000 | $1.08 per 1,000 | $0.98 per 1,000 | $0.85 per 1,000 |
| Home insights (add-on, per home with at least one part read) | $1.68 per 1,000 | $1.54 per 1,000 | $1.39 per 1,000 | $1.20 per 1,000 |
| Actor start (once per run, charged on every run) | $0.0075 | $0.0075 | $0.0075 | $0.0075 |

Platinum and Diamond plans pay the Gold price.

The Store pricing card shows these same prices per 1,000 events: "$0.85 / 1,000" on the Property row means one home's full
record costs USD 0.00085.

- Never billed: homes Zillow does not have, addresses that match no home or several, links that are not homes, a home whose record
  could not be read, a home met twice in one run, homes outside your search or filters, buildings with nothing listed, Home
  insights that could not be read, coverage rows, status rows and the summary. The Actor start event is charged on every run,
  whatever it delivers: an input with nothing usable delivers nothing, and only the run's start fee is charged.
- The run obeys the maximum cost you set for it: a home whose events the limit cannot pay is not delivered, and neither is any
  home after it.
- Example on the Gold plan: 1,000 homes cost $0.0075 (start) + $0.85 (1,000 properties) = about $0.86; with Home insights add
  $1.20: about $2.06. One home costs $0.0075 + $0.00085 = about $0.0084.
- The same runs on the Free plan: $0.0075 + $1.19 = about $1.20; with Home insights about $2.88.

### Input

| Setting | What it does |
|---|---|
| `homes` | Zillow home links (`/homedetails/.../12345678_zpid/`, `/homedetails/12345678_zpid/`, `/homes/.../12345678_zpid/`), zpids, full street addresses, apartment and condo building links (`/b/...`, `/apartments/...`) or new construction community links (`..._plid/` or `..._zpid/`). Up to 10,000 entries. Search filters do not apply to these homes. |
| `addresses`, `startUrls` | Two more ways to give the same lookups: `addresses` takes street addresses only; `startUrls` takes links (`{ "url": ... }` objects or plain text): home, building and community links are read as homes, search links as searches. |
| `datasetId` | An Apify dataset whose rows carry a `zpid` or a Zillow home link (for example a Zillow search run): every home in it is looked up, a page of 1,000 rows at a time. Datasets of up to 200,000 rows. |
| `buildingUnits` | For building links (and buildings in `datasetId`): also the unit homes of these statuses (`forSale`, `sold`, `forRent`, `offMarket`), each as its own row with its full record. |
| `communityHomeTypes` | For community links: `plan` (floor plans), `moveInReady` (move in ready homes), `lot` (lots, when Zillow lists them with their own zpid). Empty means all. |
| `locations`, `searchUrls`, `zipCodes`, `mapAreas` | Searches: places as Zillow names them (`Austin, TX`, `78704`, `Travis County, TX`, `Brooklyn, NY`, `Texas`; searched only when exactly one Zillow place matches), Zillow search links with their own status, filters, drawn area and sort, five digit ZIP codes, and map circles (`latitude,longitude,radius in miles`) or boxes (`south,west,north,east`). Every home of the search is delivered with its full record. |
| `listingStatus` | For searches: `forSale` (default), `forRent`, `sold` or `all`. |
| Filters | For searches, as in the Zillow Scraper: price or rent, beds, baths, home types, living area, lot size, year built, days on Zillow, sold within, keywords, HOA, parking, garage, pool, air conditioning, waterfront, single story, basement, views, 55+ communities, 3D tour, open houses, price cuts, Showcase, with photos, sale types, pending, backup offers, foreclosed, distressed, 23 rental amenities, move in date, and the sort: each is sent to Zillow and checked again on each home whose row shows it. Zillow has no filter for a minimum number of days on Zillow, a maximum of baths, absentee owners, price as a percent of the Zestimate, gross rent yield or a minimum school rating: those are checked on each home only. |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `splitPastCap` | Caps for the run and per search, result pages per search (41 homes a page, 1 to 24), and the split past Zillow's per search cap of 984 homes (on by default). |
| `includeInsights`, `includePersonalData` | The Home insights add-on and the personal data switch (both off by default). |
| `outputFormat`, `includeRawData` | `nested` (default) or `flat` rows with columns such as `details.yearBuilt` for spreadsheets; Zillow's own search row as `raw` (Zillow's record, and a building's or a community's raw data, only with **Include personal data** on, because they name the agents and contacts). |
| `maxConcurrency`, `proxyConfiguration` | Parallel Zillow connections (1 to 4, default 3), each keeping a polite pace; Apify Proxy datacenter by default (included in the price), or your own proxy links. |

#### Speed

Each home takes two reads of Zillow (its record, then its page views, saves and mortgage rates), one read every 4.5 seconds or more
per connection. At the default 3 connections a run delivers about 12 to 13 homes a minute (the build's runs of 563 and 400 homes
took 44 and 32 minutes); 1,000 homes take about 80 minutes. The default timeout is one hour: set the run's timeout to match for
long lists.

#### Personal data

Brokerage names and phones, building phones and builder data are business data and always delivered. The listing agent, co agent
and buyer's agent (name, phone, e-mail, licence), the listing contact (`listingContactPhone`, and `listedBy`, the person a listing
names as its contact: a landlord or an owner selling by owner) and the agents named on price history events are delivered only with
**Include personal data** (`includePersonalData`) on; with it off those fields are empty. A home its owner sells or lets (Zillow's by
owner listings) is a private person's home: with the switch off its street, coordinates, parcel id, unit number and building name
are left out (`url` becomes the plain zpid link, `personalDataHidden` is true), every nearby home in its row loses its street and
position, and every link in its row but Zillow's photos and the plain zpid link is left out (school links, climate risk links, tour
sites: a link can name a place); the positions and streets of by owner homes nested in any other row go the same way; the town,
state and ZIP code stay. Descriptions, photo captions, fact texts, Zillow's card note and every other text are delivered exactly as
Zillow serves them, whether the switch is on or off. You are responsible for using personal data lawfully (GDPR, CCPA and
similar laws).

#### When Zillow fails

When Zillow refuses or does not answer after retries, the run still ends normally and its status message says how many calls
Zillow failed, which homes or search pages could not be read, that nothing was charged for them, and to try again later.

### API examples

Run it and get the rows in one call (replace `YOUR_TOKEN`):

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~zillow-property-details-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"homes": ["29412761", "1704 Shelbourne Dr, Austin, TX 78752", "https://www.zillow.com/homedetails/2061476945_zpid/"]}'
```

Node.js:

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/zillow-property-details-scraper').call({ homes: ['29412761'], includeInsights: true });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'home').map((h) => [h.zpid, h.details.priceHistory.length]));
```

Python:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/zillow-property-details-scraper").call(run_input={"zipCodes": ["78704"], "listingStatus": "sold", "soldWithin": "90", "maxItems": 100})
homes = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "home"]
```

### What this Actor does not do

- **No monitoring between runs.** By design it keeps no memory from one run to the next, so it does not deliver only new or
  changed homes on later runs: each run delivers the records as Zillow shows them at that moment.
- **No agent profiles or agent directory.** By design this Actor covers homes; the agents named on a listing come with the record
  and the personal data switch.
- **No agent e-mails from other sources.** It delivers only Zillow's own agent e-mail field (behind the personal data switch), which
  was empty on 8 of 8 homes read in the family's tests, and looks nothing up on other sites.
- **No pre foreclosures.** Zillow shows them only to signed in users: logged out, its own pre foreclosure switch changes neither the
  total nor the rows.
- **No home insights panel and no affordability estimate.** None of the data a Zillow home page loads for a visitor carries them.
- **No search from a school.** Zillow's own place search answers no school for visitors without a login; search the school's town,
  ZIP code or a map area and use the minimum school rating.
- **No school type filter (public, private, charter).** Zillow ignores its own school filters for visitors without a login, and its
  school entries carry no type. The school rating is checked on each home's record instead (`minSchoolRating`).
- **No permit history.** No data a Zillow home page loads for a visitor carries one.
- **No building links by map position.** A `/b/<name>/<latitude>,<longitude>_ll/` link is refused free with the reason; the
  building's own link works.
- **No home without its record.** A home whose record Zillow does not answer is left out free and counted; it is never delivered
  half filled.
- **A run can stop early to protect its margin.** Work that earns nothing is capped (the unpaid work allowance: USD 0.001 plus 30
  percent of what the run's events earn). A list whose first entries are all homes Zillow does not have stops after about 10 to
  20 zpids (11 made up numbers on run daI18tDJGH6ZDjVnV: Zillow answers those with a general error, which is read twice before it
  counts as a miss; 18 on an earlier build) or 20 to 30 street addresses in a row that match nothing (22 on run hBWTobPAr6ODVDaYN,
  30 on an earlier run); homes found between the misses keep the run going. A very strict filter or very slow answers can end a run
  the same way, with `stoppedBy: "work_allowance"` on the summary; nothing is charged for homes not delivered. Put the homes you
  are surest of first in a long list.
- **No login and no captcha solving.** It reads only what Zillow shows any visitor.

### FAQ

#### How do I get Zillow property details by address?

Put the full street address into **Homes**, for example `1704 Shelbourne Dr, Austin, TX 78752` (with the unit, `#C-167` or
`Apt 44K`, where the home has one). The home is delivered only when exactly one Zillow home matches; otherwise a free row lists
Zillow's candidates.

#### How do I find a home's zpid?

Every row carries `zpid`, Zillow's property id, and `url`, the home's Zillow link. Look a home up by its address and read the zpid
from its row; the zpid is also the number before `_zpid` in any Zillow home link.

#### Can I get Zillow price history and tax history?

Yes. Every row carries `details.priceHistory` (every listing, price change and sale event with its date, price and source) and
`details.taxHistory` (tax paid and assessed value per year) where Zillow has them: 88.0 and 70.5 percent of 400 records in the
build's own run.

#### Does Zillow have a public API for property details?

This Actor needs no Zillow API key or account: it reads what Zillow shows any visitor and works as a Zillow property details API.
Call it through the Apify API with links, zpids or addresses and read the rows back as JSON.

#### Can I get the full property record from a zpid?

Yes. Put zpids into **Homes** (up to 10,000 a run): each one is read from its full Zillow record, and a zpid Zillow does not have is
a free row. The homes of a Zillow search work the same way: give the search itself (a place, ZIP code, map area or search link),
or the dataset id of an earlier search run in `datasetId`.

#### Why does this Actor run with limited permissions?

Least privilege: it reads and writes only its own run's dataset and key-value store, opens no named store, and reads another
dataset only when you give its id in `datasetId`. Limited permissions keep the rest of your Apify data out of its reach.

### Changelog

- 0.1 (2026-10-28): first release: full Zillow records by link, zpid, street address, building link (with its unit homes),
  community link or dataset, and for every home of a search; Home insights add-on; mortgage rates, page views and saves and photo
  captions in every record; personal data behind its switch, texts as Zillow serves them.

### More data tools by Automation Craft

- [Zillow Scraper: Homes for Sale, Rent and Sold](https://apify.com/automation_craft/zillow-scraper)
- [SeLoger Scraper: Listings, Prices and Agencies](https://apify.com/automation_craft/seloger-scraper)
- [Bien'ici Scraper: France Real Estate Ads & DPE](https://apify.com/automation_craft/bienici-scraper)
- [Immowelt Scraper: Rents, Prices and Energy Data](https://apify.com/automation_craft/immowelt-scraper)
- [FINN Eiendom Scraper: Norway Homes and Rentals](https://apify.com/automation_craft/finn-eiendom-scraper)
- [Airbnb Scraper: Airbnb Data, Prices, Calendar](https://apify.com/automation_craft/airbnb-scraper)
- [US Building Permits Scraper - 38 City Sources](https://apify.com/automation_craft/us-building-permits-scraper)
- [UK EPC Register Scraper - Energy Certificates](https://apify.com/automation_craft/uk-energy-certificate-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/zillow-property-details-scraper/changelog.md

# Actor input Schema

## `homes` (type: `array`):

Zillow home links (https://www.zillow.com/homedetails/.../12345678_zpid/), zpids (12345678), full street addresses ("1704 Shelbourne Dr, Austin, TX 78752"), apartment and condo building links (/b/... or /apartments/...) or new construction community links (/community/.../...\_plid/ or .../12345678_zpid/: one Property per plan and move in ready home). Up to 10,000 entries. An address is delivered only when exactly one Zillow home matches it and the record carries the same house number, street and unit; a miss is a free row. Search filters do not apply to these homes.

## `datasetId` (type: `string`):

The id of an Apify dataset whose rows carry a "zpid" or a Zillow home link (for example a Zillow search run). Every home in it is looked up like the homes above. At most 200,000 rows.

## `buildingUnits` (type: `array`):

For building links in "Homes" (and buildings in an earlier dataset): besides the building's own row, deliver every unit home of these statuses that the building page lists with its own zpid, each read from its full record as one Property. A building met in a search keeps its units inside its own row; to get them as rows, give that search's dataset id here. Empty: the building row only.

## `communityHomeTypes` (type: `array`):

For new construction community links in "Homes" only: the kinds of homes delivered. Empty means all.

## `locations` (type: `array`):

Places as Zillow names them, one per line, for example "Austin, TX", "78704", "Travis County, TX", "Mueller, Austin, TX", "Brooklyn, NY" or "Texas". A place is searched only when exactly one Zillow place matches the text; otherwise a free row lists the matching places to pick from.

## `searchUrls` (type: `array`):

Links copied from a Zillow search page, for example https://www.zillow.com/austin-tx/ or a link with your filters, map area and sort. The link keeps its own listing status, filters and drawn area; a filter you also set below replaces only that filter of the link.

## `zipCodes` (type: `array`):

Five digit US ZIP codes, one per line, each searched on its own (for example 78704).

## `mapAreas` (type: `array`):

Areas on the map, one per line: a circle as "latitude,longitude,radius in miles" (for example "30.27,-97.74,3") or a box as "south,west,north,east". Homes outside the circle are left out free.

## `listingStatus` (type: `string`):

The listing status of every place, ZIP code and map area search. Search links keep their own. Default: for sale.

## `saleTypes` (type: `array`):

Only these for sale listing types (Zillow shows all of them by default). For example only "byOwner" for homes for sale by owner, or only "newConstruction".

## `includePending` (type: `boolean`):

Also deliver homes that are pending or under contract.

## `includeAcceptingBackupOffers` (type: `boolean`):

Also deliver homes under contract that accept backup offers.

## `includeForeclosed` (type: `boolean`):

Also deliver foreclosed, bank owned homes not on the market.

## `distressedOnly` (type: `boolean`):

Only foreclosures, auctions and foreclosed (bank owned) homes. Cannot be combined with "For sale: listing types". Zillow shows pre foreclosures only to signed in users, so they are not included.

## `soldWithin` (type: `string`):

For recently sold searches: homes sold within this time.

## `minPrice` (type: `integer`):

The lowest price, in US dollars. For rentals the monthly rent.

## `maxPrice` (type: `integer`):

The highest price, in US dollars. For rentals the monthly rent.

## `minBeds` (type: `integer`):

At least this many bedrooms (0 for studios and up).

## `maxBeds` (type: `integer`):

At most this many bedrooms.

## `minBaths` (type: `number`):

At least this many bathrooms (1, 1.5, 2, 3 or 4).

## `maxBaths` (type: `number`):

At most this many bathrooms. Checked on each row; homes without a bathroom count are left out free.

## `homeTypes` (type: `array`):

Only these home types (all by default).

## `minSqft` (type: `integer`):

At least this living area in square feet.

## `maxSqft` (type: `integer`):

At most this living area in square feet.

## `minLotSize` (type: `integer`):

At least this lot size in square feet (one acre is 43,560).

## `maxLotSize` (type: `integer`):

At most this lot size in square feet.

## `minYearBuilt` (type: `integer`):

Only homes built in this year or later.

## `maxYearBuilt` (type: `integer`):

Only homes built in this year or earlier.

## `maxDaysOnZillow` (type: `string`):

For sale and rental searches: only homes listed on Zillow within this time.

## `minDaysOnZillow` (type: `integer`):

Only homes on Zillow for at least this many days (stale listings). Checked on each row; homes without a days on Zillow figure are left out free.

## `keywords` (type: `string`):

Words Zillow looks for in the listing, for example "pool" or "guest house".

## `maxHoa` (type: `integer`):

At most this monthly HOA fee.

## `includeHomesWithNoHoaData` (type: `boolean`):

With a maximum HOA fee set: keep homes whose HOA fee is not known (Zillow keeps them by default).

## `minParkingSpots` (type: `integer`):

At least this many parking spots.

## `mustHaveGarage` (type: `boolean`):

Only homes with a garage.

## `mustHavePool` (type: `boolean`):

Only homes with a pool.

## `mustHaveAirConditioning` (type: `boolean`):

Only homes with air conditioning.

## `waterfrontOnly` (type: `boolean`):

Only waterfront homes.

## `singleStoryOnly` (type: `boolean`):

Only single story homes.

## `basement` (type: `string`):

Only homes with a finished, or an unfinished, basement.

## `views` (type: `array`):

Only homes with these views.

## `seniorCommunity` (type: `string`):

Include, leave out or only show homes in 55+ communities (included by default).

## `has3DTour` (type: `boolean`):

Only homes with a 3D tour.

## `openHouseOnly` (type: `boolean`):

Only homes with an open house.

## `priceReducedOnly` (type: `boolean`):

Only homes whose price was reduced.

## `showcaseOnly` (type: `boolean`):

Only Zillow Showcase listings.

## `withPhotosOnly` (type: `boolean`):

Only homes with photos.

## `minSchoolRating` (type: `integer`):

Searches: only homes with at least one nearby school rated this or higher (GreatSchools rating from the home's Zillow record). A home whose schools are all lower is left out free.

## `includeUnratedSchools` (type: `boolean`):

With a minimum school rating: also keep homes whose nearby schools carry no rating at all.

## `maxPriceToZestimatePercent` (type: `number`):

Deals: only homes whose price is at most this percent of their Zestimate (for example 95). Checked on each row; homes without a Zestimate are left out free.

## `minGrossRentYieldPercent` (type: `number`):

Investors: only homes whose rent Zestimate times 12, divided by the price, is at least this percent. Checked on each row; homes without a rent Zestimate are left out free.

## `nonOwnerOccupiedOnly` (type: `boolean`):

Investors: only homes Zillow marks as not owner occupied. Checked on each row; homes without the mark are left out free.

## `sort` (type: `string`):

The order Zillow lists the homes in. With "maxItemsPerSearch" it decides which homes come first.

## `petsAllowed` (type: `boolean`):

Only rentals that allow pets.

## `largeDogsAllowed` (type: `boolean`):

Only rentals that allow large dogs.

## `smallDogsAllowed` (type: `boolean`):

Only rentals that allow small dogs.

## `catsAllowed` (type: `boolean`):

Only rentals that allow cats.

## `noPets` (type: `boolean`):

Only rentals that allow no pets.

## `inUnitLaundry` (type: `boolean`):

Only rentals with laundry in the unit.

## `furnished` (type: `boolean`):

Only furnished rentals.

## `onSiteParking` (type: `boolean`):

Only rentals with parking.

## `elevator` (type: `boolean`):

Only rentals with an elevator.

## `highSpeedInternet` (type: `boolean`):

Only rentals with high speed internet.

## `outdoorSpace` (type: `boolean`):

Only rentals with outdoor space.

## `utilitiesIncluded` (type: `boolean`):

Only rentals with utilities included.

## `hardwoodFloors` (type: `boolean`):

Only rentals with hardwood floors.

## `disabledAccess` (type: `boolean`):

Only rentals with disabled access.

## `incomeRestricted` (type: `boolean`):

Only income restricted rentals.

## `acceptsZillowApplications` (type: `boolean`):

Only rentals that accept applications on Zillow.

## `shortTermLease` (type: `boolean`):

Only rentals with a short term lease.

## `controlledAccess` (type: `boolean`):

Only rentals with controlled access.

## `dishwasher` (type: `boolean`):

Only rentals with a dishwasher.

## `fitnessCenter` (type: `boolean`):

Only rentals with a fitness center.

## `rentByOwner` (type: `boolean`):

Only rentals listed by their owner.

## `instantTour` (type: `boolean`):

Only rentals with an instant tour (a tour booked through Zillow).

## `apartmentCommunity` (type: `boolean`):

Only apartment community buildings.

## `rentalType` (type: `string`):

Entire places (Zillow's default), rooms for rent, or both.

## `moveInDate` (type: `string`):

Only rentals available by this date (YYYY-MM-DD).

## `maxItems` (type: `integer`):

The run stops after delivering this many homes. Leave empty for no cap.

## `maxItemsPerSearch` (type: `integer`):

Each search, place, ZIP code or map area stops after this many homes, in the sort order chosen.

## `maxPagesPerSearch` (type: `integer`):

Read at most this many result pages of 41 homes per search (1 to 24). With this set, searches are not split by price.

## `splitPastCap` (type: `boolean`):

Zillow shows at most 984 homes of one search. On (default), a bigger search is split by price into bands that each fit, so every home is read; off, each search stops at 984 homes.

## `includeInsights` (type: `boolean`):

Read each home's Walk Score, Transit Score and Bike Score, its Zestimate history and rent Zestimate history (monthly, 10 years) and the comparable homes behind its Zestimate. Billed as one Home insights event per home with at least one of them read.

## `includePersonalData` (type: `boolean`):

Off by default. On, each row also delivers the listing agent, co agent and buyer's agent (name, phone, e-mail, licence), the person a listing names as its contact (a landlord or an owner selling by owner) and the agents named on price history events; and for a home its owner sells or lets (by owner), its street, exact map position, parcel id and the links naming its street or position, for that home and for by owner homes nested in other rows (off, the town, state and ZIP code stay; a rental let by its owner is recognised through "For rent by owner" or its record). On such a home's row the nearby homes lose their street and position, and every link but Zillow's photos and the plain home link is left out (school, climate risk and tour links); texts stay as Zillow serves them. You are responsible for using personal data lawfully (GDPR, CCPA and similar laws). Brokerage names and phones are always delivered.

## `outputFormat` (type: `string`):

Nested JSON (default) or flat rows whose nested fields become columns such as "address.city".

## `includeRawData` (type: `boolean`):

Add Zillow's own search row to each row as "raw". Zillow's record (and a building's or a community's raw data) is added only with "Include personal data" on, because it names the agents and contacts.

## `maxConcurrency` (type: `integer`):

How many Zillow connections the run uses at once (1 to 4, default 3). Each connection keeps a polite pace.

## `proxyConfiguration` (type: `object`):

Default: Apify Proxy datacenter, screened for addresses Zillow refuses. Apify residential is used for search pages only. Or your own proxy links, used for every request.

## Actor input object example

```json
{
  "homes": [
    "https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/",
    "2061476945"
  ],
  "listingStatus": "forSale",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "homes": [
        "https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/",
        "2061476945"
    ],
    "listingStatus": "forSale",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/zillow-property-details-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "homes": [
        "https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/",
        "2061476945",
    ],
    "listingStatus": "forSale",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/zillow-property-details-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "homes": [
    "https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/",
    "2061476945"
  ],
  "listingStatus": "forSale",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/zillow-property-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/zillow-property-details-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UEaj4TF1b4dffeKFe/builds/Uw0kd8cATv0gtOa99/openapi.json
