# Zillow Scraper & Zillow API: Listings, Prices, Agent Contacts (`crustapi/zillow-scraper`) Actor

Extract Zillow property data in bulk, no login. City, ZIP, or link. Every property with the full record: price, price cuts, beds, baths, sqft, year built, photos, description, MLS ID, price history, and the listing agent name and phone. Filter, paginate. For sale, rent, sold.

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

## Pricing

$7.00 / 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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## What is Zillow Scraper?

Extract Zillow data in bulk, with no login and no cookies you have to supply. Paste a city, a ZIP, or a Zillow search link to pull every property in that area, or paste a property link for a single one. Every property comes with the full record, including the listing agent's name and phone. Filter by price, beds, baths, property type, square feet, year built, lot size, HOA, keywords, new listings, and price cuts. It works for properties for sale, for rent, and recently sold.

- 🏙️ Any area, by city, ZIP, or a Zillow search URL
- 🏠 Every property: price, price change, beds, baths, square feet, type, **year built**, status, days on Zillow, listed date, last sold date, Zestimate, price per sqft, lot size, tax-assessed value, neighborhood, all photos, broker, location
- 📄 The full record on every one: description, **listing agent name and phone**, MLS ID, price history, heating, cooling, parking, HOA, tax rate
- 📖 **Complete pagination, not just the first page.** We page all the way through and split a busy area into smaller boxes so you get the whole market, not the first 40 properties
- 🔑 No Zillow account, nothing to log into
- 📦 Export as JSON, CSV, Excel, HTML, or XML

### What data do I get?

**Every property returns this, on every run (no toggles, no extra step):**

| Field | Example |
|---|---|
| Address | 6305 Leatherwood Cv, Austin, TX 78759 |
| Price + price change | 750000 · -25000 when it was cut |
| Beds / Baths / Sqft | 4 · 3 · 2164 |
| Property type | SINGLE\_FAMILY |
| Year built | 1984 |
| Status / Days on Zillow | Active · 6 |
| Listed date / Last sold date | 2026-08-27 · 2014-12-19 |
| Zestimate | When Zillow shows one |
| Price per sqft | 347 |
| Lot size | 9352 sqft |
| Tax-assessed value | 558793 |
| Neighborhood | Woodcrest-A |
| Photos | Every photo in the listing, not just one |
| Broker + Location | Keller Williams Realty · 30.42, -97.75 |
| Zillow URL + ZPID | The link and the permanent property id |

**Plus the full record on every property:**

| Field | Example |
|---|---|
| Description | Full listing text |
| Listing agent | Name and phone |
| MLS ID | 7476369 |
| Price history | Every past price event, when Zillow publishes it |
| Heating / Cooling / Parking | When Zillow publishes it |
| HOA, tax rate | When Zillow publishes it |

Anything the page does not publish comes back blank rather than guessed. School ratings and tax history are not returned, because Zillow loads those separately and they are not on the page we read.

### Pricing

**$7 per 1,000 properties.** Same price for every property, the full record every time, whether it comes from an area search or a property link. No start fee, no monthly rental. You pay only for properties we return.

| Run | Actor cost |
|---|---|
| 1,000 properties | $7 |
| 10,000 properties | $70 |
| 100,000 properties | $700 |

### How it works

You paste one line per area or per property. The tool figures out which is which.

#### Search an area

Paste a city (`Austin, TX`), a ZIP (`78704`), or a Zillow search link. Pick For sale, For rent, or Recently sold, and set a max number of properties. You get one row per property, and you only pay for the properties you asked for.

Narrow it down with any of these: price, beds, baths, property type, square feet, year built, lot size, max HOA, keywords (like `pool` or `waterfront`), **New listings** (homes listed in the last 1 to 90 days, great for finding fresh inventory first), and **Price reduced only** (homes with a recent price cut, great for finding motivated sellers). Leave them blank to get everything.

Every property comes with the full record, automatically: the core facts plus year built, price per sqft, lot size, tax-assessed value, dates, neighborhood, all photos, and the deeper listing record too, the description, listing agent name and phone, MLS ID, price history, heating, cooling, parking, and HOA (whatever Zillow publishes for that property). No toggles to set.

#### Get one property's full details

Paste a property link (`https://www.zillow.com/homedetails/.../29369311_zpid/`) or just its ZPID. You get the full property record for that property.

### Output sample

