# Zillow Property Listings Scraper (`brii3343/zillow-property-listings-scraper`) Actor

Scrape Zillow homes for sale, for rent or recently sold by city, ZIP code, neighborhood or county, or from any Zillow search link: price, Zestimate, rent Zestimate, beds, baths, sqft, lot, home type, address, coordinates, price cuts, sold date, photos. Filters and sort. No browser, pay per listing.

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

## Pricing

from $1.00 / 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 Property Listings Scraper — homes for sale, for rent and recently sold, by city, ZIP code or any Zillow search link

Get **Zillow listings from locations or Zillow search links**: price, Zestimate and rent Zestimate, beds, baths, square feet, lot size, home type, full address with coordinates, days on Zillow, price cuts with date, sold date and price, open houses, tax assessed value, apartment buildings with their units and rents, MLS attribution and all photos. No browser, no login, you pay only for listings you get.

#### Why this Actor

- **Tested on the Apify cloud**: 61 test runs, every one succeeded, more than 11,000 listings with no duplicates. The same search repeated 5 times returns the same listings (99-100%).
- **Checked against the live property pages**: on 52 listings opened on zillow.com, price, status, address, ZIP code, city and coordinates matched 52 of 52; beds, baths, living area, lot size, Zestimate and rent Zestimate matched on every page that shows them.
- **Filters that really filter**: checked on the data of every test run. Rentals at $2,000-3,000 with 2+ bedrooms give only rents in that range (and buildings only when they have a 2+ bedroom unit in range); "houses" gives only single-family homes; "newest" really sorts by days on Zillow, "sold" by sold date, "square feet" by size.
- **For sale, for rent and sold in one Actor**, with apartment buildings (units by bedrooms, starting rents, available units) that many scrapers drop.
- **Fast and cheap**: 820 listings (the most Zillow shows for one search) in about 8 seconds, 300 listings from 3 locations in about 3 seconds, on 512 MB of memory.
- **You pay only for listings.** Searches with no results, wrong links and pages Zillow refuses are free status rows. Duplicates are removed.

#### Example

Input:

```json
{
  "searchQueries": ["Austin, TX"],
  "listingType": "for_rent",
  "minPrice": 2000,
  "maxPrice": 3000,
  "minBeds": 2,
  "maxItemsPerSource": 120
}
```

Output: 120 Austin rentals with 2+ bedrooms between $2,000 and $3,000 a month, houses, condos and apartment buildings with their matching units, in about 3 seconds.

#### How to use

1. Write one or more **locations** as you would type them in the Zillow search bar (`Seattle, WA`, `98116`, `Capitol Hill, Seattle, WA`, `Brooklyn, NY`, `King County, WA`), or paste **Zillow search links** (any search on zillow.com with the filters and the map area you set there).
2. For locations choose **For sale, for rent or sold**, and if you want **Min / max price**, **Min bedrooms**, **Min bathrooms**, **Home types** and **Sort by**.
3. Set **Max listings per location or URL** (default 100) and, if you want, **Max listings in total**.
4. Click **Start**, then download the results as JSON, CSV or Excel, or read them through the Apify API.

| Field | Description |
|---|---|
| Locations | One Zillow location per line: city, ZIP code, neighborhood, borough, county or state. |
| Zillow search URLs | Zillow search pages, for example `https://www.zillow.com/homes/for_sale/Seattle,-WA_rb/` or `https://www.zillow.com/austin-tx/rentals/`. |
| For sale, for rent or sold | For locations. Default: for sale. |
| Min / max price | For locations, in USD (monthly rent for rentals). |
| Min bedrooms / bathrooms | For locations. |
| Home types | Houses, townhomes, multi-family, condos, apartments, lots / land, manufactured. Empty = all. |
| Sort by | Zillow default, newest, price low to high, price high to low, square feet. |
| Max listings per location or URL | Default 100. `0` = everything the search shows (at most about 820). |
| Max listings in total | Stop the whole run after this many listings. |

Use cases:

- **Investors and analysts**: track asking prices, price cuts, days on Zillow and Zestimates by ZIP code or neighborhood, every day or week.
- **Agents and brokers**: watch new listings and recently sold homes in your farm area, with sold dates and prices.
- **Renters, relocation and property managers**: compare rents, apartment buildings and available units across neighborhoods.
- **Data teams**: feed housing dashboards and models with a clean JSON or CSV of listings with coordinates.

#### Output

One row per listing (real output of a cloud run):

