Redfin Property Listings Scraper icon

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 fingerprintscurl-cffi impersonates 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 / 5xx and network errors — up to 5 attempts per request, Retry-After honoured.
  • 🧱 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_id across 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-start warm-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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row emitted$0.0025Per 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?
No. This Actor scrapes Redfin's own publicly listed search-result data via the search page's embedded API call — no login, no API key.
How does this avoid Redfin's 350-result cap?
Every gis call is capped server-side at 350 homes regardless of what's requested. We bisect the price range into buckets (mpt=99 + min_price/max_price) and recurse until every bucket returns fewer than 350 homes, deduping by property ID across buckets.
Can I target a ZIP code or neighborhood instead of a city?
Yes — paste any /city/, /zipcode/, /neighborhood/, or /county/ search-page URL from redfin.com.
Does one bad search URL stop the whole run?
No — each entry is fault-isolated. A geo-mismatch or fetch failure on one entry is logged and skipped; the rest of the run continues.

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

Teams that run this also run