Real estate
Redfin Property Listings Scraper
Scrape normalized US Redfin listings — for-sale, sold, and pending — with full MLS/geo field coverage (MLS id, days-on-market, HOA, exact lat/long, remarks/tags, open-house info, photos) and reliable pagination past Redfin's hard 350-result cap via price-bucket bisection, deduped by property ID.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
tri_angle/redfin-search is the Apify Store's volume leader for Redfin (36,722 runs / 633 users) but sits at 3.59★ on 7 reviews — a durable execution gap, not a fluke. The rest of the field is thinner still: rigelbytes/redfin-scraper (1,008 runs / 122 users, 0★) and lulzasaur/redfin-scraper (898 runs / 47 users, 0★) round out a weak set of alternatives with no meaningful traction to validate reliability at scale. We built this Actor to close the gap on the two failure modes that show up over and over in that 3.59★: (1) reliable pagination past Redfin's hard 350-result-per-call cap, via a price-bucket bisection technique with per-bucket fault isolation, so a dense metro doesn't truncate silently at 350; and (2) full confirmed-field coverage per listing — MLS id, days-on-market, exact geo, HOA presence, remarks/tags, open-house info, photos — not just price/beds/baths. Redfin search pages carry real anti-bot posture; we run every request through Redfin's own stingray/api/gis search endpoint the way a real browser session would, so you get the data without wiring up the retry and rotation logic yourself.
What we handle for you
- 🛡️ We rotate browser fingerprints —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so Redfin's search endpoint sees a browser, not Python. - 🌐 We rotate proxy sessions through Apify Proxy on every block or geo-mismatch — fresh session ID, fresh exit IP.
- 🔁 We retry with exponential backoff on
408 / 429 / 5xxand network errors — up to 5 attempts per request,Retry-Afterhonoured. - 🧱 We back off when Redfin rate-limits or geo-splashes us — a mismatched city/state response gets a session rotation and one retry before we skip it and move on, never silently returning wrong-city data.
- 🧊 We keep the dataset clean — Pydantic-validated rows, deduped by
property_idacross price buckets, ISO-8601 timestamps, JSON / CSV / Excel export straight from the Apify Console. - 💰 You pay only for results that land — Pay-Per-Event pricing, no data no charge (only the small
actor-startwarm-up fee).
Use cases
- Investment deal screening — pull normalized for-sale listings across any Redfin metro, with days-on-market and price-per-sqft ready for comparables analysis.
- Sold-comp research — reconstruct recent sold prices for a neighborhood without the 350-listing cap silently truncating dense ZIP codes.
- iBuyer / PropTech analytics — feed a normalized MLS-status/geo/HOA schema straight into an acquisition or valuation pipeline.
- Agent lead-gen — track pending listings and open-house schedules across target markets.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
searchUrls | array | no | Redfin search-page URLs copied from redfin.com (/city/, /zipcode/, /neighborhood/, /county/ shapes). Up to 25. One of Search URLs or (Region ID + Region type + Market) is required. |
regionId | string | no | Direct region_id override — skips the search-page fetch. Required together with Region type + Market if Search URLs is unset. |
regionType | string | no | Direct region_type override. Required together with Region ID + Market if Search URLs is unset. |
market | string | no | Direct market slug override. Required together with Region ID + Region type if Search URLs is unset. |
status | string | no | for-sale, sold, or pending listings. |
maxResultsPerSearch | integer | no | Cap on rows per Search URLs / direct-override entry; triggers price-bucket bisection past Redfin's 350-home cap. |
priceBucketMinWidthUsd | integer | no | Bisection floor — stop splitting a price bucket further once its width would drop below this. |
{
"searchUrls": [
"https://www.redfin.com/city/17420/CA/San-Francisco"
],
"status": "for-sale",
"maxResultsPerSearch": 8,
"priceBucketMinWidthUsd": 25000,
"proxyConfiguration": {
"useApifyProxy": true,
"countryCode": "US"
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
property_idmls_idmls_statusprice_usdprice_per_sqft_usdsqftbedsbathsdays_on_marketneighborhoodstreet_addresscitystatezip_codelatitudelongitude
{
"property_id": "12345678",
"listing_id": "98765432",
"mls_id": "SF123456",
"mls_status": "Active",
"search_status": "Active",
"listing_type": "for-sale",
"property_type": "Single Family Residential",
"ui_property_type": "House",
"price_usd": 1250000.0,
"price_per_sqft_usd": 850.5,
"sqft": 1470.0,
"lot_size_sqft": 3200.0,
"beds": 3.0,
"baths": 2.0,
"hoa_fee_usd": null,
"hoa_frequency_known": false,
"year_built": 1948,
"days_on_market": 12,
"time_on_redfin_ms": 1036800000,
"neighborhood": "Noe Valley",
"street_address": "123 Example St",
"unit_number": null,
"city": "San Francisco",
"state": "CA",
"zip_code": "94114",
"latitude": 37.7502,
"longitude": -122.4337,
"num_photos": 32,
"photo_urls": [
"https://ssl.cdn-redfin.com/photo/1/bigphoto/example.jpg"
],
"listing_url": "https://www.redfin.com/CA/San-Francisco/123-Example-St-94114/home/12345678",
"status_ribbons": [
"COMING SOON"
],
"key_facts": [
"Central Air"
],
"listing_tags": [],
"listing_remarks": "Charming Noe Valley home...",
"is_redfin_listing": false,
"is_new_construction": false,
"sold_date": null,
"open_house_start": null,
"open_house_end": null,
"source_search_url": "https://www.redfin.com/city/17420/CA/San-Francisco",
"scraped_at": "2026-08-12T12:00:00+00:00"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row emitted | $0.0025 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
FAQ
Do I need a Redfin account or API key?
How does this avoid Redfin's 350-result cap?
Can I target a ZIP code or neighborhood instead of a city?
Does one bad search URL stop the whole run?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors