# Redfin Details Scraper (Cheap) (`data_api/redfin-details-scraper-cheap`) Actor

Redfin real estate scraper that pulls property listings, prices, photos, and agent info from any Redfin city or zipcode page, so you can build market analyses without manual data entry.

- **URL**: https://apify.com/data\_api/redfin-details-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Details Scraper

Copying Redfin listings into a spreadsheet by hand burns an afternoon and still leaves gaps. This scraper does the typing for you: paste a Redfin city page, a ZIP search, or a single home URL and get back clean rows with the asking price, beds, baths, square footage, photos, agent, brokerage, and map coordinates. Feed it one link or a whole city.

![Redfin Details Scraper](cover.jpg)

### What you get

Every property comes back as one tidy row with a steady set of columns, so results drop straight into a sheet or database. Fields that a listing does not publish come back empty instead of disappearing. Each row groups into:

- **Location** — `streetLine`, `cityName`, `stateCode`, `postalCode`, `countryCode`, plus `geoLat` / `geoLng`
- **Price and status** — `listPrice`, `currencyCode`, `saleStatus`, `daysListed`
- **Home details** — `bedroomCount`, `bathroomCount`, `floorAreaSqft`, `propertyType`, `constructionYear`, `lotArea`, `hoaCost`, `parkingDetails`, `featureList`
- **Listing extras** — `listingDescription`, `mlsId`, `schoolDetails`, `listingAgent`, `brokerageFirm`
- **Photos** — `coverPhoto` and the full `photoLinks` array
- **Run info** — `listingUrl`, `sourceUrl`, `collectedAt`, `errorMessage`

### Quick start

1. Hit **Try for free** and open the input form.
2. Paste one or more Redfin links into **Redfin URLs** — a city page, a ZIP page, or a direct property page all work.
3. Set a **Results limit** to cap how many homes you pull, and adjust the **Timeout** if needed.
4. Press **Start**, then download your data as JSON, CSV, Excel, or XML once the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Real estate investors** building comps and running quick deal math across a target ZIP
- **Agents and brokers** pulling fresh inventory for a city or neighborhood without manual lookups
- **Market analysts** tracking price, days on market, and supply shifts over time
- **App and dashboard builders** feeding live listing data into their own tools
- **Researchers** studying housing trends, pricing, or stock across regions

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `propertyUrls` | array of objects | Yes | Redfin links to scrape — city, ZIP, or direct property pages. City and ZIP pages are crawled and every listing on them is collected. |
| `resultsLimit` | integer | No | Most property rows to gather per run. Default `50`; max `1000`. |
| `timeoutSeconds` | integer | No | Seconds to wait on each request before giving up. Default `45`. |

#### Example input

