# Redfin Scraper - Listings, Sold Comps, Estimates & Leads (`scrapesage/redfin-scraper`) Actor

Scrape Redfin for-sale & sold homes for any US city, ZIP, neighborhood or county: price, beds/baths/sqft, lot, year, HOA, Redfin Estimate, rent estimate, price history, schools, climate risk, photos & listing agent/broker. New-listing & price-drop monitoring. No login, key or browser.

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

## Pricing

from $4.00 / 1,000 property scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Redfin Scraper — Listings, Sold Comps, Estimates, Price History & Agent Leads

Extract **complete Redfin real-estate data** for any US city, ZIP, neighborhood or county — the fields most scrapers leave empty: **the Redfin Estimate, rent estimate, full price/sale history, assigned schools with ratings, climate-risk factors, tax & public records, building permits, every photo, and the listing agent & brokerage**. Pull live **for-sale** listings or recent **sold comps**, and monitor a market for **new listings and price drops**.

No login, no API key, no browser — fast JSON extraction straight from Redfin's public map/search data path.

### Why this Redfin scraper?

Most Redfin scrapers return the listing grid and stop. This actor opens each home's full record and ships the **richest dataset in the category**:

| Data | Typical scrapers | This actor |
|---|---|---|
| Price, beds, baths, sqft, lot, year, HOA, $/sqft | ✅ | ✅ |
| MLS #, status, source, days on market | partial | ✅ |
| **Redfin Estimate** (home value AVM) | ❌ | ✅ |
| **Rent estimate** (monthly, low/high) | ❌ | ✅ |
| **Full price & sale history** (with sources) | ❌ | ✅ |
| **Assigned schools** + GreatSchools & parent ratings | ❌ | ✅ |
| **Climate risk** (flood / fire / heat / wind) | ❌ | ✅ |
| **Tax & public records** (assessed values, taxes, APN) | ❌ | ✅ |
| **Building permits** | ❌ | ✅ |
| **Listing agent + phone + brokerage** | ❌ | ✅ |
| All photos, full description, features/amenities | partial | ✅ |
| Sold comps (CMA) by recency window | partial | ✅ |
| New-listing & price-drop monitoring | ❌ | ✅ |

### Use cases

