# Zillow Foreclosure Scraper: REO, Auctions & Pre-Foreclosure (`memo23/zillow-foreclosure-scraper`) Actor

\[From $1.1💰] Scrape every Zillow foreclosure, pre-foreclosure, bank-owned (REO) home & foreclosure auction in any US city or ZIP — auction dates & locations, filing dates, unpaid balance, plus full property details, price & tax history

- **URL**: https://apify.com/memo23/zillow-foreclosure-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 results

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

## 🏚️ Zillow Foreclosure Scraper

Scrape **every distressed property on Zillow** for any US city, county, neighborhood, or ZIP code — **foreclosures, pre-foreclosures, bank-owned (REO) homes, and foreclosure auctions** — with the **auction date, time & location**, default/lis-pendens **filing dates**, **unpaid balance**, and (optionally) the complete property record including price history, tax history, schools, and photos.

Type a location, press Start, and get the full distressed market — as JSON, CSV, or Excel.

### ⭐ Why use this Zillow foreclosure scraper?

- **All four distressed classes in one run** — foreclosures listed for sale, pre-foreclosures (default filed, before the auction), foreclosure auctions, AND bank-owned/REO homes that haven't hit the market yet. Pick any subset.
- **Filters run server-side** — the same "Foreclosures", "Auctions", "Pre-foreclosure" and "Foreclosed" toggles as on zillow.com, applied on Zillow's own search API (each key verified against live counts), so you get exactly the distressed inventory — not a keyword guess.
- **Auction dates & foreclosure specifics** — every detail row carries the foreclosure block: auction date/time, auction location & description, default filing date, auction filing date, unpaid balance, foreclosure amount, prior sale, judicial vs non-judicial type.
- **Lender and loan terms** — the originating bank (`US BANK TRUST NA`, `CITIBANK NA`, `SECRETARY HOUSING URBAN DEVELOPMENT`…), the original loan amount and loan date. Size the debt against the price before you bid, and know who to negotiate a payoff with.
- **Pre-foreclosures included, handled properly** — off-market pre-foreclosures often have no list price or photos; rows degrade gracefully instead of erroring, and still carry the address, estimate data, and filing details Zillow exposes.
- **Full property depth** — description, photos, price history, tax history, Zestimate, schools, HOA, lot size, agent/broker contact — fields lightweight foreclosure scrapers don't have.
- **Any way you search** — plain locations ("Cleveland, OH", "44105"), or paste a Zillow search URL (drawn map area, custom filters); the distressed-only filter is stacked on top automatically.
- **Spreadsheet-ready** — optional flattened output adds `Foreclosure Type`, `Auction Date`, `Default Filing Date`, `Unpaid Balance` columns next to address/price/beds.
- **Agent email enrichment (optional)** — match the listing agent against a 420,000+ US agent database and add their direct email & phone to each row.

### 📋 What data does it extract?

| Field group | Examples |
|---|---|
| Distressed classification | `Foreclosure Type` (Pre-Foreclosure / Bank Owned (REO) / Auction / Foreclosed), `Bank Owned (REO)` flag, home status |
| Auction | `Auction Date` (date & time), `Auction Location`, `Auction Description`, `Auction Filing Date` |
| Foreclosure financials | `Foreclosure Amount`, `Unpaid Balance`, `Prior Sale Date` / `Prior Sale Amount`, `Default Filing Date`, `Judicial Type` |
| Lender & loan | `Lender` (originating bank), `Loan Amount`, `Loan Date` — size the debt against the price |
| Trustee (when published) | `Trustee Name`, `Trustee Phone`, `Trustee Address` — Zillow exposes these on only a minority of records; the columns are always present, blank when it doesn't |
| Listing basics | Address, city, state, ZIP, price, status, days on Zillow, listing date |
| Home facts | Beds, baths, living area, lot size, year built, home type, HOA |
| Location | Latitude, longitude, neighborhood, region |
| Agent & broker | Agent name, phone, brokerage; optional direct email enrichment; FSBO owner name & phone when owner-listed |
| Deep details (optional) | Full description, photo URLs, price history, tax history, Zestimate, schools, MLS ID & status |

