# Zillow Property Details Scraper: Address & ZPID Lookup (`deepmine/zillow-property-details-scraper`) Actor

Zillow property details scraper and address lookup: paste addresses, ZPIDs, home or building links, or a search run's dataset. One row per home: price, Zestimate, beds, baths, sq ft, price and tax history, schools, agent and broker, photos, plus Zillow's nearby and comparable homes. No login.

- **URL**: https://apify.com/deepmine/zillow-property-details-scraper.md
- **Developed by:** [DeepMine](https://apify.com/deepmine) (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.84 / 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 Scraper: Address & ZPID Lookup

Zillow property details scraper and address lookup: paste addresses, ZPIDs or Zillow links and get one row per home with price, Zestimate, price and tax history, schools, the listing agent and broker, photos, and Zillow's own nearby and comparable homes. No login.

| Address | Price | Status | Beds | Baths | Sq Ft | Zestimate | Nearby homes |
|---|---|---|---|---|---|---|---|
| 1818 S Lakeshore Blvd APT 27, Austin, TX 78741 | $389,900 | For sale | 1 | 1 | 736 | – | 8 |
| 2708 1st Avenue W, Seattle, WA 98119 | $820,000 | Sold | 2 | 2 | 1,143 | $857,800 | 8 |
| 4662 Eliot St, Denver, CO 80211 | $3,500/mo | For rent | 4 | 2 | 1,800 | $666,500 | 9 |
| 18 Zelma Dr, Greenville, SC 29617 | – | Off market | 3 | 3 | 2,200 | $435,300 | 8 |

<sub>Collected 2026-10-18 from the prefilled run (4 homes: for sale, sold, for rent, off market). On a 100-home Austin run (40 for sale, 34 sold, 25 for rent, 1 pending), these had a value: nearby homes 100, price history 100, schools 100, features 97, comparable homes 86, brokerage 82, agent phone 78, tax history 71, Zestimate 60, buyer's agent 34, HOA 29.</sub>

**$1.49 per 1,000 properties** on Starter ($1.78 Free, $1.19 Scale, $0.84 Business), nearby homes and Zillow's records included. The prefilled run (4 properties) costs about $0.01.

This is the lookup-only form of [Zillow API: Property Details, Search & Sold Homes](https://apify.com/deepmine/zillow-scraper): start from homes you already know, never from a city search.

### What you can do with it

- **Enrich an address list**: paste the addresses from a CRM, a lead list or a spreadsheet and get each home's facts, value, taxes and listing contacts back as a table (CSV, Excel, JSON).
- **Comps in one row**: every home comes with Zillow's own *Nearby homes* (the list on its page, usually 8) and the sales its Zestimate compares with, each with price, Zestimate, beds, baths, size and link.
- **Agent and broker contacts**: the listing agent's name, phone, email and licence, co-listing agent, brokerage and its phone, MLS name and number; sold homes add the buyer's agent and brokerage.
- **Track known homes**: schedule a run over the same ZPIDs to see status, price, Zestimate and price-history changes.
- **Enrich a search**: pick the dataset of a Zillow search run (ours or another Zillow Actor's) and every home in it gets its full details.
- **Buildings and communities**: a building link (`/b/…`) or apartment-community link (`/apartments/…`) gives the building as one row (units, rents, floor plans, amenities) or one row per unit of the kind you choose.

### Input

Paste **properties**, one per line: a street address, a ZPID, a Zillow home link or a building link. **Max properties** caps the run (100 unless you change it; building units count). Under *More inputs*, **Dataset of a Zillow search run** looks up every row of another run's dataset that has a zpid, link or address. Nearby homes and Zillow's records are on by default; **Include Zestimate history** adds 10 years of monthly Zestimates (one more request per home). All are included in the price.

```json
{
  "properties": [
    "1704 Shelbourne Dr, Austin, TX 78752",
    "29412761",
    "https://www.zillow.com/homedetails/2708-1st-Ave-W-Seattle-WA-98119/443943273_zpid/",
    "https://www.zillow.com/apartments/dallas-tx/hanover-turtle-creek/CpjCGP/"
  ],
  "maxProperties": 500,
  "extractBuildingUnits": "for_rent",
  "searchResultsDatasetId": "YOUR_DATASET_ID"
}
```

API callers can also send `startUrls` (`[{"url": "…"}]`), `addresses` and `propertyStatus`, the keys other Zillow detail Actors take, so existing inputs work unchanged.

### Output

One row per home, in input order; a home given twice (say by address and by ZPID) appears once, is charged once and lists both in `inputs`. Every row has the same fields; a value Zillow doesn't show is `null`, never 0. Addresses Zillow doesn't know are listed in the run's OUTPUT record with the reason and are never charged.

- **The home:** `photo`, `address`, `price`, `priceUsd`, `pricePerSqft`, `status`, `listingSubType`, `beds`, `baths`, `bathsFull`, `bathsHalf`, `bathsThreeQuarter`, `livingArea`, `lotSize`, `homeType`, `yearBuilt`, `description`, `descriptionSnippet`, `facts`, `features`, `parkingSpaces`, `garageSpaces`, `hasGarage`, `hasAttachedGarage`, `parkingFeatures`, `photos`, `photoCount`, `staticMapUrl`, `streetViewImageUrl` (Zillow's Street View picture of the home), `virtualTourUrl`, `floorPlanUrl`, `has3dTour`, `hasVideo`.
- **Value, costs and history:** `zestimate`, `rentZestimate`, `hoaFee`, `taxAssessedValue`, `annualTax`, `taxRate`, `mortgageRate30Year`, `mortgageRate15Year`, `mortgageRateArm5`, `lastSoldPrice`, `soldAt`, `priceHistory`, `taxHistory`, `priceChange`, `priceChangedAt`.
- **The listing:** `daysOnZillow`, `listedAt`, `pageViews`, `saves`, `openHouse`, `agentName`, `agentPhone`, `agentLicense`, `agentEmail`, `coAgentName`, `coAgentPhone`, `coAgentLicense`, `buyerAgentName`, `buyerAgentLicense`, `buyerBrokerName`, `listedBy`, `brokerName`, `brokerPhone`, `mlsId`, `mlsName`, `mlsDisclaimer`, `mlsLastChecked`, `mlsLastUpdated`.
- **Nearby:** `nearbyHomes` (Zillow's *Nearby homes* of the page) and `comparableHomes` (the Zestimate's comparable sales), each home with `zpid`, `address`, `priceUsd`, `zestimate`, `status`, `beds`, `baths`, `livingArea`, `lotSize`, `homeType`, `soldAt`, `lastSoldPrice`, `photo` (Zillow's Street View or map picture when the home has no photo), `propertyUrl`, `latitude`, `longitude`; `schools`, `schoolDistricts`, `county`, `neighborhood`, `subdivision`, `timeZone`.
- **Buildings:** `buildingName`, `unitCount` (units available now), `buildingUnits` (one line per unit), `floorPlans`, `buildingAttributes`.
- **Zillow's records** (the structures behind the text fields): `resoFacts` (up to ~90 facts on a listed home), `attributionInfo` (every agent and office with their role), `priceHistoryRecords` (price per sq ft, change rate and agents per event), `taxHistoryRecords`, `schoolRecords` (rating, level, district, enrollment, teacher ratios, GreatSchools link), `photoRecords` (every size of every photo), `keystoneHomeStatus`, `specialOffers`, `listingProvider`, `listingFlags`, `isZillowOwned`, `foreclosureTypes` (bank owned, non-retail auction, default), `adTargets` (market, price and Zestimate bands).
- **Value range, history and highlights:** `zestimateHistory` (with Include Zestimate history: `[{"date": "2026-10-16", "value": 863900}, …]`, 10 years), `zestimateLow`, `zestimateHigh`, `zestimateLowPercent`, `zestimateHighPercent`, `highlights` (Zillow's "Brand-new kitchen" tags), `whatILove`, `tourViewCount`, `sellingSoon`, `nearbyCities`, `nearbyNeighborhoods`, `nearbyZipcodes`, `countyFips`.
- **Ids and place:** `propertyUrl`, `street`, `city`, `state`, `zipcode`, `latitude`, `longitude`, `zpid`, `parcelId`, `detailsStatus`, `inputs` (every input you gave that names the home), `scrapedAt`.

What's filled depends on the home. In the Austin run, sold homes had the sale date and price and the buyer's agent and brokerage (35 of 35); homes for sale had the brokerage (41 of 41) and mostly the agent (28); rentals seldom name an agent (5 of 26); off-market homes have a Zestimate, price and tax history and nearby homes, but no price or agent. The Console has nine tables: 📊 Overview, 🏘️ Nearby Homes, 📈 Stats, 🧾 Details, 📇 Agents, 🔖 Listing (for sale), 🏢 Rentals (for rent), 🤝 Sold and 🧰 Features.

### Pricing

Pay per property delivered, no start fee, no minimum. Nearby homes and Zillow's records cost nothing extra; addresses Zillow doesn't know are never charged, and a restarted run doesn't charge again for homes it already delivered.

| Per 1,000 | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Property with full details | $1.78 | $1.49 | $1.19 | $0.84 |

Platinum and Diamond plans pay the Business price. Set a maximum cost per run in the Console; the run stops there and says so.

### FAQ

**Are the nearby homes a radius search?** No. They are the homes Zillow itself lists under *Nearby homes* on the property's page (usually 8; 9 on some rentals), read from Zillow's own data for that home. The comparable homes are the sales Zillow's Zestimate is based on, when Zillow shows them (86 of 100 homes in the Austin run).

**Why is a sale price empty?** Texas, Utah, New Mexico and a few other states don't publish sale prices; there Zillow shows one only when the listing's MLS reports it (it did for all 35 Austin sales in our test).

**Do I need to run a search first?** No: addresses, ZPIDs and links are looked up directly. To enrich a whole area, run a Zillow search and pick its dataset here.

**Why did an address come back as not found?** Zillow had no home at that address (a typo, a unit number it lists differently, or a new build). The OUTPUT record names each one; it isn't charged. Try the Zillow link instead.

### Related Actors

- [Zillow API: Property Details, Search & Sold Homes](https://apify.com/deepmine/zillow-scraper): the same engine with searches too: a city, ZIP or Zillow search link in, every listing out.
- [Zillow Scraper: Listings for Sale, Rent & Sold](https://apify.com/deepmine/zillow-listings-scraper): search-first: homes for sale, for rent or sold in an area, with details on request.

### Feedback

Found a problem or need a field? Open an issue on the Actor's **Issues** tab; we answer within 48 hours. If the data helped, a quick review on the Store page helps others find it.

# Actor input Schema

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

Homes to look up, one per line: a street address ("1704 Shelbourne Dr, Austin, TX 78752"), a ZPID (29412761), a Zillow home link, or a building link (…/b/… or …/apartments/…). Addresses Zillow doesn't have are listed in OUTPUT and never charged.

## `maxProperties` (type: `integer`):

Most homes the run returns (building units included). You pay per home returned. Empty = every home you list.

## `extractBuildingUnits` (type: `string`):

For a building or apartment-community link: the building as one row (units, rents, amenities), or one row per unit with full details, of the kind chosen here.

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

Look up every home in another run's dataset, e.g. a Zillow search or Zillow Scraper run: rows with a zpid, link or address column. Added after the homes above.

## `includeNearbyHomes` (type: `boolean`):

Adds nearbyHomes (Zillow's own "Nearby homes" of the page, usually 8) and comparableHomes (the sales its Zestimate compares with). Included in the price.

## `includeSourceFacts` (type: `boolean`):

Adds resoFacts (Zillow's full facts record, ~80 facts on a listed home), attributionInfo (every agent and office), the price history, tax history, school and photo records (per-event price per sq ft and agents, GreatSchools links, every photo size), the Zestimate's range, Zillow's highlights, listing flags, ad targeting facts, nearby cities and ZIP codes, and with nearby homes on isZillowOwned, foreclosureTypes and Zillow's Street View picture, keystoneHomeStatus, specialOffers, and for building links floorPlans and buildingAttributes. Included in the price.

## `includeZestimateHistory` (type: `boolean`):

Adds zestimateHistory: the home's Zestimate month by month over the last 10 years. One more request per home, so runs take a little longer. Included in the price.

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

Leave as is: Apify Proxy datacenter IPs, with requests Zillow blocks there retried on US residential IPs automatically. Choose RESIDENTIAL to use residential IPs for everything.

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

Same as Properties, in the request-list shape other Zillow detail Actors take (\[{"url": "…"}]), for API callers.

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

Same as Properties, for API callers that send addresses under this key.

## `propertyStatus` (type: `string`):

Accepted for compatibility (FOR_SALE, RECENTLY_SOLD or FOR_RENT) and not needed: every home's status is read from Zillow.

## Actor input object example

```json
{
  "properties": [
    "1818 S Lakeshore Blvd APT 27, Austin, TX 78741",
    "https://www.zillow.com/homedetails/2708-1st-Ave-W-Seattle-WA-98119/443943273_zpid/",
    "2061537442",
    "18 Zelma Dr, Greenville, SC 29617"
  ],
  "maxProperties": 100,
  "extractBuildingUnits": "disabled",
  "includeNearbyHomes": true,
  "includeSourceFacts": true,
  "includeZestimateHistory": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `properties` (type: `string`):

No description

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

No description

# 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 = {
    "properties": [
        "1818 S Lakeshore Blvd APT 27, Austin, TX 78741",
        "https://www.zillow.com/homedetails/2708-1st-Ave-W-Seattle-WA-98119/443943273_zpid/",
        "2061537442",
        "18 Zelma Dr, Greenville, SC 29617"
    ],
    "maxProperties": 100,
    "includeNearbyHomes": true,
    "includeSourceFacts": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/zillow-property-details-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 = {
    "properties": [
        "1818 S Lakeshore Blvd APT 27, Austin, TX 78741",
        "https://www.zillow.com/homedetails/2708-1st-Ave-W-Seattle-WA-98119/443943273_zpid/",
        "2061537442",
        "18 Zelma Dr, Greenville, SC 29617",
    ],
    "maxProperties": 100,
    "includeNearbyHomes": True,
    "includeSourceFacts": True,
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/zillow-property-details-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 '{
  "properties": [
    "1818 S Lakeshore Blvd APT 27, Austin, TX 78741",
    "https://www.zillow.com/homedetails/2708-1st-Ave-W-Seattle-WA-98119/443943273_zpid/",
    "2061537442",
    "18 Zelma Dr, Greenville, SC 29617"
  ],
  "maxProperties": 100,
  "includeNearbyHomes": true,
  "includeSourceFacts": true
}' |
apify call deepmine/zillow-property-details-scraper --silent --output-dataset

```

## MCP server setup

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