# 🏠 Zillow Motivated Seller & Price Drop Scraper (`automation_studio/zillow-motivated-seller-scraper`) Actor

Real estate investor deal screener. Scrapes Zillow for motivated sellers, For Sale By Owner (FSBO), consecutive price drops, and distress keywords.

- **URL**: https://apify.com/automation\_studio/zillow-motivated-seller-scraper.md
- **Developed by:** [Automation Studio](https://apify.com/automation_studio) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 verified property & motivated seller leads

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/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 Motivated Seller & Price Drop Scraper

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-orange?style=flat-square\&logo=apify)](https://apify.com)
[![Target Audience](https://img.shields.io/badge/Target-Wholesalers%20%7C%20Flippers%20%7C%20Investors-blue?style=flat-square)](https://apify.com)
[![Data Integrity: 100% Real](https://img.shields.io/badge/Data%20Integrity-100%25%20Verified%20Zillow%20Data-brightgreen?style=flat-square)](https://zillow.com)
[![Architecture](https://img.shields.io/badge/Architecture-Next.js%20JSON%20%2B%20Residential%20Stealth-success?style=flat-square)](https://apify.com)

An investment-grade real estate deal screener and lead generator for **real estate wholesalers, fix-and-flippers, and acquisition managers**.

Instead of dumping thousands of retail properties at full market price, this Actor automatically applies algorithmic deal filters to isolate **distressed, high-equity, motivated sellers** across any US city, state, or ZIP code.

***

### 🎯 Why Wholesalers & Investors Use This Scraper

Wholesale deal finders and house flippers make **$5,000 to $25,000+** per contract assignment, but waste 20+ hours a week sifting through overpriced retail listings.

This Actor automates deal discovery across the three strongest indicators of seller distress:

1. **For Sale By Owner (FSBO)**: Direct homeowner listings without real estate agents taking 6% commissions or blocking investor negotiations.
2. **Consecutive Price Drops**: Properties where sellers have dropped the price multiple times and accumulated significant discounts below their initial asking price.
3. **Distress NLP Keyword Detection**: Instant text scanning of property descriptions for urgency and structural keywords: *"must sell"*, *"as-is"*, *"estate sale"*, *"tlc"*, *"needs work"*, *"probate"*, *"cash only"*, and *"handyman special"*.

***

### ⚡ Key Capabilities

- **Automated Price Cut Velocity Tracking**: Computes total price drop dollar amount, total discount percentage from original listing price, and count of consecutive cuts.
- **Normalized Deal Score Index (0–100)**: Proprietary investor scoring model ranking properties by distress level so you can target the most motivated sellers first.
- **Regex Contact Harvester**: Extracts direct homeowner phone numbers and emails embedded inside listing descriptions and owner contact remarks.
- **PerimeterX / Anti-Bot Hardened**: Pre-configured to route through **Apify Residential Proxies (`RESIDENTIAL`)** to seamlessly bypass Zillow bot challenges.
- **Instant Webhook Alerts**: Connects directly to Discord or Slack to notify acquisition teams the moment a 75+ Deal Score opportunity is discovered.
- **Zero Synthetic Data Guarantee**: Strictly 100% real property listings from Zillow.

***

### 📊 Deal Score Index Explained

Every property is evaluated and assigned an objective **0 to 100 Deal Score**:

| Score Range | Deal Classification | Investor Action |
| :--- | :--- | :--- |
| **80 – 100** | 🚨 **High-Conviction Distressed Deal** | Immediate outreach. Typically FSBO + $\ge$ 15% discount + multiple price cuts + distress keywords. |
| **60 – 79** | ⚠️ **Strong Motivated Opportunity** | Prime negotiation candidate. Significant price reduction or stale inventory (>60 days on market). |
| **40 – 59** | ℹ️ **Moderate Opportunity** | Recent price reduction or emerging motivated seller. |
| **< 40** | 💤 **Low Motivation / Retail Trim** | Filtered out by default to save you time and money. |

#### Scoring Breakdown:

- **+25 points**: For Sale By Owner (FSBO)
- **Up to +30 points**: Price cut magnitude ($\ge$ 15% cut = 30 pts; 10–14% cut = 20 pts; 5–9% cut = 10 pts)
- **Up to +15 points**: Consecutive price cuts (3+ drops = 15 pts; 2 drops = 10 pts)
- **Up to +20 points**: Distress keywords in description (2+ keywords = 20 pts; 1 keyword = 12 pts)
- **Up to +10 points**: Stale Days on Market (> 90 DOM = 10 pts; 60–90 DOM = 7 pts)

***

### ⚙️ Input Configuration

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `location` | String | `"Dallas, TX"` | Target market (City, State like `"Atlanta, GA"` or 5-digit ZIP like `"75201"`). |
| `listingType` | String | `"ALL"` | Filter representation: `"ALL"`, `"FSBO_ONLY"` (homeowners), or `"AGENT_ONLY"`. |
| `minPriceDropPercent` | Integer | `5` | Minimum percentage discount from original listing price (0 to 90%). |
| `minPriceDropsCount` | Integer | `1` | Minimum number of separate price drops recorded on Zillow (1 to 10). |
| `minDaysOnZillow` | Integer | `14` | Minimum days listed on Zillow (DOM) to target stale inventory (0 to 730). |
| `distressKeywordsOnly` | Boolean | `false` | When true, only returns properties containing distress phrases in description. |
| `customKeywords` | Array | `[]` | Optional extra keywords to search (e.g. `["code violation", "tax lien"]`). |
| `minDealScore` | Integer | `40` | Minimum Deal Score threshold (0 to 100). |
| `maxResults` | Integer | `40` | Maximum motivated seller deals to collect per run (up to 500). |
| `proxyConfiguration` | Object | `RESIDENTIAL` | Apify Residential Proxy configuration (strongly recommended for Zillow). |
| `webhookUrl` | String | `""` | Optional Discord or Slack webhook URL for real-time high-conviction deal alerts. |

***

### 📋 Sample Output Record

Each item in your default dataset is enriched with full property specifications, price drop metrics, and direct contact details:

```json
{
  "zpid": "26849102",
  "dealScore": 85,
  "address": "4512 Meadowbrook Dr, Dallas, TX 75201",
  "city": "Dallas",
  "state": "TX",
  "zipcode": "75201",
  "price": 275000,
  "priceFormatted": "$275,000",
  "originalPrice": 325000,
  "originalPriceFormatted": "$325,000",
  "priceCutAmount": 50000,
  "priceCutAmountFormatted": "-$50,000",
  "priceCutPercent": 15.4,
  "priceCutPercentFormatted": "-15.4%",
  "priceDropCount": 2,
  "daysOnZillow": 68,
  "listingType": "FSBO",
  "distressKeywordsFound": [
    "as-is",
    "must sell",
    "cash only"
  ],
  "distressKeywordsDisplay": "as-is, must sell, cash only",
  "sellerContactPhone": "(214) 555-0199",
  "sellerContactEmail": "meadowbrook_owner@gmail.com",
  "agentName": "",
  "brokerName": "",
  "zillowUrl": "https://www.zillow.com/homedetails/26849102_zpid/",
  "zestimate": 310000,
  "pricePerSqft": 152,
  "bedrooms": 3,
  "bathrooms": 2.0,
  "livingAreaSqft": 1810,
  "yearBuilt": 1978,
  "lotSize": "7,405 sqft",
  "propertyType": "SINGLE_FAMILY",
  "imgSrc": "https://photos.zillowstatic.com/fp/sample.jpg",
  "descriptionExcerpt": "Must sell this month due to relocation! Sold strictly as-is, cash only. Bring your contractor and all offers...",
  "scrapedAt": "2026-09-20T14:20:00.000Z"
}
```

***

### 🔔 Discord & Slack Webhook Notifications

Integrate directly into your wholesale team's communication channel:

1. Paste your incoming Discord or Slack webhook URL into `webhookUrl`.
2. When the Actor discovers properties scoring **75+**, it posts an instant alert card with:
   - Calculated Price Cut & Discount %
   - Direct Seller Phone Number
   - Keywords identified
   - Direct clickable link to the Zillow listing

***

### 💰 Monetization & Economics

- **Pricing Model**: Pay-Per-Event (PPE)
  - **Actor Startup**: `$0.01` per run
  - **Qualified Deal Record**: `$0.01` per motivated seller lead
- **Platform Usage**: Paid by user (`isPPEPlatformUsagePaidByUser: true`).
- **Proxy Optimization**: Extracts pure JSON payloads without downloading heavy images or video, keeping proxy consumption under 3–5 MB per run.

# Actor input Schema

## `location` (type: `string`):

Target city and state (e.g. 'Dallas, TX', 'Atlanta, GA', 'Phoenix, AZ') or specific 5-digit ZIP code (e.g. '75201').

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

Filter by seller representation. 'FSBO\_ONLY' targets unrepresented homeowners (no 6% commission). 'ALL' includes both FSBO and agent-listed price drops.

## `minPriceDropPercent` (type: `integer`):

Filter for properties where total price cuts equal or exceed this percentage of original listing price (e.g. 5 = at least 5% off original price).

## `minPriceDropsCount` (type: `integer`):

Minimum number of separate price drops recorded on Zillow (e.g. 1 = at least one price drop, 2 = multiple consecutive drops indicating increasing seller urgency).

## `minDaysOnZillow` (type: `integer`):

Target stale inventory listed for at least this many days (e.g. 30 = listed for a month or more). Set to 0 to include newly listed price drops.

## `distressKeywordsOnly` (type: `boolean`):

When enabled, only returns properties whose listing descriptions contain high-intent distress keywords (e.g. 'must sell', 'as-is', 'estate sale', 'tlc', 'cash only', 'probate').

## `customKeywords` (type: `array`):

Optional list of additional keywords to scan in listing descriptions (e.g. 'code violation', 'divorce', 'handyman', 'foundation issue').

## `minDealScore` (type: `integer`):

Algorithmic Deal Score index based on FSBO status (+25), price cut magnitude (+25), distress keywords (+25), and stale DOM (+15). Only deals meeting or exceeding this score are exported.

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

Maximum number of qualified motivated seller deals to collect per run.

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

Zillow enforces PerimeterX bot challenges. Apify Residential Proxies are strongly recommended for reliable extraction.

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

Optional: Discord or Slack incoming webhook URL to receive instant alert cards when high-conviction deals (Score >= 75) are identified.

## Actor input object example

```json
{
  "location": "Dallas, TX",
  "listingType": "ALL",
  "minPriceDropPercent": 5,
  "minPriceDropsCount": 1,
  "minDaysOnZillow": 14,
  "distressKeywordsOnly": false,
  "customKeywords": [],
  "minDealScore": 40,
  "maxResults": 40,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Default dataset containing filtered motivated seller real estate deals with calculated price drops, distress keywords, and contact info.

# 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 = {
    "location": "Dallas, TX",
    "listingType": "ALL",
    "customKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_studio/zillow-motivated-seller-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 = {
    "location": "Dallas, TX",
    "listingType": "ALL",
    "customKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("automation_studio/zillow-motivated-seller-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 '{
  "location": "Dallas, TX",
  "listingType": "ALL",
  "customKeywords": []
}' |
apify call automation_studio/zillow-motivated-seller-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_studio/zillow-motivated-seller-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/e0Ivf6SI36nz3nlsE/builds/G8I5N29HVepI6Nomv/openapi.json
