Redfin Scraper - Homes for Sale & Sold Listings
Pricing
from $1.20 / 1,000 listing results
Redfin Scraper - Homes for Sale & Sold Listings
Scrape redfin.com home listings: price, beds, baths, sqft, lot, year built, coordinates, address, MLS, status, days on market, photos, schools, amenities, tax records, agent and brokerage plus 90+ fields. Search any city, ZIP, neighborhood, or county with sort and filters, or paste Redfin URLs.
Pricing
from $1.20 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Pull structured home listings from redfin.com at scale. Search any city, ZIP code, neighborhood, or county, narrow with sort and filters, and get a clean JSON record per home with price, beds, baths, square footage, lot size, year built, exact coordinates, address, MLS number, status, days on market, photo data, key facts, listing remarks, the listing agent, and the brokerage. Or paste Redfin region and listing URLs and let the scraper walk them for you.
Why This Scraper?
- 90+ fields per listing - price, price per sq ft, beds, full and partial baths, sqft, lot size, stories, year built, HOA, coordinates, MLS, status, days on market, photos, key facts, tags, full listing remarks, agent and brokerage. With detail enrichment, also nearby schools with ratings, full structured amenities, home highlights, public records (APN, tax rate, county), and the Redfin Estimate.
- Search or URL - find homes by location with filters, or paste exact region and listing URLs and pull them verbatim.
- For sale or recently sold - switch between active listings and homes sold in the last three years.
- Seven sort orders - recommended, newest, price low to high, price high to low, square feet, lot size, and price per sq ft.
- Rich filters - property type, min and max price, min beds, min baths, and min square feet.
- Optional detail enrichment - add the listing agent, brokerage, valuation label, nearby schools with ratings, structured amenities, home highlights, public/tax records, and the Redfin Estimate per home.
- Predictable output cap - one clear "Max listings" limit controls exactly how many records you get.
- MCP export - optionally pipe results straight into Notion, Linear, Airtable, or Apify.
Data You Get
Sample shape - values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
| id | 12345678 |
| url | https://www.redfin.com/IL/Chicago/123-Example-St-60601/home/12345678 |
| price | 575000 |
| priceType | Listed at Price |
| beds | 3 |
| baths | 2.5 |
| bathFull | 2 |
| bathPartial | 1 |
| sqft | 1850 |
| lotSize | 4200 |
| yearBuilt | 1998 |
| pricePerSqFt | 311 |
| hoaDues | 250 |
| propertyTypeLabel | Condo/Co-op |
| status | Active |
| daysOnMarket | 12 |
| streetLine | 123 Example St |
| city | Chicago |
| state | IL |
| zip | 60601 |
| latitude | 41.8781 |
| longitude | -87.6298 |
| mlsId | mred00000000 |
| listingAgent | Jane Doe |
| brokerName | Example Realty Group |
How to Use
1. Search a city for homes for sale (default):
{"mode": "search","locations": ["Chicago, IL"],"listingType": "for_sale","maxItems": 50}
2. Filtered search, cheapest first, condos only:
{"mode": "search","locations": ["Austin, TX", "78701"],"propertyTypes": ["Condo"],"sortBy": "price_low","minPrice": 300000,"maxPrice": 700000,"minBeds": 2,"maxItems": 100}
3. Recently sold homes with full detail:
{"mode": "search","locations": ["Brooklyn, NY"],"listingType": "sold","fetchDetails": true,"maxItems": 40}
4. Paste region and listing URLs:
{"mode": "url","urls": ["https://www.redfin.com/city/29470/IL/Chicago","https://www.redfin.com/IL/Chicago/123-Example-St-60601/home/12345678"]}
Input Parameters
| Parameter | Type | Description |
|---|---|---|
| mode | select | search (by location + filters) or url (paste URLs). |
| locations | array | Search mode. Cities, ZIPs, neighborhoods, or counties, e.g. "Chicago, IL". |
| listingType | select | for_sale or sold (last 3 years). |
| sortBy | select | recommended, newest, price_low, price_high, sqft, lot_size, price_per_sqft. |
| propertyTypes | array | Keep only these types (House, Condo, Townhouse, Multi-Family, Land, Manufactured). |
| minPrice | integer | Only listings at or above this price. |
| maxPrice | integer | Only listings at or below this price. |
| minBeds | integer | Only listings with at least this many bedrooms. |
| minBaths | integer | Only listings with at least this many bathrooms. |
| minSqft | integer | Only listings with at least this many square feet. |
| urls | array | URL mode. Region or listing URLs to fetch verbatim (filters ignored). |
| fetchDetails | boolean | Add agent, brokerage, and address valuation label per home. Default true. |
| maxItems | integer | The only default cap (20). Set 0 for unlimited. |
| maxPages | integer | Optional safety stop on result pages per location. Does NOT cap totals. Empty/0 = unlimited. |
| resumeFromRunId | string | Optional. ID of a previous run of this actor (or a dataset ID). Listings already in that dataset are skipped, so this run returns only NEW listings - use it to continue an interrupted or capped full-catalogue walk. |
| incrementalMode | boolean | Off by default. Track this exact search across scheduled runs and label every listing NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. See below. |
| stateKey | string | Optional name for the saved baseline. Leave empty and one is derived from your search settings, so two differently-configured searches never share a baseline. |
| emitUnchanged | boolean | Off by default. Also return listings that did not change since the last run. |
| emitExpired | boolean | Off by default. Return a row for listings that were in a previous run but are gone from this one. |
| proxy | object | Connection settings. The default works on every plan. |
| maxResidentialMB | integer | Cap residential traffic in MB; auto-downgrades after the cap. 0 = unlimited. |
| mcpConnectors | array | Optional. Pipe results into Notion, Linear, Airtable, or Apify via MCP. |
| notionParentPageUrl | string | Optional. Parent page for a selected Notion connector. |
| maxNotifyListings | integer | Optional. Cap how many listings are pushed to the connectors. |
Track Only What Changed (incremental mode)
Turn on incrementalMode when you run the same search on a schedule. The actor
remembers what that search returned last time and labels every listing:
| changeType | Meaning |
|---|---|
| NEW | First time this listing has appeared for this search. |
| UPDATED | Something real changed. changedFields names exactly what. |
| UNCHANGED | Identical to last run. Not returned unless emitUnchanged is on. |
| REAPPEARED | Was gone, and is back on the market. |
| EXPIRED | Was tracked before and is no longer in the results. Only with emitExpired. |
Each returned listing also carries changedFields, firstSeenAt and lastSeenAt.
Two things it deliberately will not do, because both would cost you money for news that never happened:
- Counters that tick on their own - days on market, time on Redfin, and the scrape timestamp - are ignored when deciding whether a listing changed. Otherwise every listing would look "updated" every single day.
emitExpiredonly reports a listing as gone after a run that completely covered every location or URL you selected. If a location could not be looked up, a request was rejected, part of a listing could not be read, or Max listings / Max pages stopped the run early, expiry reporting is skipped for that run and the reason is written to the log. A partial run cannot tell "gone" apart from "not reached yet", and those listings stay tracked for the next run.
Leave stateKey empty unless you want to control the baseline yourself: it is
otherwise derived from your search settings, so changing a filter starts a
separate baseline instead of reporting your whole result set as new.
Output Example
Sample shape - values are illustrative placeholders, not from a live listing.
{"id": 12345678,"propertyId": 12345678,"listingId": 200000000,"url": "https://www.redfin.com/IL/Chicago/123-Example-St-60601/home/12345678","mlsId": "mred00000000","mlsStatus": "Active","price": 575000,"priceType": "Listed at Price","pricePerSqFt": 311,"hoaDues": 250,"beds": 3,"baths": 2.5,"bathFull": 2,"bathPartial": 1,"sqft": 1850,"lotSize": 4200,"stories": 2,"yearBuilt": 1998,"streetLine": "123 Example St","unitNumber": "","city": "Chicago","state": "IL","zip": "60601","countryCode": "US","location": "Near North Side","latitude": 41.8781,"longitude": -87.6298,"propertyTypeLabel": "Condo/Co-op","status": "Active","daysOnMarket": 12,"photos": "0-24:0","hasVirtualTour": false,"keyFacts": [{ "description": "Large windows", "rank": 0 }],"listingTags": ["Hardwood flooring"],"listingRemarks": "Bright corner unit with lake views and updated kitchen.","listingAgent": "Jane Doe","brokerName": "Example Realty Group","mainHouseInfo": {"fullStreetAddress": "123 Example St, Chicago, IL 60601","url": "https://www.redfin.com/IL/Chicago/123-Example-St-60601/home/12345678"},"scrapedAt": "2025-01-01T00:00:00+00:00"}
Send results into your apps (MCP connectors)
Optionally pipe each run's results into the apps you already use through Model
Context Protocol (MCP) connectors. Authorize a connector once under Apify,
Settings, Integrations, then select it in the mcpConnectors field. Each connector
receives a condensed, human-readable summary per item (title plus key fields); the
complete record always stays in the dataset. Supported connectors: Notion, Linear,
Airtable, and Apify. For Notion, also set notionParentPageUrl. Leave
mcpConnectors empty to skip export entirely.
Plan Requirement
Runs on any Apify plan, including the free tier. Every mode and option works out of the box with no extra setup.