# Zillow Property Detail API — Address · URL · ZPID Lookup (`sian.agency/zillow-property-detail-scraper`) Actor

Paste Zillow URLs, ZPIDs, or street addresses and get a full property dossier: price, Zestimate, listing agent and broker phone numbers, 10-year tax history, price history, schools, and all photos. Optional comps, climate risk, and Zestimate history add-ons. Bulk-ready Zillow API replacement.

- **URL**: https://apify.com/sian.agency/zillow-property-detail-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 property dossier extracteds

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

Learn more: https://docs.apify.com/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 Property Detail Scraper — Full Dossiers by URL, ZPID or Address 🚀

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Property Skip Tracing](https://img.shields.io/badge/Store-Property%20Skip%20Tracing-1AE392)](https://apify.com/sian.agency/property-skip-tracing?fpr=sian) [![Zillow Agent Scraper](https://img.shields.io/badge/Store-Zillow%20Agent%20Scraper-1F4E79)](https://apify.com/sian.agency/zillow-agent-scraper?fpr=sian) [![Redfin Property Scraper](https://img.shields.io/badge/Store-Redfin%20Property%20Scraper-A02021)](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian)

#### 🎉 Paste property URLs, ZPIDs, or street addresses — get a 40+ field dossier per home, including listing agent & broker phone numbers
##### The Zillow API replacement built for lead-gen teams, investors, and PropTech data pipelines

---

### 📋 Overview

**Stop stitching together three scrapers to profile one house** — this actor turns any Zillow home URL, ZPID, or plain street address into a single, complete property dossier: price, Zestimate, rent Zestimate, listing agent and broker phone numbers, 10-year tax history, full price history, assigned schools, and every listing photo — in one row.

**Why professionals choose this scraper:**
- ✅ **Three input modes, auto-routed**: Zillow URLs, numeric ZPIDs, or raw street addresses — mix them freely, duplicates are removed automatically
- 📞 **Agent & broker contacts included**: listing agent name + phone, broker name + phone, co-agent, MLS ID, and license data on actively listed homes
- 🧾 **History bundled, not sold as extras**: 10-year tax history, full price-event history, schools, and all photo URLs ship inside the base row — data other tools charge add-ons for
- 💰 **Never billed for dead lookups**: homes that can't be found are skipped free of charge
- 💎 **Real add-ons where they count**: comparable homes, flood/fire/heat/wind/air climate risk with FEMA zones, and the full 100+ point Zestimate value history
- ⚡ **Bulk-ready**: feed hundreds of addresses from a CSV and enrich your whole lead list in one run

---

### ✨ Features

- 🏡 **Full property dossier** — 40+ curated fields per home from a 180+ field source payload
- 📞 **Listing agent & broker phones** — direct contact data for actively listed properties
- 🧾 **10-year tax history** — tax paid, assessed value, and year-over-year change rates
- 📈 **Complete price history** — every listing, price-cut, and sale event with $/sqft
- 🏫 **Assigned schools** — ratings, levels, grades, and distance
- 🖼 **All listing photos** — highest-resolution URL for every photo, plus the hero image
- 🏘 **Comps add-on** — comparable homes with price, size, and status
- 🌊 **Climate risk add-on** — flood, fire, heat, wind, and air scores with FEMA zone + insurance guidance
- 📉 **Zestimate history add-on** — chart-ready `{date, value}` series with 100+ monthly points
- 🔁 **Cross-mode deduplication** — the same home entered as URL and address counts once

---

### 🎬 Quick Start

Provide any mix of Zillow URLs, ZPIDs, or addresses. The actor looks each one up, builds one dossier row per home, and saves everything to the dataset.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~zillow-property-detail-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"addresses": ["10411 Turnbull Loop, Austin, TX 78717"]}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Paste your properties

Add Zillow home URLs, ZPIDs, or street addresses — one per line, in any combination.

#### Step 2: Toggle add-ons (optional)

Switch on comparable homes, climate risk, or Zestimate history for extra intelligence per home.

#### Step 3: Run and export

