# 🏡 Zillow Search Scraper \[From 💰$0.90/1K] (`misterkhan/zillow-scraper`) Actor

\[From $0.90/1K] Extract properties for sale, for rent, and recently sold on Zillow by city, ZIP code, or search URL — zero proxy config required. Auto-paginates listings with prices, Zestimates, rent Zestimates, addresses, coordinates, beds/baths/sqft, broker details & HD photos.

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

## Pricing

from $0.90 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🏡 Zillow Real Estate Search Scraper \[From 💰$0.90/1K]

**\[From $0.90/1K]** Extract properties **for sale, for rent, and recently sold** from **Zillow** by city, state, ZIP code, or direct Zillow search URLs — **zero proxy configuration required**. Automatically paginates search results and extracts **25+ structured property fields** including listing price, Zestimate®, Rent Zestimate®, tax assessment, full parsed address, GPS coordinates, bedrooms, bathrooms, square footage, days on Zillow, listing broker/agent metadata, and HD photos.

Ideal for **real estate investors, wholesalers, market analysts, brokerages, property managers, and PropTech teams**.

***

### 🚀 Key Features

- **Search by Location or URL**: Enter any city, state, or ZIP code (e.g., `"Austin, TX"`, `"Campbell, OH"`, `"90210"`) or paste any filtered Zillow search URL directly from your browser.
- **Complete Property Intelligence**: Extracts `zpid`, `listingPrice` (raw amount, currency, formatted), `zestimate`, `rentZestimate`, `taxAssessedValue`, `listingAddress` (street, unit, city, state, ZIP, full address), `coordinates` (`latitude`, `longitude`), `bedrooms`, `bathrooms`, `livingArea` (sqft), `homeType`, `listingStatus`, `daysOnZillow`, `broker` details, `mainImage`, and canonical `propertyUrl`.
- **Automatic Pagination**: Follows Zillow search pagination automatically until your `resultsLimit` is reached.
- **Zero Proxy Setup Needed**: Built-in residential routing and anti-blocking are included automatically at no extra cost.
- **Instant Export**: Download clean, deduplicated datasets as **JSON, CSV, Excel, XML, or RSS**, or connect directly to Google Sheets, Airtable, Zapier, Make, and webhooks.

***

### ⚙️ Input Parameters

| Field | Type | Description | Default |
|---|---|---|---|
| `location` | `String` | Target city, state, or ZIP code (e.g., `"Campbell, OH"`, `"Austin, TX"`, `"90210"`, `"Miami, FL"`). | `"Campbell, OH"` |
| `searchUrls` | `Array` | Direct Zillow search URLs (supports any Zillow filters: price range, beds/baths, home type, for sale, for rent, or recently sold). | `[]` |
| `resultsLimit` | `Integer` | Maximum number of properties to extract across your search (Free plan trial runs are capped at `40` properties per run). | `40` |
| `extractionMethod` | `String` | `"PAGINATION"` (default standard search pagination), `"PAGINATION_WITH_ZOOM_IN"`, or `"MAP_MARKERS"`. | `"PAGINATION"` |

#### Sample Input — Search by City or ZIP Code

```json
{
  "location": "Campbell, OH",
  "resultsLimit": 40,
  "extractionMethod": "PAGINATION"
}
```

#### Sample Input — Search by Custom Zillow URLs

```json
{
  "searchUrls": [
    {
      "url": "https://www.zillow.com/austin-tx/"
    },
    {
      "url": "https://www.zillow.com/miami-fl/rentals/"
    }
  ],
  "resultsLimit": 100,
  "extractionMethod": "PAGINATION"
}
```

***

### 📦 Output

Each scraped property is saved to the Apify Dataset with the following structure:

