Seibs Management CoSeibs.
blog/11 min read

How to Find Off-Market Real Estate Deals (Pre-Foreclosure, REO, Auction)

Find off-market real estate deals with pre-foreclosure, REO, and auction scrapers. Honest cost breakdown, real Python code, no skip-trace BS.

How to Find Off-Market Real Estate Deals (Pre-Foreclosure, REO, Auction)

If you flip houses, wholesale, or run a private-lending shop, you already know the math: deals come from distressed inventory that hasn't hit the MLS. The bigger your pre-foreclosure / REO / auction funnel, the more often you eat. The problem is that the tools sold to you for sourcing that funnel are either $300-$1,500/mo per seat (PropStream, BatchLeads, Foreclosure.com), built for a 2012 internet, or so locked into "premium" tiers that you pay $99 to discover that the lead you wanted is on the next tier up.

I've spent the last six months rebuilding distressed-property sourcing from scratch as part of my Apify portfolio for a handful of flipper-network and wholesale clients. This post is the field guide: where off-market deals actually live online, how to find off-market real estate deals without paying for stale data, and what every existing pipeline gets wrong.

Why the existing options leave money on the table

The off-market lead market is bloated and most of the noise comes from products that confuse "data" with "deals."

PropStream / BatchLeads / DealMachine ($99-$299/mo). Good at coverage, slow on freshness. Pre-foreclosure NODs typically appear on these platforms 14-30 days after the county filing. By the time the lead drops into your queue, four other investors have already mailed the owner. Skip-tracing is bolted on at $0.10-$0.25 per record and the precision is uneven.

Foreclosure.com / RealtyTrac ($39-$79/mo). Public auction inventory with a polished UI. Inventory is sourced from county sites with manual lag. Their "exclusive" listings are not exclusive.

Auction.com / Hubzu / Xome. Auction marketplaces, not lead lists. Useful for actually bidding, useless for sourcing pre-auction outreach.

Zillow / Redfin filters. Free, fresh, and underused. Zillow has a isForeclosures=true query parameter and surfaces pre-foreclosure, foreclosure, REO, and coming-soon auction inventory. It just doesn't ship with underwriting, comps, or owner skip-trace prep, so most investors abandon it.

County recorder direct scraping. Cheapest and freshest source - notice-of-default and lis-pendens filings go up on the county site within 24-72 hours. Wildly inconsistent across the 3,000+ US counties, every site is a different mess, and the data needs heavy enrichment.

Driving for dollars apps (DealMachine, PropertyRadar). Manual-only at scale. Fine for one-area flippers, doesn't scale to a wholesale operation working five metros.

The gap that wins: Zillow's distressed inventory + automated underwriting + skip-trace-ready owner data + (when needed) county-recorder enrichment - run weekly on cron.

What "off-market" really means

The phrase is overloaded. Five distinct sub-buckets, each with its own contact strategy.

Status Stage Who you contact Pattern
pre_foreclosure Notice of Default filed, owner still on title Owner direct Cold mail + cold call, equity-rich, time-pressured
foreclosure Active legal proceeding Owner or trustee Mixed, depends on state
reo Bank took it back after failed auction Listing agent or bank asset manager Standard offer, faster than retail
auction Sheriff / trustee sale scheduled Auction trustee, cash-only Bid the day of, no inspection
coming_soon Listed but not yet active on MLS Listing agent Soft outreach pre-launch

The pre-foreclosure window is the highest-margin and most over-fished bucket. REO is the best "clean title + inspection access" path. Auction is for cash buyers who already know what they're doing.

The walkthrough: scrape, underwrite, contact

Step 1: source the inventory

Zillow exposes distressed inventory via search URLs. The query parameter cheat sheet:

isForeclosures=true        -> all distressed
isPreForeclosure=true      -> pre-foreclosure only
isForeclosed=true          -> active foreclosure
isBankOwned=true           -> REO
isAuction=true             -> auction

You can stack with price, beds, baths, sqft, lot, year-built, and home-type. The hard 500-result cap per search URL means metros with more than 500 distressed listings need to be split into county / ZIP-cluster sub-searches.

Step 2: enrich each detail page

The Zillow listing page has price history, comps, agent info, schools, tax rate, HOA, and a freeform description. The description is where the gold lives - phrases like "needs TLC", "estate sale", "cash only", "as-is", "fire damage" tag a listing as a flip candidate. A flip-score classifier reads the description, days-on-market, price-vs-Zestimate, and photo count, and outputs a 0-1 score with per-signal breakdown.

Step 3: run first-pass underwriting

The 70% rule is the industry default: Max Allowable Offer = (ARV * 0.70) - Rehab. ARV is a Zestimate-plus-comp blend. Rehab is a sqft x age x status multiplier with REO and auction surcharges ($15/sqft REO, $20/sqft auction sight-unseen premium). Output: MAO at 70%/75%/65%, projected gross profit, margin, holding cost, rent-to-price ratio.