### 🚀 How it works

1. **Enter locations** — one or more cities/counties/ZIPs (or paste Zillow search URLs).
2. **Pick distressed types** — all four by default; narrow to e.g. pre-foreclosures only.
3. **Run** — the scraper resolves each region, applies Zillow's distressed filters server-side, then (by default) visits every matching listing for the auction date, filing dates, and full details.

Results land in the dataset, exportable as JSON, CSV, Excel, XML, or via API.

### ⚙️ Input configuration

```json
{
    "searchLocation": ["Cleveland, OH"],
    "maxItems": 100,
    "distressedTypes": ["foreclosure", "preForeclosure", "auction", "bankOwned"],
    "includePropertyDetails": true
}
```

| Field | Type | Description |
|---|---|---|
| `searchLocation` | array | Cities, counties, neighborhoods, or ZIP codes — one search each |
| `startUrls` | array | Alternative: any Zillow search URLs; the distressed-only filter is added on top |
| `maxItems` | integer | Cap on returned listings (default 100) |
| `distressedTypes` | array | Which classes to return: `foreclosure`, `preForeclosure`, `auction`, `bankOwned` (default: all) |
| `priceMin` / `priceMax` | integer | Optional price range (pre-foreclosures often have no list price) |
| `bedsMin` / `bathsMin` | integer | Optional minimum beds / baths |
| `homeTypes` | array | Limit to houses, condos, townhomes, … |
| `includePropertyDetails` | boolean | Fetch each listing's full record incl. auction date & foreclosure block (default **true**) |
| `flatOutput` | boolean | Flat spreadsheet-style rows instead of nested JSON |
| `enrichEmails` | boolean | Add the listing agent's direct email (billed only per email found) |

### 📦 Output sample

```json
{
    "zpid": "33711843",
    "address": "3521 E 146th St, Cleveland, OH 44120",
    "price": 64900,
    "beds": 3,
    "baths": 2,
    "statusText": "Foreclosure",
    "foreclosure": {
        "foreclosureType": "Bank Owned (REO)",
        "foreclosureTypes": { "isBankOwned": true, "isAnyForeclosure": true },
        "foreclosureAuctionTime": null,
        "foreclosureDefaultFilingDate": "2026-03-17",
        "foreclosureUnpaidBalance": 87400,
        "foreclosureLoanOriginator": "US BANK TRUST NA ET AL",
        "foreclosureLoanAmount": 112000,
        "foreclosureLoanDate": "2019-06-28",
        "foreclosurePriorSaleAmount": 112000,
        "foreclosurePriorSaleDate": "2019-06-28",
        "foreclosureJudicialType": "Judicial"
    },
    "detailUrl": "https://www.zillow.com/homes/33711843_zpid/",
    "details": { "…full property record: description, photos, price & tax history, schools…": "…" }
}
```

With **Flattened output** enabled, rows instead carry columns like:

| Address | Price | Foreclosure Type | Auction Date | Auction Location | Default Filing Date | Unpaid Balance | Lender | Loan Amount |
|---|---|---|---|---|---|---|---|---|
| 3521 E 146th St, Cleveland, OH 44120 | $64,900 | Bank Owned (REO) | | | 2026-03-17 | $87,400 | US BANK TRUST NA | $112,000 |
| 1118 Superior Ave, Cleveland, OH 44114 | | Pre-Foreclosure Auction | 2026-09-02 10:00 | Cuyahoga County Courthouse, Cleveland | 2026-05-11 | $145,210 | CITIBANK NA | $198,400 |

### 🔑 Key output fields

- `Foreclosure Type` / `foreclosure.foreclosureType` — the distressed class: `Pre-Foreclosure`, `Pre-Foreclosure Auction`, `Bank Owned (REO)`, `Foreclosed`, `Auction`, or `Foreclosure`.
- `Auction Date`, `Auction Location`, `Auction Description` — when and where the foreclosure auction happens (blank until Zillow publishes it).
- `Default Filing Date` / `Auction Filing Date` — when the notice of default / notice of sale was filed.
- `Unpaid Balance`, `Foreclosure Amount`, `Prior Sale Date/Amount` — the money picture behind the distress.
- `Lender`, `Loan Amount`, `Loan Date` — the originating bank and the debt to negotiate a payoff against.
- `Trustee Name` / `Trustee Phone` / `Trustee Address` — the trustee administering the sale. Zillow publishes this for only a minority of records, so expect these to be blank on most rows; they are emitted every time so your column layout stays stable.
- `foreclosure` — the raw foreclosure block on every distressed row (JSON output), `null` on none-distressed rows.
- `details` — the complete property record when **Include full property details** is on.