| Field | Type | Description |
|---|---|---|
| `zpid` | `String` | Unique Zillow Property ID |
| `propertyUrl` | `String` | Direct canonical URL to the Zillow property listing |
| `listingPrice` | `Object` | `{ amount, currency, formatted, pricePerSquareFoot }` |
| `listingAddress` | `Object` | `{ street, unit, city, state, zipCode, county, country, full }` |
| `coordinates` | `Object` | `{ latitude, longitude }` |
| `bedrooms` | `Number` | Number of bedrooms |
| `bathrooms` | `Number` | Number of bathrooms |
| `livingArea` | `Number` | Interior living area in square feet (`sqft`) |
| `homeType` | `String` | Property type (`SINGLE_FAMILY`, `CONDO`, `TOWNHOUSE`, `MULTI_FAMILY`, `LOT`, etc.) |
| `listingStatus` | `String` | Listing status (`forSale`, `forRent`, `recentlySold`) |
| `zestimate` | `Number` | Zillow estimated market value (USD) |
| `rentZestimate` | `Number` | Zillow estimated monthly rental value (USD) |
| `taxAssessedValue` | `Number` | Latest county tax assessed value (USD) |
| `daysOnZillow` | `Number` | Days since the listing was posted on Zillow |
| `broker` | `Object` | Listing brokerage and agent details (`{ name, phoneNumber, buyerAgentName }`) |
| `mainImage` | `String` | High-resolution primary property photo URL |
| `has3DModel` | `Boolean` | `true` if a 3D virtual tour is available |
| `hasVideo` | `Boolean` | `true` if a property walkthrough video is available |
| `scrapedAt` | `String` | ISO 8601 timestamp of when the listing was extracted |

#### Sample Output JSON

```json
{
  "zpid": "34873129",
  "zestimate": 128400,
  "has3DModel": false,
  "hasVideo": false,
  "hasImage": true,
  "isZillowOwned": false,
  "listingPrice": {
    "amount": 125000,
    "currency": "USD",
    "formatted": "$125,000",
    "pricePerSquareFoot": null
  },
  "listingAddress": {
    "street": "848 Almasy Dr",
    "unit": null,
    "city": "Campbell",
    "state": "OH",
    "zipCode": "44405",
    "county": null,
    "country": "USA",
    "full": "848 Almasy Dr, Campbell, OH 44405"
  },
  "coordinates": {
    "latitude": 41.080643,
    "longitude": -80.58319
  },
  "listingStatus": "forSale",
  "propertyUrl": "https://www.zillow.com/homedetails/848-Almasy-Dr-Campbell-OH-44405/34873129_zpid/",
  "homeType": "SINGLE_FAMILY",
  "bedrooms": 4,
  "bathrooms": 2,
  "livingArea": 1668,
  "livingAreaUnit": "sqft",
  "daysOnZillow": 14,
  "rentZestimate": 1395,
  "taxAssessedValue": 88410,
  "mainImage": "https://photos.zillowstatic.com/fp/de92816208c567b649c7def18be85153-p_e.jpg",
  "broker": {
    "name": "Joseph Walter Realty, LLC.",
    "phoneNumber": null,
    "buyerAgentName": null,
    "buyerBrokerName": null
  },
  "scrapedAt": "2026-10-15T07:18:45.120Z"
}
```

***

### 💰 Cost of Usage

This Actor uses the **Pay-Per-Event** pricing model with **$0 start fee** and up to **82% automatic discounts** on paid Apify plans. You only pay for the property listings delivered to your dataset:

| Apify Plan Tier | Cost per Listing (`result`) | Cost per 1,000 Listings | Per-Run Limit |
|---|---|---|---|
| **Free** (Trial) | $0.0050 | **$5.00** | Up to **40** listings / run (1 page) |
| **Starter** (Bronze) | $0.0015 | **$1.50** | Unlimited |
| **Scale** (Silver) | $0.0010 | **$1.00** | Unlimited |
| **Business+** (Gold / Platinum / Diamond) | $0.0009 | **$0.90** | Unlimited |

**💡 Example:** On paid Apify plans, scraping 1,000 Zillow listings costs **$0.90 – $1.50 USD** with **$0 Actor start fee** and **no extra proxy charges**.

***

### 🧭 How to Use

1. Open the **Zillow Search Scraper** in the Apify Console.
2. Enter a **Location** (e.g., `"Austin, TX"` or `"90210"`) **or** paste one or more Zillow URLs into **Search or Listing URLs** (`searchUrls`).
3. Set your desired **Results Limit** (e.g., `50`, `250`, or `800`).
4. Click **Start**.
5. Once the run finishes, view your properties in the interactive **Results Table** or download the dataset in **JSON, CSV, or Excel** format.

***

### 🔌 Integrations & API Usage

Run this Actor programmatically from your own application or data pipeline using the Apify API.

#### 🐍 Python Example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("misterkhan/zillow-scraper").call(run_input={
    "location": "Austin, TX",
    "resultsLimit": 100,
    "extractionMethod": "PAGINATION",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["listingAddress"]["full"], item["listingPrice"]["formatted"])
