# Zillow API | US Real Estate Listings for Sale, Rent & Sold (`johnvc/zillow-api`) Actor

A Zillow API for US real estate. Search homes for sale, for rent, and sold by plain city, ZIP, county, or neighborhood, with no region id or search URL to build. Filter for price cuts, sweep a whole metro past the 820-result cap, and get clean JSON. MCP-ready for Claude and AI agents.

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

## Pricing

from $1.60 / 1,000 listing returneds

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?

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 API | US Real Estate Listings, Price Cuts, Rentals & Sold

A **Zillow API** that turns [Zillow](https://www.zillow.com) into clean, structured JSON. Search homes **for sale**, **for rent**, and **sold** across the US, filter the way you would on the site, and get rows back that drop straight into a spreadsheet, a database, or an AI agent.

Two things set this apart from a plain Zillow scraper:

- **Search by plain place names.** Type `Austin, TX`, `78704`, `Travis County, TX`, or `Upper West Side, New York, NY`. No region ids to look up, no search URLs to hand-build. A ZIP is resolved to the correct place automatically. Many tools silently return a *different* city when you hand them a ZIP.
- **Sweep past the 820-result cap.** Zillow returns at most 820 results per search. Turn on **Sweep past the cap** and the Actor splits the map into tiles to cover a whole metro.

### Use cases

- **For sale**: price, beds, baths, square feet, lot size, home type, address, coordinates, broker, Zestimate, tax-assessed value, days on market, open houses, photos.
- **Price cuts**: the amount and date of the latest change, with a one-click **Price reduced only** filter for finding motivated sellers and stale inventory.
- **For rent**: building name, per-floor-plan rents, available-unit counts, leasing phone, required monthly fees, amenities.
- **Sold**: recently sold homes with sold date, Zestimate, and tax-assessed value.

### Getting started

```json
{
  "locations": ["Austin, TX"],
  "statusType": "sale",
  "priceReduction": true,
  "maxResults": 100
}
```

Rentals in a single ZIP:

```json
{
  "locations": ["78704"],
  "statusType": "rent",
  "maxResults": 50
}
```

A whole metro, sharded:

```json
{
  "locations": ["Phoenix, AZ"],
  "statusType": "sale",
  "autoShard": true,
  "maxResults": 2000,
  "maxUpstreamCalls": 80
}
```

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `locations` | array | one location source | `["Austin, TX"]` | Plain place names: city, ZIP, county, neighborhood, or state. Up to 25 per run. |
| `statusType` | string | yes | `sale` | `sale`, `rent`, or `sold`. |
| `regionId` | string | no | | A Zillow region id, for power users who already have one. A ZIP pasted here is resolved, not passed through. |
| `mapBounds` | string | no | | A `north,east,south,west` box, on its own or to clip a region. |
| `priceMin` / `priceMax` | integer | no | | Price range (list price for sale/sold, monthly rent for rent). |
| `bedsMin` / `bedsMax`, `bathsMin` / `bathsMax`, `sqftMin` / `sqftMax` | integer | no | | Size filters. |
| `priceReduction` | boolean | no | `false` | Only listings with a recent price cut. |
| `listingType` | array | no | | For sale: owner (FSBO), agent, new construction, foreclosure, auction, and more. |
| `homeType` | array | no | | House, condo, townhome, multi-family, lot/land, apartment, manufactured. |
| `maxResults` | integer | no | `200` | Main cost control. Minimum 10 per search (see Pricing). |
| `autoShard` | boolean | no | `false` | Sweep past the 820-result cap by splitting the map. |
| `maxUpstreamCalls` | integer | no | `40` | Hard ceiling on requests for a sharded run. |
| `includeImages` | boolean | no | `false` | Include every photo URL, not just the thumbnail. |

Rent-only filters (pets, move-in date, short-term lease) and sale-only filters (HOA, parking, basement, tours) are also supported; each applies only to its own `statusType`.

### What this Zillow API returns

One row per listing. `resultType` tells you the shape: `forSale`, `rental`, or `sold`. Every row carries the region it came from and a `scrapedAt` timestamp, so you can track a market over time by running on a schedule. Ready-made views: **Overview**, **Price cuts**, **Rentals**, **Sold**, and **Map data**.

#### Example output

```json
{
  "resultType": "forSale",
  "zpid": "29444234",
  "title": "1200 Barton Hills Dr, Austin, TX 78704",
  "price": "$425,000",
  "priceValue": 425000,
  "priceChange": -15000,
  "priceChangeDate": "2026-08-12",
  "beds": 3,
  "baths": 2,
  "squareFeet": 1842,
  "city": "Austin",
  "state": "TX",
  "zipcode": "78704",
  "latitude": 30.2489,
  "longitude": -97.7791,
  "url": "https://www.zillow.com/homedetails/29444234_zpid/",
  "regionId": "10221",
  "scrapedAt": "2026-08-25T14:22:07Z"
}
```

### 🔌 Integrations: run Zillow data as a recurring pipeline

This Zillow API is built to run on a schedule and feed the tools you already use, not just to answer a single query.

- **Tasks and Schedules.** Save a search (a city, a `priceReduction` filter, a `statusType`) as a Task, put it on a daily or weekly Schedule, and the dataset becomes a standing feed of that market. Pair it with the **Price cuts** view to watch stale inventory in a farm area.
- **MCP for Claude and AI agents.** This is an MCP-ready **Zillow MCP server**: point [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial) or any MCP client at it and ask for listings in plain language. See the FAQ below for the connection string.
- **n8n, Make, and Zapier.** Trigger the Actor from a workflow and route the JSON into a sheet, a CRM, or an alert.
- **Storage and webhooks.** Push results to Supabase, S3, or your own endpoint with an Apify webhook on run completion.
- **Code examples.** A [Python quick start and MCP install guide](https://github.com/johnisanerd/Apify-Zillow-API) shows the API from Python (uv) and from Claude, Cursor, and ChatGPT.

### Pricing

Pay per listing returned, with a **minimum of 10 listings per search** (about two cents). Every search fetches at least a full page of data whether it matches 41 listings or none, so a search that comes back empty is billed the same 10-listing minimum. There is no start fee, error rows carry no per-listing charge, and volume discounts apply automatically on higher plans.

#### Cost control

- **Max results** is the main dial; you are charged per listing (minimum 10 per search), so keep it as low as your question allows.
- **Sweep past the cap** is off by default. When on, it can make many requests, so it is paired with **Max data-source requests** as a hard ceiling.
- The Actor checks your run budget before it starts and will not fetch more listings than the budget can cover.

### 🔗 Related tools

- [Zoopla Property API](https://apify.com/johnvc/zoopla-property-api?fpr=9n7kx3): the same clean-JSON property feed for the UK market.
- [Realestate.com.au Property API](https://apify.com/johnvc/realestate-au-property-api?fpr=9n7kx3): for-sale, rent, and sold listings across Australia.
- [Google Maps Places API](https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3): enrich a listing's neighborhood with nearby amenities, ratings, and businesses.

### 📋 Featured tasks

Ready-to-run examples. Each is a saved search you can open and run in one click, or duplicate with your own city or ZIP:

- [Zillow Rentals API: Apartments & Homes for Rent](https://apify.com/johnvc/zillow-api/examples/zillow-rentals-api?fpr=9n7kx3): building name, per-floorplan rents, available units, and leasing phone by city or ZIP.
- [Zillow Sold Homes API: Recently Sold with Zestimate](https://apify.com/johnvc/zillow-api/examples/zillow-sold-homes-api?fpr=9n7kx3): sold date, Zestimate, and tax-assessed value for recently sold homes.
- [Zillow Open Houses API: Homes with Open Houses](https://apify.com/johnvc/zillow-api/examples/zillow-open-houses-api?fpr=9n7kx3): homes with a scheduled open house, including the start, end, and notes.
- [Zillow Price Cuts: Homes with Recent Price Drops](https://apify.com/johnvc/zillow-api/examples/zillow-price-cuts-api?fpr=9n7kx3): the price change amount, the change date, and days on market.
- [Zillow New Construction Homes API by City](https://apify.com/johnvc/zillow-api/examples/zillow-new-construction-api?fpr=9n7kx3): new-construction listings with price, beds, baths, square feet, and builder.
- [Zillow MCP Server: Real Estate Data for Claude](https://apify.com/johnvc/zillow-api/examples/zillow-mcp-server?fpr=9n7kx3): search for sale, rent, and sold in natural language from an MCP client.

### ❓ FAQ

#### Is there a Zillow API for developers?

Zillow's own developer access runs through an invite-only partner program, so most developers cannot self-serve. This Actor is a practical Zillow API: send a location and filters, get structured listings back, on demand or on a schedule. It is a **Zillow API alternative** you can start using in minutes.

#### How do I get Zillow data through this API versus a Web Scraper?

You never hand-build a scraper or a search URL. Unlike a raw Zillow Web Scraper, this Actor takes plain inputs (a city or ZIP, a `statusType`, filters) and returns clean typed fields. It resolves locations to the right Zillow region for you and can sweep a whole metro past the 820-result cap.

#### How do I search Zillow by ZIP code or city?

Put the ZIP or city in `locations` (for example `"78704"` or `"Austin, TX"`). The Actor resolves it to the correct [Zillow](https://www.zillow.com) region automatically. You can also pass a county, a neighborhood, or a whole state.

#### Can I use this Zillow API with Claude or an MCP server?

Yes. This is a **Zillow MCP server**. In an MCP client such as [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), add the Apify MCP endpoint and this Actor, then ask for listings in natural language. Agents can call it the same way they call any tool.

#### How do I get more than 800 Zillow results for one city?

Turn on `autoShard`. A single Zillow search is capped at 820 results, so the Actor splits the map into tiles and merges them, deduplicated, to cover a full metro. Use `maxUpstreamCalls` to cap the cost.

#### How do I find homes with recent price cuts?

Set `priceReduction` to `true`. Each row then carries `priceChange` and `priceChangeDate`, and the **Price cuts** view surfaces exactly the motivated-seller and stale-inventory listings. See [how price reductions work on Zillow](https://www.zillow.com/learn/) for background.

#### How do I find recently sold homes?

Set `statusType` to `sold`. Note that sold rows carry the sold date, the Zestimate, and the tax-assessed value, but not a closed sale price, which the source does not expose. For public sale-price records, a county [property records](https://en.wikipedia.org/wiki/Property_tax) search is the authoritative route.

#### Can I schedule this to run automatically?

Yes. Save your search as a Task and attach a Schedule (see Integrations above). The dataset becomes a self-updating feed you can diff week over week.

### Agent skills

Install ready-made Claude skills that drive this API:

- [Zillow API skill](https://github.com/johnisanerd/claude-skill-zillow-api): for-sale, rental, and sold listings by plain city or ZIP, as structured rows.
- [Zillow price cuts skill](https://github.com/johnisanerd/claude-skill-zillow-price-cuts): homes with a recent price drop, with the change amount, change date, and days on market.

Install with: `npx skills add johnisanerd/claude-skill-zillow-api`

### Notes

- Photo fields are **URLs only**. Images are never downloaded, cached, or re-hosted.
- The [Zestimate](https://en.wikipedia.org/wiki/Zillow) and Rent Zestimate are Zillow's own estimates, not appraisals or recommended rents.
- Sold listings do not carry a sale price on the source, so the **Sold** view shows the Zestimate and tax-assessed value instead.
- `daysOnZillow` resets when a listing is relisted, so it can understate how long a home has really been on the market.
- Coverage reflects what is publicly listed on Zillow; some private or office-exclusive listings never appear there.

This Actor is not affiliated with, endorsed by, or sponsored by Zillow Group, Inc. "Zillow" and "Zestimate" are trademarks of Zillow Group, Inc., used here only to describe the data source.

***

Built by [Alpha OSINT](https://www.alphaosint.com). More data APIs, and support, at [alphaosint.com](https://www.alphaosint.com).

Last Updated: 2026.09.08

# Actor input Schema

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

Places to search, as plain names. Accepts a city (Austin, TX), a ZIP code (78704), a county (Travis County, TX), a neighborhood (Upper West Side, New York, NY), or a state (TX). A ZIP is resolved to the right place automatically, so you never paste a region id. Add a state to disambiguate common names. Up to 25 locations per run.

## `ambiguityPolicy` (type: `string`):

How to handle a name that matches more than one place, such as 'Springfield'.

## `regionId` (type: `string`):

Zillow's internal numeric region id, NOT a ZIP code. Pasting a ZIP here silently returns a different city's listings. Use the Locations field instead unless you already hold a verified region id.

## `mapBounds` (type: `string`):

A geographic box as north,east,south,west, for example 30.51,-97.56,30.14,-98.05. Works on its own, or with a region id to restrict a region to part of the map.

## `statusType` (type: `string`):

Which market to search.

## `homeType` (type: `array`):

Property types to include. For sale/sold: house, townhome, multi\_family, condo, lot\_land, apartment, manufactured. For rent: house, apartment\_condo, townhome. Leave empty for all types.

## `listingType` (type: `array`):

Restrict for-sale results by who is selling. Note: foreclosure and pre-foreclosure inventory on the source is very thin.

## `listingStatus` (type: `array`):

Restrict by listing state.

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

Lowest price (list price for sale/sold, monthly rent for rent).

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

Highest price.

## `bedsMin` (type: `integer`):

Fewest bedrooms.

## `bedsMax` (type: `integer`):

Most bedrooms.

## `bathsMin` (type: `integer`):

Fewest bathrooms.

## `bathsMax` (type: `integer`):

Most bathrooms.

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

Smallest interior area.

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

Largest interior area.

## `yearBuiltMin` (type: `integer`):

Earliest year built.

## `yearBuiltMax` (type: `integer`):

Latest year built.

## `lotSizeMin` (type: `integer`):

Smallest lot in square feet.

## `lotSizeMax` (type: `integer`):

Largest lot in square feet.

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

Highest monthly HOA fee. Set 0 for no HOA.

## `parkingSpots` (type: `integer`):

Fewest parking spots.

## `hasGarage` (type: `boolean`):

Only show properties with a garage.

## `singleStory` (type: `boolean`):

Only show single-story properties.

## `priceReduction` (type: `boolean`):

Only show listings with a recent price cut. The core filter for finding motivated sellers and stale inventory.

## `timeOnZillow` (type: `string`):

Longest a listing has been posted. A number of days (for example 14), or one of 6m, 12m, 24m, 36m.

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

Comma-separated keywords to match in the listing, for example: pool, casita.

## `amenities` (type: `array`):

Required amenities. Options differ by market; common ones: ac, pool, waterfront (for sale); in\_unit\_laundry, parking, ac, dishwasher, fitness\_center (for rent).

## `view` (type: `array`):

Required views.

## `basement` (type: `array`):

Required basement type.

## `tours` (type: `array`):

Required tour options.

## `age55Plus` (type: `string`):

How to treat 55+ communities.

## `pets` (type: `array`):

Required pet policy. 'No pets' cannot be combined with the others.

## `space` (type: `string`):

Type of rental space.

## `moveInDate` (type: `string`):

Only show rentals available on or before this date (YYYY-MM-DD).

## `hideNoDateListings` (type: `boolean`):

Hide rentals that do not state an availability date. Use with move-in date.

## `shortTermLease` (type: `boolean`):

Only show rentals offering a short-term lease.

## `listingFeatures` (type: `array`):

Required rental features.

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

The main cost control. Charged per listing returned, with a 10-listing minimum per search: every search fetches at least one full page, so it is billed for at least 10 listings even when fewer (or none) match.

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

Result ordering. 'Verified source' and 'Recommended' apply to rentals only.

## `autoShard` (type: `boolean`):

The source returns at most 820 listings per search. Turn this on to split the map into quadrants and cover a whole metro. This multiplies the number of data-source requests, so keep Max results and Max data-source requests as low as your question allows.

## `maxUpstreamCalls` (type: `integer`):

A hard ceiling on how many requests a sharded run may make, independent of Max results. Empty map areas still cost one request each. 200 covers a full metro sweep; the run also stops on its own once new listings stop appearing.

## `includeImages` (type: `boolean`):

Include every listing photo URL, not just the thumbnail. This can multiply the dataset size. Photo URLs are links only; images are never rehosted.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "ambiguityPolicy": "largest",
  "statusType": "sale",
  "homeType": [],
  "listingType": [],
  "listingStatus": [],
  "hasGarage": false,
  "singleStory": false,
  "priceReduction": false,
  "amenities": [],
  "view": [],
  "basement": [],
  "tours": [],
  "age55Plus": "include",
  "pets": [],
  "space": "entire_place",
  "hideNoDateListings": false,
  "shortTermLease": false,
  "listingFeatures": [],
  "maxResults": 200,
  "sortBy": "globalrelevanceex",
  "autoShard": false,
  "maxUpstreamCalls": 40,
  "includeImages": false
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every row from this run.

## `overview` (type: `string`):

Listings with price, beds, baths and days on market.

## `priceCuts` (type: `string`):

Listings with a recorded price change, amount and date.

## `rentals` (type: `string`):

Rental buildings with rent range, vacancy and leasing phone.

## `sold` (type: `string`):

Sold properties with sold date and assessed value.

## `map` (type: `string`):

Coordinates and price for mapping and GIS.

# 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"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("johnvc/zillow-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"
  ]
}' |
apify call johnvc/zillow-api --silent --output-dataset

```

## MCP server setup

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