# Zillow Scraper - Real Estate Listings, Agents & Zestimate (`quiet_bark/zillow-scraper`) Actor

Scrape Zillow listings, agent contacts, prices, Zestimate, photos, price & tax history at scale. Two modes: DETAIL (per URL or ZPID) and SEARCH (paginated by city, ZIP, neighborhood). HTTP-only with Chrome TLS impersonation + US residential proxies. No Zillow API needed. Export JSON, CSV, Excel.

- **URL**: https://apify.com/quiet\_bark/zillow-scraper.md
- **Developed by:** [ApiMaster](https://apify.com/quiet_bark) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 9 total users, 3 monthly users, 94.4% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 results

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/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 — Extract Zillow Real Estate Data at Scale

**The fastest, no-browser Zillow scraper for Apify.** Extract full listing details, agent contacts, price history, Zestimate, photos, and search results from Zillow.com — without the official Zillow API, without a headless browser, and without getting blocked. Built on pure HTTP requests with Chrome TLS-fingerprint impersonation, US residential proxies, and automatic captcha bypass.

> Scrape **For Sale**, **Sold**, and **For Rent** Zillow listings. Search by **city**, **ZIP code**, **neighborhood**, or **region URL**. Paginate up to **820 listings** per query.

---

### 🔥 What does Zillow Scraper do?

Zillow Scraper is a **drop-in replacement for the Zillow API** that pulls every public field from a Zillow property page or search result. Use it to:

- 🏘️ **Extract Zillow listing data at scale** — price, beds, baths, square footage, lot size, year built, home type
- 📍 **Search Zillow by ZIP code, city, neighborhood, or address** with full pagination across all result pages
- 🏠 **Scrape For Sale, Sold, and For Rent** properties from any US region
- 📩 **Build real estate agent contact lists** — listing agent name, phone, email, license number, broker info
- 💰 **Capture full price history, tax history, and Zestimate** (including rent Zestimate)
- 🏊 **Pull property amenities** — pool, fireplace, parking, security, HOA, schools, nearby homes
- 🖼️ **Download high-resolution photo URLs** (50+ photos per listing)
- 📊 **Export Zillow data** to JSON, CSV, Excel, XML, or RSS
- 🔌 **Integrate with Make, Zapier, n8n, Google Sheets** via Apify webhooks and integrations

---

### ⚙️ Two scraping modes

#### Mode 1 — `DETAIL`: full property data per listing
Provide individual **Zillow listing URLs** or raw **ZPIDs**. The scraper returns the complete native Zillow property payload — the same data that powers the Zillow website itself (extracted from the embedded GraphQL cache).

#### Mode 2 — `SEARCH`: paginated search results by query
Provide a search query (`"Beverly Hills, CA"`, `"90210"`, `"sonoma-ca"`) or a full Zillow search URL. The scraper paginates through every result page and emits one summary item per listing — `zpid`, `detailUrl`, `address`, `price`, `beds`, `baths`, `homeStatus`, `zestimate`, `latLong`, etc.

> 💡 **Pro tip:** chain `SEARCH → DETAIL` by feeding the output dataset of a SEARCH run into the `datasetId` input of a DETAIL run.

---

### 📥 Input

#### SEARCH mode
```json
{
  "mode": "SEARCH",
  "searchQueries": ["Beverly Hills, CA", "90210", "https://www.zillow.com/sonoma-ca/"],
  "propertyStatus": "FOR_SALE",
  "maxPagesPerSearch": 20,
  "maxConcurrency": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
````

#### DETAIL mode

```json
{
  "mode": "DETAIL",
  "startUrls": [
    { "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/" }
  ],
  "zpids": ["15800416"],
  "datasetId": "optional-id-from-a-previous-SEARCH-run"
}
```

| Field | Mode | Description |
|---|---|---|
| `mode` | both | `DETAIL` or `SEARCH` |
| `startUrls` | DETAIL | Zillow `/homedetails/` URLs |
| `zpids` | DETAIL | Raw ZPIDs (e.g. `"15800416"`) |
| `datasetId` | DETAIL | Apify dataset id from a previous SEARCH or third-party Zillow scraper run |
| `searchQueries` | SEARCH | Free-text queries, region slugs, or full Zillow URLs |
| `maxPagesPerSearch` | SEARCH | Pagination cap per query (1–20, default 20) |
| `propertyStatus` | both | `FOR_SALE` / `SOLD` / `FOR_RENT` / `ANY` |
| `maxConcurrency` | both | Parallel requests (default 5) |
| `maxRetries` | both | Retry budget on 4xx/5xx |
| `proxy` | both | Apify proxy config — **US residential by default** |
| `rawOutput` | DETAIL | Include raw GraphQL cache under `_raw` |

***

### 📤 Output

#### DETAIL mode (one item per listing)

Mirrors Zillow's native property payload — over **150 fields** including:

- **Identity**: `zpid`, `hdpUrl`, `mlsid`, `parcelId`, `countyFIPS`
- **Address**: `streetAddress`, `city`, `state`, `zipcode`, `latitude`, `longitude`, `county`, `neighborhoodRegion`
- **Listing**: `homeStatus` (FOR\_SALE / SOLD / FOR\_RENT), `price`, `lastSoldPrice`, `daysOnZillow`, `datePostedString`
- **Property**: `bedrooms`, `bathrooms`, `livingArea`, `lotSize`, `yearBuilt`, `homeType`
- **Detailed facts** (`resoFacts`): appliances, cooling, heating, parking, HOA, view, flooring, roofing, foundation, schools
- **Agent / broker** (`attributionInfo`): `agentName`, `agentPhoneNumber`, `agentEmail`, `agentLicenseNumber`, `brokerName`, `brokerPhoneNumber`, `mlsId`, `mlsName`
- **Financial**: `zestimate`, `rentZestimate`, `taxHistory[]`, `priceHistory[]`, `monthlyHoaFee`, `propertyTaxRate`, `mortgageZHLRates`
- **Media**: `responsivePhotos[]` (high-res), `photoCount`, `virtualTourUrl`, `hiResImageLink`, `desktopWebHdpImageLink`
- **Locale**: `nearbyCities[]`, `nearbyNeighborhoods[]`, `nearbyZipcodes[]`, `nearbyHomes[]`, `comps[]`, `schools[]`
- **Scheduling**: `tourEligibility`, `openHouseSchedule`

#### SEARCH mode (one item per result row)

- `searchQuery`, `page`, `sourceUrl`
- `zpid`, `detailUrl`, `imgSrc`
- `price`, `unformattedPrice`, `address`, `addressStreet`, `addressCity`, `addressState`, `addressZipcode`
- `beds`, `baths`, `area`, `latLong`
- `homeStatus`, `homeType`, `daysOnZillow`, `zestimate`, `rentZestimate`
- `brokerName`, `listing_sub_type`, `hdpData.homeInfo.*`

***

### 🛡️ How it bypasses Zillow's anti-bot (PerimeterX / HUMAN)

Most public Zillow scrapers fail because Zillow fingerprints the **TLS handshake** and **HTTP/2 SETTINGS frame** before any header or cookie is checked. This scraper uses:

- **`curl_cffi` with Chrome TLS impersonation** — every request looks identical to a real Chrome browser at the byte level (cipher suites, ALPN, JA3/JA4, HTTP/2 priority frames).
- **US residential proxies** by default — Zillow only serves data to US visitors and aggressively blocks datacenter ASNs.
- **Fresh proxy session ID per retry** — `uuid` rotates the Apify exit IP on every captcha or proxy failure.
- **Dedicated retry budgets**: 5 retries for proxy errors + 5 retries for captcha challenges, **independent** of the main retry counter so transient blocks never exhaust your budget.
- **15-second timeout**, exponential backoff with jitter.
- **No headless browser** → 5–10× faster and cheaper than Playwright/Puppeteer scrapers.

***

### 💼 Use cases

- 📈 **Real estate market research** and competitive price analysis
- 🎯 **Lead generation** — build targeted real estate agent contact lists
- 🤖 **Train ML models** on US housing data (Zestimate validation, price prediction)
- 📊 **Investor dashboards** monitoring new listings in target neighborhoods
- 💵 **Compare Zestimate vs actual sale price** for valuation accuracy
- 🏗️ **Custom real estate search engines** and aggregators
- 📰 **News and journalism** — track housing trends by ZIP code
- 🔔 **Price-drop alerts** for specific properties

***

### 💰 Pricing

Pay-per-result on the Apify platform. With Apify's **Free plan** ($5/month free credits) you can scrape ~1,500 listings for free. The **Starter plan** ($49/month) gives you ~16,000 listings monthly. Higher tiers scale linearly.

Apify proxy traffic to Zillow is included in the listed pay-per-result price.

***

### ❓ FAQ

**Q: Do I need a Zillow API key?**
No. This scraper extracts only publicly visible Zillow data — exactly what any visitor to zillow.com can see.

**Q: Is it legal to scrape Zillow?**
Public real estate data (price, address, beds, baths, etc.) is legally scrapeable in most jurisdictions. Personal data (agent emails, phone numbers) is regulated under GDPR / CCPA — consult your legal team for commercial use cases that store or process such data.

**Q: Can I get more than 1,500 results for free?**
Yes — Apify's free $5 credits renew every month.

**Q: Does the scraper paginate automatically?**
Yes. In SEARCH mode it walks through every page up to `maxPagesPerSearch` (default 20 pages × 41 listings = ~820 results per query).

**Q: Can I scrape sold and for-rent properties?**
Yes. Set `propertyStatus` to `SOLD` or `FOR_RENT` in SEARCH mode, or just provide any `/homedetails/` URL in DETAIL mode — the scraper handles all three statuses uniformly.

**Q: Can I integrate this with Zapier / Make / n8n / Google Sheets?**
Yes. Apify provides native integrations and webhooks for all major automation platforms. Trigger a Zillow scrape from a Google Sheet, send results to Slack, or pipe new listings directly into your CRM.

**Q: What proxy should I use?**
**US residential.** Already configured by default. Datacenter, mobile, or non-US proxies will be blocked by PerimeterX.

**Q: How fast is it?**
\~2 seconds per listing through US residential proxy. With `maxConcurrency: 10` you can process 1,000 listings in ~3–5 minutes.

**Q: What happens if a listing is blocked?**
The scraper auto-rotates the Apify proxy session (new IP) and retries up to 5 times. Failed URLs are emitted as `{"sourceUrl": "...", "error": "..."}` items so you never lose visibility.

**Q: Can I export to CSV / Excel?**
Yes. Apify datasets export to JSON, CSV, Excel, XML, RSS, and HTML out of the box. You can also stream results via the Apify API in any language (Python, Node.js, Go, etc.).

***

### 🛠️ Run locally

```bash
git clone <repo>
cd zillow_apify
pip install -r requirements.txt
apify run                              ## uses storage/key_value_stores/default/INPUT.json
## or
python -m src
```

Deploy to Apify with one command:

```bash
deploy.bat                             ## Windows
## or
apify push --force
```

***

### 🏷️ Tags

`zillow scraper` · `zillow api` · `zillow data extraction` · `real estate scraper` · `property scraper` · `mls scraper` · `home listings` · `for sale` · `sold homes` · `for rent` · `zestimate` · `real estate api` · `housing data` · `zillow zip code search` · `zillow agents` · `real estate web scraping` · `python zillow scraper` · `apify zillow` · `zillow listing data` · `real estate lead generation` · `property data api` · `us housing market data` · `mls data` · `realtor scraper` · `homes for sale data`

***

🔗 **Built for [Apify](https://apify.com)** · Pure HTTP, no browser · TLS impersonation · US residential proxies · DETAIL & SEARCH modes

# Actor input Schema

## `mode` (type: `string`):

DETAIL: deep-scrape individual listing pages. SEARCH: paginate through a Zillow search and emit each listing summary.

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

List of Zillow property URLs (homedetails / hdp pages). Used only in DETAIL mode.

## `zpids` (type: `array`):

Optional list of raw ZPIDs to scrape. Each ZPID is resolved to https://www.zillow.com/homedetails/{zpid}\_zpid/. Used only in DETAIL mode.

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

Optional Apify dataset ID (e.g. from a previous SEARCH run or a Zillow Search Scraper). Items are expected to expose a `zpid`, `detailUrl`, `hdpUrl` or `url` field.

## `searchQueries` (type: `array`):

List of search inputs. Each item can be a free-text query ("Sonoma, CA", "Beverly Hills, CA", "90210"), a Zillow region slug ("sonoma-ca"), or a full Zillow search URL ("https://www.zillow.com/sonoma-ca/"). Used only in SEARCH mode.

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

Hard cap on pagination depth per search query. Zillow exposes up to 20 pages × 41 results = 820 listings per region URL. Used only in SEARCH mode.

## `propertyStatus` (type: `string`):

DETAIL mode: informational filter. SEARCH mode: chooses the search slug suffix (FOR\_SALE → /, SOLD → /sold/, FOR\_RENT → /rentals/).

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

How many requests to fetch in parallel.

## `maxRetries` (type: `integer`):

Retries on 403/429/5xx and bot-block pages (in addition to dedicated proxy/captcha retry budgets).

## `proxy` (type: `object`):

Apify proxy configuration. US residential proxies are the default and strongly recommended — Zillow only serves data to US visitors and aggressively blocks datacenter traffic.

## `rawOutput` (type: `boolean`):

If enabled, each DETAIL item also contains the original `gdpClientCache` payload under `_raw`.

## Actor input object example

```json
{
  "mode": "DETAIL",
  "startUrls": [
    {
      "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/"
    }
  ],
  "zpids": [],
  "searchQueries": [
    "Sonoma, CA"
  ],
  "maxPagesPerSearch": 20,
  "propertyStatus": "ANY",
  "maxConcurrency": 5,
  "maxRetries": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "rawOutput": false
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/"
        }
    ],
    "searchQueries": [
        "Sonoma, CA"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("quiet_bark/zillow-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 = {
    "startUrls": [{ "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/" }],
    "searchQueries": ["Sonoma, CA"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("quiet_bark/zillow-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/"
    }
  ],
  "searchQueries": [
    "Sonoma, CA"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call quiet_bark/zillow-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Zillow Scraper - Real Estate Listings, Agents & Zestimate",
        "description": "Scrape Zillow listings, agent contacts, prices, Zestimate, photos, price & tax history at scale. Two modes: DETAIL (per URL or ZPID) and SEARCH (paginated by city, ZIP, neighborhood). HTTP-only with Chrome TLS impersonation + US residential proxies. No Zillow API needed. Export JSON, CSV, Excel.",
        "version": "0.1",
        "x-build-id": "sO9KdmA7dLiza4ycO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/quiet_bark~zillow-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-quiet_bark-zillow-scraper",
                "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/quiet_bark~zillow-scraper/runs": {
            "post": {
                "operationId": "runs-sync-quiet_bark-zillow-scraper",
                "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/quiet_bark~zillow-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-quiet_bark-zillow-scraper",
                "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": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "DETAIL",
                            "SEARCH"
                        ],
                        "type": "string",
                        "description": "DETAIL: deep-scrape individual listing pages. SEARCH: paginate through a Zillow search and emit each listing summary.",
                        "default": "DETAIL"
                    },
                    "startUrls": {
                        "title": "Start URLs (DETAIL mode)",
                        "type": "array",
                        "description": "List of Zillow property URLs (homedetails / hdp pages). Used only in DETAIL mode.",
                        "default": [
                            {
                                "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/"
                            }
                        ],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "zpids": {
                        "title": "ZPIDs (DETAIL mode)",
                        "type": "array",
                        "description": "Optional list of raw ZPIDs to scrape. Each ZPID is resolved to https://www.zillow.com/homedetails/{zpid}_zpid/. Used only in DETAIL mode.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "datasetId": {
                        "title": "Input Dataset ID (DETAIL mode)",
                        "type": "string",
                        "description": "Optional Apify dataset ID (e.g. from a previous SEARCH run or a Zillow Search Scraper). Items are expected to expose a `zpid`, `detailUrl`, `hdpUrl` or `url` field."
                    },
                    "searchQueries": {
                        "title": "Search queries (SEARCH mode)",
                        "type": "array",
                        "description": "List of search inputs. Each item can be a free-text query (\"Sonoma, CA\", \"Beverly Hills, CA\", \"90210\"), a Zillow region slug (\"sonoma-ca\"), or a full Zillow search URL (\"https://www.zillow.com/sonoma-ca/\"). Used only in SEARCH mode.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPagesPerSearch": {
                        "title": "Max pages per search",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Hard cap on pagination depth per search query. Zillow exposes up to 20 pages × 41 results = 820 listings per region URL. Used only in SEARCH mode.",
                        "default": 20
                    },
                    "propertyStatus": {
                        "title": "Expected property status",
                        "enum": [
                            "ANY",
                            "FOR_SALE",
                            "SOLD",
                            "FOR_RENT"
                        ],
                        "type": "string",
                        "description": "DETAIL mode: informational filter. SEARCH mode: chooses the search slug suffix (FOR_SALE → /, SOLD → /sold/, FOR_RENT → /rentals/).",
                        "default": "ANY"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "How many requests to fetch in parallel.",
                        "default": 5
                    },
                    "maxRetries": {
                        "title": "Max retries per URL",
                        "minimum": 0,
                        "maximum": 15,
                        "type": "integer",
                        "description": "Retries on 403/429/5xx and bot-block pages (in addition to dedicated proxy/captcha retry budgets).",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. US residential proxies are the default and strongly recommended — Zillow only serves data to US visitors and aggressively blocks datacenter traffic.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    },
                    "rawOutput": {
                        "title": "Include raw GraphQL cache (DETAIL mode)",
                        "type": "boolean",
                        "description": "If enabled, each DETAIL item also contains the original `gdpClientCache` payload under `_raw`.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
