# Real Estate Property Scraper (`datapilot/real-estate-property-scraper`) Actor

Extract property prices, addresses, bedrooms, bathrooms, square footage, property types, and listing URLs from Redfin. Supports multiple locations, , network data capture, DOM fallback, and Apify Residential Proxy.

- **URL**: https://apify.com/datapilot/real-estate-property-scraper.md
- **Developed by:** [Data Pilot](https://apify.com/datapilot) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 scraped results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

🏠 **Real Estate Property** Scraper is a powerful Apify Actor designed to discover, track, and collect public **Real Estate Property** listing data directly from Redfin using a full browser engine with network interception. This tool provides comprehensive **Real Estate Property** intelligence including price, address, bedrooms, bathrooms, square footage, and property type for listings across any searched location. Whether you're building a real estate dashboard, tracking market pricing, or conducting property research, the Real Estate Property Scraper delivers actionable **Real Estate Property** insights efficiently.

With direct  browser automation, live network response interception, DOM-based fallback parsing, and reliable Apify Dataset delivery, the Real Estate Property Scraper ensures comprehensive **Real Estate Property** coverage across any list of search locations. It focuses on key **Real Estate Property** signals including price, address, and listing details, making it an essential tool for market research and property intelligence.

***

### 📋 Table of Contents

- [Features](#-features)
- [Data Source](#-data-source)
- [How It Works](#-how-it-works)
- [Input](#-input)
- [Output](#-output)
- [Technical Stack](#-technical-stack)
- [Data Fields](#-data-fields-explained)
- [Use Cases](#-use-cases)
- [Quick Start](#-quick-start)
- [Configuration](#-configuration)
- [Performance](#-performance)
- [Important Notes](#-important-notes)
- [License & Legal](#-license--legal)

***

### 🔥 Features

- **Real Browser Automation** – Uses  with headless Chromium to search and render **Real Estate Property** listings exactly as a real visitor would.
- **Network Response Interception** – Captures Redfin's internal GIS API payloads directly for the most complete **Real Estate Property** data available.
- **DOM Fallback Parsing** – Falls back to scraping visible listing cards on the page when network interception doesn't capture data.
- **Anti-Bot Bypass Script** – Injects a script to mask automation signals and reduce **Real Estate Property** search blocking.
- **Multi-Location Search** – Accepts one or more search locations and processes each **Real Estate Property** search in sequence.
- **Warm-Cookie Navigation** – Visits the homepage first to build session cookies before searching, improving **Real Estate Property** search reliability.
- **Configurable Result Cap** – Limits the number of **Real Estate Property** listings collected per run via `maxItems`.
- **Auto-Scroll Rendering** – Scrolls the results page to force additional **Real Estate Property** cards to load.
- **Residential Proxy Support** – Apify residential proxy routed through  for reliable **Real Estate Property** access.
- **Deduplication** – Filters out duplicate **Real Estate Property** listings by URL within each location search.
- **Real-Time Dataset Push** – Pushes all collected **Real Estate Property** records to Apify Dataset in a single batch.
- **Graceful Error Handling** – Skips a failing location without stopping the whole run.

***

### 📊 Data Source

#### **Redfin Public Listing Search**

- **Authority**: Redfin's own public-facing property search and listing pages
- **Access Method**: Headless Chromium browser via Playwright, combined with interception of Redfin's internal `api/gis` network responses
- **Coverage**: Any searchable location on Redfin (city, neighborhood, ZIP code, or address)
- **Data**: Price, address, bedrooms, bathrooms, square footage, and property type
- **Access**: Public search interface, no API key required
- **Update Frequency**: Reflects Redfin's current live listings at time of run

***

### ⚙️ How It Works

The Real Estate Property Scraper accepts one or more search locations and drives a real headless Chromium browser through Redfin's homepage and search flow for each one. While the browser navigates, the Actor listens for Redfin's internal `api/gis` network responses and captures the raw listing payload directly — the most complete source of **Real Estate Property** data. If no network data is intercepted, the Actor falls back to parsing visible listing cards from the rendered page DOM using a combination of CSS selectors and text-pattern matching for price, address, beds, baths, and square footage. All collected **Real Estate Property** records across every location are pushed to the Apify Dataset in a single batch at the end of the run.

**Key Processing Steps:**

1. **Input Parsing** – Accept one or more search locations and a maximum item cap
2. **Proxy Setup** – Configure Apify residential proxy and pass credentials into Playwright
3. **Browser Launch** – Start headless Chromium with anti-automation-detection flags and script injection
4. **Location Loop** – Iterate through each requested **Real Estate Property** search location
5. **Homepage Warm-Up** – Navigate to Redfin's homepage first to establish session cookies
6. **UI Search** – Fill the search box, select a suggestion, and submit the **Real Estate Property** search
7. **Network Interception** – Capture and parse `api/gis` JSON responses as they stream in
8. **Auto-Scroll** – Scroll the results page to trigger additional card rendering
9. **DOM Fallback Parsing** – Extract listing details directly from rendered cards if no network data was captured
10. **Deduplication** – Remove duplicate **Real Estate Property** listings by URL
11. **Result Capping** – Stop collecting once `maxItems` is reached for a location
12. **Dataset Push** – Push all collected records from every location in a single batch

**Key Benefits:**

- Pull **Real Estate Property** listings for any location without manual searches
- Capture rich, structured listing data straight from Redfin's own API responses
- Fall back gracefully to visible page data when the network layer changes
- Feed market-analysis dashboards, research pipelines, or investment tools
- Automate recurring **Real Estate Property** checks as new listings appear

***

### 📥 Input

The Actor accepts the following input parameters:

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchLocations` | array | *(required)* | List of locations to search (city, ZIP, neighborhood, or address). |
| `searchLocation` | string | `"New York, NY"` | Single-location fallback used if `searchLocations` is not provided. |
| `maxItems` | integer | `30` | Maximum number of **Real Estate Property** listings to collect per location. |
| `useApifyProxy` | boolean | `true` | Enable Apify residential proxies. |

**Example Input:**

```json
{
  "searchLocations": ["Austin, TX", "Denver, CO"],
  "maxItems": 40,
  "useApifyProxy": true
}
```

**Search a Single Location:**

```json
{
  "searchLocation": "Miami, FL"
}
```

**Search Multiple Locations with a Higher Cap:**

```json
{
  "searchLocations": ["Seattle, WA", "Portland, OR", "San Diego, CA"],
  "maxItems": 60
}
```

***

### 📤 Output

The Actor pushes **Real Estate Property** records with the following structure:

| Field | Type | Description |
|-------|------|-------------|
| `title` | string | Listing title, typically the property address |
| `price` | string | Listing price, formatted as displayed or parsed from the page |
| `address` | string | Full street address of the **Real Estate Property** |
| `bedrooms` | integer/string | Number of bedrooms, or `"N/A"` if not detected |
| `bathrooms` | number/string | Number of bathrooms, or `"N/A"` if not detected |
| `square_feet` | string | Square footage of the **Real Estate Property**, or `"N/A"` if not detected |
| `property_type` | string | Property type (e.g., Single Family, Condo), when available |
| `listing_url` | string | Direct URL to the **Real Estate Property** listing page |

**Example Real Estate Property Record:**

```json
{
  "title": "123 Main St, Austin, TX 78701",
  "price": "$525,000.00",
  "address": "123 Main St, Austin, TX 78701",
  "bedrooms": 3,
  "bathrooms": 2.5,
  "square_feet": "1,850",
  "property_type": "Single Family Residential",
  "listing_url": "https://www.redfin.com/TX/Austin/123-Main-St/home/12345678"
}
```

***

### 🧰 Technical Stack

- **Browser Automation:**  with headless Chromium for real **Real Estate Property** search rendering
- **Network Interception:** In-browser response listener capturing Redfin's `api/gis` JSON payloads
- **DOM Parsing:** In-page JavaScript evaluation with CSS selectors and regex text matching
- **Async:** `asyncio` for non-blocking, multi-location processing
- **Proxy:** Apify Proxy with `RESIDENTIAL` configuration, wired into Playwright's proxy settings
- **Logging:** Apify Actor logging system
- **Platform:** Apify Actor serverless environment

***

### 📊 Data Fields Explained

#### **Listing Identification**

- **title / listing\_url**: The display title and direct link to the **Real Estate Property** listing
- **address**: The full parsed street address of the property

#### **Pricing**

- **price**: The listing price, sourced from Redfin's API payload or the rendered price element

#### **Property Details**

- **bedrooms / bathrooms / square\_feet**: Core size and layout metrics for the **Real Estate Property**
- **property\_type**: The property category as classified by Redfin, when available

***

### 🎯 Use Cases

- **Market Research** – Analyze **Real Estate Property** pricing trends across neighborhoods or cities
- **Investment Screening** – Identify properties matching specific price or size criteria
- **Competitive Analysis** – Compare listing inventory across multiple target markets
- **Relocation Planning** – Survey housing options and pricing in a new city
- **Real Estate Dashboards** – Feed live listing data into internal market-tracking tools
- **Academic Research** – Study housing market trends at scale
- **Lead Generation** – Build a dataset of active **Real Estate Property** listings for outreach
- **Appraisal Support** – Gather comparable listing data for valuation reference

***

### 🚀 Quick Start

#### **1. Prepare Input**

Go to Apify Console and enter:

```json
{
  "searchLocations": ["Austin, TX"],
  "maxItems": 30
}
```

#### **2. Run the Actor**

Click **Start**. The Actor will:

- Warm up a session on Redfin's homepage
- Search each requested location through the UI
- Intercept live listing data or fall back to DOM parsing
- Push all results to the Dataset

#### **3. Monitor Progress**

Console shows:

```
[Real Estate Scraper] Target locations: ['Austin, TX']
--- Processing Location: 'Austin, TX' ---
Navigating to Redfin homepage...
Searching for 'Austin, TX'...
Waiting for property page rendering...
Intercepted 24 listings from network stream!
Done! Successfully saved total 24 property record(s).
```

#### **4. View & Download Results**

- **Results Tab**: All **Real Estate Property** records
- **Export**: JSON, CSV, Excel, or HTML
- **Filter**: By price, bedrooms, bathrooms, or property type
- **API Access**: Available via the Apify API

***

### ⚙️ Configuration

Single location, default cap:

```json
{
  "searchLocation": "Chicago, IL"
}
```

Multiple locations with higher cap:

```json
{
  "searchLocations": ["Austin, TX", "Nashville, TN"],
  "maxItems": 50
}
```

Run without proxy:

```json
{
  "searchLocation": "Boise, ID",
  "useApifyProxy": false
}
```

***

### 📈 Performance

#### **Processing Speed**

- One full browser search flow per location, including homepage warm-up and result rendering
- \~10 seconds of settle/scroll time per location to allow **Real Estate Property** cards to load
- Scales with the number of locations searched and `maxItems` requested

#### **Resource Usage**

- Memory: Moderate to high, due to running a real Chromium browser instance with network interception
- Network: Multiple requests per location, including homepage, search, and intercepted API calls
- Proxy: One residential proxy session shared across the browser context for the run

***

### ⚠️ Important Notes

#### **Legal & Compliance**

- **Fair Use**: Respects Redfin's public search interface and applies pacing delays between requests
- **Public Data Only**: Retrieves only publicly visible **Real Estate Property** listing data
- **Terms of Service**: Automated collection may be subject to Redfin's Terms of Service — review before large-scale or commercial use
- **Legal**: Not legal, financial, or investment advice — consult qualified professionals before acting on this data

#### **Data Quality**

- **Freshness**: Reflects Redfin's live listings at time of run
- **Completeness**: DOM fallback parsing may return `"N/A"` for fields not visible on the page
- **Accuracy**: Network-intercepted data is generally more complete and accurate than DOM-fallback data
- **Verification**: Cross-check high-stakes figures (price, availability) against the live Redfin website

#### **Best Practices**

- Always configure a residential proxy for the most reliable **Real Estate Property** search access
- Use specific, well-formatted locations (e.g., "City, ST" or ZIP code) for the most reliable search matches
- Keep `maxItems` reasonable per location to control run time and resource usage
- Re-run periodically to track new listings or price changes
- Expect some fields to read `"N/A"` when a run falls back to DOM parsing

***

### 📄 License & Legal

**Terms of Use:**

- Use for legitimate market research, investment analysis, and personal property search
- Respect Redfin's Terms of Service
- Do not use for unauthorized commercial redistribution of listing data
- Use **Real Estate Property** data responsibly and in compliance with applicable laws

**Disclaimer:**
Real Estate Property Scraper is provided as-is for research purposes. Users are responsible for compliance with Redfin's ToS and all applicable laws. This is not legal, financial, or investment advice.

***

### ⚖️ Real Estate Property Excellence

This Actor is optimized for **Real Estate Property** research with:

- ✅ Live network-level data interception
- ✅ Resilient DOM fallback parsing
- ✅ Multi-location batch search support
- ✅ Anti-bot bypass for reliable access
- ✅ Real-time Dataset push
- ✅ Production-ready code

# Actor input Schema

## `searchLocation` (type: `string`):

Enter City, State, or Zip Code to search (e.g. New York, NY)

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

Maximum number of properties to scrape

## `useApifyProxy` (type: `boolean`):

Enable Residential Proxy to avoid anti-bot blocking

## Actor input object example

```json
{
  "searchLocation": "New York, NY",
  "maxItems": 50,
  "useApifyProxy": true
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("datapilot/real-estate-property-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("datapilot/real-estate-property-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 '{}' |
apify call datapilot/real-estate-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datapilot/real-estate-property-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/rvZk9iDRrOB92Koqb/builds/dmROAe1VWYShB7E00/openapi.json