Step 4: prepare for skip-trace

Owner name, mailing address (often different from property address - that's an absentee owner signal), equity percentage, last sold price/date, distress sub-tags (tax delinquent, code violation, water/fire damage, divorce, bankruptcy). Feed into BatchSkipTracing / REISkip / IDI Data for phone numbers.

Step 5 (optional): cross-reference county records

For pre-foreclosure leads you want the underlying complaint and case docket. seibs.co/court-records-intel pulls federal and state cases by party name - find the NOD filing, the lis pendens, the case schedule.

Build vs buy

+----------------+    +---------------+    +-----------------+
| Zillow search  | -> | Detail-page   | -> | Flip score +    |
| URL builder    |    | enrichment    |    | 70% rule MAO    |
+----------------+    +---------------+    +-----------------+
        ^                     ^                     ^
        |                     |                     |
+------------------------------------------------------------+
| Residential proxy + Chrome-131 TLS + Zillow anti-bot mitig |
+------------------------------------------------------------+

Build it yourself: 80-150 hours, $500-$1500/mo proxy budget, recurring maintenance every time Zillow ships a layout change (every 6-10 weeks). Worth it if real-estate data is your product.

Buy a prebuilt scraper: under $5 per 500 leads. I wrote three sibling actors that share the same Zillow engine with different default filters:

There are other Zillow actors in the Apify Store - the differentiation here is the underwriting layer (flip score, MAO 70%/75%/65%, rehab estimator, owner intel for skip-tracing). Compare and pick what fits.

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("seibs.co/foreclosure-property-leads").call(run_input={
    "locations": [
        {"location": "Tampa, FL", "max_results": 200},
        {"location": "Phoenix, AZ", "max_results": 200},
        {"location": "Atlanta, GA", "max_results": 200},
    ],
    "only_foreclosures": True,
    "status_buckets": ["pre_foreclosure", "reo", "auction"],
    "min_price": 80000,
    "max_price": 350000,
    "min_beds": 3,
    "min_baths": 2,
    "min_sqft": 1000,
    "enrich_details": True,
    "min_flip_score": 0.5,
    "use_apify_proxy": True,
    "apify_proxy_groups": ["RESIDENTIAL"],
})

for prop in client.dataset(run["defaultDatasetId"]).iterate_items():
    metrics = prop.get("deal_metrics", {})
    print(f"{prop['address']} | {prop['status']:18s} | flip={prop['flip_score']['score']:.2f}")
    print(f"  list:  ${prop['price']:>10,}   ARV: ${metrics.get('arv', 0):>10,}")
    print(f"  MAO70: ${metrics.get('mao_70', 0):>10,}   margin: {metrics.get('margin_pct', 0):.1%}")
    print(f"  owner: {prop.get('owner_name')} (absentee: {prop.get('is_absentee')})")

Sample output line:

4821 Larkspur Ln, Tampa, FL | pre_foreclosure    | flip=0.78
  list:  $   189,000   ARV: $   285,000
  MAO70: $   149,500   margin: 21.4%
  owner: Maria T. Hernandez (absentee: True)

What you can do with this data

Use case Filter
Pre-foreclosure owner mail campaign status="pre_foreclosure", equity_pct > 0.30, sort by flip_score desc
REO buy-box for cash flips status="reo", flip_score > 0.6, margin_pct > 0.20
Wholesale lead lists for cash buyers flip_score > 0.5, group by ZIP, export for assignment-fee model
BRRRR rental filter sort by rent_to_price_pct desc, min_beds=3, home_type=SFR
Hard money lender prospecting filter status="auction", contact the bidders (PACER + court records)
Climate-risk-aware buy box flood_factor < 4, fire_factor < 3, min_walk_score=40
Asset-manager monitoring (lenders) dedupe on zpid, weekly cron, alert on new REO from monitored banks
Skip-trace queue prep export owner_name, owner_mailing_address, last_sold_date to BatchSkipTracing

Honest limitations

The non-glamorous truth about distressed-property scraping.

Zillow has a 500-result cap per search URL. If your metro returns more than 500 distressed listings, you have to split into smaller geographies (county, ZIP cluster, or price band). The actor accepts a list of locations and runs them in parallel, but you still need to design the geography split.

Pre-foreclosure data on Zillow lags county NOD by 7-21 days. If you want the freshest possible NODs, scrape the county recorder direct. Some counties expose JSON APIs (Hennepin MN, Maricopa AZ); most do not. Plan on a 1-3 week build per state for full county coverage.

Auction dates are unreliable. Sheriff / trustee sales get postponed constantly. Cross-check the trustee or sheriff website on sale day. The Zillow auction date is what was posted at listing time - it may have moved.

Owner names are not always on Zillow. Roughly 30-40% of pre-foreclosure listings show the owner on Zillow; the rest you skip-trace from the property address or pull from the county assessor.

Flip score is heuristic, not ML. It's a 0-1 weighted sum of seven signals (description keywords, DOM, price-vs-Zestimate, price drop, age, status, photo count). It's transparent and tunable - the flip_score.signal_breakdown field shows you exactly why a property scored where it did. It's not a black-box neural net and it's not predictive of actual flip profit.

Skip-trace is not included. The actor preps the owner record for skip-tracing (name, mailing address, absentee inference) but doesn't run the trace itself. BatchSkipTracing / REISkip / IDI Data are $0.10-$0.25 per record and required for phone outreach.

Cloudflare / anti-bot blocks happen. Residential proxies are mandatory. Datacenter IPs get rejected within minutes on Zillow. Even with residential, expect 2-5% blocked rate per run - re-run failures 6-12 hours later.

Don't violate TCPA. Cold-calling owners requires compliance with TCPA, state do-not-call lists, and mailer disclosure rules. Skip-tracing a number does not give you consent to call. Read FCC TCPA guidance before you dial.

FAQ

Q: What's the cheapest source of pre-foreclosure leads in 2026? A: County recorder direct (free, freshest, requires per-state engineering) for the highest-velocity markets, plus a Zillow scraper for everywhere else. PropStream and BatchLeads are convenient but not cheap and not fresh.

Q: How do I find off-market real estate deals legally? A: Every record this actor surfaces originates from Zillow's publicly accessible listing pages. Public data is fair game under hiQ Labs v. LinkedIn and similar US case law. Contact rules are separate - TCPA, state DNC, and mailer disclosure laws govern outreach.

Q: What's the difference between pre-foreclosure and foreclosure on Zillow? A: pre_foreclosure means a Notice of Default has been filed but the owner still holds title and usually still lives in the home. foreclosure means the legal proceeding is actively wrapping up. Pre-foreclosure is the highest-equity, time-pressured seller window for direct-to-owner wholesalers.

Q: How accurate are Zillow's Zestimates for off-market underwriting? A: Zestimate published median error is ~2.4% for on-market homes and ~7.5% for off-market. For first-pass screening it's fine. For an actual offer, blend with active and sold comps within a 0.5-mile / 6-month window - the actor does this automatically when enrich_details=true.

Q: How do I find REO listings before they hit the MLS? A: You can't reliably - banks list to the MLS within days of taking title back. The edge isn't pre-MLS, it's the daily cron + flip-score sort that puts the best REOs at the top of your queue before competitors find them.

Q: Can I scrape auction.com or sheriff sale calendars? A: Auction.com has weak anti-bot and is scrapable but the legality is murkier than Zillow (clearer ToS prohibition). Sheriff sale calendars are public-record by statute - those you can scrape freely. Most are static PDFs hosted on the sheriff's site.

Q: How do I price rehab cost from a Zillow listing without seeing the property? A: Rough rule: $25-$45/sqft for cosmetic, $55-$80/sqft for full gut, +$15/sqft for REO blind buy, +$20/sqft for auction blind buy. Adjust for age (pre-1980 = +$10/sqft), distress sub-tags (water/fire/mold = +$20-$50/sqft), and local labor costs. The actor's rehab_cost_estimate field uses this formula.

Q: How fresh is this data vs PropStream? A: PropStream pulls county data on a 7-21 day lag for pre-foreclosure. The Zillow scraper is real-time at run time but is itself pulling from Zillow's data pipeline (which is 7-21 days behind county NOD). Net-net: similar freshness, lower cost, no per-seat licensing.

Q: What's a realistic monthly cost for a one-flipper outbound pipeline? A: Apify scraper: $20-$60/mo for 2-5K leads. Skip-trace: $50-$200/mo. Mailer house: $0.50-$0.90/piece. A 500-mailer-per-week pipeline runs ~$1,200-$1,800/mo all-in vs $400-$600 for PropStream + skip-trace. The trade is engineering setup vs UI convenience.

Q: Can I get cash-buyer lists from this too? A: Indirectly. Filter Zillow sold-comps for last_sale_was_cash=true properties in your buy box; the buyer name appears in county records. Pair with court-records-intel to surface portfolio LLCs filing in your county.

Try it free

Run foreclosure-property-leads on Apify - free plan covers ~500 leads per month. Sibling actors:

About the author

I'm a solo MSP operator who builds B2B web-scraping actors at apify.com/seibs.co when I'm not running incident calls. The portfolio has 30+ live actors covering lead generation, intent data, SEC/USPTO/court records, and AI agent wrappers - all pay-per-event so you only pay for what's emitted. Find me at seibs.co.

next step / 30 seconds

Not sure which actor matches your use case?

Answer 3 questions and we surface the 2-3 best matches in the portfolio. No email gate, no signup.