# Zillow Motivated Seller Leads - Price Cuts & Stale Listings (`wellbuilt_zythem/zillow-motivated-sellers`) Actor

US homes whose owners look ready to deal: price cuts with amount and date, long days on market, listed under county assessed value, for sale by owner and pre-foreclosure. Every lead carries a 0-100 motivation score and the reasons behind it.

- **URL**: https://apify.com/wellbuilt\_zythem/zillow-motivated-sellers.md
- **Developed by:** [Carlos Escanez](https://apify.com/wellbuilt_zythem) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Motivated Seller Leads — price cuts, stale listings, under-assessed homes

**Not a list of houses for sale. A ranked list of owners who look ready to deal.**

### See it run

https://youtu.be/8SBqFsqVaYU

Every lead carries a **0-100 motivation score** and the reasons behind it, so you can see in one glance why it scored:

```
85 | 1704 Shelbourne Dr, Austin, TX 78752
   $395,000 | 3bd 2ba | 201 days | SINGLE_FAMILY
   price cut $25,000 · 201 days on market · 34% under assessed value
```

That is a real lead from a test run. A house that has sat for 201 days, cut its price by $25,000, and is listed a third below what the county says it is worth.

***

### What the score is built from

| Signal | Points | Why it matters |
|---|---:|---|
| Price cut of $25,000 or more | 30 | A published cut is a public admission the first price failed |
| Any price cut | 20 | |
| Cut of 10% or more off the original | 15 | Size of the climb-down |
| 120+ days on market | 25 | The listing is stale and the seller knows it |
| 60-119 days | 15 | |
| 30-59 days | 5 | |
| 20%+ under county assessed value | 20 | Distress, or a hurry |
| 10-19% under assessed | 10 | |
| For sale by owner | 15 | No agent in the middle |
| Pre-foreclosure auction | 30 | The strongest signal there is |

**What is deliberately not scored:** Zillow marks nearly every listing as absentee-owned, so that flag cannot tell one lead from another. It ships on the record as a filter, and scores zero. A signal that is always true is not a signal.

***

### What you get per lead

Address, city, state, ZIP, coordinates. Price, price change amount, the price-cut label with its date, days since the cut. Days on market. County assessed value and the percentage the asking price sits below it. Beds, baths, living area, lot size, home type, status. For sale by owner, by agent, new construction, pre-foreclosure. Broker name, photo, and the Zillow link.

***

### Example inputs

**Strong leads only, three cities**

```json
{
  "locations": ["Cleveland, OH", "Memphis, TN", "Birmingham, AL"],
  "minMotivationScore": 60,
  "pagesPerLocation": 5
}
```

**Stale listings under $300k that have already cut**

```json
{
  "locations": ["Austin, TX"],
  "onlyPriceCuts": true,
  "minDaysOnMarket": 90,
  "maxPrice": 300000
}
```

**Everything in a ZIP, unscored, for your own analysis**

```json
{
  "locations": ["78702"],
  "minMotivationScore": 0,
  "pagesPerLocation": 10
}
```

***

### Who buys this

- **Real estate investors and wholesalers** — this is the list they pay $100+/month for elsewhere, and the reason they pay is exactly the motivation signal.
- **Cash-buyer and "we buy houses" operators** — the price cut plus days on market pair is their whole targeting.
- **Buyer's agents** — clients want the house that will take an offer, not the one that just listed.
- **Renovation and flip firms** — under-assessed plus long on market is the profile.
- **PropTech and analytics teams** — a clean price-cut history across ZIPs.

***

### Reliability, said plainly

**Zillow refuses about half of all requests, and nearly all from datacenter IPs.** This Actor is built around that fact rather than pretending otherwise:

- Every request goes through a US residential exit with a browser-grade fingerprint.
- Each retry leaves from a **different** exit, because retrying on a refused address just gets refused again. Up to six attempts per page.
- `RUN_SUMMARY` reports pages served, pages refused and megabytes used, so you can see what the run actually cost.
- A page that never comes through is logged and skipped; the sweep continues to the next location.

About 41 homes per page, and Zillow stops paginating past 20 pages per search.

***

### Pricing

Pay per delivered lead. **Filtered-out listings cost you nothing** — you are charged only for records that reach your dataset, after the score and filters have run. Leads arrive sorted by motivation score, so a capped run keeps the best ones.

***

### Data source

Public property listings on Zillow. Records are property listings and their public marketing data. No personal data about owners or buyers is collected.

# Actor input Schema

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

Cities, neighbourhoods or ZIP codes. Write them as you would on Zillow: "Austin, TX", "Cleveland, OH", "78702".

## `minMotivationScore` (type: `integer`):

The one filter that matters. 40 keeps leads with a real signal; 60 keeps only the strong ones. 0 returns everything.

## `onlyPriceCuts` (type: `boolean`):

A published price cut is the clearest public admission that the first price failed.

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

60 or more usually means the listing is stale and the seller knows it.

## `onlyForSaleByOwner` (type: `boolean`):

No agent in the middle.

## `onlyNonOwnerOccupied` (type: `boolean`):

Zillow sets this on nearly every listing, so it is a weak filter and scores nothing. Kept because some buyers still want it.

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

Skip anything cheaper. 0 for no minimum.

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

Skip anything dearer. 0 for no maximum.

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

Leave empty for all.

## `listingStatus` (type: `string`):

For sale is the default. Recently sold is for comparables; for rent is for rental analysis.

## `pagesPerLocation` (type: `integer`):

About 41 homes per page. Zillow stops paginating past 20.

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

0 for no limit.

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

Zillow refuses about half of all requests and nearly all from datacenter IPs. A US residential exit is required, and each retry leaves from a different one.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX",
    "Cleveland, OH"
  ],
  "minMotivationScore": 40,
  "onlyPriceCuts": false,
  "minDaysOnMarket": 0,
  "onlyForSaleByOwner": false,
  "onlyNonOwnerOccupied": false,
  "minPrice": 0,
  "maxPrice": 0,
  "homeTypes": [],
  "listingStatus": "sale",
  "pagesPerLocation": 3,
  "maxResults": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

US homes with a 0-100 motivation score and the reasons behind it: price cuts, days on market, discount to assessed value, for sale by owner and pre-foreclosure.

## `runSummary` (type: `string`):

What the run actually did: sources swept, records delivered, records charged for, and any failures. Read this to see what a run cost before trusting its numbers.

# 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": [
        "Austin, TX",
        "Cleveland, OH"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wellbuilt_zythem/zillow-motivated-sellers").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": [
        "Austin, TX",
        "Cleveland, OH",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("wellbuilt_zythem/zillow-motivated-sellers").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 '{
  "locations": [
    "Austin, TX",
    "Cleveland, OH"
  ]
}' |
apify call wellbuilt_zythem/zillow-motivated-sellers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wellbuilt_zythem/zillow-motivated-sellers"
        }
    }
}
```

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/hzUsMa7ZrKz21kdMA/builds/9idbvIK8us9FQWB6x/openapi.json