### 💡 Use cases

- **Real-estate investors & flippers** — surface below-market inventory the moment it enters distress, with the unpaid balance and prior sale to size the equity.
- **Wholesalers** — pre-foreclosure owners are motivated sellers; get the address list before the property ever hits the MLS.
- **Foreclosure-auction bidders** — a clean feed of upcoming auctions with dates, locations, and filing history.
- **Agents & brokers** — target REO/bank-owned listings and build farming lists of pre-foreclosure neighborhoods.
- **Proptech & data teams** — feed distressed-market data into valuation models, dashboards, or CRMs.
- **Researchers & journalists** — track foreclosure volume by city/ZIP over time (pair with a schedule).

### ❓ FAQ

**What's the difference between the four distressed types?**
*Foreclosure* = a foreclosed home listed for sale (usually bank-owned). *Pre-foreclosure* = the owner defaulted and a notice was filed, but the auction hasn't happened — the home is NOT for sale yet. *Auction* = scheduled foreclosure/trustee auctions. *Bank-owned pre-market* = the bank has repossessed it but hasn't listed it yet (pre-market REO).

**Why do some rows have no price or photos?**
That's genuine Zillow data, not a scraper gap: pre-foreclosures and pre-market REO are off-market records, so there's no listing price and often no photos. The rows still carry the address, location, estimate data, and the foreclosure block.

**Do I get the auction date?**
Yes, whenever Zillow publishes it — `Auction Date` (with time), `Auction Location`, and `Auction Description` come straight from the property's foreclosure record. Keep **Include full property details** on (default), the auction data lives on the detail page.

**How fresh is the data?**
Every run scrapes Zillow live. Schedule the actor daily and pair it with the flagship's cross-run dedup (`storeName`) to get only never-seen-before distressed properties each morning.

**Do I need proxies?**
No. The actor ships with built-in residential proxies at no extra cost.

**Can I search several cities at once?**
Yes — add one location per line; each is searched independently in the same run.

**Can I get ONLY pre-foreclosures (or only auctions)?**
Yes — set `distressedTypes` to just the classes you want.

### 🛟 Support

Found an issue or missing a field? Open an issue on the actor's **Issues** tab — it is monitored daily and most reports get a fix or an answer within 24 hours.

### 🧩 Additional services

Need a custom pipeline (specific columns, delivery to your DB/S3/webhook, county-record merges, skip-tracing joins)? Open an issue describing what you need or contact the author through the actor page.

### 🔎 Explore more scrapers