Click Start. Export your dossiers as JSON, CSV, or Excel straight from the dataset.

**That's it! In under a minute, you'll have:**

- One complete dossier row per property
- Agent and broker phone numbers for active listings
- Tax history, price history, schools, and photos ready for your CRM or warehouse

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| propertyUrls | array | No | Zillow home-details URLs (`zillow.com/homedetails/...`) |
| zpids | array | No | Numeric Zillow property IDs (digits before `_zpid`) |
| addresses | array | No | Full US street addresses (`street, city, state ZIP`) |
| includeComparableHomes | boolean | No | Add comparable homes per property (paid plans) |
| includeClimateRisk | boolean | No | Add flood/fire/heat/wind/air risk per property (paid plans) |
| includeZestimateHistory | boolean | No | Add the Zestimate value time series per property (paid plans) |

At least one of `propertyUrls`, `zpids`, or `addresses` should be provided — a run without input performs a single demo lookup so you can inspect the output shape.

**Example:**

```json
{
  "propertyUrls": ["https://www.zillow.com/homedetails/243335909_zpid/"],
  "zpids": ["29502980"],
  "addresses": ["10411 Turnbull Loop, Austin, TX 78717"],
  "includeComparableHomes": true,
  "includeClimateRisk": true,
  "includeZestimateHistory": true
}
```

***

### 📤 Output

One row per property with **40+ fields**, including:

| Field | Type | Description |
|-------|------|-------------|
| zpid | number | Zillow property ID |
| streetAddress / city / state / zipcode | string | Resolved address |
| price / zestimate / rentZestimate / lastSoldPrice | number | Valuations (USD) |
| homeStatus / homeType | string | FOR\_SALE, RECENTLY\_SOLD, OTHER · SINGLE\_FAMILY, CONDO, … |
| bedrooms / bathrooms / livingArea / yearBuilt | number | Home facts |
| agentName / agentPhoneNumber | string | Listing agent contact (active listings) |
| brokerName / brokerPhoneNumber / mlsId | string | Broker + MLS attribution |
| monthlyHoaFee / propertyTaxRate / annualHomeownersInsurance | number | Carrying costs |
| priceHistory | array | Listing/price-cut/sale events with $/sqft |
| taxHistory | array | Up to 10 years of tax paid + assessed values |
| schools | array | Assigned schools with ratings and distance |
| photoUrls | array | Every listing photo (highest resolution) |
| comparableHomes | array | Comps add-on (when toggled) |
| climateRisk | object | Climate add-on: 5 hazard blocks + FEMA zone (when toggled) |
| zestimateHistory | array | Value-history add-on: `{date, value}` points (when toggled) |

**Example (trimmed):**

```json
{
  "zpid": 243335909,
  "zillowUrl": "https://www.zillow.com/homedetails/243335909_zpid/",
  "streetAddress": "10411 Turnbull Loop",
  "city": "Austin",
  "state": "TX",
  "zipcode": "78717",
  "price": 460000,
  "homeStatus": "FOR_SALE",
  "bedrooms": 4,
  "bathrooms": 3,
  "livingArea": 2163,
  "agentName": "Clay Byrne",
  "agentPhoneNumber": "(512) 942-7880",
  "brokerName": "Keller Williams Realty",
  "mlsId": "5013986",
  "taxHistory": [{ "year": 2025, "taxPaid": 9318.03, "assessedValue": 465600 }],
  "priceHistory": [{ "date": "2026-06-19", "event": "Listed for sale", "price": 460000 }],
  "photoUrls": ["https://photos.zillowstatic.com/fp/....jpg"],
  "enrichmentsApplied": ["comparableHomes", "climateRisk", "zestimateHistory"]
}
```

***

### 💼 Use Cases & Examples

#### 1. Lead-list enrichment for wholesalers & ISAs

**Turn a plain address list into a call sheet with listing agent and broker phone numbers.**

**Input:** CSV column of street addresses
**Output:** Dossiers with agent/broker contacts, valuations, and days on market
**Use:** Prioritize outreach by equity, list age, and price cuts

#### 2. Investor underwriting in one pass

