# Zillow Property Details Scraper (`steadyscrape/zillow-property-details-scraper`) Actor

Zillow property details by link, zpid or street address: price, Zestimate, price and tax history, schools, ~190 facts, agent, views and saves; apartment buildings with floor plans and each unit's rent. Address to zpid lookup. Export Zillow data to JSON, CSV or Excel, or via API.

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

## Pricing

$3.00 / 1,000 property with details

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does Zillow Property Details Scraper do?

**Zillow Property Details Scraper** turns **Zillow property links, zpids or street addresses** into full rows of **Zillow property details**: price, Zestimate and Rent Zestimate, beds, baths, square feet, lot, home type, tax assessed value, days on Zillow, and from each home's own page its **price history, tax history, schools, every fact Zillow lists** (heating, cooling, parking, HOA, appliances, construction…), **listing agent and broker, MLS id, parcel id, page views and saves**, description and all photos. **Apartment buildings** come with **each floor plan and every available unit's rent and move-in date**.

**Give it addresses, not just links.** Type `1500 S Lamar Blvd, Austin, TX 78704` and it finds the property with Zillow's own address search, then reads its page. An address Zillow does not know, or a unit it does not list, is reported and **not charged** — it never guesses a neighbour or a unit.

### Why use it?

- 🏘️ **Real estate investing and underwriting** — a list of addresses from a county record, a wholesaler or an MLS export, back as Zestimate, rent estimate, tax history and last sale.
- 📊 **Comps and valuation** — price history with each sale and price cut, tax assessments year by year, facts and schools for each comparable.
- 🏢 **Rental research** — a building's floor plans with each available unit's rent and move-in date, pets, fees and special offers.
- 🔔 **Monitoring** — schedule it on your watch list and see status, price and Zestimate changes.
- 🤖 **Feed CRMs, sheets, dashboards and AI agents** — JSON, CSV or Excel, or straight into Google Sheets, Make or Zapier through Apify integrations, or via API.

### Features

- ✅ **Zillow property links** — `https://www.zillow.com/homedetails/…_zpid/`, `/homes/…_zpid/` share links, apartment buildings (`/apartments/…`, `/b/…`).
- ✅ **zpids** — just the number, `7560392`.
- ✅ **Street addresses → zpid** — through Zillow's own address search, with the unit when you give one (`#2038`, `Apt 2038`, `Unit A`). Each row says how you typed it (`searchLocation`) and how Zillow writes it (`resolvedLocation`).
- ✅ **Every detail of the page** — price and tax history, schools with ratings, ~190 facts, agent and broker with phones, MLS id, parcel id, HOA, property tax rate, page views and saves, all photos in full size.
- ✅ **Apartment buildings** — floor plans with beds, baths, square feet and price range, every available unit with its rent and move-in date, amenities, pets, special offers, walk/transit/bike scores, phone and manager.
- ✅ **Fair billing** — one price per property read, a property given twice is read and charged once, the spending limit is checked before a page is read, and links, zpids or addresses Zillow does not know are listed in the run's SUMMARY and **not charged**. No start fee.

### How to get Zillow property details

1. Click **Try for free**.
2. Paste **property links or zpids**, and/or type **street addresses**, one per line.
3. Click **Start** and download the properties as JSON, CSV or Excel, or read them via API.

### Input example

```json
{
    "propertyUrls": [
        "https://www.zillow.com/homedetails/4048-E-Edgemont-Ave-Phoenix-AZ-85008/7560392_zpid/",
        "41060297",
        "https://www.zillow.com/apartments/phoenix-az/seven-(az)/636CVJ/"
    ],
    "addresses": ["1500 S Lamar Blvd, Austin, TX 78704", "5403 Joe Sayers Ave #A, Austin, TX 78756"]
}
```

### Output example

A home (lists shortened):

