# Zillow API: Property Details, Search & Sold Homes (`deepmine/zillow-scraper`) Actor

Zillow scraper and API: property data by address, ZPID or link, plus for sale, for rent and recently sold searches by city, ZIP or Zillow link, past the 820-result limit. Price, Zestimate, beds, baths, sq ft, price and tax history, schools, HOA. No login.

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

## Pricing

from $0.01 / 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 API: Property Details, Search & Sold Homes

Zillow scraper for property details and search: type an address, a ZPID or a Zillow link and get the home's price, Zestimate, beds, baths, square feet, price and tax history, schools and HOA fee, or search a city or ZIP for homes for sale, for rent or recently sold. No login.

| Address | Price | Status | Beds | Baths | Sq Ft | Zestimate |
|---|---|---|---|---|---|---|
| 2822 10th Avenue E, Seattle, WA 98102 | $1,950,000 | Sold | 4 | 4 | 4,040 | $1,929,600 |
| 2706 Wheless Ln APT 503, Austin, TX 78723 | $199,000 | For sale | 2 | 1 | 850 | – |
| 529 McGilvra Boulevard E, Seattle, WA 98112 | $2,495,000 | Sold | 4 | 4 | 3,050 | $2,529,600 |

<sub>Collected 2026-09-29 from the prefilled run (2 lookups plus homes sold in `Seattle, WA` in the last 30 days, all with full details). Rows also carry the home type, coordinates, the Zillow link, price history, schools, page views and saves, and, when Zillow shows them, the photos, price per square foot, lot size, days on Zillow or sale date, tax history, HOA, year built, facts such as heating and parking, the listing agent and broker with their phone numbers and the MLS number, the co-listing agent, the buyer's agent and brokerage on sold homes, the MLS source, parking spaces, features, school districts, mortgage rates and a map image.</sub>

**$0.10 per 1,000 properties** on Starter ($0.12 Free, $0.07 Scale, $0.01 Business); with full details $0.37 per 1,000 ($0.39 Free, $0.34 Scale, $0.28 Business). The prefilled run (up to 52 properties, all with details) costs about $0.02.

**Past Zillow's 820-result limit:** a search for a whole city reads the map area by area, then sorts it, so a big search returns the newest listings of the whole area, not of a part of it. Each run tells you how complete it was against Zillow's own count. Properties Zillow doesn't have are listed in the run summary and never charged.

### What you can do with it

