# Real Estate Listings & Property Data — Redfin Scraper (`jungle_synthesizer/redfin-scraper`) Actor

Scrape real estate listings and property data from Redfin — homes for sale, recently sold, and rentals. Returns price, beds, baths, sqft, address, coordinates, MLS status, year built, days on market, and sold prices. Search by city, ZIP, or Redfin URL. Covers MLS for-sale, sold, and rental listings.

- **URL**: https://apify.com/jungle\_synthesizer/redfin-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 2 monthly users, 96.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#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

## Real Estate Listings & Property Data Scraper — Redfin

Scrape real estate listings and property data from [Redfin](https://www.redfin.com) — homes for sale, recently sold, and rentals. Returns price, beds, baths, sqft, address, coordinates, MLS status, year built, days on market, and sold prices for any US city, ZIP code, or Redfin search URL.

***

### Redfin Scraper Features

- Extracts 25+ fields per listing — price, beds, baths, sqft, lot size, price/sqft, address, coordinates, MLS status, year built, days on market, HOA, and more.
- Covers all three listing types: for sale, recently sold, and for rent. One input flips between them.
- Filters by property type — house, condo, townhouse, land, multi-family, or mobile. Leave it empty and you get everything.
- Accepts a bare ZIP code or any Redfin search URL (city, neighborhood, county, or ZIP). Copy the URL, paste it, run.
- No accounts and no MLS login — paste a ZIP code or Redfin URL and get every matching listing back.
- Returns clean, structured JSON with consistent field names, which puts it ahead of copying rows out of a browser like it's 2009.

***

### Who Uses Redfin Real Estate Data?

- **Real estate investors** — build comps and spot underpriced listings before they move.
- **Proptech and analytics teams** — feed live for-sale and sold data into pricing models, or at least the dataset that makes them possible.
- **Agents and brokers** — track new listings and days-on-market across the ZIP codes you actually work.
- **Market researchers** — measure housing supply, price-per-sqft trends, and sold-price movement by city.
- **Lead-gen and CRM builders** — pull addresses and listing details into your pipeline on a schedule.
- **Data journalists** — pull sold-price and inventory data for a market without asking three brokerages for a spreadsheet.

***

### How Redfin Scraper Works

1. **Give it a location** — a US ZIP code (`98101`) or a Redfin search URL for a city, neighborhood, county, or ZIP.
2. **Pick a listing status** — `for_sale`, `sold`, or `for_rent`.
3. **Optionally filter by property type** — or leave it blank for all of them.
4. The scraper handles pagination and rate limiting, then returns every matching listing as structured JSON. You point it at a market and walk away.

***

### Input

```json
{
  "location": "https://www.redfin.com/city/29470/WA/Seattle",
  "status": "for_sale",
  "propertyTypes": ["house", "condo", "townhouse"],
  "maxItems": 100
}
```

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `location` | string | — | Redfin search URL or a US ZIP code. City, neighborhood, county, and ZIP URLs all work. |
| `status` | string | `for_sale` | Listing status: `for_sale`, `sold`, or `for_rent`. |
| `propertyTypes` | array | `["house","condo","townhouse"]` | Filter by type: `house`, `condo`, `townhouse`, `land`, `multi-family`, `mobile`, `other`. Empty = all types. |
| `maxItems` | integer | `100` | Maximum listings to return (max 1000 per search). |

#### Finding your Redfin URL

1. Search a city, neighborhood, county, or ZIP on [redfin.com](https://www.redfin.com).
2. Copy the URL from the search results page. It looks like one of these:
   - City: `https://www.redfin.com/city/29470/WA/Seattle`
   - Neighborhood: `https://www.redfin.com/neighborhood/108094/WA/Seattle/Capitol-Hill`
   - County: `https://www.redfin.com/county/1678/WA/King-County`
   - ZIP: `https://www.redfin.com/zipcode/98101`

Filter suffixes in the URL (like `/filter/property-type=house`) are ignored — use the `propertyTypes` field instead.

#### Example: recently sold condos

```json
{
  "location": "98101",
  "status": "sold",
  "propertyTypes": ["condo"],
  "maxItems": 200
}
```

***

### Redfin Scraper Output Fields

```json
{
  "listingId": 178452201,
  "propertyId": 45012788,
  "mlsId": "2245981",
  "mlsStatus": "Active",
  "url": "https://www.redfin.com/WA/Seattle/1521-2nd-Ave-98101/unit-1802/home/45012788",
  "price": 875000,
  "beds": 2,
  "baths": 2,
  "fullBaths": 2,
  "sqFt": 1180,
  "lotSize": null,
  "pricePerSqFt": 742,
  "propertyType": 2,
  "yearBuilt": 2009,
  "address": "1521 2nd Ave #1802",
  "city": "Seattle",
  "state": "WA",
  "zip": "98101",
  "latitude": 47.610378,
  "longitude": -122.339709,
  "daysOnMarket": 12,
  "hoaPerMonth": 985,
  "listingRemarks": "Corner unit with Elliott Bay views...",
  "numPhotos": 34,
  "isNewConstruction": false,
  "soldDate": null,
  "stories": 1,
  "timeZone": "US/Pacific",
  "scrapedAt": "2026-08-06T04:12:55.019Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | number | Redfin internal listing ID |
| `propertyId` | number | Redfin internal property ID |
| `mlsId` | string | MLS listing number |
| `mlsStatus` | string | MLS status (Active, Coming Soon, Pending, Sold, etc.) |
| `url` | string | Full Redfin listing URL |
| `price` | number | Listing price in USD |
| `beds` | number | Number of bedrooms |
| `baths` | number | Total bathrooms |
| `fullBaths` | number | Full bathrooms |
| `sqFt` | number | Square footage |
| `lotSize` | number | Lot size in square feet |
| `pricePerSqFt` | number | Price per square foot in USD |
| `propertyType` | number | Property type code (1=house, 2=condo, etc.) |
| `yearBuilt` | number | Year the property was built |
| `address` | string | Full street address |
| `city` | string | City name |
| `state` | string | State abbreviation |
| `zip` | string | ZIP/postal code |
| `latitude` | number | Property latitude |
| `longitude` | number | Property longitude |
| `daysOnMarket` | number | Days the listing has been on market |
| `hoaPerMonth` | number | HOA fee per month in USD (null if none) |
| `listingRemarks` | string | Listing description text |
| `numPhotos` | number | Number of listing photos available |
| `isNewConstruction` | boolean | Whether the property is new construction |
| `soldDate` | string | Date sold (ISO 8601, null if not sold) |
| `stories` | number | Number of stories |
| `timeZone` | string | Property time zone |
| `scrapedAt` | string | ISO 8601 timestamp when the record was collected |

***

### 🔍 FAQ

#### How do I scrape real estate listings from Redfin?

Redfin Scraper takes a ZIP code or a Redfin search URL and returns every matching listing as JSON. Pick a status (`for_sale`, `sold`, or `for_rent`), optionally filter by property type, and set `maxItems`. That's the whole setup.

#### What data can I get from Redfin?

Redfin Scraper returns 25+ fields per listing — price, beds, baths, square footage, lot size, price-per-sqft, full address, coordinates, MLS status and number, year built, days on market, HOA, listing remarks, and sold date. Enough to build comps without opening a single browser tab.

#### Can I get recently sold prices and rentals, not just active listings?

Yes. Set `status` to `sold` for recently sold homes with their sold prices and dates, or `for_rent` for rentals. The default is `for_sale`.

#### Do I need any accounts or setup to use Redfin Scraper?

Redfin Scraper needs no accounts and no MLS login. Paste a ZIP code or Redfin URL, pick a status, and it returns every matching listing as JSON.

#### How many listings can I get per search?

Redfin Scraper returns up to 1000 listings per search — most Redfin regions cap there. For larger areas, narrow the search to a specific neighborhood or ZIP code and run those separately.

***

### Need More Features?

Need custom fields, a different filter, or another real-estate source? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use Redfin Scraper?

- **Affordable** — pay-per-result pricing, no monthly minimum.
- **Complete output** — 25+ structured fields per listing with consistent names, so you spend less time cleaning data and more time using it.
- **No setup** — no accounts and no MLS login. Paste a ZIP and get listings back.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

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

Redfin search URL (https://www.redfin.com/city/29470/WA/Seattle) or US ZIP code (e.g. 98101). City/neighborhood/county Redfin URLs are all supported. Copy the URL from your Redfin search results page.

## `status` (type: `string`):

Filter by listing status. "for\_sale" returns active listings, "sold" returns recently sold, "for\_rent" returns rentals.

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

Filter by property type. Leave empty for all types. Valid values: house, condo, townhouse, land, multi-family, mobile, other.

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

Maximum number of listings to return (default 100, max 1000 per search).

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "location": "https://www.redfin.com/city/29470/WA/Seattle",
  "status": "for_sale",
  "propertyTypes": [
    "house",
    "condo",
    "townhouse"
  ],
  "maxItems": 10
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "location": "https://www.redfin.com/city/29470/WA/Seattle",
    "status": "for_sale",
    "propertyTypes": [
        "house",
        "condo",
        "townhouse"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "location": "https://www.redfin.com/city/29470/WA/Seattle",
    "status": "for_sale",
    "propertyTypes": [
        "house",
        "condo",
        "townhouse",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "location": "https://www.redfin.com/city/29470/WA/Seattle",
  "status": "for_sale",
  "propertyTypes": [
    "house",
    "condo",
    "townhouse"
  ],
  "maxItems": 10
}' |
apify call jungle_synthesizer/redfin-scraper --silent --output-dataset

```

## MCP server setup

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