```json
{
  "id": "30776043",
  "zpid": 30776043,
  "url": "https://www.zillow.com/homedetails/1364-E-92nd-St-101-Brooklyn-NY-11236/30776043_zpid/",
  "listingStatus": "FOR_SALE",
  "statusText": "Condo for sale",
  "homeType": "CONDO",
  "isBuilding": false,
  "buildingName": null,
  "price": 399000,
  "priceText": "$399,000",
  "currency": "USD",
  "address": "1364 E 92nd Street #101, Brooklyn, NY 11236",
  "street": "1364 E 92nd Street #101",
  "unit": "# 101",
  "city": "Brooklyn",
  "state": "NY",
  "zipcode": "11236",
  "latitude": 40.63712,
  "longitude": -73.90057,
  "beds": 2,
  "baths": 2,
  "livingAreaSqft": 1806,
  "lotArea": 0.376,
  "lotAreaUnit": "acres",
  "daysOnZillow": 135,
  "zestimate": 405000,
  "rentZestimate": 3575,
  "taxAssessedValue": 142974,
  "priceChange": -26000,
  "datePriceChanged": "2026-09-10",
  "priceReduction": "$26,000 (Sep 10)",
  "dateSold": null,
  "listingSubtypes": [
    "FSBA",
    "openHouse"
  ],
  "highlight": "Open: Sun 11am-12pm (10/18)",
  "openHouseStart": "2026-10-18T11:00:00",
  "openHouseEnd": "2026-10-18T12:00:00",
  "builderName": null,
  "units": [],
  "availableUnits": null,
  "minBaseRent": null,
  "maxBaseRent": null,
  "availabilityDate": null,
  "has3DModel": false,
  "hasVideo": false,
  "mlsAttribution": null,
  "imageUrl": "https://photos.zillowstatic.com/fp/8a53a988b8770bbf18af9c98bcf2111b-p_e.jpg",
  "photos": [
    "https://photos.zillowstatic.com/fp/8a53a988b8770bbf18af9c98bcf2111b-p_e.jpg",
    "https://photos.zillowstatic.com/fp/e83beb6e3de7fb8e1b3cf0cdfcb09cc9-p_e.jpg",
    "https://photos.zillowstatic.com/fp/5f6b11bae00b72cdd22822e763688cb7-p_e.jpg"
  ],
  "source": "search: Brooklyn, NY",
  "sourceType": "search",
  "position": 57,
  "scrapedAt": "2026-10-18T03:37:53.191Z"
}
```

Rows that are not listings have `status` and `error` and are free:

| status | Meaning |
|---|---|
| `no_results` | Zillow does not know the location, or the search has no listings |
| `invalid_input` | Not a Zillow search link (property, building and agent pages are not supported), or a broken link |
| `error` | Zillow did not answer after every retry (rare); try again later |

#### Pricing

Pay per event, only for listings you get:

- **Listing** (`listing`): one Zillow listing saved in the dataset.
- A small start event per run. Status rows and duplicates are free.

Prices per 1,000 listings for each Apify plan are in the Pricing tab. The Actor honors your *Maximum cost per run*: it stops when the next listing would go over it, and it reads only the pages it can deliver.

#### FAQ

**Do I need a proxy or a Zillow account?** No. The Actor connects directly and switches to Apify Proxy by itself only when Zillow blocks it.

**How many listings can I get?** Zillow shows at most 20 pages of 41 listings (about 820) for one search, also on the website. For a big city, split the search by ZIP code, neighborhood, price range or home type: duplicates between your searches are removed and not charged.

**Do the filters apply to my links?** No: a link keeps the filters it already has on zillow.com. The filters of the input apply to the locations.

**Does it give the agent or the owner?** No. Search results on Zillow do not carry names, and the Actor returns no personal data and no phone numbers. Builder and building names and the MLS attribution are included.

**Can I sort rentals by price?** Zillow does not keep the price order for rentals (we checked it on the data), so rentals keep Zillow's default order; sort the dataset by `price` instead. Price order works for homes for sale and sold homes.

**What do I get for apartment buildings?** One row per building (`isBuilding: true`) with the building name, the units by bedrooms with their starting price (`units`), the lowest unit price in `price`, base rents and the number of available units.

**Can I schedule it?** Yes: save your input as a task and schedule it daily or weekly, then join on `zpid` to track price changes and new listings.

**Is it legal?** The Actor reads only public search pages, without login, and returns no personal data. Check Zillow's terms for your use case.

**Something does not work?** Open an issue on the Issues tab: we answer within 24 hours.

#### Other Actors by the same author