- **Real-estate investing & analysis** — pull active listings *and* recent sold comps (CMA) for a ZIP, compare list price to the **Redfin Estimate** and **rent estimate**, screen by $/sqft, cap-rate inputs, lot size and year built.
- **Lead generation** — every active listing carries the **listing agent, phone and brokerage**. Build agent/brokerage prospect lists by market, price band, and volume.
- **Market & pricing intelligence** — track median price, days-on-market, price cuts and sell-through for any city, neighborhood or ZIP over time.
- **New-listing & price-drop alerts** — run in monitoring mode on a schedule to capture only homes that are new or whose price/status changed since the last run.
- **Proptech & valuation models** — feed clean, structured listings, sale history, tax records and climate risk into your own models, dashboards or CRM.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Redfin Scraper**, paste a Redfin city/ZIP/neighborhood/county URL (or just a list of ZIP codes), pick **For sale** or **Sold**, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "listingType": "for_sale",
    "searchUrls": ["https://www.redfin.com/city/11203/CA/Los-Angeles"],
    "zipCodes": ["90210", "78701"],
    "minPrice": 500000,
    "maxPrice": 2000000,
    "minBeds": 3,
    "propertyTypes": ["house", "condo"],
    "includePropertyDetails": true,
    "maxResults": 200
}
```

- **listingType** — `for_sale` (active, coming-soon & pending) or `sold` (recent comparable sales).
- **searchUrls** — Redfin **city / ZIP / neighborhood / county** page URLs. Browse Redfin, apply filters, copy the URL from your address bar — every home in that region is scraped.
- **zipCodes** — shortcut: a list of 5-digit US ZIP codes, each resolved to its Redfin region.
- **propertyUrls** — individual Redfin home URLs to scrape just those homes' full detail.
- **minPrice / maxPrice / minBeds / maxBeds / minBaths / propertyTypes** — listing filters.
- **soldWithinDays** *(sold only)* — 7 / 30 / 90 / 180 / 365 / 1095 days of comps.
- **sort** — recommended, newest, most-recently-sold, price, sqft, lot size, $/sqft.
- **includePropertyDetails** *(default true)* — open each home for the Redfin Estimate, rent estimate, price history, schools, climate risk, tax/public records, permits, photos and listing agent/brokerage (one extra page fetch per home).
- **maxResults / maxResultsPerSearch** — global and per-region caps.
- **monitorMode** *(default false)* — emit ONLY new or changed (price/status) listings vs. the previous run; pairs with [Schedules](https://docs.apify.com/platform/schedules).

### Output

One record per property:

```json
{
    "propertyId": 6824442,
    "url": "https://www.redfin.com/CA/Beverly-Hills/324-N-Palm-Dr-90210/unit-204/home/6824442",
    "fullAddress": "324 N Palm Dr #204, Beverly Hills, CA 90210",
    "price": 1395000,
    "beds": 3,
    "baths": 2,
    "sqFt": 1766,
    "pricePerSqFt": 790,
    "lotSizeSqFt": null,
    "yearBuilt": 1980,
    "hoaMonthly": 850,
    "propertyType": "Condo/Co-op",
    "mlsStatus": "Active",
    "mlsNumber": "26848017",
    "listingSource": "TheMLS",
    "saleType": "For sale",
    "daysOnMarket": 1,
    "city": "Beverly Hills",
    "state": "CA",
    "zip": "90210",
    "latitude": 34.0731,
    "longitude": -118.4004,
    "redfinEstimate": 1384281,
    "rentEstimate": 7168,
    "rentEstimateLow": 6900,
    "rentEstimateHigh": 7500,
    "listingAgentName": "Dustin Nicholas",
    "listingAgentPhone": "310-770-1847",
    "listingBrokerName": "Nicholas Property Group",
    "priceHistory": [
        { "date": "2026-06-15T07:00:00.000Z", "event": "Listed", "price": 1395000, "source": "TheMLS" }
    ],
    "schools": [
        { "name": "Beverly Vista", "type": "Public", "grades": "K-8", "rating": 8, "parentRating": 4, "distanceMiles": 0.6 }
    ],
    "climateRisk": { "floodFactor": 1, "fireFactor": 1, "heatFactor": 6, "windFactor": null },
    "publicRecords": { "yearBuilt": 1980, "totalSqFt": 1766, "apn": "4342003095", "propertyTaxes": 14817.27, "rollYear": 2025 },
    "photoCount": 35,
    "primaryPhoto": "https://ssl.cdn-redfin.com/photo/...",
    "scrapedAt": "2026-06-15T12:00:00.000Z"
}
```

In monitoring mode each record also carries `changeType` (`new` / `price_drop` / `price_increase` / `status_change`) and `previousPrice`.

Every record also includes `listingSource` (the MLS name, e.g. *Unlock MLS*) and `dataSourceId` — populated in **both** grid-only and full-detail runs.

### Pricing — pay per result, no start or subscription fee

You pay only for the depth you use:

| Event | Charged | Price |
|---|---|---|
| **Property scraped** | Every listing written to the dataset (grid record). | **$0.004** |
| **Property detail enriched** | Once per home whose full detail page is fetched (`includePropertyDetails` on, or any `propertyUrls`). | **$0.004** |

- **Grid-only** run (`includePropertyDetails: false`) → **$0.004 / home**
- **Full-detail** run (default) → **$0.008 / home** (listing + enrichment)

Example: 1,000 homes with full details = **$8.00**; the same 1,000 grid-only = **$4.00**. Apify platform compute & proxy usage is billed separately by Apify.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it hourly/daily to monitor a market for new listings and price drops.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/redfin-scraper').call({
    listingType: 'for_sale',
    zipCodes: ['78701'],
    minPrice: 400000,
    includePropertyDetails: true,
    monitorMode: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} Redfin properties`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new listings or agent leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored market gets new listings or price cuts.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find 3-bed houses under $800k in Austin and list the agents" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **property & local-market intelligence stack**:

- **[Rent.com Scraper](https://apify.com/scrapesage/rent-com-scraper)** — US apartment & rental listings with property-management leads.
- **[Craigslist Scraper](https://apify.com/scrapesage/craigslist-scraper)** — FSBO housing, real estate & classifieds with phone/email leads.
- **[Houzz Scraper](https://apify.com/scrapesage/houzz-scraper)** — home-improvement pros, contacts and reviews.
- **[Hipages Scraper](https://apify.com/scrapesage/hipages-scraper)** — Australian home-services trades with phone, ABN & licence.
- **[Companies House Scraper](https://apify.com/scrapesage/companies-house-scraper)** — UK companies, directors & PSCs.
- **[Insurance Agent Scraper](https://apify.com/scrapesage/insurance-agent-scraper)** — multi-carrier insurance-agent leads.
- **[Financial Advisor Scraper](https://apify.com/scrapesage/financial-advisor-scraper)** — FINRA & SEC adviser/firm leads.

### Tips

- **Big cities**: Redfin's map API returns up to ~350 homes per region. To exhaust a large market, scrape by **ZIP or neighborhood** (smaller regions) and/or narrow with price/beds — the actor caps per region and tells you when a region is maxed out.
- **Sold comps**: set `listingType: "sold"` and `soldWithinDays` for a comparable-sales (CMA) pull. The actor resolves each region's `market` automatically so sold results are accurate.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` to track only new listings and price drops.
- **Proxies**: keep the default **US residential** proxy — Redfin's CDN blocks datacenter IPs, so residential is required (and is the default). A fully blocked run **fails loudly** instead of returning an empty dataset.
- **Cost control**: turn off `includePropertyDetails` for a fast, listing-grid-only run — no per-home page fetch, and you pay only the base **$0.004/home** with no enrichment fee (see **Pricing** above).

### FAQ

**How do I scrape Redfin listings for a specific city or ZIP?** Paste the Redfin city/ZIP/neighborhood/county page URL into `searchUrls`, or just add the 5-digit ZIP to `zipCodes`. Combine with filters to narrow by price, beds or property type.

**Can I get recently sold homes (comps)?** Yes — set `listingType` to `sold` and choose a `soldWithinDays` window (7 days to 3 years). Each comp includes sale price, sale date, beds/baths/sqft and (with details on) full sale history.

**Where does the Redfin Estimate and rent estimate come from?** They are Redfin's own published on-page estimates, extracted from the home's public page — the same numbers a visitor sees.

**Does it include the listing agent's contact?** Yes — for active listings the listing agent name, phone (when published) and brokerage are included. They're blank only when Redfin/the MLS doesn't publish them.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor new listings automatically?** Turn on `monitorMode` and create a [Schedule](https://docs.apify.com/platform/schedules). Each run emits only homes that are new or changed since the last run, tagged with `changeType`.

**Is scraping Redfin legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws and Redfin's terms.

**A field is null — why?** Some homes genuinely don't publish an HOA, lot size, agent phone or estimate. Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

Scrape homes currently `For sale` (active, coming-soon & pending) or recently `Sold` (comparable sales for CMA / investor analysis).

## `searchUrls` (type: `array`):

Paste Redfin **city, ZIP, neighborhood or county** page URLs — e.g. `https://www.redfin.com/city/11203/CA/Los-Angeles`, `https://www.redfin.com/zipcode/90210`, `https://www.redfin.com/neighborhood/9719/CA/Los-Angeles/Hollywood`. Browse Redfin, apply any filters you like, then copy the URL from your address bar. Every listing in that region is scraped.

## `zipCodes` (type: `array`):

Optional shortcut — a list of 5-digit US ZIP codes (e.g. `78701`, `90210`). Each is resolved to its Redfin region and scraped. Use this instead of, or in addition to, Search URLs.

## `propertyUrls` (type: `array`):

Optional. Paste individual Redfin home URLs (`https://www.redfin.com/CA/Los-Angeles/123-Main-St-90001/home/12345678`) to scrape the full detail for just those homes (price history, Redfin Estimate, schools, climate risk, agent & brokerage).

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

Only keep homes priced at least this much (USD). Leave empty for no filter.

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

Only keep homes priced at most this much (USD). Leave empty for no filter.

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

Minimum number of bedrooms. Leave empty for no filter.

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

Maximum number of bedrooms. Leave empty for no filter.

## `minBaths` (type: `integer`):

Minimum number of bathrooms. Leave empty for no filter.

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

Limit to specific property types. Leave empty to include all.

## `soldWithinDays` (type: `string`):

For `Sold` listing type only — how far back to pull comparable sales.

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

Order in which listings are pulled (also controls which appear first when capped).

## `includePropertyDetails` (type: `boolean`):

Open each home's page for the rich detail layer: **Redfin Estimate, rent estimate, full price/sale history, assigned schools (with ratings), climate-risk factors, tax & public records, building permits, all photos, full description, and the listing agent & brokerage**. Turn off for a faster, listing-grid-only run (address, price, beds/baths/sqft, lot, year, status, MLS#, geo). Adds one page fetch per home.

## `maxResults` (type: `integer`):

Global cap on the total number of properties emitted in this run.

## `maxResultsPerSearch` (type: `integer`):

Cap per region (city/ZIP/neighborhood/county). Redfin's map API returns at most ~350 homes per region — narrow with price, beds or a smaller region (ZIP/neighborhood) for deeper coverage of large markets.

## `monitorMode` (type: `boolean`):

Remember listings already returned and emit ONLY homes that are **new** or whose **price/status changed** since the last run (tagged `changeType`: new / price\_drop / price\_increase / status\_change). Perfect for new-listing alerts and price-drop tracking. Pairs with Apify Schedules.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' listings for monitoring mode. Use a different name per tracked market to keep histories separate (lowercase letters, digits and hyphens).

## `maxConcurrency` (type: `integer`):

Maximum parallel requests. Keep it moderate to stay friendly to Redfin's servers.

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

Proxy settings. Redfin's CDN (CloudFront) blocks datacenter IPs and returns nothing, so **US residential proxies are required** — this is the default and should not be changed unless you supply your own US residential proxy. Datacenter proxies will produce empty runs.

## Actor input object example

```json
{
  "listingType": "for_sale",
  "searchUrls": [
    "https://www.redfin.com/zipcode/90210"
  ],
  "propertyTypes": [],
  "soldWithinDays": "90",
  "sort": "recommended",
  "includePropertyDetails": true,
  "maxResults": 200,
  "maxResultsPerSearch": 350,
  "monitorMode": false,
  "monitorStoreName": "redfin-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

All scraped Redfin properties in the default dataset. Use the Listings / Investor / Leads dataset views to filter the columns.

# 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 = {
    "searchUrls": [
        "https://www.redfin.com/zipcode/90210"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = { "searchUrls": ["https://www.redfin.com/zipcode/90210"] }

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

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

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

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.redfin.com/zipcode/90210"
  ]
}' |
apify call scrapesage/redfin-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/redfin-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/I8QdP3hK8gG9pwBFg/builds/dNmHOOYvoR04pyJhQ/openapi.json