- **Property data by address**: paste a list of addresses (or ZPIDs, or Zillow links) from your CRM or spreadsheet and get Zestimate, rent Zestimate, tax assessment, last sale, schools and HOA for each.
- **Sold comps**: recently sold homes in a ZIP or city, with sale date and price, for appraisals and investment analysis (sale prices aren't public in non-disclosure states such as Texas).
- **Rental market research**: rents for single units and apartment buildings (units available now and the lowest rent per unit type), with Zillow's rent estimate where it shows one.
- **New listings monitor**: schedule a search with *Listed within 1 day* to get each day's new listings.
- **Lead lists for agents, investors and lenders**: homes for sale by area, days on market, price cuts, auctions and foreclosures, page views and saves, who lists the home (agent or owner), and the listing agent's and broker's phone numbers.

### Input

| Field | What it does |
|---|---|
| **Properties** | Addresses (`1704 Shelbourne Dr, Austin, TX 78752`, units as `Apt 503` or `#503`), ZPIDs (`29412761`) or Zillow home links (`…/homedetails/…_zpid/`), one per line. Each comes back with full details. Lots without a house number need their ZPID or link. |
| **Locations to search** | A city with its state (`Austin, TX`), a ZIP code, a county, a neighborhood, or a Zillow search link copied from your browser's address bar (its own filters, listing type and map area are used). |
| **Listing type** | For sale (default), for rent or recently sold. |
| **Max results per location** | Up to 820 come in Zillow's *Newest* order; above that the whole area is read, sorted newest first and the newest are returned. You pay per property (1,000 if left out, up to 100,000). |
| **Include full details for search results** | Reads each search result's details: price and tax history, schools, HOA, the listing agent and broker with their phones, tours and floor plans, full-size photos, when Zillow shows them. At the details price. |
| **Listed (or sold) within** | Only listings newer than 1 day to 36 months; for sold searches, only homes sold within that time. |

Under **Filters**: min and max price (monthly rent for rentals), min bedrooms, min bathrooms, home types. **Advanced**: the proxy (Apify datacenter IPs by default; requests Zillow blocks there are retried on US residential IPs automatically).

Give at least one property or location; a run with neither runs the example above. Example:

```json
{
  "properties": ["1704 Shelbourne Dr, Austin, TX 78752", "29412761"],
  "locations": ["Seattle, WA", "https://www.zillow.com/austin-tx/rentals/"],
  "listingType": "sold",
  "daysOnZillow": "30",
  "maxResults": 500,
  "includeDetails": false
}
```

### Output

One row per property: looked-up properties first, in input order, then each location's results (newest listing first; sold: most recently sold first). A home found by several inputs appears once, under the first. Every row of a run has the same fields in the same order; a value Zillow doesn't show is `null`. Photos are links to Zillow's images; the Actor never downloads them.

| Field | Meaning |
|---|---|
| `photo` | Main listing photo link |
| `address` | Full address |
| `price` | Price as Zillow shows it: list price, sale price, or rent (`$2,100/mo`); an auction's opening bid (`$5,000 opening bid`); a builder plan's or apartment building's lowest price (`From $624,990`) |
| `priceUsd` | The same price as a number |
| `pricePerSqft` | Price per square foot, USD (Zillow's figure with details; else price ÷ living area; not for rentals or auctions) |
| `status` | For sale, For rent, Sold, Pending, Coming soon, Off market, ... |
| `listingSubType` | For homes for sale: For sale by agent, For sale by owner, New construction, New construction plan, Auction, Foreclosure, Bank owned, Coming soon, Pending |
| `buildingName`, `unitCount`, `buildingUnits` | Apartment building, units available now, and its unit types with their lowest rent (`1 bd from $1,861/mo`; rental searches only) |
| `beds`, `baths` | Bedrooms (0 = studio), bathrooms (apartment buildings: the smallest unit) |
| `bathsFull`, `bathsHalf`, `bathsThreeQuarter` | Full, half and three-quarter bathrooms (details) |
| `livingArea`, `lotSize` | Square feet |
| `homeType` | Single family, Condo, Townhouse, Multi-family, Apartment, Manufactured, Lot |
| `yearBuilt` | Year built (details) |
| `zestimate`, `rentZestimate` | Zillow's value and monthly rent estimates, USD, when Zillow shows them (many new listings have none) |
| `hoaFee` | Monthly HOA fee (details) |
| `taxAssessedValue`, `annualTax`, `taxRate` | Latest tax assessment, yearly property tax and Zillow's tax rate in % (details) |
| `mortgageRate30Year`, `mortgageRate15Year`, `mortgageRateArm5` | Zillow's current 30-year fixed, 15-year fixed and 5/1 ARM mortgage rates shown on the home's page, % (details; today's market rates, not an offer; none on rentals) |
| `daysOnZillow` | Days since the listing appeared on Zillow, Zillow's own count (not for sold homes; a relisted home can show 0 next to an older `listedAt`) |
| `listedAt` | Date the home went on the market (details) |
| `pageViews`, `saves` | Zillow page views and how many users saved the home (details) |
| `priceChange`, `priceChangedAt` | The current listing's latest price change in USD (negative = a cut) and its date |
| `openHouse` | Upcoming open houses, local time (`2026-10-04 12:00-15:00`) |
| `has3dTour` | The listing has a Zillow 3D Home tour |
| `hasVideo` | The listing has a video on Zillow (search results) |
| `virtualTourUrl`, `floorPlanUrl` | Links to the listing's 3D or virtual tour and Zillow's interactive floor plan (details) |
| `soldAt` | Sale date: for sold homes, or the last sale of a home for sale (details) |
| `lastSoldPrice` | Last sale price (details; not published in non-disclosure states) |
| `description`, `descriptionSnippet` | Listing description and its first 50 characters (details) |
| `priceHistory` | Price events, newest first: `2026-08-25: Price change $395,000 (eXp Realty)` (details) |
| `taxHistory` | Tax and assessed value by year: `2025: tax $12,242, assessed $598,179` (details) |
| `schools` | Assigned schools: `Andrews Elementary School (PK-5, 0.7 mi): 3/10` (GreatSchools rating; details) |
| `schoolDistricts` | The listing's elementary, middle and high school with their district: `Elementary: Andrews (Austin ISD)` (details) |
| `facts` | Zillow's at-a-glance facts not in other fields: `Heating: Central, Natural Gas`, `Cooling: Central Air`, `Parking: 2 Garage spaces` (details) |
| `features` | The listing's features by kind: `Appliances: Dishwasher, Washer`, `Flooring: ...`, `View: ...`, `Roof: ...` (details) |
| `parkingSpaces`, `garageSpaces`, `hasGarage`, `hasAttachedGarage`, `parkingFeatures` | Parking: total and garage spaces, garage yes/no, attached, and how the listing describes it (`Driveway`, `Detached Garage`) (details; null when Zillow knows nothing about parking) |
| `agentName`, `agentPhone`, `agentLicense`, `agentEmail` | Listing agent's name, phone, state licence number and email as Zillow shows them (details; the licence and email only where the MLS publishes them) |
| `coAgentName`, `coAgentPhone`, `coAgentLicense` | Co-listing agent, when the listing has one (details) |
| `buyerAgentName`, `buyerAgentLicense`, `buyerBrokerName` | The buyer's agent and brokerage on sold homes, when the MLS publishes them (details) |
| `listedBy` | Who lists a home for sale: `Agent`, `Owner`, or Zillow's words (details) |
| `brokerName`, `brokerPhone` | Listing brokerage and its phone (the phone with details). Rentals: search results never name one; with details, most single rentals do (5 of 7 in a Denver test), apartment buildings don't |
| `mlsId`, `mlsName`, `mlsDisclaimer`, `mlsLastChecked`, `mlsLastUpdated` | MLS listing number, the listing's source (`NWMLS as distributed by MLS GRID`, a builder, `Zillow Rentals`), the source's usage notice, and when Zillow last checked and the source last changed the listing (source's local time; details) |
| `parcelId`, `county` | County parcel number and county (details) |
| `neighborhood`, `subdivision`, `timeZone` | Zillow's neighborhood, the subdivision the listing names, and the home's time zone (details) |
| `photos`, `photoCount` | Every photo link (Zillow's carousel on search results, full size with details) and how many photos the listing has |
| `staticMapUrl` | A map image of the home's spot, the one on Zillow's page (details) |
| `propertyUrl` | The Zillow page |
| `street`, `city`, `state`, `zipcode`, `latitude`, `longitude` | Address parts and coordinates |
| `zpid` | Zillow property id (null for apartment buildings) |
| `detailsStatus` | `OK`; `Failed` when Zillow didn't answer, or `Skipped` when the run's time limit came first (either way the row is charged as a plain search result) |
| `inputs` | The property or location input the row came from |
| `scrapedAt` | When the row was collected (UTC) |

The detail fields appear when the run reads details (lookups always do; searches with *Include full details*). A field is filled only when Zillow shows it for that home: open houses, price changes, 3D tours, floor plans, HOA fees and co-listing agents are on a minority of listings, the buyer side only on sold homes. The Console has eight tables: 📊 Overview, 📈 Stats (every number), 🧾 Details, 📇 Agents (listing agent, co-agent and broker contacts, MLS), 🔖 Listing (listing type, price change, open house, tours), 🏢 Rentals, 🤝 Sold (buyer's agent and brokerage) and 🧰 Features (features, parking, school districts, neighborhood, mortgage rates, map).

The run's **OUTPUT** record (🧾 Run summary) says, per input, what happened: each lookup's status (`ok`, `notFound` with the reason, `error`) and each search's Zillow total, rows found, completeness and requests used.

### Pricing

Pay per property, no start fee, no minimum. Not-found properties are free; a property whose details fail is charged as a plain search result.

| Per 1,000 | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Property (search result) | $0.12 | $0.10 | $0.07 | $0.01 |
| Property with full details | $0.39 | $0.37 | $0.34 | $0.28 |

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

### Reliability

Zillow blocks many IP addresses. The Actor keeps the IPs that work, retries every refused request on fresh IPs (datacenter first, then US residential), and stops with a clear error instead of returning a silently short dataset. Rows are saved as they come, so a big search keeps what it read even if the run stops; near the run's time limit it stops reading, saves every row it has (the rest of a search without details) and says so. If every address or place of a run comes back "not found", or every search comes back empty, the run checks a home or a search Zillow always has; when that fails too, the run fails (Zillow changed something) instead of reporting your inputs as missing. In our tests (2026-09-29), 170 real homes looked up by address (including apartment units), ZPID or link: 168 found, each the right home, 0 errors; the 2 others were lots without a house number, which the Actor reports as not found rather than guess among lots that share an address (use their ZPID or link). All 8 made-up inputs were reported as not found and not charged.

### FAQ

**Is it legal to scrape Zillow?** The Actor reads only public pages, without an account, and returns photo links, not photos. Zillow's terms restrict automated access and listing content belongs to its sources; check what your use needs.

**Why is the sale price empty?** Texas, Utah, New Mexico and a few other states don't publish sale prices, so Zillow doesn't show them.

**Why are rental counts different from Zillow's total?** For rentals Zillow counts units; the search returns listings and apartment buildings, each building with the number of units available now and its unit types. A building's baths and square feet come only with searches over 820 results (Zillow's map answer); smaller searches leave them empty.

### Related Actors

- [Zillow Scraper: Listings for Sale, Rent & Sold](https://apify.com/deepmine/zillow-listings-scraper): the same engine with a search-first form: type a city, ZIP or Zillow search link and get its listings.

### 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 get full details for: a street address ("1704 Shelbourne Dr, Austin, TX 78752"), a Zillow property id (ZPID, e.g. 29412761) or a Zillow home link (…/homedetails/…\_zpid/). One per line. You pay per property found; addresses Zillow doesn't have are listed in the run's OUTPUT and never charged.

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

Places to search: a city with its state ("Austin, TX"), a ZIP code, a county, a neighborhood, or a Zillow search link copied from your browser (its filters and map area are used as they are). One per line.

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

What to search for in each location. Ignored for Zillow search links (they carry their own).

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

Most properties to return per location. You pay per property. Up to 820 come in Zillow's "Newest" order; above that the Actor reads the whole area box by box (past Zillow's 820 limit), sorts it newest first and returns the newest.

## `includeDetails` (type: `boolean`):

Also read each search result's details: price and tax history, schools, HOA fee, year built, description, the listing agent and broker with their phones, tours and floor plans, full-size photos (each when Zillow shows it). Costs more than a plain search result (see Pricing). Properties you look up always come with details.

## `daysOnZillow` (type: `string`):

Only listings newer than this; for "Recently sold", only homes sold within this time.

## `minPrice` (type: `integer`):

For rentals: monthly rent.

## `maxPrice` (type: `integer`):

For rentals: monthly rent.

## `minBeds` (type: `integer`):

At least this many bedrooms.

## `minBaths` (type: `integer`):

At least this many bathrooms.

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

Only these home types. Empty = all.

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

Apify Proxy datacenter IPs by default; requests Zillow blocks there are retried on US residential IPs automatically. Choose RESIDENTIAL to use residential IPs for everything.

## Actor input object example

```json
{
  "properties": [
    "2822 10th Avenue E, Seattle, WA 98102",
    "2085672717"
  ],
  "locations": [
    "Seattle, WA"
  ],
  "listingType": "sold",
  "maxResults": 50,
  "includeDetails": true,
  "daysOnZillow": "30",
  "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": [
        "2822 10th Avenue E, Seattle, WA 98102",
        "2085672717"
    ],
    "locations": [
        "Seattle, WA"
    ],
    "listingType": "sold",
    "maxResults": 50,
    "includeDetails": true,
    "daysOnZillow": "30"
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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 = {
    "properties": [
        "2822 10th Avenue E, Seattle, WA 98102",
        "2085672717",
    ],
    "locations": ["Seattle, WA"],
    "listingType": "sold",
    "maxResults": 50,
    "includeDetails": True,
    "daysOnZillow": "30",
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/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 '{
  "properties": [
    "2822 10th Avenue E, Seattle, WA 98102",
    "2085672717"
  ],
  "locations": [
    "Seattle, WA"
  ],
  "listingType": "sold",
  "maxResults": 50,
  "includeDetails": true,
  "daysOnZillow": "30"
}' |
apify call deepmine/zillow-scraper --silent --output-dataset

```

## MCP server setup

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