# Zillow Price Drop Scraper (`schnellscrapers/zillow-price-drop-scraper`) Actor

Scrape Zillow price-reduced listings with current and previous price, drop amount, drop percentage, address, beds, baths, sqft, Zestimate, broker, photos, and dates. Paste filtered search URLs, paginate and deduplicate results, and apply thresholds before billing. No login required.

- **URL**: https://apify.com/schnellscrapers/zillow-price-drop-scraper.md
- **Developed by:** [Nate Schnell](https://apify.com/schnellscrapers) (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

$1.50 / 1,000 price-drop 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/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

### What does Zillow Price Drop Scraper do?

Zillow Price Drop Scraper extracts Zillow listings with a detected asking-price reduction and returns a clean row for each property. It is built for real-estate agents, investors, wholesalers, and operations teams that want a focused feed of current opportunities instead of a full dump of every home in a market.

### What data can you extract from Zillow price drops?

- Price movement — current price, previous price, signed Zillow price change, dollar drop, percentage drop, reduction label, and change timestamp
- Property identity — ZPID, listing URL, full address, street, city, state, ZIP code, latitude, and longitude
- Home facts — home status, home type, bedrooms, bathrooms, living area, lot size, days on Zillow, Zestimate, and Rent Zestimate
- Listing context — broker, source search URL, scrape timestamp, and photo URLs exposed on the result page

The actor calculates `previousPrice` from Zillow's current price and signed price change, so every emitted row can be sorted by the size of the opportunity. `priceDropAmount` and `priceDropPercent` are positive values for easy threshold filters; the original `priceChange` remains negative for a reduction.

### How to use Zillow Price Drop Scraper

1. Open a Zillow price-reduced or saved search-result page and copy its URL.
2. Paste one or more URLs into the Zillow search URLs input.
3. Set the maximum listings and pages, then optionally require a minimum dollar or percentage reduction.
4. Click Run. Use Dry run first if you want to inspect matched versus written rows without creating dataset records.
5. Download the output as JSON, CSV, or Excel, or read it through the Apify dataset API.

The actor follows Zillow's own next-page links, deduplicates by ZPID across all supplied URLs, and filters before output is written. A record rejected by a drop threshold is not emitted or billed as a dataset item.

### How much does it cost?

Pricing starts at `$1.50 / 1,000 price-drop listings`. One billable unit is one listing written to the default dataset after duplicate and threshold filters. Apify free credits cover small tests. Set a low maximum listings value while validating a new market; page fetching itself does not create dataset charges.

Residential Apify Proxy is enabled by default because Zillow can challenge datacenter traffic; proxy transfer can affect platform usage, so the input includes an explicit proxy toggle. The measured deployed smoke cost is about `$0.12 / 1,000` before the actor event price, leaving room for the listed price.

### Input

`searchUrls` is required and accepts one or more Zillow search URLs. Use `maxItems` to cap all output, `maxPages` to control pagination per URL, `minDropUsd` for a dollar threshold, and `minDropPercent` for a percentage threshold. The default proxy configuration uses a U.S. residential group. A minimal input looks like this:

```json
{
  "searchUrls": [
    { "url": "https://www.zillow.com/new-york-ny/price-reduced/" }
  ],
  "maxItems": 50,
  "maxPages": 2,
  "minDropUsd": 10000
}
```

### Output

Each row contains the listing identity, current and previous asking prices, drop size, property facts, broker, photos, source URL, and scrape timestamp. A real output row is shaped like this:

```json
{
  "zpid": "32035196",
  "detailUrl": "https://www.zillow.com/homedetails/160-11-24th-Ave-Flushing-NY-11357/32035196_zpid/",
  "address": "160-11 24th Avenue, Whitestone, NY 11357",
  "city": "Flushing",
  "state": "NY",
  "zipcode": "11357",
  "price": 1298000,
  "previousPrice": 1328000,
  "priceChange": -30000,
  "priceDropAmount": 30000,
  "priceDropPercent": 2.259036144578313,
  "datePriceChanged": "2026-07-09T07:00:00.000Z",
  "priceReduction": "$30,000 (Jul 9)",
  "homeStatus": "FOR_SALE",
  "homeType": "SINGLE_FAMILY",
  "beds": 4,
  "baths": 3,
  "livingArea": 1865,
  "brokerName": "MAB Realty Group Inc",
  "sourceUrl": "https://www.zillow.com/new-york-ny/price-reduced/",
  "scrapedAt": "2026-08-08T16:01:00.000Z"
}
```

### Integrations

Use the Apify API, webhooks, schedules, Make, Zapier, n8n, or a small Python/Node.js job to send price-drop rows into a CRM, spreadsheet, alert channel, or market dashboard. The dataset URL is available immediately after a successful run.

### Related actors

- [Zillow Search Scraper](https://apify.com/maxcopell/zillow-scraper) — broad for-sale and rental search extraction when you need the full result set.
- [Zillow Detail Scraper](https://apify.com/maxcopell/zillow-detail-scraper) — detail-page enrichment for history, agent, tax, school, and amenity fields.

### FAQ

#### How does Zillow Price Drop Scraper work?

It reads the rendered data Zillow places in each search-result page, follows the page's own pagination link, normalizes the listing fields, and emits only records with a price reduction. It does not open a detail page for every listing.

#### Can I use Zillow Price Drop Scraper as an API?

Yes. Start a run through the Apify API with the same JSON input, then read the default dataset through its API URL. You can also attach a webhook or schedule recurring runs in Apify.

#### Can I use Zillow Price Drop Scraper in Python or Node.js?

Yes. Use the official `apify-client` package to start the actor and list its dataset items.

#### What does this actor access?

It accesses publicly rendered Zillow search-result pages supplied in `searchUrls`. No Zillow account, login, or Zillow API key is required. Search pages are fetched live for each run.

#### Is it legal to scrape Zillow?

The actor is intended for publicly visible listing data. Your use of the output must follow applicable laws, contracts, and platform requirements; review your use case with qualified counsel when personal or commercial data is involved.

#### Why is a listing missing from the output?

The source must expose a price change on the supplied search page. Listings without a detectable reduction are intentionally skipped, as are duplicate ZPIDs and rows that fail your dollar or percentage threshold. For a larger feed, provide a saved price-reduced URL and raise `maxPages` or split the market by ZIP code.

### Your feedback

If Zillow changes its search-page fields or you need another price-drop filter, use the Issues tab on the actor page. Suggestions for new buyer-facing fields are welcome when the source exposes them consistently.

# Actor input Schema

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

Paste Zillow price-reduced or saved search-result URLs. Apply Zillow's location and listing filters first, then add the URL here; each URL is paginated until the page cap or item cap is reached.

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

Hard cap on price-drop listing rows written across all URLs. Start with `20` to validate a market; the default is 100.

## `maxPages` (type: `integer`):

Maximum Zillow result pages to fetch for each search URL. Zillow result pages commonly contain up to 41 listings; the default is 5.

## `minDropUsd` (type: `number`):

Keep only listings whose price reduction is at least this many U.S. dollars. Use `0` for every detected reduction.

## `minDropPercent` (type: `number`):

Keep only listings whose price reduction is at least this percentage of the previous price. Use `0` for every detected reduction.

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

Zillow may challenge direct datacenter traffic. Residential Apify Proxy is enabled by default for deployed runs; disable it only when your source access is already reliable, because proxy transfer can affect cost.

## `dryRun` (type: `boolean`):

Fetch and filter listings without writing dataset records. Logs show matched versus written counts so you can validate a URL or threshold safely.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://www.zillow.com/new-york-ny/price-reduced/"
    }
  ],
  "maxItems": 100,
  "maxPages": 5,
  "minDropUsd": 0,
  "minDropPercent": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "dryRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

Normalized Zillow listings with price-change fields ready for lead generation, comps, and market monitoring.

# 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 = {
    "searchUrls": [
        {
            "url": "https://www.zillow.com/new-york-ny/price-reduced/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/zillow-price-drop-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 = { "searchUrls": [{ "url": "https://www.zillow.com/new-york-ny/price-reduced/" }] }

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/zillow-price-drop-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 '{
  "searchUrls": [
    {
      "url": "https://www.zillow.com/new-york-ny/price-reduced/"
    }
  ]
}' |
apify call schnellscrapers/zillow-price-drop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,schnellscrapers/zillow-price-drop-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/49IavYoHjXtbQgu6g/builds/AeokxNCk0mXQu38KR/openapi.json
