# Zillow Scraper - Listings & Property Details (`barefoot_grade/zillow-scraper`) Actor

Search Zillow homes for sale, for rent or recently sold by city, ZIP code or search link, or paste property links. Each listing becomes one row with price, beds, baths, area, address, coordinates, Zestimate, rent estimate, days on Zillow, photos and broker. Failures are reported, not charged.

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

## Pricing

from $0.70 / 1,000 listings

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/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 Scraper - Listings & Property Details

Turn a place name, a Zillow search link or a list of property links into clean listing rows. Search homes for sale, for rent or recently sold in any US city, ZIP code, neighborhood, county or state, with price, bedroom, bathroom, size and home-type filters. Every listing becomes one row with its price, beds, baths, living area, lot size, home type, full address, map coordinates, status, days on Zillow, Zestimate and rent Zestimate, tax-assessed value, photos and listing broker.

Turn on full property details to add the description, listing agent and broker, MLS number, year built, HOA fee, property tax rate, page views and saves, all photos and the price history when Zillow shows it. You can also paste property links or zpids directly to get those details for specific homes. No Zillow account is needed.

### Quick Start

```json
{
  "searchLocations": [
    "Austin, TX"
  ],
  "listingType": "forSale",
  "maxItems": 100,
  "includeDetails": false
}
```

More examples:

- Rentals with 2+ bedrooms under $2,500 a month: `{"searchLocations": ["78704"], "listingType": "forRent", "minBeds": 2, "maxPrice": 2500}`
- Recently sold houses with full details: `{"searchLocations": ["Denver, CO"], "listingType": "sold", "homeTypes": ["house"], "includeDetails": true, "maxItems": 50}`
- Specific homes: `{"propertyUrls": ["https://www.zillow.com/homedetails/15-Eaton-Ct-Brooklyn-NY-11229/30793376_zpid/", "29476314"]}`
- A search you set up on Zillow: `{"searchUrls": ["https://www.zillow.com/austin-tx-78704/rentals/"]}`

### Input

| Input | Type | Default | Meaning |
| --- | --- | --- | --- |
| `searchLocations` | array | — | Places as you would type them on Zillow: `Austin, TX`, `78704`, `Brooklyn, NY`, `Travis County, TX`. |
| `listingType` | string | `forSale` | `forSale`, `forRent` or `sold` (recently sold) for the places above. |
| `searchUrls` | array | — | Links copied from a Zillow search results page. The link's own filters and map area are kept. |
| `propertyUrls` | array | — | Zillow property links (`.../homedetails/.../12345678_zpid/`) or bare zpid numbers. Each returns one row with full details. |
| `includeDetails` | boolean | `false` | Open each search result's property page to add the full details. Slower than search results alone. |
| `maxItems` | integer | `100` | Total cap on rows for the run, across every place, link and property (up to 10,000). |
| `minPrice`, `maxPrice` | integer | — | Price range in US dollars; monthly rent for rentals. |
| `minBeds`, `minBaths` | integer | — | Minimum bedrooms and bathrooms. |
| `minSqft`, `maxSqft` | integer | — | Living area range in square feet. |
| `homeTypes` | array | all | Any of `house`, `townhouse`, `condo`, `apartment`, `multiFamily`, `manufactured`, `land`. |
| `sort` | string | `relevance` | `relevance`, `newest`, `priceLowToHigh`, `priceHighToLow`, `bedrooms`, `bathrooms`, `squareFeet` or `lotSize`. |

Give at least one place, search link or property link. Property links run first, then places and search links in the order given. A listing that appears in more than one search is returned once.

### What it returns

The dataset contains one row per listing:

