# Zillow Scraper - Homes for Sale, Rent & Sold, No Browser (`clearfetch/zillow-scraper`) Actor

Scrape Zillow listings without a browser: price, address, beds, baths, area, home type, days on Zillow, Zestimate, tax value and broker, for sale, for rent or sold. Search by city or ZIP, or paste a Zillow search link with its filters. Optional details: year built, price history, photos.

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

## Pricing

from $0.70 / 1,000 listings

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, Rent & Sold, No Browser

Scrape Zillow listings without a browser: price, address, beds, baths, living area, lot size, home type, days on
Zillow, Zestimate, rent Zestimate, tax assessment, sold date and brokerage, for homes for sale, for rent or recently
sold. Search by city or ZIP code, or paste any Zillow search link with the filters you set on zillow.com. Optionally
read each home's page for year built, description, key facts, price history and photos. **$1.00 per 1,000
listings.**

### What data you get

One row per listing, same columns every time:

- `zpid`, `url`, `statusType` (FOR\_SALE, FOR\_RENT, SOLD), `homeType`, `price`, `priceText`
- `address`, `street`, `city`, `state`, `zipcode`, `latitude`, `longitude`
- `beds`, `baths`, `livingArea` (sq ft), `lotAreaValue` and `lotAreaUnit`
- `daysOnZillow`, `zestimate`, `rentZestimate`, `taxAssessedValue`, `dateSold`, `brokerName`
- Rentals: `buildingName`, `minRent`, `maxRent` and `units` (beds and rent per unit type)
- With **Property details**: `yearBuilt`, `description`, `facts`, `priceHistory`, `lastSoldPrice`,
  `photos`, `mlsId`, `brokerageName`

### How to use

1. Type cities or ZIP codes (`Austin, TX`, `78704`) and pick for sale, for rent or recently sold. Or set filters
   on zillow.com (price, beds, home type, keywords) and paste the search link.
2. Pick how many listings per search, and whether to read each home's page for details.
3. Run it, then download CSV, Excel or JSON, or pull the rows through the API. Schedule it to track a market.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `locations` | array | — | Cities or ZIP codes, one per line. |
| `listingType` | string | `forSale` | `forSale`, `forRent` or `sold`. |
| `startUrls` | array | `[]` | Zillow search links (filters kept) or property links. |
| `maxItemsPerSearch` | integer | `100` | Per city, ZIP or link. Zillow shows up to 820; 0 means all. |
| `includeDetails` | boolean | `false` | Read each home's page for year built, description, facts, price history, photos. |
| `timeoutSecs` | integer | `30` | Per request. |
| `proxyConfiguration` | object | off | Not needed for normal runs. |

### Output example

A real row from a run on Apify with `"locations": ["Denver, CO"], "includeDetails": true` on 2026-09-30
(description, photos and price history shortened here):

```json
{
  "ok": true,
  "type": "listing",
  "zpid": "13351802",
  "url": "https://www.zillow.com/homedetails/975-S-Monroe-St-Denver-CO-80209/13351802_zpid/",
  "statusType": "FOR_SALE",
  "statusText": "House for sale",
  "homeType": "SINGLE_FAMILY",
  "price": 5595000,
  "priceText": "$5,595,000",
  "currency": "USD",
  "address": "975 S Monroe Street, Denver, CO 80209",
  "street": "975 S Monroe Street",
  "city": "Denver",
  "state": "CO",
  "zipcode": "80209",
  "latitude": 39.698574,
  "longitude": -104.94566,
  "beds": 5,
  "baths": 9,
  "livingArea": 7438,
  "lotAreaValue": 0.29843893480257117,
  "lotAreaUnit": "acres",
  "daysOnZillow": 116,
  "zestimate": null,
  "rentZestimate": null,
  "taxAssessedValue": 4100500,
  "dateSold": null,
  "brokerName": "The Agency - Denver",
  "isBuilding": false,
  "buildingName": null,
  "minRent": null,
  "maxRent": null,
  "units": [],
  "imageUrl": "https://photos.zillowstatic.com/fp/df3dd045609d42fbd321f8692575f5fd-p_e.jpg",
  "marketingStatus": "For Sale by Agent",
  "searchLocation": "Denver, CO",
  "rank": 1,
  "detailed": true,
  "yearBuilt": 2022,
  "description": "Available to the public for the first time in one of Belcaro's most sought-after pockets, Soleil on South Monroe is a custom midcentury modern residence where soaring ceilings, …",
  "facts": {
    "Type": "Single Family Residence",
    "Year Built": "2022",
    "Heating": "Forced Air, Solar",
    "Cooling": "Central Air",
    "Parking": "3 Attached Garage spaces",
    "HOA": "$13 monthly",
    "Lot": "0.30 Acres",
    "Days on Zillow": "116 Days",
    "Price/sqft": "$752"
  },
  "priceHistory": [
    {
      "date": "2026-09-24",
      "event": null,
      "price": 5595000,
      "source": null
    },
    {
      "date": "2026-06-05",
      "event": null,
      "price": 5950000,
      "source": null
    },
    {
      "date": "2020-12-24",
      "event": null,
      "price": null,
      "source": null
    }
  ],
  "lastSoldPrice": 1000000,
  "photoCount": 50,
  "photos": [
    "https://photos.zillowstatic.com/fp/df3dd045609d42fbd321f8692575f5fd-cc_ft_1536.jpg",
    "https://photos.zillowstatic.com/fp/5baf127354957a717c56f21851b48929-cc_ft_1536.jpg"
  ],
  "mlsId": "8332672",
  "mlsName": "REcolorado as distributed by MLS GRID",
  "brokerageName": "The Agency - Denver",
  "timeZone": "America/Denver",
  "scrapedAt": "2026-09-30T10:25:22.800Z"
}
```

