# Zillow Scraper: Listings, Sold Homes, Rentals & Agents (`epicscrapers/zillow-scraper`) Actor

Scrape Zillow for-sale, rental and sold homes by city, ZIP, county, URL or address, with no 500-result cap. Price, Zestimate, beds, baths, photos, listing agent phone and email, price and tax history, schools and 150+ facts. Export to CSV, Excel or JSON.

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

## Pricing

from $1.30 / 1,000 home saveds

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 Scraper: homes for sale, rentals, sold comps and listing agents

Zillow Scraper turns any Zillow search into a spreadsheet. Type a city, ZIP code, county, neighborhood or state, paste a Zillow search URL, or give a list of addresses or zpids. You get one row per home with price, Zestimate, beds, baths, square feet, tax value, status and photo. Switch on **full property details** to add the description, every photo, the listing agent's name, phone and email, price and tax history, schools, climate risk and 150+ facts.

It is built for real estate investors, agents and brokers, wholesalers, lenders, proptech teams and researchers who need Zillow data in bulk.

- **No 500-result cap.** Zillow shows at most 500 homes per search, and most scrapers stop there. This scraper splits big areas into smaller map tiles automatically, so a search for Houston returns all 15,000+ homes for sale. A whole city takes about two minutes.
- **One row has everything.** Many Zillow scrapers need two Actors: one to search and one to get details. Here a single run returns both, and you pay for details only when you switch them on.
- **Listing agent contacts.** With details on, each home includes the listing agent and co-agent (name, phone, and email where the MLS publishes it) and the brokerage.
- **Sold comps with sale dates.** Recently sold searches return `lastSoldDate` and `lastSoldPrice` (in states that disclose sale prices), plus the full sale and price history with details on.
- **Distressed and off-market homes.** Filter for foreclosures, auctions, pre-foreclosures, bank-owned homes and for-sale-by-owner (FSBO) listings.
- **Your spending limit is respected.** The run stops before it would cost more than the maximum you set. You are never charged past it.
- **No Zillow account, API key or proxy setup.** Export to JSON, CSV, Excel or Google Sheets, or call it through the Apify API.

### What can you do with Zillow Scraper?

| Goal                               | How                                                                                                                       |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Pull every listing in a market     | Add the city or county to **Locations** and set **Max results per search** to `0`.                                        |
| Build an agent lead list           | Turn on **Include full property details** and use the `listingAgent`, `coListingAgent` and `broker` fields.               |
| Get sold comps for a deal          | Set **Listing type** to **Recently sold**, **Days on Zillow (sold within)** to `180`, and filter by beds and square feet. |
| Find motivated sellers             | Use **Sale types**: For sale by owner, Pre-foreclosures, Foreclosed, Auctions. Add **Must have: Price reduced**.          |
| Track new listings daily           | Schedule a run with **Sort by: Newest** and **Days on Zillow** `1`.                                                       |
| Value a list of addresses          | Put addresses or zpids in **Properties**. Each row has `zestimate`, `rentZestimate` and `taxAssessedValue`.               |
| Estimate rental yield              | Compare `price` with `rentZestimate`, or run a **For rent** search for the same ZIP code.                                 |
| Reuse a search you built on Zillow | Set the filters and map on zillow.com, copy the URL into **Zillow URLs**.                                                 |

### How it compares

| What you need                                     | Zillow Scraper                                                                     | Typical Zillow scrapers                                        |
| ------------------------------------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| Homes per search                                  | All of them: the map is split automatically (all 15,327 homes for sale in Houston) | Often capped at 500 per search URL                             |
| Search and details                                | One Actor, one run, one row per home                                               | Often a search Actor, then a detail Actor fed with its results |
| Listing agent phone and email                     | Included with details                                                              | Often a separate paid add-on, or missing                       |
| Price history, tax history, schools, climate risk | Included with details                                                              | Varies                                                         |
| Input                                             | Location names, ZIP codes, Zillow URLs, addresses, zpids                           | Usually Zillow URLs only                                       |
| Speed                                             | A whole city in about 2 minutes; 100 homes with full details in about 30 seconds   | Varies                                                         |
| Spending limit                                    | Never exceeded                                                                     | Varies                                                         |

### Quick start

1. Click **Try for free** and sign in to Apify.
2. Add a location such as `Austin, TX` or `78704` to **Locations**.
3. Choose **For sale**, **For rent** or **Recently sold**.
4. For a first run, keep **Max results per search** at `200`.
5. Click **Start**. When the run finishes, open the **Output** tab and export the data.

```json
{
    "locations": ["Austin, TX"],
    "listingType": "forSale",
    "maxItems": 200
}
```

More examples:

```json
{
    "locations": ["78704", "78745"],
    "listingType": "sold",
    "daysOnZillow": 180,
    "bedsMin": 3,
    "maxItems": 0,
    "includeDetails": true
}
```