```json
{
  "type": "property",
  "zpid": "29412761",
  "address": "1704 Shelbourne Dr, Austin, TX 78752",
  "price": 395000,
  "priceChange": -25000,
  "beds": 3,
  "baths": 2,
  "sqft": 1556,
  "homeType": "SINGLE_FAMILY",
  "yearBuilt": 1969,
  "status": "FOR_SALE",
  "daysOnZillow": 194,
  "listedDate": "2026-02-21",
  "pricePerSqft": 254,
  "lotSize": 9561.42,
  "taxAssessedValue": 598179,
  "neighborhood": "Creekside",
  "photoCount": 37,
  "photos": ["https://photos.zillowstatic.com/fp/43506e...-p_e.jpg", "..."],
  "mlsId": "3401964",
  "description": "Charming single-story in central Austin, updated kitchen ...",
  "agentName": "Knolly Williams",
  "agentPhone": "(737) 205-1640",
  "brokerName": "eXp Realty, LLC",
  "parking": "Driveway, Garage, Garage Door Opener",
  "priceHistory": [{ "date": "2026-08-25", "event": "Price change", "price": 395000 }],
  "latitude": 30.327824,
  "longitude": -97.683815,
  "detailUrl": "https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/"
}
```

### Zillow API

Everything here runs programmatically: pass your list and read the properties through the Apify API, or any Apify integration like Zapier, Make, n8n, Google Sheets, or webhooks. For a direct Zillow API and a wider real estate feed outside Apify, the same engine powers [crustapi.com](https://crustapi.com).

### Who uses it

- Real estate investors and agents building lists of properties in a market
- Proptech and analytics teams that need a clean property feed
- Lead generation teams pulling agents and brokers
- Researchers tracking prices, inventory, and days on market

### FAQ

**Do I get the listing agent's contact?** Yes, the agent's name and phone come through whenever Zillow publishes them on the listing, which is most regular listings. Some builder and showcase listings do not name an individual agent, so those come back blank rather than guessed.

**Is this legal?** The actor only reads public Zillow pages, the same pages anyone can open in a browser without logging in. No account, no private data.

**Do I need a Zillow account?** No. Nothing runs through an account, so there is nothing to get restricted.

**Why do I get the whole area and not just the first page?** Zillow shows only about 40 properties per page and caps a single search. We page all the way through and split a busy area into smaller map boxes, then remove duplicates, so you get the full set.

**Can I schedule it?** Yes. Schedule a run on your areas and watch new listings, price cuts, and sold properties over time.

**What about school ratings and tax history?** Zillow loads those with a separate request that is not part of the page we read, so we leave them out rather than return blanks.

### More from CrustAPI

| Actor | What it does |
|---|---|
| Google Maps Scraper | Every business in any area |
| Google Reviews Scraper | Every review for any place, no duplicates |
| Skool Community Scraper | Every public Skool community and its owner |
| LinkedIn Jobs Scraper | Every job listing for any title and city |

Need volume beyond Apify, like a full real estate feed? See [crustapi.com](https://crustapi.com).

### Support and feedback

We ship improvements weekly, and user reports drive the roadmap. Something broken or missing?

- Open an issue on this actor's **Issues** tab in Apify Console
- Or email us at <support@crustapi.com>

***

*This actor is an independent tool built by CrustAPI. It is not affiliated with, endorsed by, or sponsored by Zillow. Zillow is a registered trademark of Zillow, Inc., and all other trademarks belong to their owners.*

# Actor input Schema

## `searches` (type: `array`):

One per line. Paste a city, a ZIP code, or a Zillow search link to get every property in that area. Paste a link to one property to get its full details. You can mix them.

## `maxResults` (type: `integer`):

The most properties to return per location you enter. A single property link is not affected.

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

Which listings to include in an area search. A property link always returns that property.

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

Only properties at or above this price. Leave blank for no minimum.

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

Only properties at or below this price. Leave blank for no maximum.

## `bedsMin` (type: `string`):

Only properties with at least this many bedrooms.

## `bathsMin` (type: `string`):

Only properties with at least this many bathrooms.

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

Leave empty for all types. Pick one or more to narrow it down.

## `daysOn` (type: `string`):

Only homes listed within this time. Great for finding fresh listings first.

## `priceReduced` (type: `boolean`):

Only homes with a recent price cut. Good for finding motivated sellers.

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

Only homes at or above this size. Leave blank for no minimum.

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

Only homes at or below this size. Leave blank for no maximum.

## `builtMin` (type: `integer`):

Only homes built in or after this year. Leave blank for no minimum.

## `builtMax` (type: `integer`):

Only homes built in or before this year. Leave blank for no maximum.

## `lotMin` (type: `integer`):

Only homes with a lot at or above this size. Leave blank for no minimum.

## `lotMax` (type: `integer`):

Only homes with a lot at or below this size. Leave blank for no maximum.

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

Only homes with a monthly HOA fee at or below this. Leave blank for no maximum.

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

Only homes whose listing mentions this, like pool, waterfront, or acreage.

## Actor input object example

```json
{
  "searches": [
    "Austin, TX"
  ],
  "maxResults": 100,
  "listingType": "forSale",
  "bedsMin": "0",
  "bathsMin": "0",
  "daysOn": "0",
  "priceReduced": false
}
```

# Actor output Schema

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

One row per home returned from your areas and home links.

# 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 = {
    "searches": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crustapi/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 = { "searches": ["Austin, TX"] }

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

```

## MCP server setup

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