| Field | Meaning |
| --- | --- |
| `zpid`, `url` | Zillow's property id and the listing page. Apartment buildings in rental searches have no zpid. |
| `source`, `searchInput` | `search` or `property`, and the place, link or property you supplied. |
| `detailLevel` | `listing` for search-result fields only, `full` when the property page was added. |
| `listingStatus`, `statusText` | `FOR_SALE`, `FOR_RENT`, `RECENTLY_SOLD`, `PENDING`, … and Zillow's label (for example `House for sale`). |
| `price`, `priceText`, `currency` | Asking price or monthly rent as a number and as shown. Sold homes in states that do not publish sale prices have no price. |
| `bedrooms`, `bathrooms`, `livingArea` | Beds, baths and living area in square feet. |
| `lotAreaValue`, `lotAreaUnit`, `homeType`, `yearBuilt` | Lot size and unit (`sqft` or `acres`), home type (`SINGLE_FAMILY`, `CONDO`, `TOWNHOUSE`, …) and year built. |
| `address`, `streetAddress`, `city`, `state`, `zipcode` | The full address and its parts. |
| `latitude`, `longitude` | Map coordinates. |
| `zestimate`, `rentZestimate` | Zillow's value and rent estimates, when Zillow shows them. |
| `taxAssessedValue`, `propertyTaxRate` | Latest tax-assessed value and the tax rate in percent. |
| `daysOnZillow`, `dateSold` | Days the listing has been on Zillow and the date of the most recent sale (`YYYY-MM-DD`). |
| `brokerName`, `agentName`, `agentPhone` | Listing brokerage, agent and contact phone, as shown on the listing. |
| `mlsId`, `mlsName` | MLS number and the MLS that supplied the listing. |
| `description`, `hoaFee` | Listing description and monthly HOA fee. |
| `pageViewCount`, `favoriteCount` | Views and saves on Zillow, when shown. |
| `imageUrl`, `photos` | Main photo and up to 50 photo links (full size with details on). |
| `priceHistory`, `taxHistory` | Past prices (`date`, `price`) and tax years (`year`, `taxPaid`, `assessedValue`) when the property page shows them; otherwise `null`. |
| `isBuilding`, `buildingName`, `units` | For apartment buildings in rental searches: the building name and its unit types with prices and bedrooms. |
| `scrapedAt` | Collection time (UTC, ISO 8601). |
| `error` | Always `null` in the dataset. Failures are reported in the run summary instead. |

Fields the listing does not show are `null` (or an empty list for `photos`), never guessed.

The run summary (`OUTPUT`) reports `results`, `detailedResults`, one entry per search in `searches` (the place Zillow matched, its total listing count, pages read and rows delivered), `errors` with the list at `sourceErrors`, and `detailErrors` for search results whose property page could not be opened.

### Example queries

- **Market snapshot:** search a ZIP code for sale and compare `price`, `zestimate` and `daysOnZillow` across listings.
- **Rental comps:** search `forRent` with your bedroom count and export rents to a spreadsheet.
- **Recent sales:** search `sold` with `includeDetails` to see what sold, when, and the price history.
- **Lead lists:** collect listing agents and brokerages for a city with `includeDetails` on.
- **Watch specific homes:** schedule a daily run over a list of property links and track price and status changes.

### Output example

```json
{
  "zpid": "13358265",
  "url": "https://www.zillow.com/homedetails/310-S-Clay-St-Denver-CO-80219/13358265_zpid/",
  "source": "search",
  "searchInput": "Denver, CO",
  "detailLevel": "full",
  "listingStatus": "FOR_SALE",
  "statusText": "House for sale",
  "price": 350000,
  "priceText": "$350,000",
  "currency": "USD",
  "bedrooms": 4,
  "bathrooms": 2,
  "livingArea": 2108,
  "lotAreaValue": 9583.2,
  "lotAreaUnit": "sqft",
  "homeType": "SINGLE_FAMILY",
  "yearBuilt": null,
  "address": "310 S Clay Street, Denver, CO 80219",
  "streetAddress": "310 S Clay Street",
  "city": "Denver",
  "state": "CO",
  "zipcode": "80219",
  "latitude": 39.71064,
  "longitude": -105.0201,
  "zestimate": 354200,
  "rentZestimate": 2903,
  "taxAssessedValue": 496400,
  "daysOnZillow": 143,
  "dateSold": null,
  "brokerName": "RE/MAX Professionals",
  "agentName": "Jane Doe",
  "agentPhone": "303-555-0100",
  "mlsId": "4333763",
  "mlsName": "REcolorado as distributed by MLS GRID",
  "description": "Price reduced. Home needs work. Attention investors and handy home buyers. Stucco bungalow on a large lot…",
  "hoaFee": null,
  "propertyTaxRate": 0.49,
  "pageViewCount": 7655,
  "favoriteCount": 1019,
  "imageUrl": "https://photos.zillowstatic.com/fp/0ecdff64a3b688c125e297c515a6d7f2-cc_ft_1536.jpg",
  "photos": [
    "https://photos.zillowstatic.com/fp/0ecdff64a3b688c125e297c515a6d7f2-cc_ft_1536.jpg",
    "https://photos.zillowstatic.com/fp/e1753da155a465a5bd8f066d58ab69ae-cc_ft_1536.jpg"
  ],
  "priceHistory": [
    {
      "date": "2026-09-30",
      "price": 350000
    },
    {
      "date": "2026-05-30",
      "price": 399000
    }
  ],
  "taxHistory": null,
  "isBuilding": false,
  "buildingName": null,
  "units": null,
  "scrapedAt": "2026-10-20T01:12:21Z",
  "error": null
}
```

### Failed searches and properties