```json
{
    "properties": ["3403 Winfield Dr, Austin, TX 78704", "29475196"],
    "includeDetails": true
}
```

```json
{
    "locations": ["Miami-Dade County, FL"],
    "saleTypes": ["owner", "preForeclosure", "foreclosed", "auction"],
    "maxItems": 0
}
```

### Input

| Field                             | What it does                                                                                                                                                                                                                             |
| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Locations**                     | Areas to search: city, ZIP code, county, neighborhood, borough or state, written as on Zillow. Each one is a separate search.                                                                                                            |
| **Listing type**                  | For sale, For rent or Recently sold.                                                                                                                                                                                                     |
| **Max results per search**        | Homes saved per location or URL. `0` saves every match.                                                                                                                                                                                  |
| **Include full property details** | Adds the full property page to each home (see Output). Charged per home.                                                                                                                                                                 |
| **Zillow URLs**                   | Search URLs from zillow.com (filters and map area are kept) and home pages (`/homedetails/..._zpid/`).                                                                                                                                   |
| **Properties**                    | Addresses or zpids of specific homes.                                                                                                                                                                                                    |
| **Filters**                       | Sort order, price, beds, baths, home types, days on Zillow (or sold within), keywords, sale types, pending, "must have" options, square feet, lot size, year built and HOA. They apply to Locations. Zillow URLs keep their own filters. |

Pending and under-contract homes are left out, as on Zillow. Turn on **Include pending & under contract** to add them.

### Output

Every home has these fields:

| Field                                                                                    | Example                                                                                                                     |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `zpid`, `url`                                                                            | `29475196`, `https://www.zillow.com/homedetails/3403-Winfield-Dr-Austin-TX-78704/29475196_zpid/`                            |
| `status`, `saleType`                                                                     | `forSale`, `forSaleByAgent` (also `forSaleByOwner`, `newConstruction`, `auction`, `foreclosure`, `bankOwned`, `comingSoon`) |
| `price`, `pricePerSqft`, `priceChange`, `priceChangedAt`                                 | `925000`                                                                                                                    |
| `address`, `streetAddress`, `city`, `state`, `zipcode`, `latitude`, `longitude`          | `3403 Winfield Dr, Austin, TX 78704`                                                                                        |
| `homeType`, `bedrooms`, `bathrooms`, `livingArea`, `lotSize`, `lotSizeUnit`, `yearBuilt` | `singleFamily`, `3`, `2`, `1450`                                                                                            |
| `zestimate`, `rentZestimate`, `taxAssessedValue`, `taxAssessmentYear`                    | `536000`, `2671`, `600000`, `2025`                                                                                          |
| `daysOnZillow`, `listedAt`, `lastSoldDate`, `lastSoldPrice`, `openHouses`                |                                                                                                                             |
| `brokerName`, `mlsName`, `mlsStatus`, `photo`, `virtualTourUrl`, `floorPlanUrl`          |                                                                                                                             |

Rental searches return apartment buildings as one row with `isBuilding`, `buildingName`, `availableUnits`, `minPrice`, `maxPrice` and `units` (price from, per bedroom count).

With **Include full property details** each home also has:

| Field                                                       | Contents                                                                                                                                                    |
| ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `description`, `highlights`                                 | Listing description and Zillow's highlight phrases                                                                                                          |
| `photos`, `photoCount`                                      | All listing photos, high resolution                                                                                                                         |
| `listingAgent`, `coListingAgent`, `broker`                  | `name`, `phone`, and `email` where the MLS publishes it                                                                                                     |
| `priceHistory`                                              | Every listing, price change and sale: `date`, `event`, `price`, `source`                                                                                    |
| `taxHistory`                                                | `year`, `taxPaid`, `assessedValue`                                                                                                                          |
| `schools`                                                   | Assigned schools with `rating` (1–10), grades, distance and GreatSchools link                                                                               |
| `monthlyHoaFee`, `walkScore`, `transitScore`, `bikeScore`   |                                                                                                                                                             |
| `climateRisk`                                               | Flood (with FEMA zone), fire, wind, heat and air risk scores from First Street                                                                              |
| `county`, `countyFips`, `parcelId`, `neighborhood`, `mlsId` |                                                                                                                                                             |
| `favoriteCount`, `pageViewCount`                            | How many Zillow users saved and viewed the home                                                                                                             |
| `facts`                                                     | 150+ facts from the listing: heating, cooling, parking, flooring, appliances, construction, roof, utilities, lot features, HOA details, tax amount and more |

### Pricing

You pay per home saved, with no monthly fee:

| Event                                                    | Free plan | Bronze  | Silver  | Gold and higher |
| -------------------------------------------------------- | --------- | ------- | ------- | --------------- |
| Home saved                                               | $0.0023   | $0.0020 | $0.0017 | $0.0013         |
| Full property details (only when switched on and loaded) | $0.0036   | $0.0030 | $0.0024 | $0.0017         |

