# Zillow Search Scraper (`thescrappa/zillow-search-scraper`) Actor

Search Zillow homes for sale, for rent or recently sold by city, ZIP code or map point. Get price, beds, baths, living area, Zestimate, rent Zestimate, photos and broker for up to 1,000 listings per location, with many locations in one run.

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

## Pricing

from $0.67 / 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 Search Scraper

Search Zillow for homes for sale, for rent or recently sold in any US city, ZIP code, county or neighborhood. Each listing comes back as one clean row with price, beds, baths, living area, Zestimate, rent Zestimate, broker and photos. Add many places to one run to compare markets or build a lead list.

### What data can you extract?

| Field | Type | Description |
| --- | --- | --- |
| `zpid` | Integer | Zillow property ID. Use it with the Zillow Property Details Scraper. |
| `url` | String | Link to the home on Zillow. Empty for apartment buildings, which have no single home page. |
| `address` | String | Full address: street, city, state and ZIP code. |
| `streetAddress`, `city`, `state`, `zipcode` | String | Address parts as separate columns. |
| `latitude`, `longitude` | Number | Map position of the home. |
| `homeType` | String | Zillow home type: singleFamily, condo, townhome, multiFamily, manufactured, lot or apartmentComplex. |
| `homeStatus` | String | Listing status: forSale, forRent, recentlySold, comingSoon or similar. |
| `price` | Integer | List price in USD, or the monthly rent for rentals. For sold homes, the sale price where the state publishes it (some states, such as Texas, do not). |
| `pricePerSqft` | Integer | Price per square foot in USD. |
| `bedrooms`, `bathrooms` | Number | Number of bedrooms and bathrooms. |
| `livingArea` | Integer | Living area in square feet. |
| `lotSizeSqft` | Integer | Lot size in square feet. Zillow lots given in acres are converted. |
| `yearBuilt` | Integer | Year the home was built. |
| `daysOnZillow` | Integer | Days since the listing went live on Zillow. |
| `listedAt` | String | ISO 8601 date and time the listing went live on Zillow. |
| `lastSoldAt` | String | ISO 8601 date of the last sale, for sold homes. |
| `zestimate`, `rentZestimate` | Integer | Zillow's estimated home value and monthly rent in USD, when Zillow shows them. |
| `taxAssessedValue`, `taxAssessmentYear` | Integer | Assessed value for property tax in USD and the year of the assessment. |
| `brokerName`, `mlsStatus` | String | Listing brokerage and the status in the MLS (the local listing database). |
| `openHouses` | Array | Upcoming open houses, each with ISO 8601 start and end times. |
| `hasVirtualTour` | Boolean | True when the listing has a 3D tour. |
| `photoUrl`, `photoCount` | String, Integer | Main photo in high resolution and the number of photos. |
| `photos` | Array | All high resolution photo URLs, when Include photo list is on. |
| `buildingName`, `buildingId` | String, Integer | Only on apartment buildings: building name and Zillow building ID. |
| `priceMin`, `priceMax`, `availableUnits`, `units` | Number, Array | Only on apartment buildings: rent range, number of available units and the lowest rent per bedroom count. |
| `searchLocation` | String | The location from your input that found this listing. |
| `scrapedAt` | String | ISO 8601 date and time the listing was collected. |

### Use cases

- Investors can export every home for sale in their target ZIP codes and sort by price per square foot.
- Agents and brokers can track new listings, price cuts and open houses in their farm area.
- Analysts can compare list prices with Zestimate and rent Zestimate to find homes priced below their estimated value.
- Property managers can collect rental listings and apartment rent ranges for a rent survey.
- Proptech teams can feed fresh Zillow listings into their own apps, maps and dashboards.

### How to use

1. Add one place per entry to **Locations**: a city with state, a ZIP code, a county or a neighborhood. Or enter a point as latitude,longitude.
2. Choose **For sale**, **For rent** or **Recently sold**.
3. Set price, bedroom, bathroom and home type filters if you need them.
4. Set **Maximum listings per location** and start the run.

```json
{
  "locations": [
    "Austin TX",
    "78704",
    "47.674,-122.1215"
  ],
  "listingType": "forSale",
  "minBeds": 3,
  "maxPrice": 800000,
  "homeTypes": [
    "singleFamily",
    "townhome"
  ],
  "sortBy": "newest",
  "maxItems": 200
}
```

### Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `locations` | Array | Yes | US places to search, one per entry: a city with state ("Austin TX"), a ZIP code ("78704"), a county or a neighborhood. You can also enter a point as latitude,longitude ("47.674,-122.1215") to search around it. |
| `listingType` | String | No | Which homes to search. |
| `maxItems` | Integer | No | Most listings to save for each location. Zillow shows at most 1,000 listings per search, so split large areas into ZIP codes to get more. |
| `minPrice` | Integer | No | Lowest price in USD. For rentals this is the monthly rent. |
| `maxPrice` | Integer | No | Highest price in USD. For rentals this is the monthly rent. |
| `minBeds` | Integer | No | Fewest bedrooms. |
| `maxBeds` | Integer | No | Most bedrooms. |
| `minBaths` | Number | No | Fewest bathrooms, for example 1.5. |
| `maxBaths` | Number | No | Most bathrooms. |
| `homeTypes` | Array | No | Keep only these home types. Leave empty for all types. |
| `minLivingArea` | Integer | No | Smallest living area in square feet. |
| `minLotSize` | Integer | No | Smallest lot in square feet. One acre is 43,560 sq ft. |
| `minYearBuilt` | Integer | No | Earliest year the home was built. |
| `keywords` | String | No | Words that must appear in the listing, for example "pool" or "waterfront". |
| `sortBy` | String | No | Order of the results. With a limit, the order decides which listings you get. |
| `radiusMiles` | Number | No | Search radius around latitude,longitude entries. Place names use their own Zillow boundary. |
| `includePhotos` | Boolean | No | Add the full list of high resolution photo URLs to each listing. The main photo is always included. |

### Output example

```json
{
  "zpid": 29412345,
  "url": "https://www.zillow.com/homedetails/29412345_zpid/",
  "address": "4512 Ridgeview Dr, Austin, TX 78745",
  "streetAddress": "4512 Ridgeview Dr",
  "city": "Austin",
  "state": "TX",
  "zipcode": "78745",
  "latitude": 30.21843,
  "longitude": -97.79562,
  "homeType": "singleFamily",
  "homeStatus": "forSale",
  "price": 549000,
  "pricePerSqft": 297,
  "currency": "USD",
  "bedrooms": 3,
  "bathrooms": 2,
  "livingArea": 1848,
  "lotSizeSqft": 7405,
  "yearBuilt": 1987,
  "daysOnZillow": 6,
  "listedAt": "2026-10-11T15:42:10Z",
  "lastSoldAt": null,
  "zestimate": 541300,
  "rentZestimate": 2795,
  "taxAssessedValue": 498210,
  "taxAssessmentYear": 2025,
  "brokerName": "Austin Hill Country Realty",
  "mlsStatus": "Active",
  "openHouses": [
    {
      "start": "2026-10-18T19:00:00Z",
      "end": "2026-10-18T21:00:00Z"
    }
  ],
  "hasVirtualTour": true,
  "photoUrl": "https://photos.zillowstatic.com/fp/7c1e2b9d4a6f8e03b5d2c1a9e8f7b6a5-p_f.jpg",
  "photoCount": 24,
  "photos": [
    "https://photos.zillowstatic.com/fp/7c1e2b9d4a6f8e03b5d2c1a9e8f7b6a5-p_f.jpg",
    "https://photos.zillowstatic.com/fp/3b8d0e6f2a4c9b1d7e5f3a2c8b6d4e1f-p_f.jpg"
  ],
  "searchLocation": "Austin TX",
  "scrapedAt": "2026-10-17T15:00:00Z"
}
```

### Pricing

$1.00 per 1,000 listings, plus a one-time start fee of $0.00005 per run. You pay only for listings saved to the dataset. Lookups of place names are free.

### FAQ

#### How many listings can I get per location?