```json
{
    "kind": "home",
    "id": "7560392",
    "zpid": "7560392",
    "url": "https://www.zillow.com/homedetails/4048-E-Edgemont-Ave-Phoenix-AZ-85008/7560392_zpid/",
    "status": "FOR_SALE",
    "address": "4048 E EDGEMONT Avenue, Phoenix, AZ 85008",
    "street": "4048 E EDGEMONT Avenue", "city": "Phoenix", "state": "AZ", "zipcode": "85008",
    "latitude": 33.479282, "longitude": -111.9934,
    "price": 1600000,
    "currency": "USD",
    "homeType": "SINGLE_FAMILY",
    "bedrooms": 5, "bathrooms": 5, "livingArea": 3370, "lotArea": 10685, "lotAreaUnit": "sqft",
    "zestimate": null, "rentZestimate": null, "taxAssessedValue": 518600,
    "daysOnZillow": 167,
    "priceChange": -49000, "priceChangeDate": "2026-09-23",
    "listingSubType": ["newConstruction"],
    "brokerName": "HomeSmart",
    "searchLocation": "4048 E Edgemont Ave, Phoenix, AZ 85008",
    "resolvedLocation": "4048 E Edgemont Ave Phoenix, AZ 85008",
    "details": {
        "yearBuilt": 2026,
        "propertyType": "Single Family",
        "lastSoldPrice": 522500, "dateSold": "2024-10-24",
        "propertyTaxRate": 0.41,
        "county": "Maricopa County", "parcelId": "12601083", "mlsId": "7007889",
        "pageViews": 2388, "saves": 246,
        "listingAgent": { "name": "Kristina Cat", "phone": "734-306-0569", "email": null, "licenseNumber": null },
        "broker": { "name": "HomeSmart", "phone": "602-230-7600" },
        "priceHistory": [{ "date": "2026-09-23", "event": "Price change", "price": 1600000, "pricePerSquareFoot": 475, "source": "ARMLS" }],
        "taxHistory": [{ "year": 2025, "taxPaid": 1819.7, "assessedValue": 51860 }],
        "schools": [{ "name": "Griffith Elementary School", "rating": 3, "distance": 0.9, "grades": "K-5", "level": null, "link": "https://www.greatschools.org/arizona/phoenix/754-Griffith-Elementary-School/" }],
        "facts": { "heating": ["ENERGY STAR Qualified Equipment", "Electric"], "cooling": ["Central Air", "Ceiling Fan(s)"], "parkingCapacity": 4, "hasGarage": true, "stories": 1 },
        "photos": ["https://photos.zillowstatic.com/fp/d74149e3a77bbdb4db14441e5bd9d0b8-uncropped_scaled_within_1536_1152.jpg"]
    },
    "building": null
}
```

An apartment building:

```json
{
    "kind": "building",
    "id": "1136159192",
    "url": "https://www.zillow.com/apartments/phoenix-az/seven-(az)/636CVJ/",
    "status": "FOR_RENT",
    "address": "19800 N 7th St, Phoenix, AZ 85024",
    "rentMin": 1357, "rentMax": 2052,
    "buildingName": "Seven (AZ)",
    "availableUnits": 13,
    "details": null,
    "building": {
        "phone": "(928) 440-9094", "manager": "Greystar",
        "buildingFacts": ["216 units", "3 stories", "built in 2014"],
        "pets": ["Cats", "Large dogs", "Small dogs"],
        "walkScore": 26, "transitScore": 33, "bikeScore": 37,
        "floorPlans": [{ "name": "1X1", "beds": 1, "baths": 1, "sqft": 747, "minPrice": 1374, "maxPrice": 1473, "availableFrom": "2026-10-13", "units": [{ "unitNumber": "Unit 1081", "zpid": "2091638977", "price": 1454, "sqft": 747, "availableFrom": "2026-11-02" }] }]
    }
}
```

### Zillow property details fields

| field | meaning |
|---|---|
| `kind` | `home` or `building` (an apartment building given by its `/apartments/` or `/b/` link). |
| `id`, `zpid`, `url`, `imageUrl` | The zpid of a home; Zillow's lot id of a building; its page and main photo. |
| `status`, `statusText` | `FOR_SALE`, `FOR_RENT`, `RECENTLY_SOLD`, `SOLD`, `OTHER` (off market)… as Zillow states it. |
| `address`, `street`, `city`, `state`, `zipcode`, `unit`, `latitude`, `longitude` | Where it is. |
| `price`, `priceText`, `currency` | Asking price, monthly rent, sold price, or for an off-market property the value Zillow shows; `USD`. |
| `rentMin`, `rentMax`, `availableUnits`, `buildingName` | A building's base rent range (before required fees) and available units. |
| `brokerName` | The listing's brokerage, or a new-construction community's builder. |
| `homeType`, `bedrooms`, `bathrooms`, `livingArea`, `lotArea`, `lotAreaUnit` | `livingArea` in square feet; `lotAreaUnit` is `sqft` or `acres`. |
| `zestimate`, `rentZestimate`, `taxAssessedValue` | Zillow's estimates (Zillow hides the Zestimate on many listed homes). |
| `daysOnZillow`, `priceChange`, `priceChangeDate`, `dateSold`, `listingSubType` | Market signals. |
| `details` | For a home: price history, tax history, schools, `facts` (every fact Zillow lists, as Zillow names it), agent, broker, views, saves, photos. |
| `building` | For an apartment building: floor plans, units, amenities, pets, offers, scores, photos. |
| `searchLocation`, `resolvedLocation`, `scrapedAt` | The link, zpid or address as you gave it; for an address, how Zillow writes it; when (UTC). |

The run's **SUMMARY** record lists every link, zpid or address that gave nothing — not found, a unit Zillow does not list, refused — with the reason. Those are **not charged**.

### Limits and tips

- **Zillow covers the United States.** An address needs its house number; add the unit for an apartment or condo. A duplex or a building Zillow lists only by units is reported with the units Zillow knows, so you can add the right one.
- **The street address of an apartment complex** gives the complex's own property record (parcel, tax history, last sale), not a unit. Give the building's `/apartments/` link for its floor plans and rents.
- About two properties a second; an address takes one extra lookup.
- Prices are in US dollars; rents are monthly.

### Is it legal to scrape Zillow?

This is an unofficial tool: it is not affiliated with, endorsed by or sponsored by Zillow Group. It reads only data Zillow shows publicly to anyone, without logging in, from the pages Zillow's robots.txt leaves open; it never runs Zillow's search. Listing agents' and brokers' names and phone numbers are the business contacts Zillow publishes with each listing. Scraping public data is generally legal; still, make sure your use complies with Zillow's terms and the laws that apply to you, and use it responsibly. Read Apify's [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) guide.

### Your feedback

Missing a field? Open an issue on the **Issues** tab: issues are answered, and the Actor is checked against the live site so it keeps working when Zillow changes.

# Actor input Schema

## `propertyUrls` (type: `array`):

Homes (<code>https://www.zillow.com/homedetails/…\_zpid/</code>, a <code>/homes/…\_zpid/</code> link, or just the zpid number) and apartment buildings (<code>https://www.zillow.com/apartments/…</code> or <code>/b/…</code>), one per line. Each one is read from its own page, with all its details.

## `addresses` (type: `array`):

US street addresses with the house number, as you would type them on Zillow: <code>1500 S Lamar Blvd, Austin, TX 78704</code>. Add the unit for an apartment or condo (<code>#2038</code>, <code>Apt 2038</code>, <code>Unit A</code>). Zillow's own address search finds the property; an address it does not know, or one with several units and none given, is listed as not found and not charged.

## Actor input object example

```json
{
  "propertyUrls": [
    "https://www.zillow.com/homedetails/4048-E-Edgemont-Ave-Phoenix-AZ-85008/7560392_zpid/"
  ],
  "addresses": [
    "141 Hillcrest Dr, Madison, TN 37115"
  ]
}
```

# Actor output Schema

## `properties` (type: `string`):

No description

## `summary` (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 = {
    "propertyUrls": [
        "https://www.zillow.com/homedetails/4048-E-Edgemont-Ave-Phoenix-AZ-85008/7560392_zpid/"
    ],
    "addresses": [
        "141 Hillcrest Dr, Madison, TN 37115"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/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 = {
    "propertyUrls": ["https://www.zillow.com/homedetails/4048-E-Edgemont-Ave-Phoenix-AZ-85008/7560392_zpid/"],
    "addresses": ["141 Hillcrest Dr, Madison, TN 37115"],
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/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 '{
  "propertyUrls": [
    "https://www.zillow.com/homedetails/4048-E-Edgemont-Ave-Phoenix-AZ-85008/7560392_zpid/"
  ],
  "addresses": [
    "141 Hillcrest Dr, Madison, TN 37115"
  ]
}' |
apify call steadyscrape/zillow-property-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/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/MWMBtCDd1ARErURn3/builds/XBlsLUC6AQdc3p4F2/openapi.json
