# Zillow Scraper - Search Listings (`mof1re/zillow-scraper`) Actor

Scrape Zillow listings by location. Search For Sale, For Rent, or Sold properties with price, beds/baths, photos, agent or owner info, and more. Fast API-based Zillow scraper, no browser needed, with built-in proxies and full filter support.

- **URL**: https://apify.com/mof1re/zillow-scraper.md
- **Developed by:** [Vladimir Efimenco](https://apify.com/mof1re) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Zillow Scraper | Search Listings for Sale, Rent & Sold

This Zillow scraper pulls property listings directly from Zillow's internal mobile search API, no browser involved. Search any location and get full listing data back: price, address, beds/baths, photos, agent or owner info, and more.

### ⚡ Why this Zillow scraper

- **No browser session required.** This actor talks to the same search API Zillow's own mobile app uses, so there's no page to render and nothing to wait on.
- **Search by location, not by URL.** Just give it a city, address, or zip code. No need to go find a Zillow search URL first or figure out map bounding boxes yourself.
- **All three search types.** For Sale, For Rent, and Sold, each with the full set of Zillow's own filters (price, beds, baths, home type, lot size, year built, days on Zillow, amenities, and more).
- **Owner vs agent listings flagged.** Every result tells you whether it's listed by an agent, a broker, a builder, or FSBO (for sale by owner) directly.
- **Clean, flat output.** Every field comes back as a top-level key, not buried in nested objects, so it drops straight into Excel or a CSV/Sheets export without extra processing.
- **Batch scraping.** Pass multiple locations and they run concurrently in the same job.
- **Proxies included.** No need to bring your own.
- **Fast.** Pure HTTP requests to Zillow's search API, no page load, no rendering delay.

### 🎯 Who uses this Zillow scraper

- **Real estate investors and wholesalers** scanning a market for FSBO deals, price drops, or properties sitting on the market for a while.
- **Real estate agents and brokers** building comps, tracking competitor listings, or monitoring inventory in a farm area.
- **Market researchers and analysts** tracking price trends, inventory levels, or days-on-market across cities or zip codes.
- **Lead generation teams** pulling agent and broker contact info attached to active listings.
- **Developers building real estate dashboards or tools** who need structured Zillow data without maintaining their own scraper against a site that changes often.
- **Rental market researchers** comparing rent estimates against asking rents across a neighborhood.

### 🧾 What you get, per listing

- Address, coordinates, and a direct link to the listing (desktop and mobile app URL)
- Price, price history (last change and date), price per square foot
- Zestimate and rent Zestimate
- Tax assessed value and assessment year
- Beds, baths (full/half), living area, lot size, year built, property type
- Listing status, marketing status, days on Zillow, listing date
- Whether it's FSBO (owner) or agent/broker/builder listed, plus the agent, broker, or builder name when available
- Main photo, full photo gallery, floor plan image, and video/3D tour flags
- Zillow's own listing highlights (short generated blurbs like "recently renovated" or "weatherized for efficiency")
- Featured, Showcase, and preforeclosure auction flags

### 🔍 How search works

You search the same way you would on zillow.com or the app: type a location and pick a search type.

- **`searchType`**: `FOR_SALE`, `FOR_RENT`, or `SOLD`
- **`location`**: city, neighborhood, address, or zip code (e.g. `"Newark, DE"`)
- **Filters**: price range, bed/bath range, living area, lot size, year built, home types, days on Zillow, amenities, keywords, and more, matching what's available in Zillow's own search filters

### 🔧 Input options

| Field | Description |
|---|---|
| `locations` | One or more locations to search (city, address, or zip code) |
| `searchType` | `FOR_SALE`, `FOR_RENT`, or `SOLD` |
| `maxResults` | Max listings to collect per location |
| `sortBy` | Sort order: relevance, newest, recently changed, price (high/low), beds, baths, living area, year built |
| `minPrice` / `maxPrice` | Price range |
| `minBedrooms` / `maxBedrooms` | Bedroom range |
| `minBathrooms` / `maxBathrooms` | Bathroom range |
| `minLivingAreaSqft` / `maxLivingAreaSqft` | Living area range |
| `minLotSizeSqft` / `maxLotSizeSqft` | Lot size range |
| `minYearBuilt` / `maxYearBuilt` | Year built range |
| `daysOnZillow` | Max time on market (e.g. `1_week`, `1_month`, `3_months`) |
| `homeTypes` | Property types to include |
| `keywords` | Keyword search within listings |

### 📊 Data Fields

#### 📍 Location & Listing Link

| Field | Description |
|---|---|
| `zpid` | Zillow's unique property ID |
| `street_address` / `city` / `state` / `zipcode` | Property address |
| `latitude` / `longitude` | Coordinates |
| `url` | Direct Zillow listing page URL |
| `mobile_url` | Zillow mobile app deep link |

#### 💰 Price & Estimates

| Field | Description |
|---|---|
| `price` | Current listing price |
| `price_change` / `price_changed_date` | Most recent price change and when it happened |
| `price_per_sqft` | Price per square foot |
| `zestimate` / `rent_zestimate` | Zillow's estimated value and estimated rent |
| `tax_assessed_value` / `tax_assessment_year` | Tax assessment data |

#### 🏠 Property Details

| Field | Description |
|---|---|
| `property_type` | Home type (single family, condo, manufactured, etc.) |
| `bedrooms` / `bathrooms` / `full_bathrooms` / `half_bathrooms` | Room counts |
| `living_area_sqft` / `lot_size` / `lot_size_unit` | Size details |
| `year_built` | Year the property was built |

#### 📌 Listing Status

| Field | Description |
|---|---|
| `listing_status` / `marketing_status` | Current listing state |
| `days_on_zillow` / `listing_date` | Time on market |
| `is_contingent` | Under contract but contingent |

#### 🧑‍💼 Seller Info

| Field | Description |
|---|---|
| `is_sold_by_owner` | True for FSBO listings |
| `is_sold_by_agent` | True if listed by an agent, broker, or builder |
| `agent_name` / `broker_name` / `builder_name` | Who's listing it, when available |

#### 🖼️ Media & Highlights

| Field | Description |
|---|---|
| `main_image` / `all_images` | Photos |
| `floor_plan_image` | Floor plan image, if available |
| `has_videos` / `has_3d_tour` / `has_floor_plan` | Media flags |
| `highlights` | Zillow's short generated listing highlights |
| `is_featured` / `is_showcase_listing` / `is_preforeclosure_auction` | Listing type flags |

### 📋 Example output

```json
[
  {
    "query": "Newark, DE",
    "url": "https://www.zillow.com/homedetails/72932692_zpid/",
    "mobile_url": "https://www.zillow.com/homedetail/MobileAppHDPShopperPlatformServicePage.htm?fromApp=true&p=android&variant=FOR_SALE#zpid=72932692&homeDetailsVariant=FOR_SALE&webviewLayout=doubleScroll&showFactsAndFeatures=true&fromApp=true&gmaps=true&streetview=true",
    "zpid": 72932692,
    "street_address": "806 N Country Club Dr",
    "city": "Newark",
    "state": "DE",
    "zipcode": "19711",
    "latitude": 39.69733,
    "longitude": -75.772865,
    "main_image": "https://photos.zillowstatic.com/fp/319c1fef7df959a17522ab13a3b33092-p_f.jpg",
    "all_images": [
      "https://photos.zillowstatic.com/fp/319c1fef7df959a17522ab13a3b33092-p_f.jpg",
      "https://photos.zillowstatic.com/fp/a4b8642549b21a409068c5a3c84d9592-p_f.jpg"
    ],
    "has_videos": false,
    "has_3d_tour": true,
    "has_floor_plan": true,
    "floor_plan_image": "https://www.zillowstatic.com/floor_map/02b30a63-b59f-4c7a-bd2a-78f59218fff8/hero.png",
    "price": 499900,
    "price_change": null,
    "price_changed_date": null,
    "price_per_sqft": 217,
    "currency": "usd",
    "zestimate": 512400,
    "rent_zestimate": 3209,
    "tax_assessed_value": 503700,
    "tax_assessment_year": "2025",
    "property_type": "singleFamily",
    "bedrooms": 4,
    "bathrooms": 3.0,
    "full_bathrooms": 2,
    "half_bathrooms": 1,
    "living_area_sqft": 2300,
    "year_built": 1971,
    "lot_size": 0.5800045913682277,
    "lot_size_unit": "acres",
    "listing_status": "forSale",
    "marketing_status": "active",
    "days_on_zillow": 5,
    "listing_date": "07/17/2026",
    "is_contingent": false,
    "pals_id": "5632006_DENC2104134",
    "is_sold_by_owner": false,
    "is_sold_by_agent": true,
    "broker_name": "EXP Realty, LLC",
    "agent_name": null,
    "builder_name": null,
    "is_featured": false,
    "is_showcase_listing": false,
    "is_preforeclosure_auction": false,
    "highlights": [
      "3D Tour",
      "Freshly painted throughout",
      "5 days on Zillow"
    ]
  },
  {
    "query": "Newark, DE",
    "url": "https://www.zillow.com/homedetails/73019171_zpid/",
    "mobile_url": "https://www.zillow.com/homedetail/MobileAppHDPShopperPlatformServicePage.htm?fromApp=true&p=android&variant=SHOWCASE#zpid=73019171&homeDetailsVariant=SHOWCASE&webviewLayout=doubleScroll&showFactsAndFeatures=true&fromApp=true&gmaps=true&streetview=true",
    "zpid": 73019171,
    "street_address": "108 Paddock Dr",
    "city": "Newark",
    "state": "DE",
    "zipcode": "19711",
    "latitude": 39.733837,
    "longitude": -75.71586,
    "main_image": "https://photos.zillowstatic.com/fp/7f589cad1ef26f9a29d3c15509b741f0-p_f.jpg",
    "all_images": [
      "https://photos.zillowstatic.com/fp/7f589cad1ef26f9a29d3c15509b741f0-p_f.jpg",
      "https://photos.zillowstatic.com/fp/f2d21064acd2129aab44d436e65ea5ae-p_f.jpg"
    ],
    "has_videos": false,
    "has_3d_tour": true,
    "has_floor_plan": true,
    "floor_plan_image": "https://www.zillowstatic.com/floor_map/913fe276-9c67-4a1b-81ab-d449e345f126/hero.png",
    "price": 575000,
    "price_change": null,
    "price_changed_date": null,
    "price_per_sqft": 173,
    "currency": "usd",
    "zestimate": 608100,
    "rent_zestimate": 3469,
    "tax_assessed_value": 550600,
    "tax_assessment_year": "2025",
    "property_type": "singleFamily",
    "bedrooms": 4,
    "bathrooms": 3.0,
    "full_bathrooms": 2,
    "half_bathrooms": 1,
    "living_area_sqft": 3320,
    "year_built": 1992,
    "lot_size": 0.33000459136822774,
    "lot_size_unit": "acres",
    "listing_status": "forSale",
    "marketing_status": "active",
    "days_on_zillow": 6,
    "listing_date": "07/16/2026",
    "is_contingent": true,
    "pals_id": "5632006_DENC2107250",
    "is_sold_by_owner": false,
    "is_sold_by_agent": true,
    "broker_name": "Patterson-Schwartz-Hockessin",
    "agent_name": null,
    "builder_name": null,
    "is_featured": false,
    "is_showcase_listing": true,
    "is_preforeclosure_auction": false,
    "highlights": [
      "Showcase",
      "3D Tour",
      "Striking stone-accented fireplace"
    ]
  }
]
```

### 🚀 Running the actor

#### Via Apify Console

Open the actor page, fill in the input form, and click **Start**.

#### Via Apify API: Python

```python
import requests

APIFY_TOKEN = "your_apify_token"
ACTOR_ID = "mof1re~zillow-scraper"

run_input = {
    "locations": ["Newark, DE"],
    "searchType": "FOR_SALE",
    "maxResults": 200,
}

response = requests.post(
    f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items",
    params={"token": APIFY_TOKEN},
    json=run_input,
)

listings = response.json()
print(f"Fetched {len(listings)} listings")
```

#### Via Apify API: Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'your_apify_token' });

const input = {
    locations: ['Newark, DE'],
    searchType: 'FOR_SALE',
    maxResults: 200,
};

const run = await client.actor('mof1re/zillow-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();

console.log(`Fetched ${items.length} listings`);
```

#### Example input JSON

```json
{
  "locations": ["Newark, DE", "Philadelphia, PA"],
  "searchType": "FOR_SALE",
  "maxResults": 300,
  "sortBy": "priceLowToHigh",
  "minPrice": 150000,
  "maxPrice": 500000,
  "minBedrooms": 2
}
```

### ❓ FAQ

**How is this different from other Zillow scrapers?** Most either need a pre-built Zillow search URL or a manual map bounding box. This one takes a plain location string, the same way you'd search on zillow.com, and handles pagination and filters on its own.

**Does this scraper need an account or API key?** No. It extracts publicly available listing data.

**Can I search multiple locations in one run?** Yes. Pass a list of locations and they're scraped concurrently.

**Can I search For Sale, For Rent, and Sold listings?** Yes. Set `searchType` to `FOR_SALE`, `FOR_RENT`, or `SOLD`.

**Do I need my own proxies?** No. Proxies are built into the actor.

**Is this legal? Can I scrape publicly available Zillow listings?** This tool extracts publicly available listing data. You're responsible for complying with Zillow's terms of service and applicable data protection laws for your use case.

### 💳 Pricing

Pay-per-result. You're charged for listings actually delivered, not for pages fetched or requests made.

### ⚠️ Notes

- Free-tier accounts are capped at a smaller number of results per run, and to a limited number of locations per run. Upgrade to a paid Apify plan for full volume and batch scraping.
- Data reflects what's publicly listed on zillow.com at the time of the run; the source updates continuously.

### 🔗 See also

Need data from another real estate or travel platform? Check out:

- [Tripadvisor Reviews Scraper](https://apify.com/mof1re/tripadvisor-reviews-scraper)
- [Booking.com Reviews Scraper](https://apify.com/mof1re/booking-reviews-scraper-browserless)
- [AirBnb Reviews Scraper](https://apify.com/mof1re/airbnb-reviews-scraper-browserless)
- [Trustpilot Reviews Scraper](https://apify.com/mof1re/trustpilot-scraper-fast-browserlessapif)
- [ULTA Reviews Scraper](https://apify.com/mof1re/ulta-reviews-scraper)

# Actor input Schema

## `searchType` (type: `string`):

What kind of listings to search for.

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

ZIP code, city + state e.g. "90210", "Chicago, IL", or "Newark, DE". Add multiple to scrape several locations in one run.

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

Maximum number of listings to collect. Leave empty to collect all available results.

## `sortBy` (type: `string`):

How to sort the results. Leave empty to use Zillow's default relevance sorting for the selected search type.

## `keywords` (type: `string`):

Optional free-text keyword to filter listings (e.g. "pool", "renovated").

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

Minimum price in USD (Sale/Sold) or minimum monthly rent (For Rent).

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

Maximum price in USD (Sale/Sold) or maximum monthly rent (For Rent).

## `minBedrooms` (type: `integer`):

Minimum number of bedrooms.

## `maxBedrooms` (type: `integer`):

Maximum number of bedrooms.

## `minBathrooms` (type: `number`):

Minimum number of bathrooms.

## `maxBathrooms` (type: `number`):

Maximum number of bathrooms.

## `minLivingAreaSqft` (type: `integer`):

Minimum interior living area in square feet.

## `maxLivingAreaSqft` (type: `integer`):

Maximum interior living area in square feet.

## `minLotSizeSqft` (type: `integer`):

Minimum lot size in square feet. 21780 sqft ≈ 1/2 acre.

## `maxLotSizeSqft` (type: `integer`):

Maximum lot size in square feet. 21780 sqft ≈ 1/2 acre.

## `minYearBuilt` (type: `integer`):

Minimum construction year.

## `maxYearBuilt` (type: `integer`):

Maximum construction year.

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

Property types to include. For 'For Rent' searches, only Houses (singleFamily), Townhomes, and Condos are supported — other values are silently dropped.

## `basementStatuses` (type: `array`):

Basement status.

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

Only show listings posted within this time window.

## `minParkingSpots` (type: `integer`):

Minimum number of parking spots.

## `otherAmenitiesFilters` (type: `array`):

General amenities. Only applies to 'For Sale' and 'For Rent' searches.

## `rentalAmenitiesFilters` (type: `array`):

Rental-specific amenities. Only applies to 'For Rent' searches.

## `allowedPets` (type: `array`):

Only show rentals that allow these pets. Only applies to 'For Rent' searches, and is ignored if 'No pets allowed' below is checked.

## `noPetsAllowed` (type: `boolean`):

Only show rentals that don't allow pets. Only applies to 'For Rent' searches. When checked, 'Pets allowed' above is ignored.

## `forRentByOwner` (type: `boolean`):

Only show rentals listed directly by the owner. Only applies to 'For Rent' searches.

## `showOnlyFilter` (type: `array`):

Only show listings with these features. Not all values apply to every search type — Zillow will ignore ones that don't apply.

## `viewTypesFilter` (type: `array`):

Only show listings with these views.

## Actor input object example

```json
{
  "searchType": "FOR_SALE",
  "locations": [
    "Newark, DE"
  ],
  "maxResults": 150,
  "noPetsAllowed": false,
  "forRentByOwner": false
}
```

# Actor output Schema

## `listings` (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 = {
    "locations": [
        "Newark, DE"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mof1re/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 = { "locations": ["Newark, DE"] }

# Run the Actor and wait for it to finish
run = client.actor("mof1re/zillow-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Newark, DE"
  ]
}' |
apify call mof1re/zillow-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mof1re/zillow-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UkX01gVFM5Mf6kJdd/builds/A1GlhXt7gYQ2djIzK/openapi.json
