Redfin Scraper — Real-Estate Listings & Sold Data
Pricing
$1.50 / 1,000 listing fetcheds
Redfin Scraper — Real-Estate Listings & Sold Data
Reliable, always-fresh Redfin listings: price, beds/baths, sqft, address, lat/long, MLS ID, and more. Paste a Redfin city/zip URL. By FreshActors.
Pricing
$1.50 / 1,000 listing fetcheds
Rating
0.0
(0)
Developer
Freshactors
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Redfin (US Real Estate) Scraper — Listings, Sold Data & Property API
Scrape Redfin (US real estate) listings into clean, structured JSON — price, beds, baths, square footage, address, lat/long, MLS ID, property type, days-on-market and more — straight from a Redfin city or ZIP URL. No account, no login, no API key.

✅ Last verified working: 2026-06-12. Monitored by an automated daily canary. When Redfin changes something, we patch fast and log it in the changelog below.
Why this Redfin (US real estate) scraper
Most Redfin scrapers on the store are abandoned — stale code, a handful of users, low ratings — and they break the moment Redfin tweaks its internal data API. This one is maintained, monitored, and built to stay working:
- A daily canary runs the actor against live Redfin and alerts us the moment a field drifts or a block pattern changes. That's the "always-fresh" promise — and why the "Last verified working" badge above is a real date, not marketing.
- Block-resistant by design. Redfin's GIS data API returns a "Success" envelope even when it's bot-blocked, which is how naive scrapers silently return zero rows. This actor distinguishes a genuine zero-result from a soft block and retries with backoff + IP rotation instead of handing you an empty dataset.
- Paste-a-URL simplicity. Give it a Redfin city, ZIP, county or neighborhood URL — the region is parsed straight from the URL. No hunting for internal Redfin region IDs.
- Stable, versioned output (
_schemaVersion). Fields don't silently disappear between runs; schema changes are logged. - Fast patches. Open an issue and it gets answered. Reliability is the entire product.
If you've been burned by a "Redfin API" actor that returns nothing on a Monday morning, this is the fix.
What data you get
Each row is one property listing. Real fields emitted by the actor:
| Field | Type | Description |
|---|---|---|
listingId | number | Redfin internal listing ID |
propertyId | number | Redfin internal property ID |
mlsId | string | MLS number for the listing |
mlsStatus | string | MLS status (e.g. Active, Sold) |
address | string | Street line |
unit | string | Unit / apartment number (if any) |
city | string | City |
state | string | US state code |
zip | string | ZIP code |
price | number | List price (or sold price) in USD |
hoa | number | Monthly HOA dues, if reported |
beds | number | Bedrooms |
baths | number | Bathrooms |
sqft | number | Interior square footage |
lotSize | number | Lot size |
pricePerSqFt | number | Price per square foot |
yearBuilt | number | Year built |
propertyType | string | e.g. Single Family Residential, Condo/Co-op, Townhouse |
latitude | number | Latitude |
longitude | number | Longitude |
daysOnMarket | number | Days on Redfin |
lastSoldDate | string | ISO date of the property's most recent prior sale (null if none). On a sold listing this is that sale; on a for-sale listing it's the previous sale. |
url | string | Canonical Redfin listing URL |
_schemaVersion | string | Output schema version |
_scrapedAt | string | ISO timestamp of the scrape |
Two modes, set with listingType:
forSale— active for-sale listings (default).sold— recently sold homes (the sale date is inlastSoldDate, the sold price inprice), for comps and sold-price analysis. Sold rows come from Redfin's public CSV comps feed, somlsStatusisSoldandlistingIdisnull(Redfin's internal listing id isn't exposed on that feed;propertyId,mlsIdandurlstill are).
You can also choose the sort order (Redfin-recommended, price asc/desc, days-on-market asc/desc, or square-footage desc) and scrape multiple regions in a single run.
Use cases
- Real-estate investors & flippers building a deal pipeline. Search intent: "Redfin scraper", "scrape Redfin listings", "Redfin sold data export". Pull all for-sale homes in a metro, filter by
pricePerSqFtanddaysOnMarket, and surface underpriced inventory. - Proptech & CMA tools needing a Redfin API alternative. Search intent: "Redfin API", "Redfin data API no key". Feed
soldlistings withlastSoldDateandpriceinto your comparative-market-analysis or AVM model. - Data & analytics teams doing market research. Search intent: "how to scrape Redfin", "Redfin real estate data to CSV/JSON". Track median price, inventory and days-on-market across cities over time via scheduled runs.
- Lead-gen & local agents monitoring a farm area. Search intent: "Redfin listings scraper by ZIP". Watch a ZIP or neighborhood for new or price-dropped listings and trigger outreach.
Input
| Field | Type | Notes |
|---|---|---|
redfinUrls | string[] | Redfin city / ZIP / county / neighborhood URLs. The region is read from the URL. |
regions | object[] | Advanced alternative: { "region_id": "30818", "region_type": 6 } (6=city, 2=zip, 5=county, 1=neighborhood). Note: region_id is Redfin's internal id, not a postal code — for a ZIP, paste the /zipcode/… URL instead (the actor resolves the internal id for you). |
listingType | string | forSale (default) or sold. |
sort | string | redfin-recommended-asc, price-asc, price-desc, days-on-redfin-asc, days-on-redfin-desc, square-footage-desc. |
maxListings | int | Cap total listings across all regions. Default 100, max 17500. |
numHomesPerPage | int | Advanced — listings per request page. Default 350. Leave at default. |
For-sale by URL:
{"redfinUrls": ["https://www.redfin.com/city/30818/TX/Austin"],"listingType": "forSale","sort": "price-desc","maxListings": 500}
Sold comps by ZIP:
{"redfinUrls": ["https://www.redfin.com/zipcode/78701"],"listingType": "sold","sort": "days-on-redfin-asc","maxListings": 250}
Output sample
{"_type": "listing","_schemaVersion": "1.0","listingId": 216197035,"propertyId": 31845362,"mlsId": "2116358131372161577","mlsStatus": "Active","address": "4602 Indian Wells Dr","unit": null,"city": "Austin","state": "TX","zip": "78747","price": 560000,"hoa": 45,"beds": 3,"baths": 2,"sqft": 2097,"lotSize": 7405,"pricePerSqFt": 267,"yearBuilt": 2019,"propertyType": "Single Family Residential","latitude": 30.1327479,"longitude": -97.79,"daysOnMarket": 12,"lastSoldDate": null,"url": "https://www.redfin.com/TX/Austin/4602-Indian-Wells-Dr-78747/home/31845362","_scrapedAt": "2026-06-01T08:08:20.543Z"}
Use with AI agents (MCP)
This scraper is callable as a tool by AI agents via the Apify MCP server — so assistants like Claude, Cursor, and VS Code can run it and use the structured results mid-conversation, with no glue code.
Simplest path: in a recent Claude Desktop, add the hosted server https://mcp.apify.com under Settings → Connectors and authorize with OAuth. For any config-file client:
{"mcpServers": {"apify": {"command": "npx","args": ["-y", "@apify/actors-mcp-server"],"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }}}}
Then ask in plain language, e.g. "Pull active Redfin listings for Austin, TX with price, beds, baths, and square footage." — the agent calls freshactors/redfin-scraper with the right input and reads back the JSON. Full setup: Apify MCP docs.
Pricing
Pay-per-result, no subscription. You're charged $0.0015 per listing returned (the listing-fetched event) — that's it. You only pay for rows that actually land in your dataset.
How much does 100 results cost? 100 × $0.0015 = $0.15.
A few more reference points:
- 500 listings → $0.75
- 1,000 listings → $1.50
- 10,000 listings → $15.00
Set maxListings to keep any single run within your budget.
FAQ
Is scraping Redfin (US real estate) legal? This actor collects publicly visible listing data. Scraping public data is broadly permitted in many jurisdictions, but you're responsible for complying with Redfin's terms and applicable laws. Note that some MLS listings are excluded from Redfin's public data per local MLS rules — Redfin itself flags this — so those won't appear.
Do I need an API key or a Redfin account? No. There's no Redfin account, login or API key. You paste a Redfin URL (or region IDs) and run the actor.
Is there an official Redfin API? Redfin doesn't offer a public listings API. This actor is the practical substitute: structured JSON with the fields most people want, callable from the Apify API/SDK.
How do I get sold listings instead of for-sale?
Set listingType to sold. Sold rows carry the sale date in lastSoldDate, which is what you want for comps and sold-price trends.
How do I scrape a specific city or ZIP?
Paste the Redfin URL for it — e.g. https://www.redfin.com/city/30818/TX/Austin or https://www.redfin.com/zipcode/78701. The region is parsed from the URL automatically. For programmatic control, use the advanced regions input with region_id + region_type.
How many listings can I get per run?
Up to maxListings, which defaults to 100 and can go up to 17,500. You can also include multiple URLs/regions in one run; the cap applies across all of them.
How often is the data updated? The actor reads live from Redfin every time you run it, so data is as fresh as Redfin's own site at run time. Schedule runs (hourly/daily) for ongoing monitoring.
Why do some scrapers return zero results — does this one? Redfin's data endpoint returns a "Success" envelope even when it's quietly blocking bots, so naive scrapers return empty datasets. This actor detects that soft-block pattern and retries with backoff and IP rotation, so a real zero-result is distinguished from a block.
What's the difference between redfinUrls and regions?
redfinUrls is the easy path — paste any Redfin region page URL. regions is the advanced path for when you already know Redfin's internal region_id and region_type and want to script them directly.
Can I export to CSV or Excel? Yes. Results go to a standard Apify dataset, which you can export as JSON, CSV, Excel, or HTML, or pull via the API.
Other FreshActors tools
| FreshActors actor | What it scrapes |
|---|---|
| App Store Scraper | Apple App Store — app details, search, reviews |
| Google Play Scraper | Google Play — app details, reviews, search |
| Microsoft Store Scraper | Microsoft Store — app details, rating windows, search, reviews |
| VS Code Marketplace Scraper | VS Code extensions — install/trending stats, search, reviews |
| Shopify App Store Scraper | Shopify App Store — app details, reviews, discovery |
| Greenhouse & Lever Jobs Scraper | Greenhouse + Lever — normalized job postings |
| Workable Jobs Scraper | Workable — normalized job postings, full descriptions |
| SmartRecruiters Jobs Scraper | SmartRecruiters — normalized job postings, full descriptions |
| Recruitee Jobs Scraper | Recruitee — normalized job postings + salary |
| Teamtailor Jobs Scraper | Teamtailor — normalized job postings, full descriptions |
| Personio Jobs Scraper | Personio — normalized job postings, departments + seniority |
Reliability
A scheduled daily canary runs this actor against live Redfin and checks that listings still parse and the expected fields are present. When Redfin changes its data API or block behavior, we patch quickly and record it in the changelog below, then bump the "Last verified working" date at the top. That feedback loop — monitor, detect, patch, log — is the whole point of FreshActors: an actor you can build a pipeline on without it quietly going stale.
Changelog
- 2026-06-06 — Fixed
soldmode, which had been silently returning for-sale listings: Redfin's JSON endpoint ignores the sold filter, so sold mode now reads Redfin's CSV comps feed and returns genuinely sold homes (real sale date + sold price). Fixed ZIP scraping, which returned the wrong region: a/zipcode/…URL now resolves Redfin's internal region id instead of using the postal code (which pointed at an unrelated area). Both paths are now covered by the daily canary. - 2026-06-04 — Renamed the
soldDateoutput field tolastSoldDateand documented it honestly: Redfin returns the property's most recent prior sale on every listing (including for-sale homes), so the oldsoldDatelabel was misleading. Same data, accurate name. Also removed the opaque, undocumentedlistingTypeinteger (no usable meaning, and it clashed with thelistingTypeinput). - 2026-06-01 — v1.0 launch. For-sale + sold listings, URL-based region resolution, block-aware retry engine, daily canary monitoring.
Legal note. This actor scrapes public real-estate listing data. Some MLS listings are excluded per local MLS rules. Use the data responsibly and in line with Redfin's terms and applicable laws.
Found a problem? Open an issue — answered fast. Staying fresh is the whole point.