# Zillow Property Details API: ZPID, URL & Address Lookup (`sauliusautomatesit/zillow-property-details-api`) Actor

Zillow property details API and scraper: Zestimate and range, rent Zestimate, tax value, price, last sale, facts, agent, broker and photos for any Zillow link, zpid or street address, in bulk. No login; also via MCP. $2 per 1,000 homes.

- **URL**: https://apify.com/sauliusautomatesit/zillow-property-details-api.md
- **Developed by:** [Saulius AutomatesIT](https://apify.com/sauliusautomatesit) (community)
- **Categories:** Real estate, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.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 Property Details API: ZPID, URL & Address Lookup

Zillow property details API and scraper: give it Zillow home links, zpids or plain **street addresses** and get one full row per home with **Zestimate** and its low and high range, **rent Zestimate**, tax assessed value and tax rate, list or sold price, last sold price, beds, baths, living area, lot, year built, home type, days on Zillow, page views and saves, description, facts, listing agent and phone, broker, MLS id, coordinates and photos.

No Zillow account, no cookies, no browser. **$2 per 1,000 homes**, misses free.

### What you can use it for

- **Bulk valuations**: a spreadsheet of addresses in, Zestimate, range, rent Zestimate and tax value out.
- **Enrich a search**: point it at the dataset of any Zillow search run (`zpid` or `url` columns) and get the full details for every home.
- **Rental yield and flip analysis**: Zestimate next to rent Zestimate, last sale and tax value for each property.
- **CRM and lead enrichment**: listing agent, phone, broker and MLS id for homes on the market.
- **AI agents**: call it as an MCP tool to look up any US home by address.

### How to use it

1. Paste **Zillow home links**, **street addresses** or **zpids** (any mix), or the **dataset ID** of an earlier search run.
2. Run it and download JSON, CSV or Excel, or read the rows through the API.

Inputs written for other Zillow detail scrapers work as they are: `startUrls` (links as `{"url": ...}` objects) and `addresses` are the same field names.

#### Input example

```json
{
  "startUrls": [{ "url": "https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/" }],
  "addresses": ["18 Zelma Dr, Greenville, SC 29617"],
  "zpids": ["29490744"],
  "maxPhotos": 10
}
```

### Output

#### Property row

```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

- **Addresses** are matched with Zillow's own search box; the row carries the address Zillow matched (`matchedAddress`). An address Zillow does not know comes back as a free `NOT_FOUND` row.
- **Search links** pasted in `Zillow home links` are expanded: each home found (up to `Max homes per search link`) gets its full row.
- **Apartment building pages** (`/apartments/...`, `/b/...`) hold many units, not one home; they are skipped with a free `UNSUPPORTED` row.
- **Zestimates** are Zillow's estimates; some homes have none and the field is then `null`.
- The run summary (`OUTPUT` in the key-value store) counts rows delivered, misses and failures.

### Pricing

| Item | Price |
|---|---|
| Property (full details) | $0.002 ($2 per 1,000) |
| Run start | $0.00005 |

Bronze, Silver and Gold Apify plans pay 5%, 10% and 15% less. Inputs that give nothing (unknown address, deleted home, unsupported page) come back as free `error` rows. If Zillow refuses a home page from a search link, that home is saved from the search card and charged as a listing ($1.50 per 1,000).

### Use it from code or an AI agent

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("sauliusautomatesit/zillow-property-details-api").call(run_input={
    "addresses": ["2114 Bigelow Ave N, Seattle, WA 98109", "18 Zelma Dr, Greenville, SC 29617"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("zestimate"), item.get("rentZestimate"), item.get("streetAddress"))
```

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

### Related Actors

- [Zillow Scraper API](https://apify.com/sauliusautomatesit/zillow-scraper-api): search Zillow by city, ZIP, neighborhood or search link with filters, plus property details.
- [Zillow ZIP Code Search API](https://apify.com/sauliusautomatesit/zillow-zip-code-search-api): every home for sale, for rent or sold in a list of ZIP codes.

### 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

## `startUrls` (type: `array`):

Zillow property pages, one per line, for example `https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/`. A Zillow search link works too: every home it finds comes back with full details (up to `Max homes per search link`). Apartment building pages (`/apartments/`, `/b/`) are skipped with a free error row.

## `addresses` (type: `array`):

US street addresses, one per line, as you would type them in Zillow's search box: `18 Zelma Dr, Greenville, SC 29617`. Each is matched to its Zillow home; the row says which address Zillow matched.

## `zpids` (type: `array`):

Zillow property ids, one per line, for example `48749425` (the number before `_zpid` in a Zillow link).

## `searchResultsDatasetId` (type: `string`):

A dataset from an earlier run in your account whose rows carry `zpid` or `url`, for example the output of a Zillow search scraper. Every home in it is looked up in full.

## `maxDatasetItems` (type: `integer`):

At most this many rows are read from the dataset above.

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

For Zillow search links in `Zillow home links`: how many of the homes found are looked up in full.

## `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
{
  "startUrls": [
    {
      "url": "https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/"
    }
  ],
  "addresses": [
    "18 Zelma Dr, Greenville, SC 29617"
  ],
  "maxDatasetItems": 10000,
  "maxResultsPerSearch": 100,
  "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 = {
    "startUrls": [
        {
            "url": "https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/"
        }
    ],
    "addresses": [
        "18 Zelma Dr, Greenville, SC 29617"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sauliusautomatesit/zillow-property-details-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 = {
    "startUrls": [{ "url": "https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/" }],
    "addresses": ["18 Zelma Dr, Greenville, SC 29617"],
}

# Run the Actor and wait for it to finish
run = client.actor("sauliusautomatesit/zillow-property-details-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 '{
  "startUrls": [
    {
      "url": "https://www.zillow.com/homedetails/2114-Bigelow-Ave-N-Seattle-WA-98109/48749425_zpid/"
    }
  ],
  "addresses": [
    "18 Zelma Dr, Greenville, SC 29617"
  ]
}' |
apify call sauliusautomatesit/zillow-property-details-api --silent --output-dataset

```

## MCP server setup

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