Redfin Scraper icon

Redfin Scraper

Scrape redfin.com home listings: price, beds, baths, sqft, lot, year built, coordinates, address, MLS, status, days on market, photos, schools,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Redfin Scraper at a glance

Redfin Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, change type (incremental mode), url, price and price type, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Automation, Developer Tools
Pricing
$1.80 per 1,000 results (Free plan), from $1.20 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
25 options

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.

What Redfin Scraper can do

  • 90+ fields per listing. Price, price per sq ft, beds, full and partial baths, square footage, lot size, stories, year built, HOA dues, coordinates, MLS number, status, days on market, photos, key facts, tags and the full listing remarks on every search result.
  • Search or paste URLs. Find homes by city, ZIP, neighborhood or county with sort and filters, or paste exact Redfin 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.
  • Optional detail enrichment. Add the listing agent, brokerage, valuation label, nearby schools with ratings, structured amenities, home highlights, public and tax records, and the Redfin Estimate per home.
  • Predictable cost. One Max listings cap controls exactly how many records a run returns, with a separate Max pages safety stop for paging depth.
  • Built for schedules. Incremental mode returns only new and changed listings on recurring runs, and a genuinely blocked run fails loudly instead of returning an empty dataset.

Choose what to collect

These inputs let you configure Redfin Scraper - Homes for Sale & Sold Listings. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredHow to find listings. "Search" finds listings by location with filters. "URL" fetches the exact region or listing URLs you paste (filters are ignored). "Addresses / previous dataset" fetches the exact homes named by street address and/or by a previous run's dataset.

Choices: search, url, listings

locationsarrayPlaces to search, e.g. "Chicago, IL", "Austin, TX", "60611", or "Brooklyn, NY". Each location is resolved and searched independently.
listingTypestringWhich listings to return: homes currently for sale, or homes sold in the last 3 years.

Choices: for_sale, sold

sortBystringOrder results are returned in.

Choices: recommended, newest, price_low, price_high, sqft, lot_size, price_per_sqft

