# Redfin Scraper - Homes for Sale, Prices, Beds & Photos (`scrapewise/redfin-scraper`) Actor

Scrape Redfin homes for sale by city, neighborhood or county link: address, price, beds, baths, square feet, lot size, year built, HOA, days on market, photo, tour links, coordinates and description. Filter by price, beds, type, age. Use onlyNew for daily alerts. Error rows are free.

- **URL**: https://apify.com/scrapewise/redfin-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Real estate, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.76 / 1,000 home delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Redfin Scraper: homes for sale with price, beds, size, photos and days on market

This Redfin scraper collects **the homes for sale in any Redfin city, neighborhood or county**, with no account and no API key. Paste a Redfin link (or a region id), add the filters you care about, and get one clean row per home: **address, asking price, price per square foot, beds, baths, living area, lot size, year built, HOA fee, days on market, property type, coordinates, listing description, key facts, main photo and tour links**.

Use it to track a housing market, build lead and investment lists, feed price models and dashboards, watch new listings every day, or compare neighborhoods by price per square foot. Schedule it with `onlyNew` and you only receive homes you have not seen before.

### At a glance

| What | Price |
|---|---|
| Home delivered | **US$ 1.00 per 1,000 homes** (US$ 0.001 each) |
| Run start | US$ 0.005 per run |

- 1,000 homes = **US$ 1.01** in total. 100 homes = **US$ 0.105**.
- Error rows, duplicates and homes already delivered by earlier runs (`onlyNew`) are never charged.
- `maxItems` is a hard cap, and a spending limit set on the run stops it cleanly with everything delivered so far.
- Proxy cost is included in the price.

### Quick start

One city, the 50 first homes:

```json
{
  "startUrls": [{ "url": "https://www.redfin.com/city/1826/MA/Boston" }],
  "maxItems": 50
}
```

Condos with at least 2 bedrooms, up to US$ 900,000, listed in the last 14 days:

```json
{
  "startUrls": [{ "url": "https://www.redfin.com/city/1826/MA/Boston" }],
  "propertyTypes": ["Condo"],
  "minBeds": 2,
  "maxPrice": 900000,
  "maxDaysOnMarket": 14,
  "maxItems": 30
}
```

That input returned 30 homes in about 2 seconds in our test.

The filters of a Redfin search link work too. Copy the address of a filtered search from your browser, for example
`https://www.redfin.com/city/1826/MA/Boston/filter/min-price=400k,max-price=900k,min-beds=2,property-type=condo`,
and paste it in `startUrls`. Filters typed in the fields below win over the ones in the link.

### Where to get the region

Open Redfin, search a city, neighborhood or county, and copy the link. The number after `/city/`, `/neighborhood/` or `/county/` is the region id. You can paste the whole link, or write only the region in `searchQueries`:

| Write | Meaning |
|---|---|
| `city:1826` | A city and the area Redfin groups with it |
| `neighborhood:1` | A neighborhood |
| `county:5` | A county |
| `state:2` | A state |
| `60602` (five digits) | A ZIP code. This is looked up when possible; if it is not found you get a free `REGION_NOT_FOUND` row, and the city link is the safe choice |

### Input

| Field | What it does |
|---|---|
| `startUrls` | Redfin city, neighborhood or county links. One region per link. Filters inside the link are used. |
| `searchQueries` | Regions written as `city:1826`, `neighborhood:1`, `county:5`, or a ZIP code. |
| `listingStatus` | `all` (default), `active` (for sale) or `comingSoon`. Sold homes are not included. |
| `minPrice`, `maxPrice` | Price range in USD. |
| `minBeds`, `maxBeds` | Bedroom range. |
| `minBaths` | Minimum bathrooms (1.5 counts a half bath). |
| `propertyTypes` | `House`, `Condo`, `Townhouse`, `Multi-family`, `Land`, `Other`, `Mobile`, `Co-op`. Empty = all. |
| `minSqft`, `maxSqft` | Living area range in square feet. |
| `minYearBuilt`, `maxYearBuilt` | Year built range. |
| `maxDaysOnMarket` | Only homes listed on Redfin for at most this many days. |
| `maxItems` | Cap for the whole run, across all regions (default 50; 0 = no cap). |
| `onlyNew` | Skip homes delivered by earlier runs of the same region and filters. |
| `proxyConfiguration` | Apify datacenter proxy by default. |

`urls`, `url`, `regions`, `search`, `query`, `location`, `limit`, `maxResults`, `beds`, `baths` and `status` are accepted too, so inputs written for other Redfin tools keep working.

#### How far one search goes

Redfin lets a single region search reach **10,000 homes**. For a bigger area (a whole state, a huge county) split it into its cities or counties and put them all in one run with `maxItems` set to 0; homes that appear in more than one region are delivered once.