- [Zillow Scraper (full search, sold, rentals, monitoring)](https://apify.com/memo23/zillow-scraper-ppe) — the flagship this actor is built on: every listing status, Monitoring Mode change feeds, FSBO owner contacts, agent enrichment, and more.
- [Zillow Open Houses Scraper](https://apify.com/memo23/zillow-open-houses-scraper) — every upcoming open house with exact dates & times.
- [All actors by memo23](https://apify.com/memo23) — 100+ maintained scrapers for real estate, jobs, directories, and reviews.

### 🤖 For AI Agents & LLM Apps

This actor is MCP-ready: call it from AI agents (Claude, GPT, LangChain, LlamaIndex, or the Apify MCP server) to answer questions like *"which pre-foreclosures in Cleveland have an auction scheduled this month?"*. Structured JSON output with stable field names makes rows directly usable as tool results — the `foreclosure` block for distress reasoning, `details` for grounded property Q\&A.

### ⚠️ Disclaimer

This actor is not affiliated with, endorsed by, or connected to Zillow Group. It extracts only publicly visible listing information for lawful purposes such as market research and investment analysis; no login is used and no private data is accessed. You are responsible for how you use the data — respect Zillow's terms and applicable laws (including local regulations on personal-data processing and fair-debt/consumer-protection rules when contacting distressed owners).

***

*zillow foreclosure scraper · scrape zillow foreclosures · zillow pre-foreclosure list · pre foreclosure leads · bank owned REO scraper · foreclosure auction dates · zillow auction scraper · distressed property data · foreclosure listings export · zillow foreclosure API · export zillow foreclosures to excel*

# Actor input Schema

## `searchLocation` (type: `array`):

City, county, neighborhood, or ZIP code — e.g. "Cleveland, OH", "Miami-Dade County, FL", or "44105". One per line; each becomes its own distressed-property search.

## `startUrls` (type: `array`):

Alternative to Search location(s): paste any Zillow search URL (map area, drawn region, filtered search). The distressed-only filter is applied automatically on top of whatever the URL already filters.

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

Maximum number of distressed-property listings to return.

## `distressedTypes` (type: `array`):

Which distressed classes to return. Leave all selected for the full distressed market.

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

Minimum listing price. Leave blank for no minimum. Note: pre-foreclosures often have no list price and are unaffected.

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

Maximum listing price. Leave blank for no maximum.

## `bedsMin` (type: `integer`):

Minimum bedrooms.

## `bathsMin` (type: `integer`):

Minimum bathrooms.

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

Limit to specific property types. Leave empty for all.

## `includePropertyDetails` (type: `boolean`):

Fetch each listing's detail page for the foreclosure specifics — auction date, time & location, default/lis-pendens filing date, unpaid balance, foreclosure type (REO vs pre-foreclosure vs auction) — plus full description, photos, price & tax history, schools, and agent info. Recommended — without it rows carry only the basic search-card fields.

## `flatOutput` (type: `boolean`):

Each row becomes a simple flat object with "Foreclosure Type", "Auction Date", "Default Filing Date", "Unpaid Balance" columns plus the most requested property columns — ideal for CSV/Excel. When off, rows carry a raw `foreclosure` object and the full details blob.

## `enrichEmails` (type: `boolean`):

Adds the listing agent's email and phone to each row — matched from our database of 420,000+ U.S. agents. Only charged when an email is actually returned. (Pre-foreclosures are off-market and usually carry no agent.)

## `maxConcurrency` (type: `integer`):

Maximum number of pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of times a failed request is retried before giving up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## `distressedOnly` (type: `boolean`):

Always on for this actor — every returned listing is a foreclosure, pre-foreclosure, auction, or bank-owned property.

## Actor input object example

```json
{
  "searchLocation": [
    "Cleveland, OH"
  ],
  "maxItems": 100,
  "distressedTypes": [
    "foreclosure",
    "preForeclosure",
    "auction",
    "bankOwned"
  ],
  "includePropertyDetails": true,
  "flatOutput": false,
  "enrichEmails": false,
  "maxConcurrency": 20,
  "maxRequestRetries": 5,
  "distressedOnly": true
}
```

# Actor output Schema

## `results` (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 = {
    "searchLocation": [
        "Cleveland, OH"
    ],
    "distressedTypes": [
        "foreclosure",
        "preForeclosure",
        "auction",
        "bankOwned"
    ],
    "includePropertyDetails": true,
    "distressedOnly": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/zillow-foreclosure-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 = {
    "searchLocation": ["Cleveland, OH"],
    "distressedTypes": [
        "foreclosure",
        "preForeclosure",
        "auction",
        "bankOwned",
    ],
    "includePropertyDetails": True,
    "distressedOnly": True,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/zillow-foreclosure-scraper").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 '{
  "searchLocation": [
    "Cleveland, OH"
  ],
  "distressedTypes": [
    "foreclosure",
    "preForeclosure",
    "auction",
    "bankOwned"
  ],
  "includePropertyDetails": true,
  "distressedOnly": true
}' |
apify call memo23/zillow-foreclosure-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/zillow-foreclosure-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JbyUpvBvkt5DaLhTn/builds/lBLyfI0hd3jR9uZrS/openapi.json
