# Zillow Scraper Pro (`stackrelay/zillow-scraper-pro`) Actor

Scrape Zillow property listings and deep details by ZIP code or URL. Returns address, price, beds, baths, sqft, Zestimate, price history, tax records, school ratings, and agent info. Anti-bot resilient via residential proxies and fingerprint spoofing. Supports for\_sale, for\_rent, and recently\_sold.

- **URL**: https://apify.com/stackrelay/zillow-scraper-pro.md
- **Developed by:** [StackRelay](https://apify.com/stackrelay) (community)
- **Categories:** Lead generation, Real estate, Agents
- **Stats:** 13 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 search-page-processeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Zillow Scraper Pro — Zillow Data API & MCP Server for AI Agents

**The Zillow scraper and unofficial Zillow data API built for AI agents, real estate investors, and data teams.** Extract Zillow property listings, Zestimates, Rent Zestimates, tax-assessed values, full listing descriptions, and agent contact info from any ZIP code, city, or Zillow search URL — with a built-in [MCP server](https://modelcontextprotocol.io/) that plugs straight into Claude, GPT, Cursor, and other LLM agents.

A modern **Zillow API alternative** for teams that need structured real-estate data without standing up their own anti-bot infrastructure. Use it as a Zillow data extractor for lead generation, an MLS-data alternative for market research, or a backend for AI-powered property tools. Unlike every other Zillow scraper on Apify, this one is **designed to be called by AI** — not just by humans. It ships with a full JSON Schema, a two-tier pricing model (fast summary vs. deep detail), and anti-bot resilience tuned for Zillow's Imperva / PerimeterX WAF.

> **Use cases:** real estate lead generation, MLS-style listing monitoring, Zestimate data extraction, property investor comp analysis, rental market research, AI-powered real estate agents, bulk Zillow data export, FSBO discovery, agent & broker contact lists.

---

### Quick start (60 seconds)

**1. Run with one ZIP code** — paste this into the actor's input on Apify Console:
```json
{ "location": ["10001"], "dataDepth": "summary", "maxResults": 25 }
````

**2. Click Start.** First results stream into the dataset within ~30 seconds.

**3. Download** as JSON, CSV, or Excel from the dataset tab — or pipe straight into Claude via the [built-in MCP server](#built-for-ai-agents-mcp-native).

That's it. Total cost for the example above: about **$0.08** (one search + 25 summary properties). Scale up `maxResults`, switch to `dataDepth: "detail"`, or pass a city name (`"Austin, TX"`) or a full Zillow URL whenever you're ready.

***

### Contents

- [Quick start (60 seconds)](#quick-start-60-seconds)
- [Built for](#built-for)
- [Why Zillow Scraper Pro](#why-zillow-scraper-pro)
- [What it scrapes from Zillow](#what-it-scrapes-from-zillow)
- [Built for AI agents (MCP-native)](#built-for-ai-agents-mcp-native)
- [Anti-bot: why this one doesn't break](#anti-bot-why-this-one-doesnt-break)
- [Input](#input)
- [Output schema](#output-schema)
- [Pricing — two-tier pay-per-event](#pricing--two-tier-pay-per-event)
- [Usage examples](#usage-examples)
- [Deployment](#deployment)
- [Troubleshooting](#troubleshooting)
- [FAQ](#frequently-asked-questions)
- [Changelog](#changelog)

***

### Built for

| You are… | What you'll use it for |
|---|---|
| **Real estate investor / flipper** | Pull recently-sold comps, days-on-market, and tax-assessed value for any ZIP — feed your underwriting spreadsheet directly. |
| **Lead-gen / cold-outreach team** | Extract listing agents, broker names, and broker phone numbers across whole metros for prospecting. |
| **Prop-tech founder** | Use as a backend Zillow data API — sub-minute response, structured JSON, no browser overhead — without standing up your own anti-bot stack. |
| **AI agent builder** | Drop the MCP server into Claude Desktop, Cursor, or LangChain and let your agent answer real-estate questions with live data. |
| **Rental market analyst** | Sweep `for_rent` listings nightly across a city; track Rent Zestimates, days-listed, and price drops. |
| **Data team / BI analyst** | Schedule summary-mode pulls across hundreds of ZIPs into S3, BigQuery, Snowflake, or Postgres via Apify integrations. |
| **Real estate journalist / researcher** | Build market reports backed by structured Zillow data instead of one-off manual pulls. |

If your workflow shows up here, this actor is built to slot in without custom code.

***

### Why Zillow Scraper Pro

| Feature | Zillow Scraper Pro | Typical Apify Zillow Scrapers |
|---|---|---|
| **MCP server built in** | ✅ Native Claude / LLM integration | ❌ |
| **Two-tier pricing** | ✅ Fast summary + deep detail | ❌ One price fits all |
| **Zestimate transparency** | ✅ `zestimateStatus` + comp-based fallback for new construction | ❌ Null zestimates with no context |
| **Anti-bot resilience** | ✅ TLS fingerprinting + pre-warmed session pool | ⚠️ Breaks on every Zillow update |
| **Rent Zestimate** | ✅ Included | ⚠️ Sometimes |
| **Listing agent & broker contacts** | ✅ Name, phone, email, MLS in detail mode | ⚠️ Usually extra cost |
| **ZIP code, URL, and city search** | ✅ All three | ⚠️ Usually one |
| **For Sale / For Rent / Recently Sold** | ✅ All three | ⚠️ Usually for-sale only |

***

### What it scrapes from Zillow

**Search inputs:**

- Scrape Zillow by **ZIP code** — e.g. `["10001", "90210", "78701"]`
- Scrape Zillow by **city or neighborhood** URL — e.g. `https://www.zillow.com/austin-tx/`
- Scrape Zillow by **custom filtered search URL** — price, beds, sqft, property type, etc.
- Listing types: `for_sale`, `for_rent`, `recently_sold`

**Data extracted per property (detail mode):**

- **Pricing:** list price, Zestimate, Rent Zestimate, tax-assessed value
- **Property facts:** beds, baths, sqft, lot size, year built, property type, stories, HOA fee
- **Location:** full address, ZIP code, latitude, longitude
- **Real estate context:** days on market, listing status, MLS name, MLS ID
- **Agent & broker:** agent name, phone, email, broker name
- **Rich media:** hi-res photo URLs
- **Property description:** full listing description text

> **Not included:** year-by-year price/tax history, school ratings, and walk/transit/bike scores are served by Zillow's separate, heavily bot-protected GraphQL APIs and are **not** returned by this HTTP-only scraper. It focuses on the listing, valuation, specs, description, and agent-contact data it can deliver reliably at scale.

***

### Built for AI agents (MCP-native)

Most Zillow scrapers output JSON and stop there. Zillow Scraper Pro publishes a full **Model Context Protocol** schema so LLM agents (Claude, GPT, Cursor, LangChain, LlamaIndex) can reason about the data before calling it.

#### Three ways to use with AI

**1. Via the Apify MCP server (no code)**

```
Server URL: https://mcp.apify.com/mcp
```

Add to Claude Desktop, then ask naturally: *"Find 3-bed houses under $500K in Austin listed in the last 30 days."* Claude calls the actor, filters the results, and answers. No code, no SDK.

**2. Via the built-in local MCP server**

```bash
node src/mcp-server.js
```

Runs a standards-compliant MCP server on your machine, exposing `search_zillow`, `get_property_details`, and `bulk_scrape_zip` as callable tools. Connect any MCP client.

**3. Via the Apify API**
Same actor, standard REST/JS client. Use when you want a traditional scraper API without the AI layer.

#### Agent-friendly output fields

Every record includes three fields specifically for agent reasoning:

| Field | Purpose |
|---|---|
| `dataDepth` | `summary` | `detail` | `summary_fallback` — tells the agent whether to re-request with `dataDepth: "detail"` |
| `zestimateStatus` | `available` | `new_construction` | `not_published` — explains *why* a Zestimate is null instead of hiding it |
| `estimatedValuePPSF` | Comp-based valuation fallback computed from the median price-per-sqft in the same search. Useful when Zillow won't publish a Zestimate (new construction, coops, luxury). |
| `scrapedAt` | ISO 8601 — lets the agent assess data freshness |
| `source` | Always `"zillow"` — for multi-source pipelines |

***

### Anti-bot: why this one doesn't break

Zillow runs **Imperva / PerimeterX** with TLS fingerprinting, JavaScript canvas/WebGL fingerprinting, `navigator.webdriver` detection, and behavioral heuristics. Most Zillow scrapers on the market break within hours of a Zillow deploy. This actor uses:

1. **HTTP-only stealth with Chrome TLS fingerprinting** (`got-scraping`) — sub-second requests, no browser overhead, no JavaScript runtime to fingerprint
2. **Residential proxy routing** via Apify's residential pool — datacenter IPs are blocked at the edge
3. **Pre-warmed session pool** with session affinity — survives rate-limit bursts that kill fresh-session scrapers
4. **`__NEXT_DATA__` + `gdpClientCache` extraction** — pulls data from Zillow's embedded JSON payloads, so layout changes don't break selectors
5. **Auto-retry on PerimeterX challenges** — detects challenge pages and retries with a fresh residential IP (up to 4 retries, with exponential backoff)
6. **Configurable human-like delays** — 3–8 second jitter between requests (tunable per run)

The result: sub-minute runs at 20-property scale, and weeks between block incidents instead of hours.

***

### Input

#### Core fields

| Field | Type | Default | Description |
|---|---|---|---|
| `location` | string\[] | — | **Required.** ZIP codes (`"10001"`), city names (`"Austin, TX"`), or any Zillow URL. Mix freely. |
| `listingType` | string | `for_sale` | `for_sale`, `for_rent`, or `recently_sold` |
| `dataDepth` | string | `detail` | `summary` — fast, cheap (search-page data only). `detail` — rich, visits each listing page. `auto` — tries detail, falls back to summary on repeated failures. |
| `maxResults` | integer | `100` | Max properties to collect per run |
| `filters` | object | `{}` | Pre-scrape filters (see below) — reduces cost by skipping non-matching listings before detail fetches |

#### Filters object

| Filter | Type | Description |
|---|---|---|
| `minPrice` | integer | Minimum list price |
| `maxPrice` | integer | Maximum list price |
| `minBeds` | integer | Minimum bedrooms |
| `maxBeds` | integer | Maximum bedrooms |
| `minBaths` | number | Minimum bathrooms |
| `maxDaysOnMarket` | integer | Only listings on market ≤ N days |
| `propertyTypes` | string\[] | e.g. `["single_family", "condo", "townhouse"]` |

#### Advanced (optional)

Tucked under an `advanced` object so they don't clutter the main input. You rarely need to touch these.

| Field | Type | Default | Description |
|---|---|---|---|
| `advanced.proxyConfig` | object | RESIDENTIAL | Apify proxy settings — datacenter proxies will be blocked by Zillow |
| `advanced.maxConcurrency` | integer | `3` | Parallel requests — keep 1–5 for Zillow safety |
| `advanced.requestDelayMs` | integer | `4000` | Delay between requests in ms (3000–8000 recommended) |

#### Minimum input

One entry in `location` — that's it.

#### Examples

**Investor comp pull — 3BR homes under $600K in two Austin ZIP codes:**

```json
{
  "location": ["78701", "78702"],
  "listingType": "for_sale",
  "dataDepth": "detail",
  "maxResults": 50,
  "filters": {
    "minBeds": 3,
    "maxPrice": 600000,
    "propertyTypes": ["single_family", "townhouse"]
  }
}
```

**Rental market survey — city name, summary only (fast and cheap):**

```json
{
  "location": ["Austin, TX"],
  "listingType": "for_rent",
  "dataDepth": "summary",
  "maxResults": 200
}
```

**Direct Zillow search URL (paste any filtered search from your browser):**

```json
{
  "location": ["https://www.zillow.com/austin-tx/homes/3-_beds/?searchQueryState=..."],
  "listingType": "for_sale",
  "dataDepth": "detail",
  "maxResults": 100
}
```

**AI agent call via MCP (no JSON needed — Claude writes this for you):**

> "Find 3-bed houses under $500K in Austin listed in the last 30 days."

***

### Output schema

Each dataset item is one property. `dataDepth` tells you which tier the item came from.

#### Summary fields (all runs, `dataDepth: "summary"`)

```json
{
  "zpid": "12345678",
  "url": "https://www.zillow.com/homedetails/...",
  "address": "123 Main St, New York, NY 10001",
  "price": 850000,
  "beds": 3,
  "baths": 2,
  "sqft": 1400,
  "propertyType": "condo",
  "listingType": "FOR_SALE",
  "listingStatus": "For Sale",
  "daysOnMarket": 12,
  "zestimate": 860000,
  "zestimateStatus": "available",
  "rentZestimate": 4200,
  "estimatedValuePPSF": null,
  "latitude": 40.7128,
  "longitude": -74.006,
  "yearBuilt": 1985,
  "imgSrc": "https://...",
  "scrapedAt": "2026-04-15T12:00:00.000Z",
  "source": "zillow",
  "dataDepth": "summary"
}
```

#### Detail fields (`dataDepth: "detail"`)

All summary fields plus:

```json
{
  "lotSizeSqft": 2500,
  "stories": 3,
  "description": "Bright corner unit...",
  "monthlyHoaFee": 450,
  "taxAssessedValue": 720000,
  "taxAssessedYear": 2024,
  "annualHomeownersInsurance": 1200,
  "parkingSpaces": 1,
  "hasCooling": true,
  "hasHeating": true,
  "agent": {
    "agentName": "Jane Smith",
    "agentPhoneNumber": "212-555-0100",
    "agentEmail": "jane@example.com",
    "brokerName": "Compass",
    "mlsName": "REBNY",
    "mlsId": "REBNY-123456"
  },
  "photos": ["https://..."],
  "dataDepth": "detail"
}
```

> Fields like `priceHistory`, `taxHistory`, `schools`, and `walkScore`/`transitScore`/`bikeScore` exist on the record for schema stability but are populated only if Zillow exposes them in the page payload; via this HTTP-only method they are typically empty. See the FAQ.

***

### Pricing — two-tier pay-per-event

This actor uses **pay-per-event (PPE)** pricing. You pay only for what you actually use, and you get two distinct tiers so you never overpay for depth you didn't need.

| Event | Price | When you pay | Use when |
|---|---|---|---|
| `apify-actor-start` | **$0.00005** (first 5 seconds waived) | Once per run — Apify platform event, effectively free for almost all runs | Automatic |
| `search-page-processed` | **$0.002** | Per ZIP / search URL handled | Always — covers the anti-bot cost of the search endpoint |
| `property-summary-returned` | **$0.003** | Per property with ~20 core fields (address, price, **Zestimate**, beds, baths, sqft, yearBuilt, agent, photos) | **Monitoring, alerting, bulk exports** — when you need breadth over depth |
| `property-detail-enriched` | **$0.015** | Per property with 40+ fields (full description, HOA, tax-assessed value, complete specs, additional photos, agent & broker contacts) | **Comp analysis, lead generation, due diligence** — when you need depth over breadth |

**Example costs:**

- Daily monitoring sweep of 200 ZIP codes × 50 properties summary = $30.40 / day → **$912 / month**
- Weekly deep comp analysis of 100 properties with full detail = $1.50 / week → **$6 / month**
- One-time market report: 500 properties detail-mode = $7.50

Compare to single-tier competitors: typical detail-scrapers charge $0.003–$0.005 per property regardless of depth, so you pay the same for shallow fields as for the full description + specs + agent-contact stack. With Zillow Scraper Pro you only pay the premium when you actually need the premium data.

***

### Usage examples

#### Scrape all Zillow for-sale listings in a ZIP code

```json
{
  "location": ["10001"],
  "listingType": "for_sale",
  "dataDepth": "detail",
  "maxResults": 200
}
```

#### Monitor a city in summary mode (cheapest possible)

```json
{
  "location": ["https://www.zillow.com/new-york-ny/homes-for-sale/"],
  "listingType": "for_sale",
  "dataDepth": "summary",
  "maxResults": 500
}
```

#### Nightly rental-market sweep across multiple ZIPs

```json
{
  "location": ["90210", "90036", "90024"],
  "listingType": "for_rent",
  "dataDepth": "detail",
  "maxResults": 300,
  "advanced": {
    "requestDelayMs": 5000
  }
}
```

#### Recently sold comps for an investor's target ZIP

```json
{
  "location": ["78701"],
  "listingType": "recently_sold",
  "dataDepth": "detail",
  "maxResults": 100
}
```

***

### Deployment

#### Prerequisites

- [Apify CLI](https://docs.apify.com/cli): `npm install -g apify-cli`
- Apify account with residential proxy access

#### Steps

```bash
cd zillow-scraper-pro
npm install
apify login
apify run        # local test
apify push       # deploy to Apify Store
```

#### Local testing input

Create `.actor/input.json`:

```json
{
  "location": ["10001"],
  "listingType": "for_sale",
  "dataDepth": "detail",
  "maxResults": 10,
  "advanced": {
    "requestDelayMs": 3000
  }
}
```

***

### Troubleshooting

**Empty results?** Zillow may have shipped a change. Patches ship within 48 hours of a confirmed break — file an Issue on the actor page.

**Getting blocked?** Confirm `advanced.proxyConfig` is set to `RESIDENTIAL`. Datacenter IPs are blocked at Zillow's edge immediately.

**Null `zestimate`?** Check `zestimateStatus`. It will be one of:

- `available` — Zillow published a value (in the `zestimate` field)
- `new_construction` — property built in the last 5 years; Zillow doesn't publish Zestimates for these. Use `estimatedValuePPSF` as a comp-based fallback.
- `not_published` — coops, mixed-use, or luxury listings where Zillow itself declines to publish. Fallback also available when sqft is known.

**Slow runs?** `advanced.requestDelayMs` of 3000–8000ms is the safe range for Zillow. Lowering below 2000ms significantly increases block rates.

**Running into the $5 Apify free-tier limit?** Start with `dataDepth: "summary"` and a small `maxResults` to explore the schema. Detail mode is designed for production use where the depth justifies the per-property price.

***

### Frequently asked questions

**Q: How is this different from `maxcopell/zillow-scraper`?**
A: That scraper is search-only at $0.002/property; no detail pages, no MCP, no Zestimate transparency. Zillow Scraper Pro gives you both tiers in one actor plus AI-agent integration.

**Q: Does this work for Zillow rentals?**
A: Yes. Set `listingType: "for_rent"`. Both Zestimate and Rent Zestimate are extracted in detail mode.

**Q: Can it handle recently sold properties?**
A: Yes. Set `listingType: "recently_sold"` to pull sold comps for investor analysis.

**Q: Does this bypass Zillow's login wall?**
A: This actor only scrapes publicly accessible Zillow pages. It does not access logged-in-only data, scrape personal information beyond what Zillow publishes, or violate authenticated-only features.

**Q: Is scraping Zillow legal?**
A: Web scraping public pages is generally permitted under the hiQ v. LinkedIn precedent for publicly available data, but you are responsible for complying with Zillow's Terms of Service and applicable laws in your jurisdiction. This actor is provided for legitimate research, due diligence, and AI tool-use scenarios.

**Q: Can I use this commercially?**
A: Yes. Output is yours; usage is subject to Apify's terms and Zillow's ToS. The actor source is Apache-2.0 licensed.

***

### Changelog

#### v3.1 — April 2026 *(current)*

Major performance + link-correctness pass.

- **Performance:** sub-minute ZIP scrapes at 50-property scale (previously ~3 min)
- **Routing:** correct city-name URL handling for `for_rent` and `recently_sold`
- **Pagination:** query-string safety — prevents duplicate `searchQueryState` params on page 2+
- **URL pass-through:** direct Zillow URL inputs are no longer re-slugged
- **Proxy pool:** reduced size for faster warm-ups
- **Bandwidth:** detail fetches no longer race three proxies in parallel — ~2/3 bandwidth cut with no measurable hit-rate loss

#### v2.9 — April 2026

Output-quality and pricing release.

- **New field:** `zestimateStatus` (`available` / `new_construction` / `not_published`) — explains *why* a Zestimate is null
- **New field:** `estimatedValuePPSF` — comp-based valuation fallback when Zillow declines to publish
- **New field:** `rentZestimate` extracted in detail mode
- **Pricing:** moved to tiered pay-per-event (search / summary / detail) — pay only for the depth you use
- **MCP:** built-in MCP server added (`src/mcp-server.js`)

***

### What's next

Public roadmap — these are committed for the next two release cycles:

- **Webhook output mode** — push new listings into a webhook URL as they're scraped, for real-time monitoring pipelines
- **Saved-search alerts** — actor input that resolves a saved Zillow search and only emits *new* listings since the last run
- **Zillow rental Zestimate history** — full rent-history time series for `for_rent` listings
- **Per-listing photo-count cap** — keep dataset size predictable when properties have 60+ photos
- **Snowflake / BigQuery direct output** — first-party Apify integration templates, not just generic webhook

Have a request? Open an issue on the actor's Apify Store page.

***

### License

Apache 2.0

***

### Related searches

Common questions and workflows this actor is built to serve:

- *How do I scrape Zillow listings in bulk?* → Set `location` to a list of ZIP codes and `dataDepth: "summary"` for the cheapest sweep.
- *Is there a Zillow API I can use with Claude or GPT?* → Yes — this actor ships with a built-in MCP server, usable from Claude Desktop, Cursor, or any MCP client.
- *How do I extract Zestimates and Rent Zestimates programmatically?* → Both are first-class fields in detail mode. `zestimateStatus` tells you *why* a value is missing (new construction, coop, not published) so you can fall back to `estimatedValuePPSF`.
- *How do I get Zillow recently sold comps?* → Set `listingType: "recently_sold"` with the target ZIP or city.
- *How do I pull Zillow rental listings for a market?* → Set `listingType: "for_rent"` with ZIPs or a city name like `"Austin, TX"`.
- *Does this extract school ratings, walk scores, or full price/tax history?* → No. Those are served by Zillow's separate, heavily bot-protected GraphQL APIs and are not returned by this HTTP-only scraper. Detail mode focuses on listing, valuation, specs, description, and agent-contact data.
- *Does it include tax-assessed value?* → Yes, when Zillow publishes it (`taxAssessedValue`), along with `taxAssessedYear`. Year-by-year tax history is not included.
- *Can I feed a filtered Zillow search URL directly?* → Yes — paste any Zillow URL (ZIP path, city slug, or full `searchQueryState` URL) into `location` and the actor passes it through unchanged.
- *How do I monitor a ZIP code for new listings nightly?* → Schedule a summary-mode run with `filters.maxDaysOnMarket: 1`.
- *Is there a free Zillow API?* → Zillow's official API was retired years ago. This actor is the closest equivalent: structured JSON output, REST-callable via Apify, and only billed for what you scrape.
- *How do I find FSBO (for-sale-by-owner) listings?* → Use a filtered Zillow search URL with FSBO selected; pass it as the `location` and the actor passes through the filter unchanged.
- *Can I export Zillow data to Excel or Google Sheets?* → Yes — Apify's dataset tab exports CSV, Excel, JSON, and HTML. Use the Zapier or Make connector for direct Sheets pushes.
- *How does this compare to other Apify Zillow scrapers?* → See the [Why Zillow Scraper Pro](#why-zillow-scraper-pro) comparison table.

# Actor input Schema

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

ZIP codes to search. Add one per line — e.g. 10001, 90210, 78701.

## `startUrls` (type: `array`):

City names ("Austin, TX"), neighborhood names, or any Zillow search URL. Use this if you want to search beyond ZIP codes or paste a filtered Zillow URL from your browser.

## `listingType` (type: `string`):

What kind of listings to pull.

## `includeSingleFamily` (type: `boolean`):

Include single-family homes.

## `includeCondo` (type: `boolean`):

Include condos and co-ops.

## `includeTownhouse` (type: `boolean`):

Include townhouses.

## `includeMultiFamily` (type: `boolean`):

Include duplexes, triplexes, and other multi-family properties.

## `includeApartment` (type: `boolean`):

Include apartment units.

## `includeManufactured` (type: `boolean`):

Include manufactured and mobile homes.

## `includeLand` (type: `boolean`):

Include vacant land and lots.

## `dataDepth` (type: `string`):

Summary: fast and cheap — returns ~20 fields from the search page only. Detail: visits each listing page for 45+ fields including price history, tax records, schools, and agent info (costs ~5× more per property). Auto: tries detail, falls back to summary if Zillow blocks the detail page.

## `maxResults` (type: `integer`):

Maximum number of properties to collect across all ZIP codes and locations.

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

Only include listings at or above this price.

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

Only include listings at or below this price.

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

Minimum number of bedrooms.

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

Maximum number of bedrooms.

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

Minimum number of bathrooms (decimals allowed for half-baths).

## `maxDaysOnMarket` (type: `integer`):

Only include listings that have been on Zillow for this many days or fewer. Useful for finding recently listed properties.

## `proxyConfig` (type: `object`):

Residential proxies are required — Zillow blocks datacenter IPs at the edge.

## Actor input object example

```json
{
  "zipCodes": [
    "10001",
    "90210"
  ],
  "startUrls": [
    {
      "url": "https://www.zillow.com/austin-tx/"
    }
  ],
  "listingType": "for_sale",
  "includeSingleFamily": true,
  "includeCondo": true,
  "includeTownhouse": true,
  "includeMultiFamily": true,
  "includeApartment": true,
  "includeManufactured": false,
  "includeLand": false,
  "dataDepth": "detail",
  "maxResults": 100,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All scraped properties. Defaults to the Listings view; switch to Full property detail for the deep fields.

# 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 = {
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stackrelay/zillow-scraper-pro").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 = { "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    } }

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

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

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

```

## CLI example

```bash
echo '{
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call stackrelay/zillow-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stackrelay/zillow-scraper-pro",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Zillow Scraper Pro",
        "description": "Scrape Zillow property listings and deep details by ZIP code or URL. Returns address, price, beds, baths, sqft, Zestimate, price history, tax records, school ratings, and agent info. Anti-bot resilient via residential proxies and fingerprint spoofing. Supports for_sale, for_rent, and recently_sold.",
        "version": "3.2",
        "x-build-id": "ViPbr3HkrberL1HtB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stackrelay~zillow-scraper-pro/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stackrelay-zillow-scraper-pro",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stackrelay~zillow-scraper-pro/runs": {
            "post": {
                "operationId": "runs-sync-stackrelay-zillow-scraper-pro",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stackrelay~zillow-scraper-pro/run-sync": {
            "post": {
                "operationId": "run-sync-stackrelay-zillow-scraper-pro",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "zipCodes": {
                        "title": "ZIP Codes",
                        "type": "array",
                        "description": "ZIP codes to search. Add one per line — e.g. 10001, 90210, 78701.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "City / Neighborhood / Custom URL (optional)",
                        "type": "array",
                        "description": "City names (\"Austin, TX\"), neighborhood names, or any Zillow search URL. Use this if you want to search beyond ZIP codes or paste a filtered Zillow URL from your browser.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "listingType": {
                        "title": "Listing Type",
                        "enum": [
                            "for_sale",
                            "for_rent",
                            "recently_sold"
                        ],
                        "type": "string",
                        "description": "What kind of listings to pull.",
                        "default": "for_sale"
                    },
                    "includeSingleFamily": {
                        "title": "Single Family",
                        "type": "boolean",
                        "description": "Include single-family homes.",
                        "default": true
                    },
                    "includeCondo": {
                        "title": "Condo",
                        "type": "boolean",
                        "description": "Include condos and co-ops.",
                        "default": true
                    },
                    "includeTownhouse": {
                        "title": "Townhouse",
                        "type": "boolean",
                        "description": "Include townhouses.",
                        "default": true
                    },
                    "includeMultiFamily": {
                        "title": "Multi-Family",
                        "type": "boolean",
                        "description": "Include duplexes, triplexes, and other multi-family properties.",
                        "default": true
                    },
                    "includeApartment": {
                        "title": "Apartment",
                        "type": "boolean",
                        "description": "Include apartment units.",
                        "default": true
                    },
                    "includeManufactured": {
                        "title": "Manufactured / Mobile Home",
                        "type": "boolean",
                        "description": "Include manufactured and mobile homes.",
                        "default": false
                    },
                    "includeLand": {
                        "title": "Land / Lot",
                        "type": "boolean",
                        "description": "Include vacant land and lots.",
                        "default": false
                    },
                    "dataDepth": {
                        "title": "Data Depth",
                        "enum": [
                            "summary",
                            "detail",
                            "auto"
                        ],
                        "type": "string",
                        "description": "Summary: fast and cheap — returns ~20 fields from the search page only. Detail: visits each listing page for 45+ fields including price history, tax records, schools, and agent info (costs ~5× more per property). Auto: tries detail, falls back to summary if Zillow blocks the detail page.",
                        "default": "detail"
                    },
                    "maxResults": {
                        "title": "Max Properties",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of properties to collect across all ZIP codes and locations.",
                        "default": 100
                    },
                    "minPrice": {
                        "title": "Min Price ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings at or above this price."
                    },
                    "maxPrice": {
                        "title": "Max Price ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings at or below this price."
                    },
                    "minBeds": {
                        "title": "Min Bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Minimum number of bedrooms."
                    },
                    "maxBeds": {
                        "title": "Max Bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of bedrooms."
                    },
                    "minBaths": {
                        "title": "Min Bathrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "number",
                        "description": "Minimum number of bathrooms (decimals allowed for half-baths)."
                    },
                    "maxDaysOnMarket": {
                        "title": "Max Days on Market",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Only include listings that have been on Zillow for this many days or fewer. Useful for finding recently listed properties."
                    },
                    "proxyConfig": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Residential proxies are required — Zillow blocks datacenter IPs at the edge."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
