# Zillow For-Sale, Rent & Sold Listing Extractor (`nimbryxo-studio/zillow-for-sale-rent-and-sold-listing-extractor`) Actor

Search Zillow by city, state or ZIP for active, rental or recently sold listings, with pricing, Zestimate, agent, school, tax and price history for each property.

- **URL**: https://apify.com/nimbryxo-studio/zillow-for-sale-rent-and-sold-listing-extractor.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 For-Sale, Rent & Sold Listing Extractor

Enter a city, state, or ZIP code and choose active listings, rentals, or recently sold homes — this actor turns Zillow's own search results into structured property records. Search results give price, size and location; with detail scraping on, each listing also gets nearby schools, tax history, price history, agent details and property features.

### What this actor does

- Searches any US city, state, or ZIP code across three modes: for sale (`BUY`), for rent (`RENT`), or recently sold (`SOLD`)
- Returns core listing data from search results — price, Zestimate, rent Zestimate, beds, baths, square footage, lot size, address and coordinates
- Optionally opens each property's detail page for year built, HOA fee, agent, full description, all photos, nearby schools, price history, tax history, and property features
- Accepts direct Zillow property or search-page URLs alongside or instead of a location search; a property that appears in several searches is returned once
- Fields a listing doesn't have (e.g. no HOA fee, no Zestimate) are left out of the record rather than returned empty

### Output per property

Each property produces one record. Fields with no available data are left out automatically. Fields marked *detail* only appear when `scrapeDetails` is on and the property's detail page could be read; if a detail page fails, the record keeps its search-result data (for a direct property URL that can be just `url` and `zpid`).

#### Core property data

| Field | Type | Description |
|-------|------|-------------|
| url | String | Property detail URL on Zillow.com |
| zpid | Number | Zillow property ID (a text ID for some apartment-building listings) |
| status | String | Listing status as Zillow reports it (e.g., FOR_SALE, FOR_RENT, RECENTLY_SOLD) |
| price | Number | Current listing price |
| zestimate | Number | Zillow's estimated market value |
| rentZestimate | Number | Zillow's estimated monthly rent value |
| beds | Number | Number of bedrooms |
| baths | Number | Number of bathrooms |
| sqft | Number | Living area in square feet |
| lotSize | String | Lot size (e.g., "8,000 sqft") |
| yearBuilt | Number | Year the property was constructed (*detail*) |
| propertyType | String | Property type (e.g., SINGLE_FAMILY, CONDO, TOWNHOUSE; BUILDING for apartment buildings) |
| stories | Number | Number of stories (*detail*) |
| parking | String | Parking details (e.g., "2 garage spaces") (*detail*) |
| hoaFee | Number | Monthly HOA fee (*detail*) |
| pricePerSqft | Number | Price per square foot (*detail*) |
| daysOnZillow | Number | Days the property has been listed on Zillow |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| address | String | Street address |
| city | String | City name |
| state | String | State code (e.g., "TX") |
| zipCode | String | ZIP code |
| latitude | Number | Latitude coordinate |
| longitude | Number | Longitude coordinate |

#### Agent and broker

| Field | Type | Description |
|-------|------|-------------|
| brokerName | String | Brokerage company name |
| agentName | String | Listing agent name (*detail*) |
| agentPhone | String | Listing agent phone number (*detail*) |

#### Rich data (from detail pages, when `scrapeDetails` is on)

| Field | Type | Description |
|-------|------|-------------|
| description | String | Full property description text (in search-only results for apartment buildings, this holds the building name) |
| photos | Array | Photo URLs for the listing (search results carry only the main photo) |
| priceHistory | Array | Price change events — date, event type, price, price per sqft, source |
| taxHistory | Array | Tax records — year, tax paid, assessed value, change rate |
| schools | Array | Nearby schools — name, level, grades, distance, rating, type |
| features | Object | Property features — heating, cooling, flooring, roofing, pool, fireplace, construction, and more |
| scrapedAt | String | ISO timestamp when data was collected (always present) |

#### Sample output