```json
{
    "propertyUrls": [
        {"url": "https://www.redfin.com/city/30749/TX/Austin"},
        {"url": "https://www.redfin.com/zipcode/78701"}
    ],
    "resultsLimit": 50,
    "timeoutSeconds": 45
}
````

### Output

Each property becomes one row. City and ZIP pages expand into many rows; a direct property URL returns a single row. Every field is always present — anything the listing does not show comes back as `null` so your dataset stays rectangular.

#### Example output

```json
{
    "listingUrl": "https://www.redfin.com/TX/Austin/123-Oak-St-78701/home/55012345",
    "streetLine": "123 Oak St",
    "cityName": "Austin",
    "stateCode": "TX",
    "postalCode": "78701",
    "countryCode": "US",
    "listPrice": 624900,
    "currencyCode": "USD",
    "saleStatus": "For Sale",
    "bedroomCount": 3,
    "bathroomCount": 2,
    "floorAreaSqft": 1740,
    "propertyType": "Single Family Residential",
    "constructionYear": 1972,
    "geoLat": 30.2711,
    "geoLng": -97.7437,
    "listingDescription": "Updated single-story home a short walk from downtown, with a renovated kitchen and a shaded backyard.",
    "featureList": [
        "Heating & cooling: Central A/C",
        "Parking: 2-car garage"
    ],
    "photoLinks": [
        "https://ssl.cdn-redfin.com/photo/52/bigphoto/345/55012345_1.jpg",
        "https://ssl.cdn-redfin.com/photo/52/bigphoto/345/55012345_2.jpg"
    ],
    "coverPhoto": "https://ssl.cdn-redfin.com/photo/52/bigphoto/345/55012345_1.jpg",
    "mlsId": "1234567",
    "daysListed": 9,
    "lotArea": "0.21 acres",
    "hoaCost": null,
    "parkingDetails": "Parking: 2-car garage",
    "listingAgent": "Maria Lopez",
    "brokerageFirm": "Compass RE Texas",
    "schoolDetails": "Austin Independent School District",
    "collectedAt": "2026-06-29T10:23:45.123456+00:00",
    "sourceUrl": "https://www.redfin.com/city/30749/TX/Austin",
    "errorMessage": null
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `listingUrl` | string | Direct link to the Redfin property page |
| `streetLine` | string | House number and street name |
| `cityName` | string | Town or city |
| `stateCode` | string | Two-letter US state code |
| `postalCode` | string | US ZIP code |
| `countryCode` | string | Country code, usually US |
| `listPrice` | integer | Asking price in whole dollars |
| `currencyCode` | string | Currency code for the price, such as USD |
| `saleStatus` | string | For Sale, Sold, Pending, and similar |
| `bedroomCount` | integer | Number of bedrooms |
| `bathroomCount` | integer | Total bathroom count |
| `floorAreaSqft` | integer | Indoor living space in square feet |
| `propertyType` | string | Single Family Residential, Condo, Townhouse, and so on |
| `constructionYear` | integer | Year the home was built |
| `geoLat` | number | Map latitude |
| `geoLng` | number | Map longitude |
| `listingDescription` | string | Full write-up or agent remarks |
| `featureList` | array | Highlighted features such as parking or cooling |
| `photoLinks` | array | Full-size URLs for every listing photo |
| `coverPhoto` | string | URL of the lead photo |
| `mlsId` | string | Multiple Listing Service identifier |
| `daysListed` | integer | Days the home has been on the market |
| `lotArea` | string | Lot size as shown, e.g. 0.21 acres |
| `hoaCost` | string | Homeowners association fee, when listed |
| `parkingDetails` | string | Garage or parking notes |
| `listingAgent` | string | Name of the listing agent |
| `brokerageFirm` | string | Brokerage representing the listing |
| `schoolDetails` | string | Nearby schools or school district |
| `collectedAt` | string | ISO 8601 timestamp of when the row was captured |
| `sourceUrl` | string | The input URL that led to this property |
| `errorMessage` | string | Why a property failed; `null` on success |

### Tips for best results

- **Test with a small `resultsLimit` first.** Set it to 10 or 20 on a new URL to confirm the output fits your pipeline before pulling a whole city.
- **City and ZIP pages multiply fast.** One city link can expand into hundreds of rows, so use `resultsLimit` to keep runs in check.
- **Direct property URLs return one row each.** Mix them freely with search pages in the same run.
- **Raise `timeoutSeconds`** toward 60 if you see repeated timeout errors on larger pages.
- **Empty fields are normal.** Some listings hide the HOA fee, lot size, or school info — those columns come back as `null` rather than failing the row.

### How can I use Redfin property data?

**How can I use the Redfin Details Scraper to build a comps list for a neighborhood?**
Paste a city or ZIP search URL for the area you care about and set `resultsLimit` to the number of homes you want. Each row carries the address, `listPrice`, `bedroomCount`, `bathroomCount`, `floorAreaSqft`, and `saleStatus`, so you can sort and filter comparable sales in a spreadsheet within minutes.

**How can I export Redfin listings to CSV or Excel?**
Run the scraper on your Redfin URLs, then use the export button to download the dataset as CSV, Excel, JSON, or XML. Every property is one row with the same columns, which keeps the file clean when you open it in a sheet or load it into a database.

**How can I track Redfin price changes and days on market over time?**
Schedule the actor to run on the same city or ZIP URLs on a regular cadence and keep each export. Comparing `listPrice`, `daysListed`, and `saleStatus` between runs shows you how inventory and pricing move across a market without watching the site by hand.

**How can I pull Redfin photos and agent details for a single property?**
Drop a direct property URL into `propertyUrls`. The row returns `coverPhoto`, the full `photoLinks` array, `listingAgent`, `brokerageFirm`, and the `listingDescription`, so you get the visuals and the contact context in one place.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

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

One or more Redfin URLs to scrape. Accepts city pages (e.g. https://www.redfin.com/city/11387/OH/London), zipcode pages (e.g. https://www.redfin.com/zipcode/32754), or direct property pages (e.g. https://www.redfin.com/OH/London/123-Main-St-43140/home/12345678).

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

Maximum number of property records to collect per run.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.redfin.com/city/11387/OH/London"
    }
  ],
  "maxItems": 40,
  "requestTimeoutSecs": 30
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.redfin.com/city/11387/OH/London"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/redfin-details-scraper-cheap").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 = { "startUrls": [{ "url": "https://www.redfin.com/city/11387/OH/London" }] }

# Run the Actor and wait for it to finish
run = client.actor("data_api/redfin-details-scraper-cheap").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 '{
  "startUrls": [
    {
      "url": "https://www.redfin.com/city/11387/OH/London"
    }
  ]
}' |
apify call data_api/redfin-details-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Redfin Details Scraper (Cheap)",
        "description": "Redfin real estate scraper that pulls property listings, prices, photos, and agent info from any Redfin city or zipcode page, so you can build market analyses without manual data entry.",
        "version": "0.0",
        "x-build-id": "Enz6C41Ny4Zd19LCN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/data_api~redfin-details-scraper-cheap/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-data_api-redfin-details-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/data_api~redfin-details-scraper-cheap/runs": {
            "post": {
                "operationId": "runs-sync-data_api-redfin-details-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/data_api~redfin-details-scraper-cheap/run-sync": {
            "post": {
                "operationId": "run-sync-data_api-redfin-details-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Redfin URLs",
                        "type": "array",
                        "description": "One or more Redfin URLs to scrape. Accepts city pages (e.g. https://www.redfin.com/city/11387/OH/London), zipcode pages (e.g. https://www.redfin.com/zipcode/32754), or direct property pages (e.g. https://www.redfin.com/OH/London/123-Main-St-43140/home/12345678).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of property records to collect per run.",
                        "default": 40
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Per-request timeout in seconds.",
                        "default": 30
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
