# Zillow Listings Scraper -- No Login Required (`crowdpull/zillow-listings-scraper`) Actor

Extract Zillow property listings, Zestimates, price labels, and optional detail data. No login or cookies needed. Supports city/ZIP search, Zillow URL mode, and address or ZPID lookup.

- **URL**: https://apify.com/crowdpull/zillow-listings-scraper.md
- **Developed by:** [Crowd Pull](https://apify.com/crowdpull) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 property extracteds

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

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 Listings Scraper -- No Login Required

Scrape property listings, Zestimates, agent contact info, price history, and tax records from Zillow. No login, no cookies. Search by location, paste a Zillow URL, or look up specific addresses -- one actor does all three.

### Smart Scrape: stop re-scraping data you already have

Every other per-result Zillow scraper on the Apify Store charges you the same price whether you're pulling a property for the first time or the tenth. This one doesn't.

Turn on Smart Scrape and the actor keeps a persistent cache of every property it's seen. On the next run, anything already in the cache gets skipped. You pay $0.50/1K for the skip instead of the full extraction price.

Say you scrape Houston every week. Week 1 pulls 2,000 listings. Week 2, 1,700 of those haven't changed. Smart Scrape skips them and only extracts the 300 new ones. That's 300 extractions + 1,700 cache checks instead of 2,000 extractions -- about 60% cheaper.

No other per-result Zillow scraper does this.

### Three modes, one actor

Other Zillow scrapers make you use separate actors for searching vs. looking up individual properties. This one combines them:

- **Search** -- find listings by city, ZIP, or neighborhood with filters applied programmatically
- **URL** -- paste a Zillow search URL and the actor picks up its filters directly
- **Lookup** -- fetch full details for specific addresses or ZPIDs

### What you get

#### From search (41 fields per property)
Address, coordinates, price, buyer-facing price label, price explanation, listing flags, Zestimate, rent Zestimate, tax assessed value, beds, baths, sqft, lot size, home type, listing status, days on Zillow, 3D tour/video flags, broker name, primary image, detail URL.

#### With detail enrichment (optional)
Set `includeDetails: true` to hit each property's detail page. This adds:
- Agent name, phone, email
- Broker/agency name
- Year built, description, county, MLS ID
- All photo URLs (not just the thumbnail)
- Monthly HOA fee and property tax rate
- Price history -- every listing, sale, and price change with dates and agents
- Tax history -- assessed values and tax payments going back 20+ years

### Filters

| Filter | Options |
|--------|---------|
| Listing type | For Sale, Recently Sold, For Rent, Foreclosures |
| Price range | Min/Max |
| Bedrooms | Minimum |
| Bathrooms | Minimum |
| Square feet | Min/Max |
| Lot size | Min/Max |
| Year built | Min/Max |
| Home types | Houses, Townhomes, Multi-Family, Condos, Land, Apartments, Manufactured |
| Sort by | Newest, Relevance, Price (Low/High), Bedrooms, Bathrooms, Sqft, Lot Size, Zestimate |
| Days on Zillow | 1 day to 36 months |
| Amenities | Pool, AC, Waterfront, Single Story, Garage, Basement, 3D Tour |

### Search extraction

With residential proxies, search mode uses Zillow's server-rendered search result page data first: it builds a region-locked `searchQueryState` URL, reads the `__NEXT_DATA__` payload, and paginates with Zillow's own `/2_p/`, `/3_p/` paths. This keeps ZIP and city searches tied to Zillow's canonical region instead of an approximate map box.

If the SRP path is blocked or no proxy is available, the actor falls back to Zillow's async search API. For ZIP searches, fallback rows are post-filtered to the requested ZIP so nearby ZIP codes do not leak into the output.

Zillow caps visible SRP results at about 500 listings. When that cap applies, rows include `resultsCapped: true` and `scrapeWarnings` includes `zillow_srp_result_cap`. Narrow the region or filters for full coverage.

### How it compares

| | CrowdPull | Other PPE scrapers |
|---|---|---|
| Smart Scrape dedup | Built-in, $0.50/1K skips | Not available |
| Modes | Search + URL + Lookup | Usually one |
| Memory | 2 GB default, HTTP-first search | 1-4 GB, often browser-based |
| Price + tax history | Included with detail enrichment | Separate actor or missing |
| Filters | Programmatic -- no URL wrangling | Most need a Zillow URL |
| Agent contact info | Name, phone, email | Varies |

### Pricing

| Event | Per 1,000 | Notes |
|-------|-----------|-------|
| Property extracted | $2.00 (FREE/BRONZE tier) | Volume discounts up to 40% |
| Detail enrichment | $2.50 (FREE tier) | Only charged when enabled and successful |
| Smart Scrape skip | $0.50 | Flat rate for cached properties |
| Actor start | $0.0005 | Once per run, charged by Apify's synthetic start event |

Search + detail together runs $4.50/1K. Using two separate actors elsewhere costs $5.00+/1K.

### Input examples

#### Search
```json
{
  "mode": "search",
  "location": "Houston, TX 77008",
  "listingType": "for_sale",
  "priceMin": 200000,
  "priceMax": 500000,
  "bedsMin": 3,
  "homeTypes": ["houses", "townhomes"],
  "maxResults": 100,
  "includeDetails": true
}
````

#### URL

```json
{
  "mode": "url",
  "searchUrls": [
    "https://www.zillow.com/houston-tx/?searchQueryState=..."
  ],
  "maxResults": 500
}
```

#### Lookup

```json
{
  "mode": "lookup",
  "addresses": ["1246 Omar St, Houston, TX 77008"],
  "zpids": ["27886690"]
}
```

### Sample output

A single record with detail enrichment enabled:

```json
{
  "zpid": "27783682",
  "address": "1246 Omar St, Houston, TX 77008",
  "streetAddress": "1246 Omar St",
  "city": "Houston",
  "state": "TX",
  "zipcode": "77008",
  "latitude": 29.787777,
  "longitude": -95.38971,
  "price": 1050000,
  "zestimate": 1010800,
  "rentZestimate": 3163,
  "taxAssessedValue": 929206,
  "beds": 4,
  "baths": 2,
  "sqft": 2454,
  "lotSize": 6272,
  "yearBuilt": 1930,
  "homeType": "MULTI_FAMILY",
  "homeStatus": "RECENTLY_SOLD",
  "daysOnZillow": 1,
  "description": "Charming duplex in the Heights with...",
  "detailUrl": "https://www.zillow.com/homedetails/1246-Omar-St-Houston-TX-77008/27783682_zpid/",
  "imgSrc": "https://photos.zillowstatic.com/fp/a25daf77...-p_e.jpg",
  "photoUrls": ["https://photos.zillowstatic.com/fp/...jpg", "..."],
  "has3DModel": false,
  "hasVideo": false,
  "dateSold": "2026-03-10",
  "county": "Harris County",
  "monthlyHoaFee": null,
  "propertyTaxRate": 1.75,
  "agentName": "Nathan Mutchler",
  "agentPhone": null,
  "agentEmail": null,
  "brokerName": "RJ Williams & Company RE LLC",
  "mlsId": null,
  "priceHistory": [
    { "date": "2026-03-10", "event": "Sold", "price": null, "source": "NTREIS" },
    { "date": "2026-01-30", "event": "Pending sale", "price": 1050000, "source": "NTREIS" },
    { "date": "2026-01-12", "event": "Listed for sale", "price": 1050000, "source": "NTREIS" }
  ],
  "taxHistory": [
    { "time": 1741737710674, "taxPaid": null, "value": 975432, "valueIncreaseRate": 0.0497 },
    { "time": 1710201710674, "taxPaid": 19442.36, "value": 929206, "valueIncreaseRate": -0.0294 }
  ],
  "scrapedAt": "2026-03-12T00:01:50.803Z"
}
```

Without detail enrichment, fields like `yearBuilt`, `description`, `photoUrls`, `agentName`, `priceHistory`, and `taxHistory` will be null.

Rows with `price: 0` or `price: null` can still include useful Zillow context:

- `priceDisplay` -- buyer-facing label such as `Est. $220,900`, `Auction`, or `Contact for price`
- `priceQualifier` -- normalized reason such as `auction_estimate`, `auction`, `contact_for_price`, or `no_published_price`
- `priceExplanation` -- short explanation when Zillow does not publish a normal list price
- `listingFlags` -- normalized tags such as `auction`, `foreclosure`, `bank_owned`, `new_construction`, `pending`, `contingent`, or `no_published_price`

Each row also includes scrape-health fields:

- `scrapeStatus` -- `base`, `detail_enriched`, or `partial`
- `detailStatus` -- `not_requested`, `enriched`, or `failed`
- `detailFailureReason` -- structured reason when enrichment fails, such as `perimeterx_block` or `proxy_upstream_error`
- `resultsCapped` and `scrapeWarnings` -- set when Zillow's result cap or another guardrail affects coverage
- `source` -- `async_api`, `srp_next_data`, or `detail_lookup`

### Limitations

- **No school or neighborhood data.** Competitors like maxcopell's detail scraper extract nearby schools and neighborhoods. We don't.
- **Price/tax history depends on a GraphQL hash** that Zillow can rotate when they redeploy their frontend. If history stops returning data, the hash may need updating.
- **Sold price is sometimes undisclosed.** For recently sold properties, `price` may be 0 or null when Zillow does not publish the sale price in search results.
- **Datacenter proxies don't work.** Zillow's PerimeterX protection blocks them. You need residential proxies for production runs.
- **Detail enrichment is intentionally marked partial on anti-bot failures.** The actor still returns the base search row and records the failure reason instead of silently dropping the listing.

### Tips

- Use residential proxies for production volume. Datacenter proxies get blocked by PerimeterX.
- Keep `includeDetails` off unless you need detail-page-only fields. Search data comes from Zillow's SRP `__NEXT_DATA__`; detail pages are more likely to trigger anti-bot checks.
- Start with `maxConcurrency: 1`. Bump to 2-3 if you're not seeing blocks. More concurrency means faster enrichment but higher block risk.
- Turn on Smart Scrape for any recurring job. The savings add up fast.
- URL mode is handy when you've already set up filters on Zillow's site. Just copy the URL.

# Actor input Schema

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

Search mode finds listings by location. URL mode accepts Zillow search URLs. Lookup mode fetches details for specific addresses or ZPIDs.

## `location` (type: `string`):

City, zip code, or neighborhood (e.g. 'Chicago, IL', '77008', 'Montrose Houston TX').

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

Type of listing to search for.

## `priceMin` (type: `integer`):

Minimum listing price filter.

## `priceMax` (type: `integer`):

Maximum listing price filter.

## `bedsMin` (type: `integer`):

Minimum number of bedrooms.

## `bathsMin` (type: `integer`):

Minimum number of bathrooms.

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

Filter by property type. Leave empty for all types.

## `sortBy` (type: `string`):

Sort order for search results.

## `daysOnZillow` (type: `string`):

Filter by how long the listing has been on Zillow.

## `sqftMin` (type: `integer`):

Minimum square footage.

## `sqftMax` (type: `integer`):

Maximum square footage.

## `lotSizeMin` (type: `integer`):

Minimum lot size in sqft.

## `lotSizeMax` (type: `integer`):

Maximum lot size in sqft.

## `yearBuiltMin` (type: `integer`):

Minimum year built.

## `yearBuiltMax` (type: `integer`):

Maximum year built.

## `hasPool` (type: `boolean`):

Filter to properties with a pool.

## `hasAC` (type: `boolean`):

Filter to properties with air conditioning.

## `isWaterfront` (type: `boolean`):

Filter to waterfront properties.

## `isSingleStory` (type: `boolean`):

Filter to single-story properties.

## `hasGarage` (type: `boolean`):

Filter to properties with a garage.

## `hasBasement` (type: `boolean`):

Filter to properties with a basement.

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

Filter to properties with 3D tours.

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

Maximum listings to return. SRP searches follow Zillow pagination and mark resultsCapped when Zillow's visible result cap applies.

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

Zillow search URLs with searchQueryState parameter. Apply filters on Zillow first, then paste the URL.

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

Addresses to look up. Each is resolved to a ZPID via autocomplete.

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

Zillow Property IDs to fetch directly.

## `includeDetails` (type: `boolean`):

Fetch each property's detail page for year built, agent info, description, photos, and more. Slower but much richer.

## `enableDedup` (type: `boolean`):

Skip properties already scraped in previous runs. Uses a persistent cache keyed by location.

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

Max concurrent detail page requests. Higher = faster but more block risk.

## `delayMs` (type: `integer`):

Delay between requests in milliseconds.

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

Residential proxies recommended. Search mode uses SRP **NEXT\_DATA** first when a proxy is available; datacenter proxies are commonly blocked.

## Actor input object example

```json
{
  "mode": "search",
  "location": "Chicago, IL",
  "listingType": "for_sale",
  "sortBy": "newest",
  "daysOnZillow": "",
  "hasPool": false,
  "hasAC": false,
  "isWaterfront": false,
  "isSingleStory": false,
  "hasGarage": false,
  "hasBasement": false,
  "has3DTour": false,
  "maxResults": 100,
  "searchUrls": [
    "https://www.zillow.com/chicago-il/?searchQueryState=..."
  ],
  "addresses": [
    "123 Main St, Chicago, IL 60601"
  ],
  "includeDetails": false,
  "enableDedup": false,
  "maxConcurrency": 1,
  "delayMs": 200,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items containing Zillow property listing records.

## `runStatus` (type: `string`):

Structured run summary with result counts, warnings, source counts, and cap status.

# 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 = {
    "location": "Chicago, IL",
    "maxResults": 100,
    "searchUrls": [
        "https://www.zillow.com/chicago-il/?searchQueryState=..."
    ],
    "addresses": [
        "123 Main St, Chicago, IL 60601"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crowdpull/zillow-listings-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 = {
    "location": "Chicago, IL",
    "maxResults": 100,
    "searchUrls": ["https://www.zillow.com/chicago-il/?searchQueryState=..."],
    "addresses": ["123 Main St, Chicago, IL 60601"],
}

# Run the Actor and wait for it to finish
run = client.actor("crowdpull/zillow-listings-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 '{
  "location": "Chicago, IL",
  "maxResults": 100,
  "searchUrls": [
    "https://www.zillow.com/chicago-il/?searchQueryState=..."
  ],
  "addresses": [
    "123 Main St, Chicago, IL 60601"
  ]
}' |
apify call crowdpull/zillow-listings-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Zillow Listings Scraper -- No Login Required",
        "description": "Extract Zillow property listings, Zestimates, price labels, and optional detail data. No login or cookies needed. Supports city/ZIP search, Zillow URL mode, and address or ZPID lookup.",
        "version": "1.0",
        "x-build-id": "nCAGNqBerhznlAzqH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crowdpull~zillow-listings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crowdpull-zillow-listings-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/crowdpull~zillow-listings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crowdpull-zillow-listings-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/crowdpull~zillow-listings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crowdpull-zillow-listings-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Scraping Mode",
                        "enum": [
                            "search",
                            "url",
                            "lookup"
                        ],
                        "type": "string",
                        "description": "Search mode finds listings by location. URL mode accepts Zillow search URLs. Lookup mode fetches details for specific addresses or ZPIDs.",
                        "default": "search"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, zip code, or neighborhood (e.g. 'Chicago, IL', '77008', 'Montrose Houston TX')."
                    },
                    "listingType": {
                        "title": "Listing Type",
                        "enum": [
                            "for_sale",
                            "recently_sold",
                            "for_rent",
                            "foreclosure"
                        ],
                        "type": "string",
                        "description": "Type of listing to search for.",
                        "default": "for_sale"
                    },
                    "priceMin": {
                        "title": "Min Price ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum listing price filter."
                    },
                    "priceMax": {
                        "title": "Max Price ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum listing price filter."
                    },
                    "bedsMin": {
                        "title": "Min Bedrooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Minimum number of bedrooms."
                    },
                    "bathsMin": {
                        "title": "Min Bathrooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Minimum number of bathrooms."
                    },
                    "homeTypes": {
                        "title": "Home Types",
                        "type": "array",
                        "description": "Filter by property type. Leave empty for all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "houses",
                                "townhomes",
                                "multifamily",
                                "condos",
                                "land",
                                "apartments",
                                "manufactured"
                            ],
                            "enumTitles": [
                                "Houses",
                                "Townhomes",
                                "Multi-Family",
                                "Condos/Co-ops",
                                "Land",
                                "Apartments",
                                "Manufactured"
                            ]
                        }
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "newest",
                            "relevance",
                            "pricea",
                            "priced",
                            "beds",
                            "baths",
                            "size",
                            "lot",
                            "zest"
                        ],
                        "type": "string",
                        "description": "Sort order for search results.",
                        "default": "newest"
                    },
                    "daysOnZillow": {
                        "title": "Days on Zillow",
                        "enum": [
                            "",
                            "1",
                            "7",
                            "14",
                            "30",
                            "90",
                            "6m",
                            "12m",
                            "24m",
                            "36m"
                        ],
                        "type": "string",
                        "description": "Filter by how long the listing has been on Zillow.",
                        "default": ""
                    },
                    "sqftMin": {
                        "title": "Min Square Feet",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum square footage."
                    },
                    "sqftMax": {
                        "title": "Max Square Feet",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum square footage."
                    },
                    "lotSizeMin": {
                        "title": "Min Lot Size (sqft)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum lot size in sqft."
                    },
                    "lotSizeMax": {
                        "title": "Max Lot Size (sqft)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum lot size in sqft."
                    },
                    "yearBuiltMin": {
                        "title": "Min Year Built",
                        "minimum": 1800,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "Minimum year built."
                    },
                    "yearBuiltMax": {
                        "title": "Max Year Built",
                        "minimum": 1800,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "Maximum year built."
                    },
                    "hasPool": {
                        "title": "Has Pool",
                        "type": "boolean",
                        "description": "Filter to properties with a pool.",
                        "default": false
                    },
                    "hasAC": {
                        "title": "Has Air Conditioning",
                        "type": "boolean",
                        "description": "Filter to properties with air conditioning.",
                        "default": false
                    },
                    "isWaterfront": {
                        "title": "Waterfront",
                        "type": "boolean",
                        "description": "Filter to waterfront properties.",
                        "default": false
                    },
                    "isSingleStory": {
                        "title": "Single Story",
                        "type": "boolean",
                        "description": "Filter to single-story properties.",
                        "default": false
                    },
                    "hasGarage": {
                        "title": "Has Garage",
                        "type": "boolean",
                        "description": "Filter to properties with a garage.",
                        "default": false
                    },
                    "hasBasement": {
                        "title": "Has Basement",
                        "type": "boolean",
                        "description": "Filter to properties with a basement.",
                        "default": false
                    },
                    "has3DTour": {
                        "title": "Has 3D Tour",
                        "type": "boolean",
                        "description": "Filter to properties with 3D tours.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum listings to return. SRP searches follow Zillow pagination and mark resultsCapped when Zillow's visible result cap applies.",
                        "default": 500
                    },
                    "searchUrls": {
                        "title": "Zillow Search URLs",
                        "type": "array",
                        "description": "Zillow search URLs with searchQueryState parameter. Apply filters on Zillow first, then paste the URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "addresses": {
                        "title": "Addresses",
                        "type": "array",
                        "description": "Addresses to look up. Each is resolved to a ZPID via autocomplete.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "zpids": {
                        "title": "ZPIDs",
                        "type": "array",
                        "description": "Zillow Property IDs to fetch directly.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeDetails": {
                        "title": "Include Detail Enrichment",
                        "type": "boolean",
                        "description": "Fetch each property's detail page for year built, agent info, description, photos, and more. Slower but much richer.",
                        "default": false
                    },
                    "enableDedup": {
                        "title": "Enable Deduplication",
                        "type": "boolean",
                        "description": "Skip properties already scraped in previous runs. Uses a persistent cache keyed by location.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Max concurrent detail page requests. Higher = faster but more block risk.",
                        "default": 1
                    },
                    "delayMs": {
                        "title": "Delay Between Requests (ms)",
                        "minimum": 50,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between requests in milliseconds.",
                        "default": 200
                    },
                    "proxyConfig": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Residential proxies recommended. Search mode uses SRP __NEXT_DATA__ first when a proxy is available; datacenter proxies are commonly blocked.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