On the Bronze plan, 1,000 homes cost $2.00, or $5.00 with full details. That's search, details and agent contacts in one run, instead of a search Actor plus a detail Actor. Set a maximum cost per run in the run options: the scraper stops before reaching it and never charges past it.

### Tips

- **Big areas:** a state can have over 100,000 listings. Start with a city or county, or set a limit.
- **Exact areas:** draw the map area on zillow.com and paste the URL into **Zillow URLs**.
- **Sale prices:** some states (Texas, Utah and others) don't disclose sale prices, so `lastSoldPrice` is empty there. The `zestimate` and `taxAssessedValue` are still filled.
- **Auctions** often have no list price. Their `price` is empty, and Zillow matches them to price filters by Zestimate.
- **Schedule** the scraper in Apify to collect new listings every day, and connect it to Google Sheets, Make, Zapier or a webhook.

### FAQ

**Is it legal to scrape Zillow?** This scraper collects publicly visible listing data. Listing agent contact details are personal data: you are responsible for using them lawfully (for example under CAN-SPAM, TCPA or GDPR) and for respecting Zillow's terms where they apply to you.

**Why do I get fewer homes than Zillow shows?** Check the filters and **Max results per search**. Pending homes are excluded by default, as on Zillow.

**Can I use it through an API?** Yes. Every run can be started through the Apify API, and the results are available as JSON, CSV or Excel.

**Something is missing or broken?** Open an issue on the Issues tab. Bugs are fixed quickly.

# Actor input Schema

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

Areas to search, the way you type them on Zillow: a city (Austin, TX), ZIP code (78704), county (Miami-Dade County, FL), neighborhood (Capitol Hill, Seattle), borough or state (Texas). Each location is searched separately. Large areas are split automatically, so you are not limited to Zillow's 500 or 1,000 results.

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

What to search for in Locations. Ignored for Zillow search URLs, which keep their own type.

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

Maximum homes saved for each location or search URL. Set to 0 for every matching home.

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

Adds the full property page to every home: description, all photos, listing agent name, phone and email, broker, price history, tax history, schools with ratings, HOA fee, walk/transit scores, climate risk and 150+ facts (heating, parking, flooring, appliances, parcel number…). Charged as an extra event per home.

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

Paste URLs from zillow.com. Search pages (with filters and map area, e.g. https://www.zillow.com/austin-tx/?searchQueryState=...) are scraped with their own filters. Home pages (https://www.zillow.com/homedetails/.../29475196_zpid/) return that home.

## `properties` (type: `array`):

Specific homes to scrape: a full address (3403 Winfield Dr, Austin, TX 78704) or a Zillow property ID (zpid, e.g. 29475196). Up to thousands per run.

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

Order of results. Matters when Max results is lower than the number of matching homes.

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

Minimum list price. For rentals, the monthly rent.

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

Maximum list price. For rentals, the monthly rent.

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

Minimum number of bedrooms.

## `bedsMax` (type: `integer`):

Maximum number of bedrooms.

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

Minimum number of bathrooms.

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

Only these home types. Leave empty for all.

## `daysOnZillow` (type: `integer`):

Only homes listed in the last N days. For recently sold homes: sold in the last N days (e.g. 30, 90, 365).

## `keywords` (type: `string`):

Only listings whose description mentions these words, e.g. pool, ADU, fixer.

## `saleTypes` (type: `array`):

Which for-sale listings to include. Leave empty for Zillow's default (agent-listed, by owner, new construction, foreclosures, auctions, coming soon). Pre-foreclosures and foreclosed (bank-owned, off-market) must be selected explicitly.

## `includePending` (type: `boolean`):

For sale only. Also include homes that are pending or under contract (Zillow hides them by default).

## `showOnly` (type: `array`):

Only homes with all of these.

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

Minimum interior square feet.

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

Maximum interior square feet.

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

Minimum lot size in square feet (1 acre = 43,560 sqft).

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

Maximum lot size in square feet (1 acre = 43,560 sqft).

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

Minimum year built.

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

Maximum year built.

## `hoaMax` (type: `integer`):

Maximum monthly HOA fee. Homes without HOA data are kept.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "listingType": "forSale",
  "maxItems": 200,
  "includeDetails": false,
  "sortBy": "relevance",
  "includePending": false
}
```

# Actor output Schema

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

No description

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("epicscrapers/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"] }

# Run the Actor and wait for it to finish
run = client.actor("epicscrapers/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 '{
  "locations": [
    "Austin, TX"
  ]
}' |
apify call epicscrapers/zillow-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,epicscrapers/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/T4gtGBdRzHFHz2EhF/builds/EdlcirHnn8WKd5lh2/openapi.json
