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.
Find off-market real estate deals with pre-foreclosure, REO, and auction scrapers. Honest cost breakdown, real Python code, no skip-trace BS.
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.
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.
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.
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.
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.
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.
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.
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.
+----------------+ +---------------+ +-----------------+
| 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:
seibs.co/foreclosure-property-leads - pre-foreclosure / REO / bank-owned, defaults to distressed-only.seibs.co/house-flipper-leads - full active inventory with flip-score on top.seibs.co/property-auction-leads - auction-specialist sibling.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)
| 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 |
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.
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.
Run foreclosure-property-leads on Apify - free plan covers ~500 leads per month. Sibling actors:
house-flipper-leads - full inventory with flip-score (broader top of funnel).property-auction-leads - sheriff and trustee auction specialist.court-records-intel - underlying foreclosure complaints and lis pendens by party name.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.
Answer 3 questions and we surface the 2-3 best matches in the portfolio. No email gate, no signup.