Zillow shows at most 1,000 listings for one search. To get more, split a large city into ZIP codes or neighborhoods and add each one as a location. A listing found by more than one location is saved and charged only once.

#### Which places can I search?

Any US city, county, ZIP code or neighborhood that Zillow knows. Write a city as "Austin TX". If a place is not found, the Actor logs it, continues with the other locations and lists it in the run status. You can also search around a map point with latitude,longitude and **Radius for points (miles)**.

#### Why do some sold homes have no price?

Some US states, such as Texas and Utah, do not publish sale prices. Zillow then shows no price for sold homes there. The Zestimate and the sale date are still included.

#### How does the home type filter work?

Zillow search has no home type filter, so the Actor removes other home types from each page before it saves them. You only pay for the listings that match. Zillow returns at most 1,000 listings per search, so the filter checks those 1,000. For rare home types in a large city, search by ZIP code instead.

#### Is scraping Zillow legal?

The Actor reads public listing data that anyone can see on Zillow without an account. Rules depend on your location and use case. Check the applicable laws and Zillow's terms, and handle personal data, such as agent names, with care.

#### Can I start runs through the Apify API?

Yes. Send a POST request to `https://api.apify.com/v2/acts/thescrappa~zillow-search-scraper/runs` with your input as JSON, or use an Apify client library. Read the results from the run's default dataset.

#### Can I connect the results to other tools?

Yes. Use Apify integrations to send the results to Make, Zapier, n8n, Google Sheets, Slack or a webhook, or download them as JSON, CSV or Excel.

#### What happens when a location fails?

The Actor retries short Zillow outages, then logs the error and continues with the next location. The run fails only when no location could be searched.

### Related Scrappa Actors

- [Zillow Property Details Scraper](https://apify.com/thescrappa/zillow-property-details-scraper)
- [Redfin Property Search Scraper](https://apify.com/thescrappa/redfin-property-search-scraper)
- [Redfin Property Details Scraper](https://apify.com/thescrappa/redfin-property-details-scraper)
- [Redfin Valuation Scraper](https://apify.com/thescrappa/redfin-valuation-scraper)
- [Realestate.com.au Property Search Scraper](https://apify.com/thescrappa/realestate-com-au-search-scraper)

# Actor input Schema

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

US places to search, one per entry: a city with state ("Austin TX"), a ZIP code ("78704"), a county or a neighborhood. You can also enter a point as latitude,longitude ("47.674,-122.1215") to search around it.

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

Which homes to search.

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

Most listings to save for each location. Zillow shows at most 1,000 listings per search, so split large areas into ZIP codes to get more.

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

Lowest price in USD. For rentals this is the monthly rent.

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

Highest price in USD. For rentals this is the monthly rent.

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

Fewest bedrooms.

## `maxBeds` (type: `integer`):

Most bedrooms.

## `minBaths` (type: `number`):

Fewest bathrooms, for example 1.5.

## `maxBaths` (type: `number`):

Most bathrooms.

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

Keep only these home types. Leave empty for all types.

## `minLivingArea` (type: `integer`):

Smallest living area in square feet.

## `minLotSize` (type: `integer`):

Smallest lot in square feet. One acre is 43,560 sq ft.

## `minYearBuilt` (type: `integer`):

Earliest year the home was built.

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

Words that must appear in the listing, for example "pool" or "waterfront".

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

Order of the results. With a limit, the order decides which listings you get.

## `radiusMiles` (type: `number`):

Search radius around latitude,longitude entries. Place names use their own Zillow boundary.

## `includePhotos` (type: `boolean`):

Add the full list of high resolution photo URLs to each listing. The main photo is always included.

## Actor input object example

```json
{
  "locations": [
    "Austin TX"
  ],
  "listingType": "forSale",
  "maxItems": 20,
  "sortBy": "default",
  "radiusMiles": 5,
  "includePhotos": true
}
```

# Actor output Schema

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

All results from this run in the default dataset.

# 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"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("thescrappa/zillow-search-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"],
    "maxItems": 20,
}

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

```

## MCP server setup

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