A search or link that cannot be read comes back as one row with `ok: false` and a plain reason. Those rows are
free.

### Pricing

**$1.00 per 1,000 listings** ($0.001 each). With **Property details** on, each home whose page was read costs
$2.00 per 1,000 more. Repeats (a home found by two searches is written once) and failed searches are free.

Paid Apify plans pay less: 10% off on Bronze, 20% on Silver and 30% on Gold and higher tiers.

### Use cases

- **Investors and flippers**: every listing in a ZIP code with price, Zestimate, tax value and days on market.
- **Market reports**: prices, price cuts and time on market by city, on a schedule.
- **Rental analysis**: rents by bedroom count for every building in an area.
- **Comparables**: recently sold homes with sold dates and prices.

### FAQ

**Can I use Zillow's own filters?** Yes. Set them on zillow.com (price, beds, baths, home type, keywords, map area),
copy the address bar, and paste it into **Zillow links**; the filters are kept on every page.

**How many listings per search?** Zillow shows at most 820 listings (20 pages) for one search. Split a big city
into ZIP codes or price bands for more.

**Do I need a proxy?** Not for normal runs. The Actor spaces its requests; if Zillow starts refusing them, rows say
so and a proxy in the input helps.

**Is it legal?** It reads listing pages that anyone can see on Zillow without logging in. You are responsible for
how you use the data.

### Integrations

Run it from the Apify API or a client library, schedule it in Apify Console, or connect it to n8n, Make, Zapier or
any MCP client through Apify's integrations. Results are available as JSON, CSV, Excel and through the dataset API.

### More tools from clearfetch

- [Google Maps Scraper](https://apify.com/clearfetch/google-maps-scraper): real estate agencies, contractors and any local business with phone and rating
- [Google Maps Email Extractor](https://apify.com/clearfetch/google-maps-email-extractor): agencies and brokers with emails from their websites
- [Google Trends Scraper](https://apify.com/clearfetch/google-trends-scraper): search interest in neighborhoods and markets

### Changelog

- **1.0.0** (2026-09) — first release: cities, ZIP codes and search links for sale, for rent and sold, up to 820 per
  search, optional property details.

# Actor input Schema

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

One per line: "Austin, TX", "78704", "Brooklyn, NY".

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

For sale, for rent, or recently sold. Applies to cities and ZIP codes; search links keep their own.

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

Zillow search links copied from the browser, with any filters you set (price, beds, home type...), or property links (zillow.com/homedetails/...).

## `maxItemsPerSearch` (type: `integer`):

Listings per city, ZIP or search link. Zillow shows up to 820 (20 pages); 0 means all of them.

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

Read each home's page for year built, description, key facts, price history, photos and MLS ID. Slower, and charged as a separate event per home.

## `timeoutSecs` (type: `integer`):

Per request.

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

Not needed for normal runs. A proxy lets requests go out faster on very large runs.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "listingType": "forSale",
  "startUrls": [],
  "maxItemsPerSearch": 41,
  "includeDetails": false,
  "timeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Listings with price, address, beds, baths, area, Zestimate and more. Searches and links that could not be read appear with ok=false and a reason, and are not charged.

# 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"
    ],
    "maxItemsPerSearch": 41
};

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

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

```

## MCP server setup

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