Filters are applied to every home of the region, so a narrow filter in a big city reads the whole city (a city with 6,700 homes took about 30 seconds in our test) and delivers only the matches. You pay only for the homes delivered.

### Output

One row per home (`type: listing`). Fields that Redfin does not show for a given home are `null`.

| Field | What it is |
|---|---|
| `propertyId`, `listingId`, `mlsNumber` | Redfin property id, listing id and the MLS number |
| `status` | Listing status as Redfin shows it (`Active`, `New`, `Coming Soon`...) |
| `url` | Link to the home on Redfin |
| `address`, `unit`, `fullAddress` | Street address, unit and the full address with city, state and ZIP |
| `city`, `state`, `zip`, `country`, `neighborhood` | Location of the home, and the neighborhood or area name |
| `latitude`, `longitude` | Coordinates |
| `price`, `pricePerSqft`, `hoaMonthly` | Asking price in USD, price per square foot and monthly HOA fee |
| `beds`, `baths`, `fullBaths`, `partialBaths` | Bedrooms and bathrooms |
| `sqft`, `lotSizeSqft`, `yearBuilt`, `stories` | Living area, lot size in square feet, year built and floors |
| `parkingSpaces`, `garageSpaces` | Parking and garage spaces |
| `propertyType`, `isNewConstruction` | House, Condo, Townhouse, Multi-family, Land... and the new construction flag |
| `daysOnMarket`, `daysOnRedfin` | Days on the market (MLS) and days since Redfin listed it |
| `description` | The first part of the listing description (about 700 characters, as Redfin shows it) |
| `keyFacts`, `tags` | Highlights Redfin extracts from the listing |
| `labels` | Badges such as `New`, `Open House`, `Price Drop`, `Coming Soon` |
| `isHot` | Redfin's hot home flag |
| `openHouseStart`, `openHouseEnd` | Next open house (UTC), when there is one |
| `photoCount`, `photoUrl` | Number of photos and the link of the main photo |
| `hasVirtualTour`, `hasVideoTour`, `has3DTour`, `tourUrl` | Tour flags and the 3D tour link when there is one |
| `sourceRegion`, `scrapedAt` | The link or region you sent, and when the row was collected (UTC) |
| `errorCode`, `error` | Empty on a good row (see the error table below) |

Agent, broker, owner, phone and email details are not collected. Phone numbers and emails inside a description are replaced with `[contact removed]`.

One real row from our test (description shortened):

```json
{
  "type": "listing",
  "propertyId": 9043024,
  "mlsNumber": "73596482",
  "status": "New",
  "url": "https://www.redfin.com/MA/Brighton/140-Kenrick-St-02135/unit-8/home/9043024",
  "address": "140 Kenrick #8",
  "unit": "#8",
  "fullAddress": "140 Kenrick #8, Brighton, MA 02135",
  "city": "Brighton",
  "state": "MA",
  "zip": "02135",
  "neighborhood": "Brighton",
  "latitude": 42.3458083,
  "longitude": -71.1680134,
  "price": 449000,
  "pricePerSqft": 695,
  "hoaMonthly": 434,
  "beds": 2,
  "baths": 1.0,
  "fullBaths": 1,
  "sqft": 646,
  "yearBuilt": 1975,
  "stories": 1.0,
  "parkingSpaces": 2,
  "garageSpaces": 0,
  "propertyType": "Condo",
  "isNewConstruction": false,
  "daysOnMarket": 3,
  "daysOnRedfin": 3.2,
  "description": "Welcome to Chandler Pond Condominiums! This bright and inviting two-bedroom, one-bathroom garden-level condo offers a spacious, open living ...",
  "keyFacts": ["Public transit", "Garden-level condo", "Gas range"],
  "tags": ["GARDEN-LEVEL CONDO", "GAS RANGE", "OUTDOOR COMMUNITY POOL", "ON-SITE LAUNDRY"],
  "labels": [],
  "isHot": false,
  "photoCount": 19,
  "photoUrl": "https://ssl.cdn-redfin.com/photo/52/bigphoto/482/73596482_0.jpg",
  "hasVirtualTour": false,
  "has3DTour": false,
  "tourUrl": null,
  "sourceRegion": "https://www.redfin.com/city/1826/MA/Boston",
  "scrapedAt": "2026-11-01T19:08:30Z",
  "errorCode": null,
  "error": null
}
```

### Daily alerts for new listings

Turn on `onlyNew`, keep the same region and filters, and schedule the run once a day. The first run delivers the current homes; every later run delivers only homes that were not delivered before, and skipped homes are not charged. The run still reads the whole region each time, so a daily run on a big city takes well under a minute.

```json
{
  "startUrls": [{ "url": "https://www.redfin.com/city/1826/MA/Boston" }],
  "propertyTypes": ["House", "Townhouse"],
  "maxPrice": 1200000,
  "onlyNew": true,
  "maxItems": 200
}
```