```json
{
    "url": "https://www.zillow.com/homedetails/46-Kingwood-Greens-Dr-Kingwood-TX-77339/28065573_zpid/",
    "zpid": 28065573,
    "status": "FOR_SALE",
    "price": 318000,
    "zestimate": 325000,
    "rentZestimate": 2400,
    "beds": 5,
    "baths": 4,
    "sqft": 5526,
    "lotSize": "22,346 sqft",
    "yearBuilt": 2000,
    "propertyType": "SINGLE_FAMILY",
    "stories": 2,
    "parking": "3 garage spaces",
    "hoaFee": 150,
    "pricePerSqft": 58,
    "daysOnZillow": 14,
    "address": "46 Kingwood Greens Dr",
    "city": "Kingwood",
    "state": "TX",
    "zipCode": "77339",
    "latitude": 30.033194,
    "longitude": -95.180402,
    "brokerName": "REALHome Services and Solutions, Inc.",
    "agentName": "Lori Brown",
    "agentPhone": "(979) 255-0702",
    "description": "Spacious 5 bedroom home in Kingwood with pool and 3-car garage. Updated kitchen, hardwood floors throughout, and large backyard with mature trees...",
    "photos": [
        "https://photos.zillowstatic.com/fp/example1.jpg",
        "https://photos.zillowstatic.com/fp/example2.jpg"
    ],
    "priceHistory": [
        {
            "date": "2026-03-01",
            "event": "Listed",
            "price": 318000,
            "pricePerSqft": 58,
            "priceChangeRate": 0,
            "source": "HAR"
        },
        {
            "date": "2002-01-03",
            "event": "Sold",
            "price": 215000,
            "pricePerSqft": 39,
            "priceChangeRate": 0,
            "source": "Public Record"
        }
    ],
    "taxHistory": [
        {
            "year": 2025,
            "taxPaid": 8500,
            "value": 310000,
            "taxIncreaseRate": 0.02,
            "valueIncreaseRate": 0.03
        }
    ],
    "schools": [
        {
            "name": "Kingwood Park High School",
            "level": "High",
            "grades": "9-12",
            "distance": 1.2,
            "rating": 7,
            "type": "public"
        }
    ],
    "features": {
        "heating": ["Central"],
        "cooling": ["Central Air"],
        "flooring": ["Hardwood", "Tile"],
        "roofType": "Composition",
        "poolFeatures": ["In Ground"],
        "parkingFeatures": ["Attached Garage"]
    },
    "scrapedAt": "2026-03-25T12:00:00.000000+00:00"
}
```

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `search` | String | – | City and state (or ZIP) to search (e.g., "Houston, TX", "Miami, FL"). |
| `mode` | Select | `BUY` | `BUY` (for sale), `RENT` (for rent), or `SOLD` (recently sold). Applies to `search` only; search-page URLs keep their own filters. |
| `maxItems` | Integer | `50` | Max properties for the whole run (1–500), including direct property URLs. |
| `endPage` | Integer | `5` | Max result pages per search (1–20). Each page returns up to 40 properties. |
| `scrapeDetails` | Boolean | `true` | Fetch full detail pages for enriched data (schools, history, features, etc.). Disable for faster runs. |
| `startUrls` | URL List | – | Direct Zillow property detail URLs (`/homedetails/`, `_zpid`, `/apartments/`) or search page URLs. |

**Note:** at least one of `search` or `startUrls` must be provided.

#### Example: buy properties

```json
{
    "search": "Houston, TX",
    "mode": "BUY",
    "maxItems": 50,
    "scrapeDetails": true
}
```

#### Example: rental search

```json
{
    "search": "Miami, FL",
    "mode": "RENT",
    "maxItems": 25
}
```

#### Example: recently sold

```json
{
    "search": "Denver, CO",
    "mode": "SOLD",
    "maxItems": 30,
    "endPage": 3
}
```

#### Example: direct property URL

```json
{
    "startUrls": [
        { "url": "https://www.zillow.com/homedetails/123-Main-St-Houston-TX-77001/12345678_zpid/" }
    ],
    "scrapeDetails": true
}
```

