# Zillow Scraper (`sleek_waveform/zillow-scraper`) Actor

Scrape Zillow listings by city, ZIP code, or search URL — no API key required. Get 40+ fields per home: price, beds, baths, sqft, Zestimate, Rent Zestimate, tax value, price cuts, days on market, coordinates, photos. For-sale, rental and sold data. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/sleek\_waveform/zillow-scraper.md
- **Developed by:** [Daniel Dimitrov](https://apify.com/sleek_waveform) (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 $1.10 / 1,000 property listing scrapeds

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

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

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

# README

Zillow Scraper extracts property listings from Zillow.com without an API key. Scrape Zillow listings by city, ZIP code, or search URL and export price, beds, baths, square footage, Zestimate, Rent Zestimate, tax assessed value, coordinates, and photos to JSON, CSV, or Excel.

Zillow has no public API for listing data, and its website blocks ordinary scrapers. This Zillow scraper handles that for you — it uses browser-grade TLS fingerprinting and residential IPs so you get real listing data instead of a "page has been denied" error.

### What does Zillow Scraper do?

This Zillow data scraper collects property listings from three Zillow search surfaces:

- 🏡 **For sale** — active listings with prices, price cuts, and days on market
- 🔑 **For rent** — rentals and apartment buildings, including per-unit rent ranges
- 💰 **Recently sold** — sold comparables for valuation and market analysis

For-sale searches can be narrowed further by **listing type** — by agent, for sale by owner (FSBO), new construction, foreclosure, auction, or coming soon.

You give it a location (or paste a Zillow search URL), and it returns clean, structured rows — one per property — ready for analysis, lead generation, or a database.

### What data can you extract from Zillow?

Each listing includes **40+ fields**. Every field below comes from a real scraped record:

| Field | Example | Notes |
|---|---|---|
| `zpid` | `145656008` | Zillow's property ID |
| `address` | `4619 Inicio Ln, Austin, TX 78725` | Also split into street/city/state/zip |
| `price` | `225000` | Numeric; `priceLabel` holds `$225,000` |
| `beds` / `baths` | `3` / `3` | |
| `livingArea` | `1321` | Square feet |
| `lotAreaValue` / `lotAreaUnit` | `6194.232` / `sqft` | |
| `homeType` | `SINGLE_FAMILY` | Condo, townhouse, multi-family, land… |
| `zestimate` | `218700` | Zillow's estimated value |
| `rentZestimate` | `1822` | Estimated monthly rent |
| `taxAssessedValue` | `266535` | |
| `priceChange` / `priceReduction` | `-15000` / `$15,000 (Jul 15)` | Price-cut tracking |
| `daysOnZillow` | `91` | |
| `latitude` / `longitude` | `30.239851` / `-97.57366` | Mapping-ready |
| `photoUrls` | `[…]` | Full-resolution image URLs |
| `url` | `https://www.zillow.com/homedetails/…` | Link back to the listing |

Rental buildings additionally return `buildingName`, `minRent`, `maxRent`, `availableUnits`, and a `units` array with the price and bedroom count of each floor plan.

### How to scrape Zillow data

1. Click **Try for free** to open the Zillow Scraper.
2. Enter one or more **locations** — a city (`Austin, TX`), a ZIP code (`27703`), or paste a Zillow search URL.
3. Choose a **listing status**: for sale, for rent, or recently sold.
4. *(Optional)* For for-sale searches, pick a **listing type** — by agent, for sale by owner (FSBO), new construction, foreclosure, auction, or coming soon.
5. *(Optional)* Set filters — min/max price, minimum beds and baths, square footage, home type, and sort order.
6. Set **max listings** and click **Start**.
7. When the run finishes, download your Zillow data as **JSON, CSV, Excel, XML, or HTML** from the Storage tab, or pull it via the Apify API.

### Input example

```json
{
  "locations": ["Austin, TX", "27703"],
  "listingStatus": "forSale",
  "listingType": "byOwner",
  "maxItems": 200,
  "priceMin": 200000,
  "priceMax": 600000,
  "bedsMin": 3,
  "homeTypes": ["house"],
  "sortBy": "newest"
}
```

You can also skip the filters entirely and paste a Zillow search URL you have already refined in the browser:

```json
{
  "searchUrls": ["https://www.zillow.com/homes/for_sale/Austin-TX/"],
  "maxItems": 500
}
```

### Output example

```json
{
  "zpid": "145656008",
  "url": "https://www.zillow.com/homedetails/4619-Inicio-Ln-Austin-TX-78725/145656008_zpid/",
  "statusType": "FOR_SALE",
  "homeType": "SINGLE_FAMILY",
  "address": "4619 Inicio Ln, Austin, TX 78725",
  "city": "Austin",
  "state": "TX",
  "zipcode": "78725",
  "latitude": 30.239851,
  "longitude": -97.57366,
  "price": 225000,
  "priceLabel": "$225,000",
  "priceChange": -15000,
  "priceReduction": "$15,000 (Jul 15)",
  "beds": 3,
  "baths": 3,
  "livingArea": 1321,
  "lotAreaValue": 6194.232,
  "lotAreaUnit": "sqft",
  "zestimate": null,
  "rentZestimate": null,
  "taxAssessedValue": 266535,
  "daysOnZillow": 91,
  "photoCount": 31
}
```

### How much does it cost to scrape Zillow?

This Zillow scraper uses **pay per result** — you pay per property listing returned, and nothing else. No platform-usage charges on top, no per-run fee.

The rate drops automatically with your Apify plan — no action needed, the discount applies to your account tier:

| Your Apify plan | Store discount | Price per listing | 1,000 listings |
|---|---|---|---|
| Free | — | $0.0020 | $2.00 |
| Starter | Bronze | $0.0017 | $1.70 |
| Scale | Silver | $0.0014 | $1.40 |
| Business | Gold | $0.0011 | $1.10 |
| Enterprise | Platinum / Diamond | $0.0007 / $0.0004 | $0.70 / $0.40 |

That means a **45% discount** on the Business plan, and up to 80% on Enterprise.

You are only charged for **unique listings actually delivered**:

- **Empty searches cost nothing.** If a search matches no properties, you pay $0.
- **Duplicates are never charged twice.** Overlapping pages and internal retries are deduplicated before billing.
- **Failed searches cost nothing.** If Zillow can't be reached, or returns results for the wrong area, the run stops without billing you for that data.

### What can you use Zillow data for?

- 📊 **Market analysis** — track median prices, inventory, and days on market across ZIP codes
- 🏦 **Investment screening** — combine `price`, `rentZestimate`, and `taxAssessedValue` to compute rental yield at scale
- 📉 **Price-drop monitoring** — schedule daily runs and watch `priceReduction` to spot motivated sellers
- 🏘️ **Comparables (comps)** — pull recently sold properties near a subject property
- 🤖 **AI and ML** — feed structured real estate data into models, dashboards, or an LLM pipeline

### Frequently asked questions

#### Do I need a Zillow API key?

No. Zillow does not offer a public listings API, and this scraper needs no key, login, or cookie. Just enter a location and run it.

#### Can it scrape Zillow property detail pages?

No, and it is worth being upfront about why. Zillow's bot protection refuses `/homedetails/` pages even from sessions whose search pages load normally, so no scraper can reliably deliver them. The good news: the fields people usually want detail pages for — **Zestimate, Rent Zestimate, tax assessed value, lot size, and price history signals** — are already included in search results, so this scraper returns them anyway.

#### How many Zillow listings can I get per search?

Zillow caps any single search at **20 pages (about 820 listings)**. To collect more, split your search — by ZIP code, by price band, or by home type — and pass several locations at once. The scraper deduplicates automatically, so overlapping searches never produce duplicate rows or duplicate charges.

#### Do I need a proxy?

Yes — Zillow blocks datacenter IP addresses. **Apify Residential proxy is preselected** in the input, so it works out of the box. Changing it to datacenter proxies will cause the run to fail.

#### Why did my run return fewer results than I asked for?

Either the search genuinely has fewer matches, or your filters are narrow. The run log always shows Zillow's own total match count. If a search returns nothing at all, you are not charged.

#### Is it legal to scrape Zillow?

This scraper collects only publicly available data — no logins, no personal accounts, no private information. Scraping public data is generally legal in the EU and US, but how you *use* the data is your responsibility. If you plan to republish or store data commercially, get legal advice first, and review Zillow's terms of use.

#### Can I run this on a schedule?

Yes. Use Apify **Schedules** to run it daily or weekly, and connect it to Google Sheets, Slack, Zapier, Make, or a webhook. Everything is also available through the [Apify API](https://docs.apify.com/api/v2) and the Python or JavaScript clients.

### Related real estate and lead-generation scrapers

- [Google Maps Leads Scraper](https://apify.com/sleek_waveform/us-b2b-leads-google-maps) — local business leads with emails and phone numbers
- [Construction Contractor Leads](https://apify.com/sleek_waveform/construction-contractor-leads) — licensed contractor data
- [Resale Arbitrage Monitor](https://apify.com/sleek_waveform/resale-arbitrage-monitor) — price-gap monitoring across marketplaces

### Support and feature requests

Found a bug, or need a field this scraper doesn't return yet? Open an issue on the **Issues** tab of this Actor and it will be looked at. Custom versions of this Zillow scraper can be built on request.

# Actor input Schema

## `locations` (type: `array`):

Places to search, e.g. "Austin, TX", "Durham, NC" or "27703". One search per location.

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

Paste Zillow search page URLs directly, e.g. https://www.zillow.com/homes/for\_sale/Austin-TX/. Property detail (/homedetails/) pages are NOT supported — Zillow blocks them.

## `listingStatus` (type: `string`):

Which listings to scrape.

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

Narrow for-sale listings by who is selling. Ignored for rentals and sold listings.

## `maxItems` (type: `integer`):

Maximum listings to return across all searches. Zillow caps a single search at 820 results (20 pages).

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

Minimum price (USD).

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

Maximum price (USD).

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

Minimum number of bedrooms.

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

Minimum number of bathrooms.

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

Minimum living area in square feet.

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

Maximum living area in square feet.

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

Leave empty for all types.

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

Order in which Zillow returns the listings.

## `proxyConfiguration` (type: `object`):

Zillow refuses datacenter IPs — RESIDENTIAL proxy is required and preselected. Changing this will cause the run to fail.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX",
    "27703"
  ],
  "searchUrls": [],
  "listingStatus": "forSale",
  "listingType": "any",
  "maxItems": 100,
  "homeTypes": [],
  "sortBy": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped Zillow listings, one record per property, in JSON

## `listingsCsv` (type: `string`):

The same listings exported as CSV, ready for Excel or Google Sheets

## `datasetOverview` (type: `string`):

Browse and filter the results in the Console, including the investment, rentals and map views

# 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 = {
    "locations": [
        "Austin, TX"
    ],
    "searchUrls": [],
    "homeTypes": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sleek_waveform/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 = {
    "locations": ["Austin, TX"],
    "searchUrls": [],
    "homeTypes": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "locations": [
    "Austin, TX"
  ],
  "searchUrls": [],
  "homeTypes": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call sleek_waveform/zillow-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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