# Zillow Scraper API: Property Details, Zestimate & Search (`sauliusautomatesit/zillow-scraper-api`) Actor

Scrape Zillow: homes for sale, for rent and recently sold by city, ZIP or Zillow search link, and property details with Zestimate, rent Zestimate, tax value, agent and photos by link, zpid or street address. No login; also via MCP. $2 per 1,000 properties.

- **URL**: https://apify.com/sauliusautomatesit/zillow-scraper-api.md
- **Developed by:** [Saulius AutomatesIT](https://apify.com/sauliusautomatesit) (community)
- **Categories:** Real estate, Lead generation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 properties

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 API: Property Details, Zestimate & Search

Get [Zillow](https://www.zillow.com) data in bulk: **homes for sale, for rent and recently sold** in any city, ZIP code, neighborhood, county or state, or behind any Zillow search link with your filters, and **property details with Zestimate** for any Zillow link, zpid or **street address**. Each home comes with price, Zestimate and its range, rent Zestimate, tax assessed value, last sold price, beds, baths, living area, lot, year built, home type, days on Zillow, page views and saves, description, facts, listing agent and broker, MLS id, coordinates and photos.

No Zillow account, no cookies of yours, no browser. **$2 per 1,000 properties** with full details, **$1.50 per 1,000 listings** from searches.

### What you can use it for

- **Real estate investing**: every home for sale in a ZIP code with price, Zestimate and rent Zestimate side by side, to spot underpriced homes and rental yields.
- **Valuations in bulk**: paste a list of street addresses and get the Zestimate, its low and high range, rent Zestimate, tax value and last sale for each.
- **Market research**: inventory, prices, days on market and sold homes by city or neighborhood, scheduled daily or weekly.
- **Lead generation**: listings with the listing agent, broker and MLS id; recently sold homes by area.
- **Rentals**: apartments and homes for rent with unit prices by bedroom count.

### Why not call Zillow yourself

Zillow has no public API for listings or Zestimates (its old API was shut down). The website loads its data from page JSON and an internal search endpoint that caps every search at 20 pages, answers unknown place names with San Francisco, and pushes back on repeated requests. This Actor resolves places the way Zillow's search box does, pages through results, splits big areas into smaller map boxes to get past the 820-home cap, retries on fresh IPs, and returns plain JSON: one call from Python, JavaScript, cURL or an AI agent.

### How to use it

1. Add **Places to search** (`Austin, TX`, `78704`) and pick for sale, for rent or sold; or paste **Zillow search links** with any filters you set on zillow.com; or both.
2. Add **Properties**: Zillow links, zpids or street addresses, for one detailed row each.
3. Turn on **Full details for search results** if you want the full property row for every home a search finds.
4. Run it and download the results as JSON, CSV or Excel, or read them through the API.

#### Input example

```json
{
  "locations": ["Austin, TX", "78704"],
  "status": "forSale",
  "maxResultsPerSearch": 500,
  "includeDetails": false,
  "searchUrls": ["https://www.zillow.com/seattle-wa/rentals/"],
  "properties": [
    "2114 Bigelow Ave N, Seattle, WA 98109",
    "https://www.zillow.com/homedetails/48841077_zpid/",
    "48749425"
  ]
}
```

### Output

#### Listing (one per home found by a search)

```json
{
  "type": "listing",
  "zpid": "58312123",
  "url": "https://www.zillow.com/homedetails/1011-Brodie-St-APT-28-Austin-TX-78704/58312123_zpid/",
  "status": "FOR_SALE",
  "price": 600000,
  "address": "1011 Brodie St APT 28, Austin, TX 78704",
  "city": "Austin", "state": "TX", "zipcode": "78704",
  "latitude": 30.24636, "longitude": -97.76386,
  "bedrooms": 3, "bathrooms": 3, "livingArea": 1521,
  "lotArea": 4173.048, "lotAreaUnit": "sqft",
  "homeType": "SINGLE_FAMILY",
  "zestimate": null, "rentZestimate": null, "taxAssessedValue": 516022,
  "daysOnZillow": 2, "dateSold": null,
  "brokerName": "Compass RE Texas, LLC",
  "photos": ["https://photos.zillowstatic.com/fp/7a619a56e12d0d6372afe4917d72ff10-p_e.jpg"],
  "source": "search", "searchInput": "78704", "searchStatus": "forSale", "matchedPlace": "78704", "position": 2
}
```

Rentals in apartment buildings have `isBuilding: true`, the building name and `units` with price per bedroom count, and no zpid.

#### Property (one per property link, zpid or address, or per search result with full details)

```json
{
  "type": "property",
  "zpid": "48749425",
  "url": "https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/",
  "status": "OTHER",
  "price": 2155400,
  "zestimate": 2155400, "zestimateLow": 1939860, "zestimateHigh": 2370940,
  "rentZestimate": 6769,
  "streetAddress": "2114 Bigelow Ave N", "city": "Seattle", "state": "WA", "zipcode": "98109",
  "county": "King County",
  "bedrooms": 4, "bathrooms": 3, "livingArea": 3470, "lotSize": 4680, "yearBuilt": 1924,
  "homeType": "SINGLE_FAMILY",
  "taxAssessedValue": 2044000, "propertyTaxRate": 0.82, "lastSoldPrice": 995000,
  "daysOnZillow": 6522, "pageViews": null, "favorites": null,
  "description": null,
  "agentName": null, "brokerName": null, "mlsId": null,
  "neighborhood": "Queen Anne", "pricePerSquareFoot": 621,
  "facts": { "homeType": "SingleFamily", "lotSize": "4,680 sqft", "yearBuilt": 1924, "parkingFeatures": ["Off-street", "Garage"] },
  "photos": ["https://photos.zillowstatic.com/fp/..."],
  "source": "address", "input": "2114 Bigelow Ave N, Seattle, WA 98109",
  "matchedAddress": "2114 Bigelow Ave N Seattle, WA 98109"
}
```

For-sale homes add the listing description, agent name and phone, broker, MLS name and id, page views and saves, HOA fee and price per square foot. `priceHistory` and `taxHistory` are filled when Zillow puts them in the page (some showcase listings); otherwise they are `null`.

### Good to know

- **Search size**: Zillow shows at most about 820 homes per search (20 pages of 41). Ask for more and the Actor splits the area into map quarters, again and again where needed, and removes duplicates. The run summary (`OUTPUT` in the key-value store) shows how many homes Zillow has per search and how many you got.
- **Places** are matched with Zillow's own search box: the first place it suggests is used, and the row says which (`matchedPlace`). A name Zillow does not know comes back as a free `NOT_FOUND` row instead of another city's homes.
- **Addresses** are matched the same way; the row carries the address Zillow matched (`matchedAddress`).
- **Zestimates** are Zillow's estimates; some homes and some states have none, and the field is then `null`.
- **Apartment pages** (`/apartments/...`, `/b/...`) are not supported as inputs; their homes appear in rental searches as building rows.

### Pricing

Pay per result, no subscription:

| Item | Price |
|---|---|
| Property (full details) | $0.002 ($2 per 1,000) |
| Listing (search result) | $0.0015 ($1.50 per 1,000) |
| Run start | $0.00005 |

Bronze, Silver and Gold Apify plans pay 5%, 10% and 15% less. With **Full details for search results** on, each home is charged once, as a property. Inputs that give nothing (unknown place, deleted home, a search with no homes) come back as free `error` rows that say why.

### Use it from code or an AI agent

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("sauliusautomatesit/zillow-scraper-api").call(run_input={
    "locations": ["78704"],
    "status": "forSale",
    "maxResultsPerSearch": 200,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["price"], item["zestimate"], item["address"])
```

As an MCP tool for Claude, Cursor or any MCP client: `https://mcp.apify.com/?tools=sauliusautomatesit/zillow-scraper-api`.

### Related Actors

- [Bing Search API](https://apify.com/sauliusautomatesit/bing-search-api): Bing web results in bulk, for agents' and brokers' websites.
- [Google Hotels API](https://apify.com/sauliusautomatesit/google-hotels-api): hotel prices and availability from Google Hotels.

### Notes

The Actor reads only public data that Zillow shows to any logged-out visitor, and it does not collect agents' e-mail addresses. Use the data in line with Zillow's terms and the privacy and fair housing laws that apply to you.

# Actor input Schema

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

One place per line, as you would type it on Zillow: a city (`Austin, TX`), a ZIP code (`78704`), a neighborhood, a county or a state. Each gives up to `maxResultsPerSearch` homes with the status below.

## `status` (type: `string`):

For `Places to search`: `forSale` (default), `forRent` or `sold` (recently sold). Search links keep their own filters.

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

Searches set up on zillow.com with any filters (price, beds, home type, map area, keywords): copy the link from the address bar, one per line, for example `https://www.zillow.com/austin-tx/` or `https://www.zillow.com/homes/for_rent/`.

## `maxResultsPerSearch` (type: `integer`):

Zillow shows at most about 820 homes per search; above that the map is split into smaller areas automatically, up to all the homes Zillow has.

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

Opens each home found by a search for the full property row (description, Zestimate range, rent Zestimate, facts, agent, more photos). Charged as a property instead of a listing. Apartment buildings stay listings.

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

Homes to look up, one per line: a Zillow link (`https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/`), a zpid (`48749425`) or a street address (`2114 Bigelow Ave N, Seattle, WA 98109`). Each gives one property row with Zestimate.

## `maxPhotos` (type: `integer`):

Photo links per row, largest size. 0 for none.

## `concurrency` (type: `integer`):

Requests to Zillow at once. The default suits most runs.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "status": "forSale",
  "maxResultsPerSearch": 50,
  "includeDetails": false,
  "properties": [
    "2114 Bigelow Ave N, Seattle, WA 98109"
  ],
  "maxPhotos": 10,
  "concurrency": 10
}
```

# Actor output Schema

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

Items of type listing and property. Download as JSON, CSV or Excel, or read it from this API endpoint.

## `summary` (type: `string`):

Rows delivered per type, homes Zillow has per search, inputs not found and failures.

# 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"
    ],
    "maxResultsPerSearch": 50,
    "properties": [
        "2114 Bigelow Ave N, Seattle, WA 98109"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sauliusautomatesit/zillow-scraper-api").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"],
    "maxResultsPerSearch": 50,
    "properties": ["2114 Bigelow Ave N, Seattle, WA 98109"],
}

# Run the Actor and wait for it to finish
run = client.actor("sauliusautomatesit/zillow-scraper-api").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"
  ],
  "maxResultsPerSearch": 50,
  "properties": [
    "2114 Bigelow Ave N, Seattle, WA 98109"
  ]
}' |
apify call sauliusautomatesit/zillow-scraper-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sauliusautomatesit/zillow-scraper-api"
        }
    }
}
```

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/Q9ElvXWKQ1SYQeJuv/builds/0LzzHRRbcpidl8y82/openapi.json