Change the region, a filter or the price range and the memory starts again for that new search.

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | Not a Redfin search link |
| `INVALID_INPUT` | A field has a wrong value (the message says which one) |
| `REGION_NOT_FOUND` | A ZIP code or name could not be matched to a region; paste the city, neighborhood or county link |
| `NO_RESULTS` | The region has no home for these filters; try fewer filters or a larger region |
| `BLOCKED` | Redfin refused every attempt for this region; run it again in a few minutes |
| `UNEXPECTED` | Something unexpected stopped the run; what was already delivered is kept |

### Integrations, scheduling and AI agents

- **Schedule** the same search daily or weekly in [Apify schedules](https://docs.apify.com/platform/schedules) to follow prices, new listings and days on market.
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier or Google Sheets through [Apify integrations](https://docs.apify.com/platform/integrations); for example, add a row to a sheet or send a Slack message for every new home under your budget.
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) in Claude, ChatGPT, Cursor or any MCP client, for example "list the new 3-bedroom houses under 700k in this Redfin city and rank them by price per square foot".

### FAQ

**Do I need a Redfin account or an API key?** No. The Actor reads public listing data without login or cookies.

**Does it include sold homes or rentals?** No. It covers homes that are on the market now: for sale and coming soon.

**Why is `description` short?** Redfin shows only the first part of the listing text in search results, about 700 characters.

**Why are some fields `null`?** Redfin does not publish every field for every listing: lot size is empty for many condos, HOA for houses without one, and a few listings hide the street address or the price.

**What about the other photos and the full history of a home?** Not included. The Actor covers the search results of a region: the main photo link, the photo count and the fields above. Price history, tax records, school scores and per-home detail pages are not collected.

**Can I search the whole United States?** Run it per region. Put many cities or counties in one run and set `maxItems` to 0; duplicates between regions are removed.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- Only homes on the market now (for sale and coming soon), US listings.
- Up to 10,000 homes per region; split larger areas into cities or counties.
- Homes come in Redfin's recommended order; sort the dataset afterwards by `price`, `daysOnRedfin` or any other field.
- The listing description is the short version Redfin shows in results.
- Agent and broker details are not collected.

### Changelog

- **1 Nov 2026:** first version: regions by link or id, price, beds, baths, type, size, year and age filters, `onlyNew` alerts, main photo and tour links.

# Actor input Schema

## `startUrls` (type: `array`):

Links to a Redfin city, neighborhood or county page, for example https://www.redfin.com/city/1826/MA/Boston. Filters in the link (min-price, max-beds, property-type...) are used when the fields below are empty. One region per link.

## `searchQueries` (type: `array`):

Optional. A region written as city:1826, neighborhood:1 or county:5 (the number in the Redfin link), or a five-digit ZIP code. One region per line.

## `listingStatus` (type: `string`):

Redfin shows homes that are on the market now. Sold homes are not included.

## `minPrice` (type: `integer`):

Keep homes at or above this price. Empty = no minimum.

## `maxPrice` (type: `integer`):

Keep homes at or below this price. Empty = no maximum.

## `minBeds` (type: `integer`):

Keep homes with at least this many bedrooms.

## `maxBeds` (type: `integer`):

Keep homes with at most this many bedrooms.

## `minBaths` (type: `number`):

Keep homes with at least this many bathrooms (1.5 counts a half bath).

## `propertyTypes` (type: `array`):

Keep only these types. Empty = all.

## `minSqft` (type: `integer`):

Keep homes with at least this living area.

## `maxSqft` (type: `integer`):

Keep homes with at most this living area.

## `minYearBuilt` (type: `integer`):

Keep homes built in this year or later.

## `maxYearBuilt` (type: `integer`):

Keep homes built in this year or earlier.

## `maxDaysOnMarket` (type: `integer`):

Keep homes listed on Redfin for at most this many days. Coming soon homes always pass.

## `maxItems` (type: `integer`):

Hard cap for the whole run, across all regions. 0 = no cap. A single region returns up to 10,000 homes; split bigger areas into cities or counties.

## `onlyNew` (type: `boolean`):

Skip homes already delivered by earlier runs of the same region and filters. Schedule the run daily to get only new listings. Homes skipped this way are not charged.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default. Change it only if you know you need to.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.redfin.com/city/1826/MA/Boston"
    }
  ],
  "listingStatus": "all",
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.redfin.com/city/1826/MA/Boston"
        }
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/redfin-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.redfin.com/city/1826/MA/Boston" }],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/redfin-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.redfin.com/city/1826/MA/Boston"
    }
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/redfin-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/redfin-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zaVbVScHbj1L4lBd3/builds/Lp93OaxhCLrXOOlWA/openapi.json