**Underwrite acquisitions with tax burden, price trajectory, and comps in a single row.**

**Input:** ZPIDs from your deal pipeline
**Output:** 10-year tax history, price events, HOA + insurance costs, comps add-on
**Use:** Feed your underwriting model without visiting a single listing page

#### 3. Zillow API replacement for PropTech ETL

**Zillow retired its public API — this is the drop-in data feed.**

**Input:** URLs or ZPIDs from your product database
**Output:** Clean, stable JSON dossiers ready for BigQuery, Snowflake, or pandas
**Use:** Nightly refresh of property facts and valuations at pay-per-result pricing

#### 4. Climate & insurance risk screening

**Score portfolios for flood, fire, heat, wind, and air risk before you lend or buy.**

**Input:** Addresses + `includeClimateRisk: true`
**Output:** Risk scores, growth trends, FEMA zones, insurance recommendations per home
**Use:** Flag high-risk collateral and estimate insurance exposure

#### 5. Home-value tracking & CMAs

**Chart any home's value trajectory with 100+ monthly Zestimate points.**

**Input:** URLs + `includeZestimateHistory: true`
**Output:** Chart-ready `{date, value}` series per property
**Use:** CMAs, tax-appeal evidence, market-timing dashboards

#### 6. CRM hygiene for brokerages

**Keep listing status, price, and attribution fresh across thousands of records.**

**Input:** Bulk ZPIDs synced from your CRM
**Output:** Current status, price, agent-of-record per property
**Use:** Automated weekly refresh with per-result billing

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/zillow-property-detail-scraper').call({
  addresses: ['10411 Turnbull Loop, Austin, TX 78717'],
  includeComparableHomes: true
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].agentPhoneNumber);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/zillow-property-detail-scraper').call(
    run_input={'zpids': ['243335909'], 'includeClimateRisk': True}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['streetAddress'], item['price'], item['agentPhoneNumber'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~zillow-property-detail-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"propertyUrls": ["https://www.zillow.com/homedetails/243335909_zpid/"]}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: New row in your CRM or a nightly schedule
2. **HTTP Request**: Call the actor API with the address batch
3. **Process**: Map dossier fields to your pipeline
4. **Action**: Update records, alert on price cuts, or route hot leads

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **5 properties** per run — full dossier quality, same fields
- No credit card required
- Perfect for testing the output on your own listings

#### PAID Tier (Production Ready)

- **Unlimited** properties per run
- Enrichment add-ons unlocked: comps, climate risk, Zestimate history
- Pay-per-result: dossiers are only charged when a home is found; add-ons only when they return data

💰 **One dossier here replaces three separate tools** — details, photos, and history are bundled in a single per-property price.