propertyTypesarrayKeep only listings matching these property types (e.g. House, Condo, Townhouse, Multi-Family, Land, Manufactured). Leave empty for all types.
minPriceintegerOnly listings priced at or above this amount.
maxPriceintegerOnly listings priced at or below this amount.
Show 18 more inputs
More input fields
InputWhat it controls
minBedsintegerOnly listings with at least this many bedrooms.
minBathsintegerOnly listings with at least this many bathrooms.
minSqftintegerOnly listings with at least this much interior area (sq ft).
urlsarrayRedfin URLs. Supported: /city, /zipcode, /county, /state, /neighborhood region pages (also with /page-N, /filter/max-price=500k,min-beds=2, /filter/include=sold-3yr, /recently-sold, and category pages such as /condos and /homes-for-sale-under-150000) and listing URLs (.../home/12345678). Pasted /page-N, /filter/ and /recently-sold parts are applied; run-level filter fields are ignored. Unsupported URLs are skipped with a warning. Used only when Mode is "URL".
addressesarrayStreet addresses, e.g. "61 Oak Point Dr, Holiday Island, AR 72631". Each is matched to its Redfin listing; an address with no match is reported as an error. Used only when Mode is "Addresses / previous dataset".
searchResultsDatasetIdstringDataset ID of a previous run of this actor; every listing URL in it is fetched again with full details. Used only when Mode is "Addresses / previous dataset".
fetchDetailsbooleanOpen each listing's detail panels for the address section, valuation label, and the listing agent and brokerage. Disable for a faster, lower-cost run with the summary fields only.
maxItemsintegerThe cap on how many listings to return in total. This is THE cap and the only finite limit applied by default (20). Set 0 for unlimited.
maxPagesintegerOptional safety stop on the number of result pages per location (350 listings per page). This does NOT cap your total results and defers to "Max listings". Defaults to unlimited (empty or 0): paging is uncapped and "Max listings" decides when to stop. Only set a value if you specifically want to limit paging depth.
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. Combine both runs' datasets for the full set. Max listings then counts only the new listings. One-off continuation of a SPECIFIC run, for ongoing scheduled monitoring of the same search use Incremental mode below instead.
incrementalModebooleanFor a search you run on a schedule (e.g. daily/weekly): remembers what this exact search returned last time and classifies every listing as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, so you can act on only what changed. A listing is UPDATED when any scraped field changes (price, status, remarks, agent, schools, photos and so on); scrapedAt, days on market and time on Redfin are excluded because they change on their own, and you can exclude more with Ignore fields below. Off by default so existing scheduled runs are unaffected. Separate from Resume above, which continues one specific interrupted run. Uses State key below to isolate different searches; see Emit unchanged rows / Emit expired rows to control which of those get pushed (both bill extra rows when on).
stateKeystringNames the saved baseline Incremental mode compares against. Leave empty to auto-derive one from mode/locations/urls/listingType/sortBy/propertyTypes/price/beds/baths/sqft/fetchDetails, two differently-configured searches never share a baseline even with this left empty. Set your own text only if you want to explicitly reuse or separate baselines yourself. Ignored when Incremental mode is off.
emitUnchangedbooleanWhen Incremental mode is on: also push rows classified UNCHANGED (identical to last run), not just NEW/UPDATED/REAPPEARED/EXPIRED. Off by default to save you from paying for rows that didn't change. Turning this on bills the per-result event (and the detail-enrichment surcharge, when fetched) for every unchanged row too.
emitExpiredbooleanWhen Incremental mode is on: push a synthetic EXPIRED row for listings tracked in a previous run that no longer appear in this one. Only fires after a run that completely covered every selected location/URL: if any location could not be looked up, any request was rejected, part of a listing could not be read, or a cap or resume truncated the run, expiry reporting is skipped for that run (with a log line saying which) because a partial scan can't tell 'gone' apart from 'not reached yet'. Off by default; turning it on bills the per-result event for each EXPIRED row emitted. EXPIRED rows count against Max listings like any other row; if the cap is reached, the remaining gone listings stay tracked and are reported on a later run rather than being emitted uncapped.
ignoreFieldsForChangesarrayOptional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (scrapedAt, days on market and time on Redfin already never trigger a UPDATED: they tick on their own). Matches the name at any depth inside a record; use a dotted path such as schools.rating to ignore only that nested spot. The fields stay in the output either way.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title plus key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringOptional. Parent page ID/URL for a selected Notion connector.
maxNotifyListingsintegerOptional. Cap how many listings are pushed to the connectors.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID
changeTypeChange type (incremental mode) (text)
urlURL (link)
pricePrice
priceTypePrice type
bedsBeds
bathsBaths
sqftSq Ft
lotSizeLot size
yearBuiltYear
propertyTypeLabelType
statusStatus
Show 20 more fields
daysOnMarketDOM
streetLineAddress
cityCity
stateST
zipZIP
latitudeLat
longitudeLng
mlsIdMLS#
listingAgentAgent
brokerNameBrokerage
pricePerSqFt$/sqft
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
redfinEstimateRedfin estimate (object)
publicRecordsPublic records (object)
schoolsSchools (array)
amenitiesAmenities (array)
keyFactsKey facts (array)
listingRemarksDescription

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": 12345678,
  "propertyId": 12345678,
  "listingId": 200000000,
  "url": "https://www.redfin.com/IL/Chicago/123-Example-St-60601/home/12345678",
  "mlsId": "mred00000000",
  "mlsStatus": "Active",
  "status": "Active",
  "price": 575000,
  "priceType": "List 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",
  "city": "Chicago",
  "state": "IL",
  "zip": "60601",
  "latitude": 41.8781,
  "longitude": -87.6298,
  "propertyTypeLabel": "Condo/Co-op",
  "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 an updated kitchen.",
  "listingAgent": "Alex Example",
  "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"
  },
  "schools": [
    {
      "name": "Example Elementary",
      "rating": 8,
      "distanceMiles": 0.4
    }
  ],
  "scrapedAt": "2025-01-01T00:00:00+00:00"
}

Ways to use this data

  • Real estate investors and analysts: track pricing, days on market and price-per-sqft trends across neighborhoods to spot value.
  • Agents and brokerages: monitor competing listings, new inventory and price changes in a farm area on a schedule.
  • Real estate data products and dashboards: feed structured listing data into your own search, map or comps tool.
  • Market researchers: build historical datasets of sold homes, including sale dates and property details, for trend analysis.
  • Lead generation tools: collect listing agent and brokerage details alongside property data for outreach lists.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Redfin Scraper return?

The documented output for Redfin Scraper includes id, change type (incremental mode), url, price, price type, beds, baths and sq ft. Availability of each field depends on the source page and the selected mode.

How much does Redfin Scraper cost?

It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings, and unchanged ones are not billed unless you turn on Emit unchanged rows.

Why does a pasted listing URL return fewer fields than a search result?

Because fetching a single listing's detail panels is the only way to identify it directly, a pasted listing URL needs Fetch full listing details on (the default) to return anything beyond its id and URL; with it on, you get the detail-only fields (agent, brokerage, address, schools, amenities, public records, Redfin Estimate) but never the search-card fields (price, beds, baths, sqft, lot size, year built, city/state/zip, coordinates, photos, tags, remarks). Search by the address or ZIP instead if you need the full field set for one property.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Redfin Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.