# Expired & Delisted Listing Leads — Off-Market Detector API (`industrious_emphasis/delisted-listing-detector`) Actor

Detect homes that left the market without selling. Expired and withdrawn listing leads by ZIP code, pay per lead. No MLS subscription, no sales call. For agents, investors, and AI agents.

- **URL**: https://apify.com/industrious\_emphasis/delisted-listing-detector.md
- **Developed by:** [Brock Bangasser](https://apify.com/industrious_emphasis) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 delisted lead returneds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## 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

## Expired & Delisted Listing Leads — Off-Market Detector

**Detects homes that left the market without selling — the signal behind every $60–360/month "expired listing" subscription — as a pay-per-lead API with no MLS lock-in.**

Roughly **85,000 US homes get delisted every month** (Redfin), and expired/withdrawn listings are the highest-converting seller leads in real estate: the owner already wanted to sell, their agent contract just ran out. That's why 20–50 agents call each one within 48 hours, and why REDX ($60/mo per MLS), Landvoice ($60–120/mo per MLS), Vulcan7 (~$250+/mo) and Espresso Agent ($279/mo) built subscription businesses on this exact signal.

This Actor gives you the same detection layer, unbundled:

- **Watch any ZIP codes** — no per-MLS subscriptions, no sales call, no contract
- **Pay per lead** ($100/1k), not per month — a January expiration wave costs you more, a quiet week costs you almost nothing
- **API-first** — pipe leads into your CRM, dialer, direct-mail tool, n8n/Make workflow, or AI agent
- **You own the watch state** — snapshots live in *your* Apify storage, and your watch history compounds into better detection

### How it works

The first run for a ZIP records a snapshot of every active listing. Every following run re-checks the market and reports listings that **disappeared without a sold record**:

| type | What it means | Billed? |
|---|---|---|
| `delisted_lead` | On market before, gone now, no recent-sold record | $0.10 |
| `relisted` | A previously delisted home is back on market — motivated seller | Free |
| `zip_summary` | Per-ZIP receipt: actives checked, leads found | Free |
| `run_summary` | Whole-run receipt — "no leads" is an answer, never an empty table | Free |

Each lead row carries: full address, city/state/ZIP, last asking price, beds/baths/sqft, days-on-market when it vanished, first/last seen dates, the date it disappeared, last listing status, a stable `zpid` join key, the listing URL, and a confidence flag (`probable` = vanished outright; `low` = was pending, likely a closing in flight).

Run it on a schedule (daily or every 2–3 days is ideal) with Apify's built-in scheduler — set it once and leads accumulate.

### Sample output

```json
{
  "type": "delisted_lead",
  "address": "700 W Pleasure Dr, Litchfield, MN 55355",
  "zipcode": "55355",
  "last_list_price": 345000,
  "beds": 3, "baths": 1, "area_sqft": 1452,
  "days_on_zillow_last_seen": 94,
  "first_seen": "2026-07-08",
  "disappeared_on": "2026-07-15",
  "last_status_seen": "ForSale",
  "confidence": "probable",
  "zpid": "106769507",
  "detail_url": "https://www.zillow.com/homedetails/..."
}
````

### What this costs (both layers, honestly)

1. **This Actor's events**: $0.02 per run + $1 per 1,000 listings watched + **$0.10 per delisted lead**.
2. **Data source**: each run internally calls the Zillow ZIP-search Actor under *your* account (~$1.10 per 1,000 listings scanned). A typical suburban ZIP has 50–300 active listings.

Worked example: watching 5 suburban ZIPs (~800 active listings) daily for a month ≈ $26 of scanning + $0.60 of run fees + $0.10 per lead found. If those ZIPs produce 40 leads that month, your total is around **$31 — versus $60–120/month for one MLS region** with an incumbent, and you only paid for what appeared. One converted expired listing is a $5,000–15,000 commission.

### Who uses this

- **Listing agents** prospecting expired/withdrawn homeowners (pair with your dialer's compliance tools)
- **Real-estate marketing agencies** running direct-mail or door-knocking campaigns for agent clients
- **Investors** hunting motivated sellers before they relist
- **Proptech builders and AI agents** that need a delisting signal as an API primitive

### No contact info — by design

Rows contain **addresses and listing facts only**: no owner names, no phone numbers, no emails. That keeps this dataset clean of personal data and keeps compliance simple. Need contacts? Chain any skip-trace Actor from the Apify Store on the `address` field in one step (n8n/Make make this a 3-node workflow) — and scrub against the DNC registry before calling; that's your obligation, not optional.

### Honest notes on the data (read this)

- **Detection is portal-derived inference, not MLS truth.** A `probable` lead means the listing vanished from the portal with no sold record — usually expired/withdrawn/cancelled, occasionally a data hiccup or an off-MLS sale. The `relisted` signal and your own follow-up close that gap. Incumbent MLS feeds see status flips a few hours sooner; this Actor sees *withdrawn and quietly-delisted* homes that MLS-expired-only feeds can miss.
- **First run per ZIP produces zero leads** — it seeds the baseline. Leads start when the market moves (in most metros, that's the very next daily run).
- **Coverage follows the portal.** Very rural areas and off-MLS listings may be missed.
- **Watch state lives in your account** under the `delisted-listing-watch` key-value store. Delete it to reset a watch.

### FAQ

**How is this different from REDX/Vulcan7?** They sell MLS-sourced expireds plus skip-traced contacts as a per-MLS monthly subscription. This is the raw detection signal, nationwide, pay-per-use, API-first, without contact enrichment.

**Can I watch a whole metro?** Yes — up to 50 ZIPs per run; run multiple schedules for more.

**What happens on a huge day (e.g., early January)?** Year-end expirations spike. Cap your spend with `maxLeads` and the platform's max-charge limit — this Actor honors both and never charges for undelivered leads.

# Actor input Schema

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

US 5-digit ZIP codes. The first run for a ZIP seeds its snapshot (no leads yet); every later run emits homes that left the market without selling. Max 50 per run.

## `priceMin` (type: `integer`):

Ignore listings below this price. 0 = no minimum.

## `priceMax` (type: `integer`):

Ignore listings above this price. 0 = no maximum.

## `includeFsbo` (type: `boolean`):

Include FSBO listings in the watch alongside agent listings.

## `maxLeads` (type: `integer`):

Hard cap on billed lead rows for the whole run.

## `contactEmail` (type: `string`):

Reserved for operator contact; not published anywhere.

## Actor input object example

```json
{
  "zipCodes": [
    "55305",
    "55416"
  ],
  "priceMin": 0,
  "priceMax": 0,
  "includeFsbo": false,
  "maxLeads": 500
}
```

# Actor output Schema

## `leads` (type: `string`):

No description

## `leadsCsv` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("industrious_emphasis/delisted-listing-detector").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("industrious_emphasis/delisted-listing-detector").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 '{}' |
apify call industrious_emphasis/delisted-listing-detector --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Expired & Delisted Listing Leads — Off-Market Detector API",
        "description": "Detect homes that left the market without selling. Expired and withdrawn listing leads by ZIP code, pay per lead. No MLS subscription, no sales call. For agents, investors, and AI agents.",
        "version": "0.1",
        "x-build-id": "qz7gzEWIFQeCHzEf4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/industrious_emphasis~delisted-listing-detector/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-industrious_emphasis-delisted-listing-detector",
                "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/industrious_emphasis~delisted-listing-detector/runs": {
            "post": {
                "operationId": "runs-sync-industrious_emphasis-delisted-listing-detector",
                "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/industrious_emphasis~delisted-listing-detector/run-sync": {
            "post": {
                "operationId": "run-sync-industrious_emphasis-delisted-listing-detector",
                "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 to watch",
                        "type": "array",
                        "description": "US 5-digit ZIP codes. The first run for a ZIP seeds its snapshot (no leads yet); every later run emits homes that left the market without selling. Max 50 per run.",
                        "default": [
                            "55305",
                            "55416"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "priceMin": {
                        "title": "Minimum listing price ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Ignore listings below this price. 0 = no minimum.",
                        "default": 0
                    },
                    "priceMax": {
                        "title": "Maximum listing price ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Ignore listings above this price. 0 = no maximum.",
                        "default": 0
                    },
                    "includeFsbo": {
                        "title": "Also watch for-sale-by-owner listings",
                        "type": "boolean",
                        "description": "Include FSBO listings in the watch alongside agent listings.",
                        "default": false
                    },
                    "maxLeads": {
                        "title": "Max delisted leads per run",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Hard cap on billed lead rows for the whole run.",
                        "default": 500
                    },
                    "contactEmail": {
                        "title": "Contact email (optional)",
                        "type": "string",
                        "description": "Reserved for operator contact; not published anywhere."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
