# Redfin Scraper (`lergassy/redfin-scraper`) Actor

Scrape Redfin homes for sale, sold or for rent in any US city, ZIP, county or neighborhood: price, beds, baths, sqft, address, coordinates, days on market, MLS number, photo. Add price & tax history, broker, agent, schools. Export JSON/CSV/Excel, use the API, schedule it or connect n8n or Zapier.

- **URL**: https://apify.com/lergassy/redfin-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 5 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.28 / 1,000 homes

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

### What is Redfin Scraper?

**Redfin Scraper** pulls homes from [redfin.com](https://www.redfin.com) — **for sale, recently sold or for rent** — for any US city, ZIP code, county or neighborhood, or straight from a Redfin search URL you already filtered in the browser. Every home comes back as one clean, flat row: price, beds, baths, square feet, lot size, year built, full address, coordinates, days on market, MLS number, HOA, status and the main photo.

Turn on the **home details add-on** and each home also gets its **price history, property tax history, listing broker and agent with phone numbers, schools with GreatSchools ratings, parcel number (APN), Redfin Estimate** and the full feature list.

No login, no cookies, no browser. The Actor reads the same JSON redfin.com loads in your browser, so a run of 1,000 homes takes seconds. Export to JSON, CSV or Excel, call it through the API, schedule it, or plug it into Make, n8n, Zapier or Google Sheets.

### What data can Redfin Scraper extract?

| Field | Example |
|---|---|
| 🏠 `address`, `street`, `city`, `state`, `zip`, `neighborhood` | 2809 Kinney Oaks Ct, Austin, TX 78704 |
| 📍 `latitude`, `longitude` | 30.243589, -97.774234 |
| 💲 `price` / `soldPrice`, `soldDate`, `pricePerSqft`, `hoa` | 775000, 469, 50 |
| 🛏 `beds`, `baths`, `fullBaths`, `partialBaths` | 3, 2, 2 |
| 📐 `sqft`, `lotSize`, `yearBuilt`, `stories`, `garageSpaces` | 1654, 3354, 2001, 1, 1 |
| 🏷 `propertyType`, `status`, `listingType` | House, Active, forSale |
| ⏱ `daysOnMarket`, `listedAt`, `lastSoldDate` | 1, 2026-10-22T18:21:32Z |
| 🔖 `propertyId`, `listingId`, `mlsId`, `url` | 31953388, 4729441 |
| 🖼 `mainPhoto`, `photoCount` | link to the listing photo, 40 |
| 🔥 `isHot`, `isNew`, `isComingSoon`, `openHouse`, `keyFacts`, `tags`, `badges` | Open House · Oct 24, 12:00PM |
| 📝 `description` | listing remarks (Redfin shortens long ones to about 700 characters) |
| 🏢 Rentals: `propertyName`, `price`–`priceMax`, `beds`–`bedsMax`, `availableUnits`, `phone` | Wixby House, $1,170–2,350 |
| ➕ Details add-on: `brokerName`, `brokerPhone`, `agentName`, `agentPhone` | Compass RE Texas, LLC |
| ➕ Details add-on: `priceHistory`, `taxHistory`, `schools`, `apn`, `county`, `redfinEstimate`, `features` | Listed 2026-10-22 $775,000 |

Fields Redfin does not show for a home are left out of its row instead of being filled with empty values.

### How much does it cost to scrape Redfin?

Pay per result — no monthly rent, no start fee:

| Event | Price | Results per $1 |
|---|---|---|
| Home | $0.00035 (Free plan) → $0.00028 (Gold and up) | 2,850 – 3,570 homes |
| Add-on: Home details (only when switched on) | $0.0028 per home | ~317 homes with details |

The [Apify Free plan](https://apify.com/pricing) gives you $5 of credit every month — about **14,000 homes**, or 1,500 homes with full details, without paying anything. Set **Max cost per run** when you start a run and the Actor stops cleanly at that amount: every row you get is paid for, nothing more.

### How to scrape Redfin homes

1. Click **Try for free** and open the Actor's input.
2. In **Locations**, type places the way you type them on Redfin: `Austin, TX`, `78704`, `Travis County, TX`, `Travis Heights, Austin` or a street address. Or paste Redfin URLs into **Redfin URLs**.
3. Pick **For sale**, **Sold** (and how many days back) or **For rent**.
4. Add filters if you need them: price, beds, baths, square feet, property type, year built, lot size.
5. Set **Max homes in total** and, if you want history, broker and schools, switch on **Add home details ($)**.
6. Click **Start** and download the results as JSON, CSV or Excel, or read them through the API.

### ⬇️ Input

```json
{
    "locations": ["Austin, TX", "78704"],
    "listingType": "forSale",
    "minPrice": 300000,
    "maxPrice": 600000,
    "minBeds": 3,
    "propertyTypes": ["house", "townhouse"],
    "maxItems": 500,
    "includeDetails": false
}
```

Redfin search URLs keep all their filters: `https://www.redfin.com/city/30818/TX/Austin/filter/property-type=condo,min-price=200k,max-price=400k,min-beds=2`, sold searches (`…/filter/include=sold-3mo`), rentals (`…/apartments-for-rent`) and single home pages (`…/home/31982122`).

### ⬆️ Output

One home with the details add-on (from a real run, lists shortened):

```json
{
  "type": "home",
  "propertyId": 31953388,
  "listingId": 224611722,
  "mlsId": "4729441",
  "url": "https://www.redfin.com/TX/Austin/2809-Kinney-Oaks-Ct-78704/home/31953388",
  "address": "2809 Kinney Oaks Ct, Austin, TX 78704",
  "neighborhood": "Village At Kinney Court",
  "latitude": 30.243589,
  "longitude": -97.774234,
  "listingType": "forSale",
  "status": "Active",
  "price": 775000,
  "lastSoldDate": "2020-12-23",
  "beds": 3,
  "baths": 2,
  "sqft": 1654,
  "lotSize": 3354,
  "pricePerSqft": 469,
  "yearBuilt": 2001,
  "propertyType": "House",
  "hoa": 50,
  "daysOnMarket": 1,
  "mainPhoto": "https://ssl.cdn-redfin.com/photo/92/bigphoto/441/4729441_0.jpg",
  "photoCount": 40,
  "openHouse": "Open House - 12:00 - 4:00 PM · Oct 24, 12:00PM",
  "brokerName": "Compass RE Texas, LLC",
  "brokerPhone": "512-575-3644",
  "agentName": "Stefan Benteler",
  "agentPhone": "512-487-9993",
  "apn": "553084",
  "county": "Travis County",
  "priceHistory": [
    { "date": "2026-10-22", "event": "Listed", "price": 775000, "mlsStatus": "Active", "source": "Unlock MLS" },
    { "date": "2020-12-29", "event": "Sold (Public Records)", "source": "Public Records" }
  ],
  "taxHistory": [
    { "year": 2026, "taxesDue": 12369.36, "landValue": 262500, "improvementValue": 341920, "assessedValue": 604420 }
  ],
  "schools": [
    { "name": "Zilker Elementary School", "rating": 9, "grades": "PreK-5", "type": "Public", "distanceMiles": 0.6, "students": 506 }
  ]
}
```

A rental row carries ranges instead: `"propertyName": "Wixby House", "price": 1170, "priceMax": 2350, "beds": 0, "bedsMax": 2, "availableUnits": 311, "phone": "5126287096"`.

### Use cases

#### Real estate investors

Pull every home for sale under a price in your target ZIP codes each morning, sort by price per square foot and days on market, and spot price drops in the price history.

#### Agents and brokers

Build comps from recently sold homes (sold price, sold date, beds, baths, square feet) and find listing agents and brokerages with their phone numbers for referral and partnership outreach.

#### Property managers and renters

Track rental supply: rent ranges, available units, unit sizes and leasing phone numbers for every apartment community in a city.

#### Analysts and proptech teams

Feed clean, typed rows into dashboards and models — coordinates for maps, tax history for yield, school ratings for scoring.

#### AI agents

One call returns flat JSON with stable field names, so an AI agent (through the Apify API or MCP) can answer "what 3-bed homes under $500k are for sale in 78704?" with real listings.

### Integrations

- **API**: start runs and read results from any language — see the API tab; Python (`apify-client`) and JavaScript (`apify-client`) are a few lines.
- **No-code**: Make, n8n, Zapier and Google Sheets connectors; webhooks when a run finishes.
- **Schedules**: run daily with **Only new homes** to get a feed of new listings or new sales, paid only for what is new.
- **MCP**: use the Actor as a tool from Claude, Cursor or any MCP client through Apify's MCP server.

### Migrating from another Redfin scraper?

| You used | Put it here |
|---|---|
| `searchUrls` / `startUrls` with Redfin search links | `startUrls` (filters in the link are kept) |
| `search` / `zipCodes` / city names | `locations` |
| `searchMode: SALE / SOLD / RENT`, `listingType: for_sale / sold` | `listingType: forSale / sold / forRent` |
| `soldWithinDays` | `soldWithinDays` (any 1–1825) |
| `minPrice`, `maxPrice`, `minBeds`, `maxBeds`, `minBaths` | same names |
| `maxResults` / `maxItems` | `maxItems` |
| `includeBelowTheFold` / `includePropertyDetails` | `includeDetails` |
| `monitorMode` | `onlyNewRowsStore` |

### Troubleshooting

- **A place returns the wrong city** — add the state: `Springfield, IL` instead of `Springfield`.
- **"Redfin cannot search a whole state at once"** — Redfin itself times out on whole states; list the cities or counties instead.
- **No results** — you get a free row saying which place and filters found nothing; loosen the filters.
- **Fewer homes than "match on Redfin"** — raise **Max homes in total**.
- **Description ends mid-sentence** — Redfin's search shortens long remarks; the rest is on the home page.

### ❓ FAQ

#### Is it legal to scrape Redfin?

The Actor collects only public listing information that anyone can see on redfin.com without logging in. Scraping public data is generally legal, but you are responsible for how you use it: check Redfin's terms, respect privacy laws (agent phone numbers are personal data under GDPR/CCPA-style rules) and do not republish listing photos or remarks as your own.

#### Do I need a Redfin account or proxies?

No. The Actor works without login and handles blocking itself: it goes direct first and steps up to residential proxies and an unblocker only for requests that get refused.

#### Which areas does it cover?

Every US place Redfin covers. Redfin's Canadian site is not supported.

#### How fresh is the data?

Live: every run reads Redfin at that moment.

#### Can I get only new listings every day?

Yes — give **Only new homes — memory name** any name and schedule the Actor. Homes delivered before under that name are skipped and not charged.

### Your feedback

Something missing or wrong? Open an issue on the Actor's **Issues** tab — we read every one and usually fix within days.

### You might also like

| Actor | What it does |
|---|---|
| [Zillow Scraper](https://apify.com/lergassy/zillow-scraper) | Homes for sale, sold and for rent from Zillow |
| [Zillow API](https://apify.com/lergassy/zillow-api) | Zillow property data through a fast API |
| [Craigslist Scraper](https://apify.com/lergassy/craigslist-scraper) | Housing, for-sale and job listings from any Craigslist city |

# Actor input Schema

## `locations` (type: `array`):

Give this or <code>startUrls</code>. One place per line, typed the way you would type it in Redfin's search box: a city with state (<code>Austin, TX</code>), a ZIP code (<code>78704</code>), a county (<code>Travis County, TX</code>), a neighborhood (<code>Travis Heights, Austin</code>) or a street address for one home. All places are searched in one run.

## `listingType` (type: `string`):

Homes for sale (active and coming soon), recently sold homes, or rentals (apartments, houses, condos, townhouses for rent).

## `soldWithinDays` (type: `integer`):

Only with <b>Sold</b>: how far back to look. Redfin's own choices are 7, 30, 90, 180, 365, 730, 1095 and 1825 days; any number from 1 to 1825 works.

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

Stop after this many homes across all locations. With several locations the limit is shared fairly: each gets an equal part, and what a small place cannot fill goes to the others.

## `includeDetails` (type: `boolean`):

Paid add-on, charged per home that gets details: price history (listed, price changes, sold), property tax history with assessed values, listing broker and agent with phone numbers, schools serving the home with GreatSchools ratings, parcel number (APN), county, Redfin Estimate and the full feature list (parking, heating, interior, exterior…). For homes for sale and sold; rentals already carry their phone and unit ranges.

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

Only homes priced at least this much in US dollars (monthly rent for rentals, sale price for sold homes).

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

Only homes priced at most this much in US dollars (monthly rent for rentals).

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

At least this many bedrooms.

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

At most this many bedrooms.

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

At least this many bathrooms (1, 1.5, 2, 3…).

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

At least this much living area, in square feet.

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

At most this much living area, in square feet.

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

Only these kinds of homes. Leave empty for all. For rentals Redfin knows house, condo, townhouse and apartment.

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

Only homes built in this year or later (for sale and sold).

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

Only homes built in this year or earlier (for sale and sold).

## `minLotSize` (type: `integer`):

Only homes on a lot at least this big, in square feet (1 acre = 43,560 sq ft). For sale and sold.

## `includeComingSoon` (type: `boolean`):

For sale only: also return homes marked Coming Soon (not yet open for showings), as redfin.com does by default. Switch off for active listings only.

## `sort` (type: `string`):

Order in which Redfin returns homes — matters when you take fewer than all of them.

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

Give this or <code>locations</code>. Paste Redfin pages exactly as you set them up in the browser: a city, ZIP code, county or neighborhood search with its filters (<code>https://www.redfin.com/city/30818/TX/Austin/filter/min-price=300k,max-price=600k,min-beds=3</code>), a sold search (<code>…/filter/include=sold-3mo</code>), rentals (<code>…/apartments-for-rent</code>) or single home pages (<code>…/home/31982122</code>). Filters in the address win over the fields above.

## `onlyNewRowsStore` (type: `string`):

Give this run a name — <code>my-austin-watch</code> — and the Actor remembers every listing it delivered under that name. Every later run with the same name writes and charges <b>only listings you have not received before</b> (a relisted home counts as new). Schedule the Actor daily to get a feed of new listings or new sales. Leave empty to get everything found, every time.

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

Not needed: the Actor reaches Redfin directly and switches to a residential proxy, then to an unblocker, by itself only for requests that get blocked. Set your own proxy only if you must, then it is used for every request.

## `includeRunSummary` (type: `boolean`):

One extra free row at the end with the run's totals: rows delivered, free rows, what was charged and how much in US dollars. It carries type "notice", so a filter on the data rows skips it. Switch off if your pipeline cannot tolerate an extra row.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "listingType": "forSale",
  "soldWithinDays": 90,
  "maxItems": 50,
  "includeDetails": false,
  "includeComingSoon": true,
  "sort": "recommended",
  "includeRunSummary": true
}
```

# Actor output Schema

## `homes` (type: `string`):

One row per Redfin home (type "home"), plus free rows for problems (type "error") and the run summary (type "notice").

## `allFields` (type: `string`):

Every field of every row, including description, price and tax history, schools and features.

# 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 = {
    "locations": [
        "Austin, TX"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/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 = {
    "locations": ["Austin, TX"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/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 '{
  "locations": [
    "Austin, TX"
  ],
  "maxItems": 50
}' |
apify call lergassy/redfin-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/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/iPfZZp9NJe3Ndmraj/builds/l7gvlM2AeLVledtMT/openapi.json
