# Redfin Scraper — For-Sale & Sold, 27 Fields, No Login (`themineworks/redfin-scraper`) Actor

Scrape Redfin for-sale and recently-sold listings by city or zip: price, beds, baths, sqft, price/sqft, agent, MLS, coordinates and photos. No login, no API key. Use as an MCP server in Claude & AI agents.

- **URL**: https://apify.com/themineworks/redfin-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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: For Sale & Sold Property Data

> **Part of the Real Estate MCP.** This actor's data is also available to AI agents through our [Real Estate MCP server](https://apify.com/themineworks/real-estate-mcp) — eight listing, sales and rental-market tools behind one endpoint. No result, no charge.

> ⚡ Part of a 69-scraper suite trusted by 450+ developers across 8,000+ runs · >99% run success · no login, no cookies, no ban risk.

> 💸 You're only charged for delivered results. Empty searches, failed pages and duplicate listings are never billed.

### Overview

Redfin Scraper extracts real estate listings from Redfin.com by city, ZIP code, or Redfin URL, returning clean, structured JSON for every for-sale and recently-sold property. No login, no API key, no browser automation. Point it at `"Austin, TX"` or a Redfin search URL, and get back price, beds, baths, square footage, price per sqft, listing agent, broker, MLS ID, coordinates, and photo URL for hundreds of homes in a single run.

Built lean and HTTP-only, powered by Apify residential proxies. Ideal for real estate investors, brokerages, PropTech tools, market analysts, and AI agents that need live housing data.

✅ No login | ✅ No API key | ✅ HTTP only (fast) | ✅ MCP-ready for AI agents

Reliability: blocked, empty, or failed pages are never charged. You only pay for property records actually delivered to your dataset.

### Features

Search by city, ZIP code, or paste any Redfin search or listing URL.
Filter by sold-within days for a recent-sold feed, or focus on active for-sale.
Price and bedroom filters to narrow to your target segment.
Listing agent, broker, and MLS ID in every record for downstream outreach.
Same output whether you consume it via CSV, JSON, Excel, API, or MCP tool call.

### How it works

Redfin publishes its listings on a fast internal JSON feed that powers its own map view. This actor talks to that feed directly, rather than rendering a full browser, which is why it runs in a fraction of the time and cost of a Playwright scraper. Residential proxies keep runs steady, and the parser handles both for-sale and recently-sold layouts.

Every record is flat. Address, price, beds/baths/sqft, coordinates, and listing agent live at the top level. There is no HTML in the records, no per-tile parsing on your side, no manual pagination.

### 🧾 Input configuration

```json
{
  "location": "Austin, TX",
  "redfinUrl": null,
  "maxItems": 500,
  "soldWithinDays": 30,
  "minPrice": 300000,
  "maxPrice": 900000,
  "minBeds": 3,
  "proxyConfig": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "countryCode": "US" }
}
```

### 📤 Output format

Real record captured from a live run against `"Austin, TX"`:

```json
{
  "propertyId": "32757422",
  "mlsId": "117021",
  "address": "12410 Burlywood Trl",
  "city": "Austin",
  "state": "TX",
  "zip": "78750",
  "price": 460000,
  "beds": 3,
  "baths": 2.5,
  "sqft": 2090,
  "lotSize": 10410,
  "pricePerSqft": 220,
  "yearBuilt": 1978,
  "propertyType": "Other",
  "status": "Coming Soon",
  "listingType": "6",
  "daysOnMarket": 5,
  "soldDate": "2017-01-09",
  "latitude": 30.4628173,
  "longitude": -97.806229,
  "listingAgentName": "Monica DiSchiano",
  "isNewConstruction": false,
  "url": "https://www.redfin.com/TX/Austin/12410-Burlywood-Trl-78750/home/32757422",
  "scraped_at": "2026-07-15T01:15:15.112Z"
}
```

Field availability depends on what Redfin publishes for each listing. Null fields (for example `hoaFee` or `photoUrl` when Redfin does not expose them for a given record) are omitted rather than sent as null.

Every property record contains these fields:

| Field | Description |
| --- | --- |
| 🆔 `propertyId` | Redfin internal property ID |
| 🗂️ `mlsId` | MLS listing ID |
| 📍 `address` | Street address |
| 🏙️ `city` | City |
| 🗺️ `state` | State abbreviation |
| 📮 `zip` | ZIP code |
| 💰 `price` | List or sold price in USD |
| 🛏️ `beds` | Bedroom count |
| 🛁 `baths` | Bathroom count |
| 📐 `sqft` | Interior square footage |
| 🌳 `lotSize` | Lot size in sq ft |
| 💵 `pricePerSqft` | Price per square foot |
| 🏗️ `yearBuilt` | Year built |
| 🏠 `propertyType` | Property type |
| 🏷️ `status` | Active, Pending, Sold, etc. |
| 📆 `daysOnMarket` | Days on market |
| 📅 `soldDate` | Sold date if applicable |
| 🌐 `latitude` / `longitude` | Geocoordinates |
| 💳 `hoaFee` | Monthly HOA fee |
| 👤 `listingAgentName` | Listing agent name |
| 🏢 `listingBrokerName` | Listing brokerage name |
| 🖼️ `photoUrl` | Primary listing photo URL |
| 🔗 `url` | Direct Redfin listing URL |
| 🕒 `scraped_at` | ISO timestamp of capture |