### Use cases

- **Investment analysis** — compare listing prices, Zestimates, and price history to spot undervalued properties
- **Market research** — track listing and sold prices, and days on market, across neighborhoods
- **Rental analysis** — compare rental prices and rent Zestimates by location
- **School district research** — find properties near top-rated schools with distance and rating data
- **Agent and broker research** — identify which agents and brokerages are active in a target market
- **Price trend monitoring** — track price reductions, relists, and final sale prices for market timing

### FAQ

**Do I need to configure a proxy?**
No. There are no proxy settings to fill in.

**What is the difference between BUY, RENT, and SOLD modes?**
BUY searches active for-sale listings, RENT searches rental apartments and homes, and SOLD searches recently sold properties. The mode only changes which Zillow search is run; the record fields are the same.

**What is a Zestimate?**
A Zestimate is Zillow's proprietary estimated market value for a property. The rent Zestimate is a similar estimate for what a property could rent for monthly. Both are included in the output when available.

**How many properties can I scrape per run?**
Up to 500 properties per run. Each search page returns up to 40 listings, and you can configure up to 20 pages per search. A search stops early when Zillow returns a page with fewer than 40 listings.

**Why are some fields missing from certain properties?**
Not all Zillow listings have complete data — some may lack a Zestimate, tax history, school data, or an HOA fee depending on the property and location. Those fields are simply left out rather than returned empty.

**What happens if I set `scrapeDetails` to false?**
Runs finish significantly faster. You still get core listing data (price, beds, baths, sqft, address, Zestimate where shown) from search results, but not year built, HOA fee, agent details, schools, tax history, price history, full descriptions, or property features. Direct property URLs return only `url` and `zpid` in this case.

**Can I search a specific ZIP code or neighborhood?**
Yes. Enter it in `search` using formats like "77339" (ZIP code), "Kingwood, TX" (neighborhood and state), or any location Zillow recognizes.

**Can I scrape specific Zillow URLs directly?**
Yes. Paste any Zillow property detail or search results page URL into `startUrls`, combined with or instead of a location search. Search-page URLs are read with their own filters and paged with `endPage`; property URLs are added after the search results until `maxItems` is reached.

**How current is the data?**
The actor reads live data from Zillow.com at the time of each run. Every record includes a `scrapedAt` timestamp so you know exactly when it was collected.

**Is this affiliated with Zillow?**
No. It is an independent tool that reads publicly visible Zillow pages.

# Actor input Schema

## `search` (type: `string`):

City and state to search for properties (e.g., 'Houston, TX', 'San Francisco, CA', 'Miami, FL').

## `mode` (type: `string`):

Type of property search — for sale, for rent, or recently sold.

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

Maximum number of property listings to scrape (1-500).

## `endPage` (type: `integer`):

Maximum search result pages to scrape per search (1-20). Each page has up to 40 properties.

## `scrapeDetails` (type: `boolean`):

Fetch each property's detail page for full description, schools, tax history, price history, and more. Disable for faster runs with only search-level data.

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

Direct Zillow property detail URLs or search page URLs. Paste URLs from your browser.

## Actor input object example

```json
{
  "search": "Houston, TX",
  "mode": "BUY",
  "maxItems": 5,
  "endPage": 1,
  "scrapeDetails": true
}
```

# Actor output Schema

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

Dataset containing scraped property listings

# 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 = {
    "search": "Houston, TX",
    "maxItems": 5,
    "endPage": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/zillow-for-sale-rent-and-sold-listing-extractor").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 = {
    "search": "Houston, TX",
    "maxItems": 5,
    "endPage": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/zillow-for-sale-rent-and-sold-listing-extractor").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 '{
  "search": "Houston, TX",
  "maxItems": 5,
  "endPage": 1
}' |
apify call nimbryxo-studio/zillow-for-sale-rent-and-sold-listing-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/zillow-for-sale-rent-and-sold-listing-extractor"
        }
    }
}
```

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/BW8wUYVb2qQuoswGw/builds/ZDbtWpqefy6XBM9Nm/openapi.json
