# ZillowPulse — Stale Listing & Price Drop Detector (`ayk_6789/price-drop-check`) Actor

Find motivated sellers before your competition does. ZillowPulse scans Zillow by ZIP code and surfaces every FOR\_SALE listing that has been sitting on the market for 30+ days — including full price history, tax records, school ratings, and direct agent contact details.

- **URL**: https://apify.com/ayk\_6789/price-drop-check.md
- **Developed by:** [YKA](https://apify.com/ayk_6789) (community)
- **Categories:** Real estate, Integrations
- **Stats:** 5 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$29.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#rental-actors

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## ZillowPulse — Stale Listing & Price Drop Detector

Find motivated sellers before your competition does. ZillowPulse scans Zillow by ZIP code and surfaces every FOR_SALE listing that has been sitting on the market for 30+ days — including full price history, tax records, school ratings, and direct agent contact details.

Built for real estate agents and investors who want to identify negotiation leverage: listings where the seller is under pressure, the price has already dropped, and days on market signal motivation to deal.

---

### Why This Actor Exists

The most actionable leads in real estate are not new listings — they are **stale listings**. A property that has been on the market for 30, 60, or 90 days with a price reduction tells a clear story: the seller needs to move. ZillowPulse automates the discovery of exactly these properties at scale.

**Key signals this Actor surfaces:**
- Listings active for 30+ days (fully configurable)
- Full price history showing every reduction, relisting, and sale event
- Price drop percentage calculable from `priceHistory` — flag any listing where the original list price has dropped 15%+
- Agent name, phone, and brokerage — ready for outreach
- Tax history going back 20+ years — understand true ownership cost
- School ratings — critical context for family buyer conversations

---

### What You Get Per Listing

Each scraped record contains:

| Field | Description |
|---|---|
| `street_address` | Full street address |
| `city` / `state` / `zip` | Location |
| `price_listed` | Current asking price |
| `days_on_zillow` | Days on market per Zillow |
| `days_on_market_calculated` | Days calculated from `datePostedString` |
| `date_posted` | Original listing date (YYYY-MM-DD) |
| `bedrooms` / `bathrooms` | Bed/bath count |
| `living_area_sqft` | Interior square footage |
| `lot_size_sqft` | Lot size |
| `year_built` | Year of construction |
| `price_per_sqft` | Price per square foot |
| `zestimate` | Zillow automated valuation |
| `rent_zestimate` | Estimated rental value |
| `hoa_fee` | HOA fee if applicable |
| `agent_name` | Listing agent full name |
| `agent_phone` | Listing agent phone number |
| `brokerage_name` | Listing brokerage |
| `priceHistory` | Full array of every price event — list, reduce, sell |
| `taxHistory` | 20–25 years of annual tax and assessed value records |
| `schools` | 3 nearest schools with ratings, grades, and distance |
| `photos` | Array of listing photo URLs |
| `description` | Full property description text |
| `zillow_url` | Direct link to the Zillow listing |
| `home_type` | SINGLE_FAMILY, CONDO, TOWNHOUSE, etc. |
| `home_status` | FOR_SALE, PENDING, etc. |
| `latitude` / `longitude` | Coordinates |
| `county` | County name |
| `parking` | Parking details |
| `heating` / `cooling` | HVAC details |
| `scraped_at` | ISO timestamp of when data was collected |

---

### How to Identify Price Drops in the Output

The `priceHistory` array contains every price event. To find listings with a 15%+ price drop, filter where:

````

originalPrice = first event in priceHistory where event = "Listed for sale"
currentPrice  = price\_listed
dropPct       = (originalPrice - currentPrice) / originalPrice \* 100
flag if dropPct >= 15

````

Example `priceHistory` entry:
```json
{
  "date": "2026-01-15",
  "event": "Price change",
  "price": 850000,
  "priceChangeRate": -0.15,
  "pricePerSquareFoot": 425
}
````

The `priceChangeRate` field is negative for reductions — `-0.15` means a 15% drop. You can filter directly on this field without any calculation.

***

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `zipCodes` | array | ✅ Yes | — | One or more US ZIP codes to search |
| `minDaysOnMarket` | integer | No | `20` | Minimum days listed. Use `30` for motivated sellers |
| `maxListingsPerZip` | integer | No | `0` (unlimited) | Cap results per ZIP. `0` = no limit |
| `minPrice` | integer | No | none | Minimum asking price filter |
| `maxPrice` | integer | No | none | Maximum asking price filter |
| `homeTypes` | array | No | all types | Filter by type: `SINGLE_FAMILY`, `CONDO`, `TOWNHOUSE`, `MULTI_FAMILY`, `LAND`, `MANUFACTURED` |
| `webhookUrl` | string | No | none | POST each result to this URL as it is scraped |

#### Recommended Input for Motivated Seller Leads

```json
{
  "zipCodes": ["75229", "75230", "75231"],
  "minDaysOnMarket": 30,
  "maxListingsPerZip": 50,
  "homeTypes": ["SINGLE_FAMILY"]
}
```

#### Input for Price Drop Hunting (All Types, No Cap)

```json
{
  "zipCodes": ["92131"],
  "minDaysOnMarket": 30,
  "maxListingsPerZip": 0
}
```

***

### How It Works

**Stage 1 — Search:** ZillowPulse queries Zillow's search API for each ZIP code, paginating from oldest to newest. Only listings meeting your `minDaysOnMarket` threshold are collected. This avoids scraping thousands of detail pages unnecessarily.

**Stage 2 — Detail Scrape:** Each qualifying listing URL is fetched individually. The full property page is parsed to extract all data fields, then a secondary GraphQL query pulls price history, tax history, and school data that is not available in the HTML.

All requests are rate-limited and spaced to operate reliably without blocks.

***

### Expected Performance

| Listings | Estimated Runtime |
|---|---|
| 10 | ~1 minute |
| 50 | ~5 minutes |
| 100 | ~10 minutes |
| 200 | ~20 minutes |

Rate: approximately 15 listings per minute.

***

### Use Cases

**Real estate agents** — Build a daily pipeline of stale listings in your farm area. Call the listing agent with a buyer who is ready to move.

**Investors** — Identify distressed listings where price reductions signal seller motivation. Cross-reference tax history to understand true cost basis.

**Wholesalers** — Find properties sitting on the market with multiple price drops. These sellers are the most likely to accept below-market offers.

**Market analysts** — Track days-on-market trends and price reduction frequency by ZIP code over time.

***

### Output Example

```json
{
  "zpid": "16823642",
  "street_address": "10060 Scripps Vista Way Unit 33",
  "city": "San Diego",
  "state": "CA",
  "zip": "92131",
  "price_listed": 795000,
  "days_on_zillow": 38,
  "days_on_market_calculated": 38,
  "date_posted": "2026-02-15",
  "bedrooms": 3,
  "bathrooms": 2,
  "living_area_sqft": 1450,
  "year_built": 1998,
  "zestimate": 781000,
  "agent_name": "Sarah Johnson",
  "agent_phone": "619-555-0142",
  "brokerage_name": "Compass",
  "priceHistory": [
    {
      "date": "2026-02-15",
      "event": "Listed for sale",
      "price": 950000,
      "priceChangeRate": 0
    },
    {
      "date": "2026-03-01",
      "event": "Price change",
      "price": 875000,
      "priceChangeRate": -0.079
    },
    {
      "date": "2026-03-15",
      "event": "Price change",
      "price": 795000,
      "priceChangeRate": -0.091
    }
  ],
  "schools": [
    { "name": "Miramar Ranch Elementary", "rating": 9, "distance": 0.4 },
    { "name": "Scripps Ranch Middle School", "rating": 8, "distance": 1.2 },
    { "name": "Scripps Ranch High School", "rating": 9, "distance": 1.8 }
  ],
  "zillow_url": "https://www.zillow.com/homedetails/10060-Scripps-Vista-Way-UNIT-33-San-Diego-CA-92131/16823642_zpid/",
  "scraped_at": "2026-03-24T04:07:42.000Z"
}
```

***

### Legal & Terms of Use

This Actor is intended for personal research and professional real estate use. Users are responsible for complying with Zillow's Terms of Service and all applicable laws. Data collected should not be used for mass unsolicited contact or resale without appropriate licensing.

***

### Support

For issues, feature requests, or custom configurations, contact the actor maintainer through the Apify platform.

# Actor input Schema

## `zipCodes` (type: `array`):

US ZIP codes to search. Example: \["75229", "92131"]

## `minDaysOnMarket` (type: `integer`):

Only include listings on market for at least this many days.

## `maxListingsPerZip` (type: `integer`):

Maximum listings to scrape per ZIP code. Set to 0 for unlimited (scrapes all matching listings).

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

Minimum listing price filter.

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

Maximum listing price filter.

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

Filter by home type. Leave empty for all types. Options: SINGLE\_FAMILY, CONDO, TOWNHOUSE, MULTI\_FAMILY, LAND, MANUFACTURED

## `webhookUrl` (type: `string`):

POST each result to this URL in real-time.

## Actor input object example

```json
{
  "zipCodes": [
    "75229"
  ],
  "minDaysOnMarket": 20,
  "maxListingsPerZip": 10,
  "homeTypes": []
}
```

# 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 = {
    "zipCodes": [
        "75229"
    ],
    "minDaysOnMarket": 20,
    "maxListingsPerZip": 10,
    "minPrice": 0,
    "maxPrice": 0,
    "homeTypes": [],
    "webhookUrl": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("ayk_6789/price-drop-check").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 = {
    "zipCodes": ["75229"],
    "minDaysOnMarket": 20,
    "maxListingsPerZip": 10,
    "minPrice": 0,
    "maxPrice": 0,
    "homeTypes": [],
    "webhookUrl": "",
}

# Run the Actor and wait for it to finish
run = client.actor("ayk_6789/price-drop-check").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 '{
  "zipCodes": [
    "75229"
  ],
  "minDaysOnMarket": 20,
  "maxListingsPerZip": 10,
  "minPrice": 0,
  "maxPrice": 0,
  "homeTypes": [],
  "webhookUrl": ""
}' |
apify call ayk_6789/price-drop-check --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ZillowPulse — Stale Listing & Price Drop Detector",
        "description": "Find motivated sellers before your competition does. ZillowPulse scans Zillow by ZIP code and surfaces every FOR_SALE listing that has been sitting on the market for 30+ days — including full price history, tax records, school ratings, and direct agent contact details.",
        "version": "0.0",
        "x-build-id": "tcIAJr7ZUuXhIf2bN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ayk_6789~price-drop-check/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ayk_6789-price-drop-check",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ayk_6789~price-drop-check/runs": {
            "post": {
                "operationId": "runs-sync-ayk_6789-price-drop-check",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ayk_6789~price-drop-check/run-sync": {
            "post": {
                "operationId": "run-sync-ayk_6789-price-drop-check",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "zipCodes"
                ],
                "properties": {
                    "zipCodes": {
                        "title": "ZIP Codes",
                        "type": "array",
                        "description": "US ZIP codes to search. Example: [\"75229\", \"92131\"]",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minDaysOnMarket": {
                        "title": "Min Days on Market",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Only include listings on market for at least this many days."
                    },
                    "maxListingsPerZip": {
                        "title": "Max Listings Per ZIP",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum listings to scrape per ZIP code. Set to 0 for unlimited (scrapes all matching listings)."
                    },
                    "minPrice": {
                        "title": "Min Price (optional)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum listing price filter."
                    },
                    "maxPrice": {
                        "title": "Max Price (optional)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum listing price filter."
                    },
                    "homeTypes": {
                        "title": "Home Types (optional)",
                        "type": "array",
                        "description": "Filter by home type. Leave empty for all types. Options: SINGLE_FAMILY, CONDO, TOWNHOUSE, MULTI_FAMILY, LAND, MANUFACTURED",
                        "items": {
                            "type": "string"
                        }
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (optional)",
                        "type": "string",
                        "description": "POST each result to this URL in real-time."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