### 💼 Common use cases

**Real estate investing**
Scan every recent sold in a ZIP to build a comp set for underwriting.
Filter by beds, price, and sold-within days for a live off-market flip pipeline.

**Brokerage and agent tools**
Give agents a live pipeline of new listings in their farm area.
Track competitor agents by pulling `listingAgentName` from every new listing in a ZIP.

**PropTech and analytics**
Feed a valuation model with fresh comps daily.
Build a rental or price-per-sqft dashboard for any US metro.

**AI real estate copilots**
Give an agent live listing data so it can answer "what sold in Austin under $700K last month?"
Wire an MCP tool into Claude or ChatGPT for on-demand market research.

### 🚀 Getting started

1. Open the actor and set `location` (e.g. `"Austin, TX"` or a ZIP), or paste any Redfin URL into `redfinUrl`.
2. Set `soldWithinDays` for a recent-sold feed, or leave empty for active listings only.
3. Add price and bedroom filters if you want to narrow the run.
4. Set `maxItems` to cap volume.
5. Click Start, then download the dataset as JSON, CSV, or Excel, or pull it via API or MCP.

### FAQ

**Do I need a Redfin login?**
No. It reads only public listing data, no cookies, no seat cost.

**How current is the sold data?**
Sold status updates flow into Redfin within hours of MLS reporting. Set `soldWithinDays: 30` for a rolling one-month sold feed.

**Can I paste a Redfin URL directly?**
Yes. Any Redfin search URL, city page, or ZIP page works in the `redfinUrl` field, filters and all.

**How much does it cost?**
$2 per 1,000 property records delivered. You pay only for records actually delivered, and there is no free tier. Empty runs cost nothing.

**Can I use it inside an AI agent?**
Yes. It is exposed as an MCP tool. See below.

### Use in Claude, ChatGPT & any MCP agent

```
https://mcp.apify.com/?tools=themineworks/redfin-scraper
```

Or call it programmatically with the Apify client:

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

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

const run = await client.actor('themineworks/redfin-scraper').call({
  location: 'Austin, TX',
  soldWithinDays: 30,
  minPrice: 300000,
  maxItems: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### 🛠️ Related real estate actors

Pair this actor with the rest of the themineworks real estate wedge:

- **[Zillow Search Scraper](https://apify.com/themineworks/zillow-search-scraper)**: cross-check the same market's for-sale inventory on Zillow.
- **[Zillow Property Details](https://apify.com/themineworks/zillow-property-details)**: cross-reference Zillow price history and Zestimate for the same properties.
- **[Zillow Recently Sold](https://apify.com/themineworks/zillow-recently-sold)**: pull Zillow sold comps for the same market.
- **[Zillow Rental Listings](https://apify.com/themineworks/zillow-rental-listings)**: compare buy vs rent with Zillow for-rent listings.
- **[Realtor.com Scraper](https://apify.com/themineworks/realtor-scraper)**: cross-check Realtor.com listings with agent and brokerage data.
- **[99acres Scraper](https://apify.com/themineworks/99acres-scraper)**: India rent, buy, PG, and commercial listings.
- **[Google Maps Leads Scraper](https://apify.com/themineworks/maps-leads)**: prospect local real estate services (movers, inspectors, lenders) around a hot ZIP.
- **[Yellow Pages US Scraper](https://apify.com/themineworks/yellowpages-us)**: pull broker and agent contact info by city.

Typical flow: redfin-scraper builds the comp set, zillow-property-details fills in price history and estimates, maps-leads finds the local service providers around a target property.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.

# Actor input Schema

## `location` (type: `string`):

City, neighborhood or ZIP code to search (e.g. "Austin, TX", "90210", "Seattle, WA").

## `redfinUrl` (type: `string`):

Optionally paste a Redfin city/search URL (e.g. https://www.redfin.com/city/30818/TX/Austin) to scrape that exact region. Overrides the location field.

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

Maximum number of properties to scrape. First 25 lifetime are free.

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

Leave empty for for-sale listings. Set to 7, 30, 90, 180 or 365 to scrape recently-sold homes instead.

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

Only return properties priced at or above this value.

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

Only return properties priced at or below this value.

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

Only return properties with at least this many bedrooms.

## `proxyConfig` (type: `object`):

Apify proxy settings. US residential recommended for Redfin.

## Actor input object example

```json
{
  "location": "Austin, TX",
  "maxItems": 5,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "location": "Austin, TX",
    "maxItems": 5,
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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 = {
    "location": "Austin, TX",
    "maxItems": 5,
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/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 '{
  "location": "Austin, TX",
  "maxItems": 5,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call themineworks/redfin-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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