🔗 [View current pricing](https://apify.com/sian.agency/zillow-property-detail-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many properties can I process?**
A: FREE tier: 5 per run. PAID tier: unlimited — thousands per run is normal.

**Q: Do I always get agent phone numbers?**
A: Agent and broker contact fields are populated for actively listed homes (FOR\_SALE). Off-market homes still return the full dossier — valuations, tax history, photos — but attribution may be empty.

**Q: What happens if an address doesn't match a home?**
A: The lookup is skipped and you are **not** charged. Failed lookups are listed in a retry-helper row and the HTML report.

**Q: Can I mix URLs, ZPIDs, and addresses in one run?**
A: Yes — all three inputs can be used together. The actor dedupes them by resolved property, so the same home never bills twice.

**Q: What output formats are available?**
A: JSON, CSV, Excel, XML — export directly from the Apify dataset or pull via API.

**Q: Does it work for off-market homes?**
A: Yes. Off-market dossiers include valuations, tax history, photos, schools, and facts — everything except active-listing attribution.

**Q: Is this legal?**
A: The actor only extracts publicly accessible listing data. See the [legal section](#%EF%B8%8F-is-it-legal-to-scrape-data) below.

***

### 🐛 Troubleshooting

**"Property not found" for an address**

- Use the full form: `street, city, state ZIP` (e.g. `10411 Turnbull Loop, Austin, TX 78717`)
- Check the address exists on the consumer site; new constructions can lag

**Invalid URL error**

- Only home-details pages are supported: `zillow.com/homedetails/...`
- Search-result URLs (`zillow.com/austin-tx/`) belong in a search scraper, not a detail scraper

**Agent fields are empty**

- Contact attribution is only published for actively listed homes — off-market rows legitimately have empty agent fields

**Add-on fields are null**

- Enrichment toggles require a paying Apify plan; on FREE runs they are skipped with a log notice
- Add-ons are only charged when they return data — null means no data was available for that home

***

### ⚠️ Trademark Disclaimer

Zillow is a registered trademark of Zillow Group, Inc. This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Zillow Group**. It extracts only publicly available information for legitimate research, analytics, and lead-generation purposes. Users are responsible for complying with applicable laws and the terms of service of the websites they access.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

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

🏡 **LOOKUP BY URL:** Paste Zillow home-details links, one per line.

📋 **How to get a URL:**

1. Open any home on zillow.com
2. Copy the browser address — it looks like `https://www.zillow.com/homedetails/10411-Turnbull-Loop-Austin-TX-78717/243335909_zpid/`
3. Paste it here (Bulk edit accepts one URL per line)

✅ **SUPPORTED:** `zillow.com/homedetails/...` property pages
🚫 **NOT supported:** search-result pages like `zillow.com/austin-tx/` — use our search-focused actors for those

💡 **TIP:** Mix and match with ZPIDs and addresses below — duplicates are removed automatically.

⚡ **TIER LIMITS:** FREE runs process up to 5 properties total; paid Apify plans are unlimited.

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

🔢 **LOOKUP BY ZPID:** The numeric property ID from any Zillow URL — the digits right before `_zpid`.

📋 **Example:** for `.../243335909_zpid/` the ZPID is `243335909`.

💡 **TIP:** Ideal when your database already stores ZPIDs — the fastest, most exact lookup mode.

⚡ **TIER LIMITS:** FREE runs process up to 5 properties total; paid Apify plans are unlimited.

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

📍 **LOOKUP BY ADDRESS:** Full US street addresses, one per line.

📋 **Format:** `street, city, state ZIP` — e.g. `10411 Turnbull Loop, Austin, TX 78717`.

💡 **TIP:** Perfect for enriching CSV lead lists that only contain addresses — the actor resolves each address to the matching home automatically.

⚡ **TIER LIMITS:** FREE runs process up to 5 properties total; paid Apify plans are unlimited.

## `includeComparableHomes` (type: `boolean`):

🏘 **COMPS ADD-ON:** Fetches comparable homes for each property — address, price, beds/baths, living area, status, and Zillow link per comp.

💰 Adds one enrichment charge per property (only when comps are returned).

⚡ Available on paid Apify plans.

## `includeClimateRisk` (type: `boolean`):

🌊 **CLIMATE ADD-ON:** Flood, fire, heat, wind, and air-quality risk scores with FEMA zone and insurance recommendations per property.

💰 Adds one enrichment charge per property (only when risk data is returned).

⚡ Available on paid Apify plans.

## `includeZestimateHistory` (type: `boolean`):

📈 **VALUE-HISTORY ADD-ON:** The full Zestimate home-value time series (100+ monthly points) per property — chart-ready `{date, value}` pairs.

💰 Adds one enrichment charge per property (only when the series is returned).

⚡ Available on paid Apify plans.

## Actor input object example

```json
{
  "propertyUrls": [
    "https://www.zillow.com/homedetails/243335909_zpid/"
  ],
  "zpids": [
    "243335909"
  ],
  "addresses": [
    "10411 Turnbull Loop, Austin, TX 78717"
  ],
  "includeComparableHomes": false,
  "includeClimateRisk": false,
  "includeZestimateHistory": false
}
```

# Actor output Schema

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

One row per property: price, Zestimate, agent & broker contacts, tax and price history, schools, photos, and optional comps / climate / Zestimate-history add-ons

## `scrapingSummary` (type: `string`):

HTML summary showing extracted dossiers, not-found lookups, failures, and charged add-ons

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/zillow-property-detail-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/zillow-property-detail-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 '{}' |
apify call sian.agency/zillow-property-detail-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Zillow Property Detail API — Address · URL · ZPID Lookup",
        "description": "Paste Zillow URLs, ZPIDs, or street addresses and get a full property dossier: price, Zestimate, listing agent and broker phone numbers, 10-year tax history, price history, schools, and all photos. Optional comps, climate risk, and Zestimate history add-ons. Bulk-ready Zillow API replacement.",
        "version": "1.0",
        "x-build-id": "qra9uHD04r04B3D8p"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~zillow-property-detail-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-zillow-property-detail-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/sian.agency~zillow-property-detail-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-zillow-property-detail-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/sian.agency~zillow-property-detail-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-zillow-property-detail-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": {
                    "propertyUrls": {
                        "title": "🏡 Zillow Property URLs",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "🏡 **LOOKUP BY URL:** Paste Zillow home-details links, one per line.\n\n📋 **How to get a URL:**\n1. Open any home on zillow.com\n2. Copy the browser address — it looks like `https://www.zillow.com/homedetails/10411-Turnbull-Loop-Austin-TX-78717/243335909_zpid/`\n3. Paste it here (Bulk edit accepts one URL per line)\n\n✅ **SUPPORTED:** `zillow.com/homedetails/...` property pages\n🚫 **NOT supported:** search-result pages like `zillow.com/austin-tx/` — use our search-focused actors for those\n\n💡 **TIP:** Mix and match with ZPIDs and addresses below — duplicates are removed automatically.\n\n⚡ **TIER LIMITS:** FREE runs process up to 5 properties total; paid Apify plans are unlimited.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "zpids": {
                        "title": "🔢 ZPIDs (Zillow Property IDs)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "🔢 **LOOKUP BY ZPID:** The numeric property ID from any Zillow URL — the digits right before `_zpid`.\n\n📋 **Example:** for `.../243335909_zpid/` the ZPID is `243335909`.\n\n💡 **TIP:** Ideal when your database already stores ZPIDs — the fastest, most exact lookup mode.\n\n⚡ **TIER LIMITS:** FREE runs process up to 5 properties total; paid Apify plans are unlimited.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "addresses": {
                        "title": "📍 Street Addresses",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "📍 **LOOKUP BY ADDRESS:** Full US street addresses, one per line.\n\n📋 **Format:** `street, city, state ZIP` — e.g. `10411 Turnbull Loop, Austin, TX 78717`.\n\n💡 **TIP:** Perfect for enriching CSV lead lists that only contain addresses — the actor resolves each address to the matching home automatically.\n\n⚡ **TIER LIMITS:** FREE runs process up to 5 properties total; paid Apify plans are unlimited.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeComparableHomes": {
                        "title": "🏘 Comparable homes (add-on)",
                        "type": "boolean",
                        "description": "🏘 **COMPS ADD-ON:** Fetches comparable homes for each property — address, price, beds/baths, living area, status, and Zillow link per comp.\n\n💰 Adds one enrichment charge per property (only when comps are returned).\n\n⚡ Available on paid Apify plans.",
                        "default": false
                    },
                    "includeClimateRisk": {
                        "title": "🌊 Climate risk (add-on)",
                        "type": "boolean",
                        "description": "🌊 **CLIMATE ADD-ON:** Flood, fire, heat, wind, and air-quality risk scores with FEMA zone and insurance recommendations per property.\n\n💰 Adds one enrichment charge per property (only when risk data is returned).\n\n⚡ Available on paid Apify plans.",
                        "default": false
                    },
                    "includeZestimateHistory": {
                        "title": "📈 Zestimate history (add-on)",
                        "type": "boolean",
                        "description": "📈 **VALUE-HISTORY ADD-ON:** The full Zestimate home-value time series (100+ monthly points) per property — chart-ready `{date, value}` pairs.\n\n💰 Adds one enrichment charge per property (only when the series is returned).\n\n⚡ Available on paid Apify plans.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