```

#### 💻 Node.js Example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('misterkhan/zillow-scraper').call({
    location: 'Austin, TX',
    resultsLimit: 100,
    extractionMethod: 'PAGINATION',
});

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

#### 🧠 cURL Example

```bash
curl "https://api.apify.com/v2/acts/misterkhan~zillow-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "location": "Austin, TX",
    "resultsLimit": 100
  }'
```

***

### 🤖 Real Estate Automation Ideas

- **Deal Sourcing & Underwriting**: Compare `listingPrice.amount` against `zestimate` and `rentZestimate` to automatically flag undervalued properties and high cap-rate rentals.
- **Daily Market Monitoring**: Schedule daily or weekly runs across target ZIP codes to track new inventory, price drops, and days on market.
- **CRM & Spreadsheet Sync**: Send new listings directly into **Google Sheets, Airtable, HubSpot, Salesforce, or Notion** via Zapier or Make.
- **Brokerage & Agent Lead Lists**: Extract active listing brokerages across specific markets for B2B outreach and partnership campaigns.

***

### ❓ FAQ

**Q: Do I need to configure or pay for proxies?**\
**A:** No. Anti-blocking and residential proxy routing are built in automatically at no extra cost.

**Q: Can I scrape custom filtered Zillow searches (e.g., price range, 3+ beds, multi-family, recently sold)?**\
**A:** Yes! Apply any filters you want on `zillow.com` in your browser, copy the URL from your address bar, and paste it into the `searchUrls` field.

**Q: How many listings can Zillow return per search URL?**\
**A:** Zillow caps standard web pagination at roughly 20 pages (~800–820 listings) per single search query. To extract thousands of properties across a large state or metro area, pass multiple ZIP code or neighborhood search URLs in `searchUrls`.

**Q: Is it legal to scrape Zillow?**\
**A:** This Actor only extracts publicly available property listing facts displayed on public web pages. For more context, read Apify's guide on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🔗 Related Actors from Our Store

Combine this Actor with our other **`128 MB` Pay-Per-Event (PPE)** tools in the same workflow (`$0.00` start fee):

| Related Actor | Best For | Starting Price |
| :--- | :--- | :--- |
| **[🇪🇸 Idealista Property Scraper](https://apify.com/misterkhan/idealista-scraper)** | Spain, Italy & Portugal real estate listings — prices in EUR, m², rooms & photos | **From 💰`$0.75 / 1K`** |
| **[🇫🇷 PAP.fr France FSBO Property Scraper](https://apify.com/misterkhan/pap-fr-particuliers-scraper)** | Owner-direct (Particulier à Particulier) property sales & rentals across France | **From 💰`$0.75 / 1K`** |

👉 **[See all Actors by `misterkhan` on Apify Store →](https://apify.com/misterkhan)**

***

### 💬 Questions or Issues?

If you encounter any issues or have feature requests, please open an issue on the **Issues** tab of the Actor page in the Apify Store.

### 🧑‍⚖️ Legal Disclaimer

This Actor is an independent data extraction tool and is not affiliated with, endorsed by, or sponsored by Zillow Group, Inc. Users are solely responsible for complying with applicable laws and terms of use when utilizing extracted data.

# Actor input Schema

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

Target geography (e.g. 'Campbell, OH', 'Austin, TX', '90210', 'Miami, FL').

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

Direct Zillow search URLs or listing URLs (e.g. https://www.zillow.com/austin-tx/).

## `resultsLimit` (type: `integer`):

Maximum number of properties to extract (default: 40 = 1 search page). Free plan runs are capped at 40 properties per run.

## `extractionMethod` (type: `string`):

Method of extraction across search results.

## Actor input object example

```json
{
  "location": "Campbell, OH",
  "resultsLimit": 40,
  "extractionMethod": "PAGINATION"
}
```

# Actor output Schema

## `overview` (type: `string`):

Results Table exported from the default dataset.

## `usage_summary` (type: `string`):

Execution telemetry and extraction summary stored in the default key-value store.

# 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": "Campbell, OH",
    "resultsLimit": 40,
    "extractionMethod": "PAGINATION"
};

// Run the Actor and wait for it to finish
const run = await client.actor("misterkhan/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 = {
    "location": "Campbell, OH",
    "resultsLimit": 40,
    "extractionMethod": "PAGINATION",
}

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

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

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

```

## CLI example

```bash
echo '{
  "location": "Campbell, OH",
  "resultsLimit": 40,
  "extractionMethod": "PAGINATION"
}' |
apify call misterkhan/zillow-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,misterkhan/zillow-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gmanHTMr3ehFANO4I/builds/ywKKi2NRVMv4kFbXz/openapi.json
