Redfin Scraper - Homes for Sale & Sold Listings avatar

Redfin Scraper - Homes for Sale & Sold Listings

Pricing

from $1.20 / 1,000 listing results

Go to Apify Store
Redfin Scraper - Homes for Sale & Sold Listings

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

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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.

FieldExample
id12345678
urlhttps://www.redfin.com/IL/Chicago/123-Example-St-60601/home/12345678
price575000
priceTypeListed at Price
beds3
baths2.5
bathFull2
bathPartial1
sqft1850
lotSize4200
yearBuilt1998
pricePerSqFt311
hoaDues250
propertyTypeLabelCondo/Co-op
statusActive
daysOnMarket12
streetLine123 Example St
cityChicago
stateIL
zip60601
latitude41.8781
longitude-87.6298
mlsIdmred00000000
listingAgentJane Doe
brokerNameExample 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

ParameterTypeDescription
modeselectsearch (by location + filters) or url (paste URLs).
locationsarraySearch mode. Cities, ZIPs, neighborhoods, or counties, e.g. "Chicago, IL".
listingTypeselectfor_sale or sold (last 3 years).
sortByselectrecommended, newest, price_low, price_high, sqft, lot_size, price_per_sqft.
propertyTypesarrayKeep only these types (House, Condo, Townhouse, Multi-Family, Land, Manufactured).
minPriceintegerOnly listings at or above this price.
maxPriceintegerOnly listings at or below this price.
minBedsintegerOnly listings with at least this many bedrooms.
minBathsintegerOnly listings with at least this many bathrooms.
minSqftintegerOnly listings with at least this many square feet.
urlsarrayURL mode. Region or listing URLs to fetch verbatim (filters ignored).
fetchDetailsbooleanAdd agent, brokerage, and address valuation label per home. Default true.
maxItemsintegerThe only default cap (20). Set 0 for unlimited.
maxPagesintegerOptional safety stop on result pages per location. Does NOT cap totals. Empty/0 = unlimited.
resumeFromRunIdstringOptional. 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.
incrementalModebooleanOff by default. Track this exact search across scheduled runs and label every listing NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. See below.
stateKeystringOptional name for the saved baseline. Leave empty and one is derived from your search settings, so two differently-configured searches never share a baseline.
emitUnchangedbooleanOff by default. Also return listings that did not change since the last run.
emitExpiredbooleanOff by default. Return a row for listings that were in a previous run but are gone from this one.
proxyobjectConnection settings. The default works on every plan.
maxResidentialMBintegerCap residential traffic in MB; auto-downgrades after the cap. 0 = unlimited.
mcpConnectorsarrayOptional. Pipe results into Notion, Linear, Airtable, or Apify via MCP.
notionParentPageUrlstringOptional. Parent page for a selected Notion connector.
maxNotifyListingsintegerOptional. 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:

changeTypeMeaning
NEWFirst time this listing has appeared for this search.
UPDATEDSomething real changed. changedFields names exactly what.
UNCHANGEDIdentical to last run. Not returned unless emitUnchanged is on.
REAPPEAREDWas gone, and is back on the market.
EXPIREDWas 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.
  • emitExpired only 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.