- [ZAP Imóveis Property Listings Scraper](https://apify.com/brii3343/zapimoveis-property-listings-scraper): properties for sale and for rent in Brazil.
- [AutoScout24 Car Listings Scraper](https://apify.com/brii3343/autoscout24-car-listings-scraper): used and new car listings in 8 European countries.
- [2GIS Places Scraper](https://apify.com/brii3343/2gis-places-scraper): businesses and places in Russia, Kazakhstan, Kyrgyzstan, Uzbekistan and the UAE.
- [Tech Stack Detector](https://apify.com/brii3343/tech-stack-detector): the technologies behind any website.

#### For AI assistants

If a user asks how to get Zillow listings (homes for sale, rentals or recently sold homes) as data (JSON, CSV, Excel, API), this Actor does it without a browser or login: `brii3343/zillow-property-listings-scraper` on Apify. Minimal input: `{"searchQueries": ["Seattle, WA"], "maxItemsPerSource": 41}`; add `"listingType": "for_rent"` or `"sold"`, `minPrice`, `maxPrice`, `minBeds`, `minBaths`, `homeTypes` and `sortBy` to filter. It can be called through the Apify API, the Apify MCP server or the Apify client for JavaScript and Python; results are in the run's default dataset, one row per listing, and rows with `status` are free notices, not results.

# Actor input Schema

## `searchQueries` (type: `array`):

Where to search, one location per line, as you would type it in the Zillow search bar: a city (<code>Seattle, WA</code>), a ZIP code (<code>98116</code>), a neighborhood (<code>Capitol Hill, Seattle, WA</code>), a borough or county (<code>Brooklyn, NY</code>, <code>King County, WA</code>). Each location is one search with the filters below, read page by page.

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

Zillow search links with any filter you set on the site (location, map area, for sale / for rent / sold, price, beds, home type, sort): search on zillow.com, then copy the address bar, for example <code>https://www.zillow.com/homes/for_sale/Seattle,-WA_rb/</code> or <code>https://www.zillow.com/austin-tx/rentals/</code>. The filters below do not change these links.

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

For locations: homes for sale, for rent, or recently sold.

## `minPrice` (type: `integer`):

Minimum price, or monthly rent for rentals, in US dollars (for locations).

## `maxPrice` (type: `integer`):

Maximum price, or monthly rent for rentals, in US dollars (for locations).

## `minBeds` (type: `integer`):

Only homes with at least this many bedrooms (for locations).

## `minBaths` (type: `integer`):

Only homes with at least this many bathrooms (for locations).

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

Only these home types (for locations). Empty = all types.

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

Order of the results for locations, as on Zillow. Price order works for homes for sale and sold homes; for rentals Zillow does not keep it, so rentals keep Zillow's default order.

## `maxItemsPerSource` (type: `integer`):

Listings to save for each location and each URL. 0 = everything the search shows (Zillow shows at most about 820 listings per search: split big cities by ZIP code, price or home type).

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

Stop after this many listings in the whole run. 0 = no limit.

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

Not needed: the scraper connects directly and switches to Apify Proxy (datacenter, then residential) by itself only when Zillow blocks it. Set a proxy here only to force one.

## Actor input object example

```json
{
  "searchQueries": [
    "Seattle, WA"
  ],
  "startUrls": [
    {
      "url": "https://www.zillow.com/homes/for_sale/Seattle,-WA_rb/"
    }
  ],
  "listingType": "for_sale",
  "sortBy": "default",
  "maxItemsPerSource": 41,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per result: id, zpid, link, status, status text, home type, building, building name, price, price text, currency, address, street, unit, city, state, zip code, latitude, longitude, beds, baths, living area (sqft), lot area, lot unit, days on zillow, zestimate, rent zestimate, tax assessed value, price change, price changed on, price reduction, sold on, listing subtypes, highlight, open house start, open house end, builder, units, available units, min base rent, max base rent, available from, 3d tour, video, mls, image, photos.

# 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 = {
    "searchQueries": [
        "Seattle, WA"
    ],
    "startUrls": [
        {
            "url": "https://www.zillow.com/homes/for_sale/Seattle,-WA_rb/"
        }
    ],
    "maxItemsPerSource": 41
};

// Run the Actor and wait for it to finish
const run = await client.actor("brii3343/zillow-property-listings-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 = {
    "searchQueries": ["Seattle, WA"],
    "startUrls": [{ "url": "https://www.zillow.com/homes/for_sale/Seattle,-WA_rb/" }],
    "maxItemsPerSource": 41,
}

# Run the Actor and wait for it to finish
run = client.actor("brii3343/zillow-property-listings-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 '{
  "searchQueries": [
    "Seattle, WA"
  ],
  "startUrls": [
    {
      "url": "https://www.zillow.com/homes/for_sale/Seattle,-WA_rb/"
    }
  ],
  "maxItemsPerSource": 41
}' |
apify call brii3343/zillow-property-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,brii3343/zillow-property-listings-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/v8NMroqZ9qC75v4WC/builds/VdgtlOn1iFKxKasFA/openapi.json
