# Zillow Real Estate Scraper ($0.5/1k) (`santamaria-automations/zillow-scraper`) Actor

Scrape property listings from Zillow.com — the US's #1 real estate portal. Returns price, address, beds, baths, sqft, year built, GPS coordinates, and Zestimate for for-sale, for-rent, and recently-sold listings. No login required. Pay-per-result.

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

## Pricing

from $0.50 / 1,000 search results

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/platform/actors/running/actors-in-store#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

## Zillow Real Estate Scraper

Get property listings from [Zillow.com](https://www.zillow.com) as clean JSON. Works with for-sale, for-rent, and recently-sold listings across the US. Returns 30+ fields per listing including price, address, Zestimate, broker name, GPS coordinates, days on market, and photos. No login required.

At $0.50 per 1,000 listings, this is the cheapest reliable Zillow scraper on Apify.

### What you can do with it

- Track price drops and new listings in a market you follow
- Pull recently sold homes for comparable market analysis
- Export rental inventory for pricing research
- Feed live real-estate data into your CRM, dashboard, or AI agent
- Enrich a list of specific properties by their Zillow ID

### How to use it

**Option 1: Enter one or more locations.** Set `locations` to a list of cities, ZIP codes, or neighborhoods. Each entry becomes a separate search.

```
Los Angeles, CA
Miami, FL
Brooklyn, NY
90210
Austin, TX
```

**Option 2: Paste Zillow search URLs.** Open zillow.com, apply your filters (price range, beds, home type), copy the browser URL, and paste it into `searchUrls`. Use this when you need Zillow's advanced filters that aren't exposed as inputs here.

#### Minimal input

```json
{
  "locations": ["Miami, FL"],
  "listingType": "for_sale",
  "maxItems": 100
}
```

#### Input with full details

```json
{
  "locations": ["Austin, TX", "78701"],
  "listingType": "for_sale",
  "maxItems": 50,
  "fetchDetails": true,
  "preferDatacenter": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "countryCode": "US"
  }
}
```

#### Input parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `searchUrls` | array | Zillow search URLs. Best when you need Zillow's advanced filters. |
| `locations` | array | Cities, ZIP codes, or neighborhoods. One search per entry. |
| `listingType` | string | `for_sale`, `for_rent`, or `recently_sold`. Default `for_sale`. |
| `maxItems` | integer | Maximum listings to return across all searches. Default 100. |
| `fetchDetails` | boolean | Visit each property page to add description, MLS ID, HOA fee, price history, and school count. Off by default. |
| `concurrency` | integer | Parallel HTTP requests. Default 2. |
| `preferDatacenter` | boolean | Route through Apify's cheaper datacenter pool first, with automatic fallback to residential if blocked. Off by default. |
| `proxyConfiguration` | object | Apify proxy settings. Residential + US by default. |

### What you get back

For every listing, the scraper returns:

- Price and Zestimate (Zillow's estimated market value)
- Rent Zestimate (Zillow's estimated monthly rent)
- Broker name (listing brokerage or agent)
- Full address broken into street, city, state, and ZIP
- GPS coordinates
- Property type (Single Family, Condo, Townhouse, etc.)
- Bedrooms and bathrooms
- Living area in sqft and lot size in sqft
- Year built
- Days on market
- Tax assessed value
- Price change amount, badge, and date (when a price drop happened)
- Media flags (3D tour, video tour) and photo count
- Photo URLs
- Listing status (FOR\_SALE, FOR\_RENT, RECENTLY\_SOLD)
- Date sold and final sale price for recently-sold listings
- Next open house time and date, if scheduled

With `fetchDetails: true`, every listing is also enriched from its property detail page with:

- Full listing description
- HOA monthly fee
- MLS ID
- Complete price history (date, event, and price for every past change)
- Number of associated schools

#### Output example

```json
{
  "property_image_url": "https://photos.zillowstatic.com/fp/abc123-p_e.jpg",
  "zpid": "20527905",
  "url": "https://www.zillow.com/homedetails/123-Main-St-Los-Angeles-CA-90001/20527905_zpid/",
  "status": "FOR_SALE",
  "listing_type": "for_sale",
  "price": 750000,
  "zestimate": 780000,
  "rent_zestimate": 3400,
  "address": "123 Main St Los Angeles, CA 90001",
  "address_street": "123 Main St",
  "city": "Los Angeles",
  "state": "CA",
  "zip_code": "90001",
  "latitude": 34.052235,
  "longitude": -118.243683,
  "property_type": "Single Family",
  "bedrooms": 3,
  "bathrooms": 2,
  "living_area_sqft": 1800,
  "lot_size_sqft": 6000,
  "year_built": 1995,
  "days_on_market": 12,
  "tax_assessed_value": 680000,
  "broker_name": "Compass Realty",
  "price_change": -25000,
  "price_reduction": "$25,000 (Jul 20)",
  "has_3d_tour": true,
  "has_video": false,
  "photos": ["https://photos.zillowstatic.com/fp/abc123.jpg"],
  "source_url": "https://www.zillow.com/homes/Los-Angeles,-CA_rb/",
  "source_platform": "zillow.com",
  "scraped_at": "2026-07-27T10:00:00Z"
}
```

#### Full field reference

| Field | Type | Description |
|-------|------|-------------|
| `property_image_url` | string | Main property photo URL |
| `zpid` | string | Zillow property ID |
| `url` | string | Zillow listing URL |
| `status` | string | Listing status (FOR\_SALE, FOR\_RENT, RECENTLY\_SOLD) |
| `listing_type` | string | Search type: for\_sale, for\_rent, recently\_sold |
| `price` | number | Asking price in USD |
| `zestimate` | number | Zillow's estimated market value in USD |
| `rent_zestimate` | number | Zillow's estimated monthly rent in USD |
| `address` | string | Full address |
| `address_street` | string | Street address |
| `city` | string | City name |
| `state` | string | State abbreviation |
| `zip_code` | string | ZIP code |
| `latitude` | number | GPS latitude |
| `longitude` | number | GPS longitude |
| `property_type` | string | Property type (Single Family, Condo, etc.) |
| `bedrooms` | number | Number of bedrooms |
| `bathrooms` | number | Number of bathrooms |
| `living_area_sqft` | number | Living area in square feet |
| `lot_size_sqft` | number | Lot size in square feet |
| `year_built` | number | Year built |
| `days_on_market` | number | Days on Zillow |
| `tax_assessed_value` | number | Tax assessed value in USD |
| `broker_name` | string | Listing brokerage or agent name |
| `price_change` | number | Recent price change in USD (negative means reduction) |
| `price_reduction` | string | Zillow's human-readable reduction badge |
| `price_changed_at` | string | Date of the most recent price change |
| `has_3d_tour` | boolean | Property has a 3D walkthrough |
| `has_video` | boolean | Property has a video tour |
| `photos` | array | Property photo URLs |
| `photo_count` | number | Total number of photos on the listing |
| `date_sold` | string | Date sold (recently\_sold listings) |
| `listing_sold_price` | number | Final sale price in USD (recently\_sold listings) |
| `open_house` | string | Next open house time and date, if scheduled |
| `description` | string | Full listing description (fetchDetails only) |
| `hoa_monthly_fee` | number | Monthly HOA fee in USD (fetchDetails only) |
| `mls_id` | string | MLS listing ID (fetchDetails only) |
| `price_history` | array | Full price event history (fetchDetails only) |
| `schools_count` | number | Number of associated schools (fetchDetails only) |
| `source_url` | string | Search URL used |
| `source_platform` | string | Always `zillow.com` |
| `scraped_at` | string | ISO timestamp |

### Use it with AI agents (MCP)

Connect this actor to any MCP-compatible AI client (Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents).

**Apify MCP server URL:**

```
https://mcp.apify.com?tools=santamaria-automations/zillow-scraper
```

**Example prompt once connected:**

> "Use `zillow-scraper` to get for-sale listings in Miami, FL. Return price, beds, baths, and address as a table."

Clients that support dynamic tool discovery (Claude.ai, VS Code) receive the full input schema automatically via `add-actor`.

### Tips for best results

- **Save on cost with `preferDatacenter: true`.** Datacenter proxy runs are about 6x cheaper than residential. If a session hits a block, the actor rotates sessions automatically and falls back to residential after 3 consecutive blocks. Same output, lower cost per run.
- **Residential is the default** because it always works. Leave it on if you want maximum reliability without thinking about proxies.
- **Recently sold** returns homes sold in the past 90 days.
- **Zillow caps search results at about 1,000 listings per query.** For a full market, split by neighborhood or ZIP code.
- **Rental listings** on Zillow often group multiple units under an apartment building. Set `fetchDetails: true` to enrich those with per-unit data.
- The scraper rotates browser fingerprints and proxy sessions automatically for the best success rate.

### Pricing

Pay only for what you get. No monthly fee, no minimum.

| Event | Price |
|-------|-------|
| Actor start | $0.001 |
| Per property listing (search) | $0.50 per 1,000 |
| Per property with full details | $1.50 per 1,000 (only when `fetchDetails: true`) |

A run scraping 100 listings costs about $0.05. Adding full detail enrichment on top brings it to about $0.20.

### Legal

This scraper accesses only publicly available property listings on Zillow.com. Use the data for market research, real estate analysis, or feeding your own product. Do not resell the raw dataset as-is, and respect Zillow's terms of use in downstream applications.

# Actor input Schema

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

Paste Zillow search URLs directly. Best for advanced filters (price bands, home type, keywords). Example: https://www.zillow.com/homes/Los-Angeles,-CA\_rb/

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

List of cities, ZIP codes, or neighborhoods. Each entry becomes one search. Example: \['Los Angeles, CA', 'Miami, FL', '90210']

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

Type of listings to scrape. Ignored when Search URLs are provided (the URL itself carries the filter).

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

Maximum number of listings to return across all searches.

## `fetchDetails` (type: `boolean`):

Visit each property's detail page to add description, HOA fee, MLS ID, full price history, and school count. Adds about 3 seconds per listing and triples per-listing cost.

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

Number of parallel HTTP requests. Higher is faster but more likely to trigger rate limits.

## `preferDatacenter` (type: `boolean`):

Route search traffic through Apify's datacenter pool first. About 6x cheaper than residential. Automatically falls back to residential after 3 consecutive blocks. Ignored when Fetch full property details is on (detail pages require residential).

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

Apify proxy settings. Residential + US is the default and works for every listing type and detail page.

## Actor input object example

```json
{
  "searchUrls": [],
  "locations": [
    "Los Angeles, CA"
  ],
  "listingType": "for_sale",
  "maxItems": 40,
  "fetchDetails": false,
  "concurrency": 2,
  "preferDatacenter": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "countryCode": "US"
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing scraped Zillow property listings

# 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 = {
    "searchUrls": [],
    "locations": [
        "Los Angeles, CA"
    ],
    "maxItems": 40,
    "concurrency": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/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 = {
    "searchUrls": [],
    "locations": ["Los Angeles, CA"],
    "maxItems": 40,
    "concurrency": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/zillow-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [],
  "locations": [
    "Los Angeles, CA"
  ],
  "maxItems": 40,
  "concurrency": 2
}' |
apify call santamaria-automations/zillow-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=santamaria-automations/zillow-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/qMYJrCcOuK4MsbHKd/builds/3V3cmB6iWbCjwSVUT/openapi.json