A place Zillow does not recognise, a property link that no longer exists or a search that could not be read is reported in the run summary at `OUTPUT.sourceErrors` with its input, `code` and `message`. When the full details of a search result cannot be opened, the search result is still delivered with `detailLevel` `listing` and the property is listed in `OUTPUT.detailErrors`. Failures are never dataset rows and are not charged. If no listing at all could be collected, the run ends with an error instead of finishing green with an empty dataset.

### Limits and caveats

- Zillow shows at most 20 pages (about 820 listings) for one search. To collect more, split a large area into ZIP codes or neighborhoods, or narrow it with price ranges; duplicates across searches are removed.
- Only what Zillow shows publicly on a listing is returned. Price and tax history appear only for the listings whose page shows them, and the Zestimate is missing for some homes.
- Sale prices of sold homes are missing in states that do not publish them (for example Texas).
- Rental searches in large cities are mostly apartment buildings and communities. They come back as one row per building with its unit types and prices (`isBuilding`, `units`); full property details apply to individual home listings.
- Full details take about 1 to 2 seconds per listing; search results alone come back about 40 at a time.
- US listings only.
- Automated access is subject to Zillow's terms; use this actor only where you have the necessary permissions and a lawful basis, and handle any personal data (such as agent names and phone numbers) in line with the privacy laws that apply to you.

### FAQ

**Do I need a Zillow account?** No. Only public listing information is collected.

**What is a zpid?** Zillow's number for a property. It is the number before `_zpid` in a property link; you can paste it on its own in `propertyUrls`.

**Can I use my own Zillow search with map area and filters?** Yes. Set it up on Zillow, copy the link from the address bar and put it in `searchUrls`.

**How fast is it?** Search results: a few seconds per 40 listings. With full details: roughly 1,000 listings in 30 to 40 minutes. The default run timeout is 4 hours.

### Price

**$0.0007 per listing**, **$0.0016 per detailed property** ($0.0007 listing + $0.0009 detail add-on), plus **$0.005 per run start**. A detailed property is a row with full property details, from `propertyUrls` or from a search with `includeDetails`; a search result whose details could not be opened is charged as a listing. The run-start event is charged per GB of memory; the default 512 MB run is one start event. The start is charged even if the run saves no results. Failed searches and properties are not charged. When your maximum charge for the run is reached, the run stops and keeps the rows already saved. Platform usage is included in these prices.

# Actor input Schema

## `searchLocations` (type: `array`):

Cities, ZIP codes, neighborhoods, counties or states as you would type them on Zillow, for example "Austin, TX", "78704" or "Brooklyn, NY". Each place is searched with the listing type and filters below.

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

Which listings to return for the places above.

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

Links copied from a Zillow search results page (zillow.com/austin-tx/, zillow.com/homes/for_rent/...). The link's own filters and map area are kept.

## `propertyUrls` (type: `array`):

Zillow property links (zillow.com/homedetails/.../12345678_zpid/) or bare zpid numbers. Each becomes one row with the full property details.

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

Open each search result's property page to add the description, agent and broker, MLS number, year built, HOA fee, tax rate, all photos and price history when Zillow shows it. Slower than search results alone.

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

Total cap on rows for the run, across every place, link and property.

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

Lowest price in US dollars (monthly rent for rentals).

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

Highest price in US dollars (monthly rent for rentals).

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

Only homes with at least this many bedrooms.

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

Only homes with at least this many bathrooms.

## `minSqft` (type: `integer`):

Smallest living area in square feet.

## `maxSqft` (type: `integer`):

Largest living area in square feet.

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

Only these home types. Leave empty for all.

## `sort` (type: `string`):

Order of the search results, as on Zillow.

## Actor input object example

```json
{
  "searchLocations": [
    "Austin, TX"
  ],
  "listingType": "forSale",
  "includeDetails": false,
  "maxItems": 100,
  "sort": "relevance"
}
```

# Actor output Schema

## `results` (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 = {
    "searchLocations": [
        "Austin, TX"
    ],
    "listingType": "forSale",
    "includeDetails": false,
    "maxItems": 100,
    "sort": "relevance"
};

// Run the Actor and wait for it to finish
const run = await client.actor("barefoot_grade/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 = {
    "searchLocations": ["Austin, TX"],
    "listingType": "forSale",
    "includeDetails": False,
    "maxItems": 100,
    "sort": "relevance",
}

# Run the Actor and wait for it to finish
run = client.actor("barefoot_grade/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 '{
  "searchLocations": [
    "Austin, TX"
  ],
  "listingType": "forSale",
  "includeDetails": false,
  "maxItems": 100,
  "sort": "relevance"
}' |
apify call barefoot_grade/zillow-scraper --silent --output-dataset

```

## MCP server setup

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