# Redfin Property Search Scraper (`mantisus/redfin-fast-scraper-per-results`) Actor

Scrape listings from Redfin search results: for-sale, rental, and sold properties. Returns prices, photos, MLS codes, agent phones, and property specs. Input: search URL or ZIP code list with filters.

- **URL**: https://apify.com/mantisus/redfin-fast-scraper-per-results.md
- **Developed by:** [Maksym Bohomolov](https://apify.com/mantisus) (community)
- **Categories:** Automation, Real estate, Lead generation
- **Stats:** 231 total users, 29 monthly users, 96.6% runs succeeded, 11 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.65 / 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 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 Property Search Scraper

Bulk-scrape listings from Redfin search results: properties for sale, for rent, and recently sold. Provide a Redfin search URL or a list of ZIP codes with a filter template. The scraper returns every matching listing with address, price, photos, MLS code, property specs, and (for rentals) phone numbers.

**This scraper processes Redfin search results pages, not individual property detail pages.** Input must be a URL that shows a list of listings (e.g. `redfin.com/zipcode/...`, `redfin.com/city/...`), not a single home URL like `redfin.com/CA/Los-Angeles/.../home/177150500`.

Built without a headless browser. It runs on direct HTTP requests to Redfin's internal endpoints. That takes more development effort upfront. But every run is dramatically cheaper to execute, without losing data quality.

### Common use cases

- **Rental lead generation**: phone numbers from rental listings, filtered by area and property type
- **Market monitoring**: daily delta of new listings in selected ZIP codes using the `onlyNew` flag
- **Investment research**: price, days on market, HOA dues, lot size across multiple markets in one run
- **Sold-comp analysis**: recent sales with full pricing. Some sold listings are gated by Redfin behind sign-in (see *Gated listings* below)
- **Aggregator feeds**: bulk extraction for portals combining Redfin with other sources

### How to use it

Two input formats are supported.

#### Option 1: paste search URLs from Redfin

Copy any search URL from redfin.com (with or without filters) and pass it in `urls`. The scraper returns every listing the URL matches.

```json
{
  "urls": [
    "https://www.redfin.com/zipcode/21234/filter/min-parking=1,include=forsale+mlsfsbo+construction,air-conditioning"
  ],
  "onlyNew": false,
  "searchLimit": null,
  "proxySettings": { "useApifyProxy": false }
}
```

#### Option 2: apply one filter template across many locations

When you need the same filters across many ZIP codes or cities, pass one example URL as `sampleUrl` and the location list separately. The scraper applies the filter pattern to each location.

```json
{
  "locations": ["20001", "Philadelphia"],
  "sampleUrl": "https://www.redfin.com/zipcode/21234/filter/min-parking=1,include=forsale+mlsfsbo+construction,air-conditioning",
  "searchLimit": 50,
  "onlyNew": false,
  "proxySettings": { "useApifyProxy": false }
}
```

#### Other parameters

- `searchLimit`: cap on results returned. Set to 0 for all results. Ignored when `onlyNew` is enabled.
- `onlyNew`: when enabled, returns only listings added since the last run. The first run with this flag does a full scan. Subsequent runs return only new listings. Useful for daily monitoring. `searchLimit` is ignored in this mode so that no new listing is missed. The position is normally matched exactly. If the listing it points at has left the results in the meantime (sold, delisted, filtered out), the run falls back to matching by time with a one-minute overlap, so it may re-return a listing that sits right on the boundary. That is deliberate: a small overlap is cheaper than a missed listing.
- `stateStore`: key-value store that holds the `onlyNew` monitoring state (the last-seen position per search). Leave empty to use the auto-created `redfin-tech-store`. Pick a separate store per monitoring task to keep their baselines isolated. To reset monitoring and force a full scan, point it at a different store.
- `proxySettings`: standard Apify proxy configuration.

### Output

Data is saved to an Apify dataset. It has five preconfigured views: **Overview**, **Sale Listings**, **Rental Listings**, **Location Data**, and **Full Data**. You can switch between summary tables and the complete schema without writing transformations. Download in JSON, CSV, XML, Excel, HTML, RSS, or JSONL.

#### Gated listings

Redfin gates some sold listings behind sign-in. For these, fields like `price`, `mls`, `beds`, `sqft`, `yearBuilt`, `lotSize`, and `hoaDues` come back as `null`. The scraper flags each such row with:

- `requiresAuth: true` means the listing is gated
- `priceDisplayLevel` gives the gate type (`accessible`, `sign_in`, `vow_up`, or `censored`)

Active for-sale and rental listings are not affected.

#### Sample output: property for sale (active)

```json
{
  "propertyId": "3180722",
  "category": "sale",
  "url": "https://www.redfin.com/CA/Oceanside/342-Rimhurst-Ct-92058/home/3180722",
  "propertyType": "single_family_residential",
  "latitude": 33.2366226,
  "longitude": -117.3505077,
  "address": "342 Rimhurst Ct",
  "city": "Oceanside",
  "state": "CA",
  "zipCode": "92058",
  "status": "active",
  "mainPhoto": "https://ssl.cdn-redfin.com/photo/45/bigphoto/767/NDP2604767_0.jpg",
  "photos": ["...55 photo URLs"],
  "mls": "NDP2604767",
  "redfinListingType": "mls",
  "beds": 4,
  "baths": 2.5,
  "bathFull": 2,
  "bathPartial": 1,
  "bathTotal": 2.5,
  "sqft": 1968,
  "yearBuilt": 1999,
  "lotSize": 27007,
  "price": 1195000,
  "priceType": "listing_price",
  "priceDisplayLevel": "accessible",
  "hoaDues": 110,
  "daysOnMarket": 1,
  "listingAddedDate": "2026-05-17T17:36:04+00:00",
  "lastSaleDate": "2017-12-19T08:00:00+00:00",
  "brokerName": "",
  "requiresAuth": false,
  "isNewConstruction": false,
  "hasVirtualTour": true,
  "sashes": [
    { "name": "Open House", "openHouseText": "OPEN TODAY, 12:30PM TO 2:30PM", "timeOnRedfin": 0.0 },
    { "name": "3D Walkthrough", "openHouseText": "", "timeOnRedfin": 0.0 }
  ]
}
```

#### Sample output: recently sold

```json
{
  "propertyId": "20585481",
  "category": "sale",
  "url": "https://www.redfin.com/NY/Rosedale/13703-244th-St-11422/home/20585481",
  "propertyType": "single_family_residential",
  "address": "137-03 244th St",
  "city": "Rosedale",
  "state": "NY",
  "zipCode": "11422",
  "status": "sold",
  "photos": ["...4 photo URLs"],
  "mls": "957545",
  "redfinListingType": "mls",
  "beds": 3,
  "baths": 2.0,
  "bathFull": 2,
  "bathPartial": 0,
  "bathTotal": 2.0,
  "sqft": 968,
  "yearBuilt": 1925,
  "lotSize": 4000,
  "price": 720000,
  "priceType": "last_sale_price",
  "priceDisplayLevel": "accessible",
  "hoaDues": 0,
  "listingAddedDate": "2026-02-02T22:18:45+00:00",
  "lastSaleDate": "2026-04-23T07:00:00+00:00",
  "brokerName": "RE/MAX Southshore Realty",
  "requiresAuth": false,
  "sashes": [{ "name": "Sold", "openHouseText": "", "timeOnRedfin": 0.0 }]
}
```

#### Sample output: rental

```json
{
  "propertyId": "196662798",
  "category": "rental",
  "url": "https://www.redfin.com/CA/San-Diego/AMLI-Aero/apartment/196662798",
  "propertyType": "multi_family_5_plus",
  "address": "3585 Aero Ct",
  "city": "San Diego",
  "state": "CA",
  "zipCode": "92123",
  "status": "available",
  "photos": ["...34 photo URLs"],
  "rentPropertyName": "AMLI Aero",
  "rentBedMin": 0,
  "rentBedMax": 3,
  "rentBathMin": 1.0,
  "rentBathMax": 2.0,
  "rentSqftMin": 576,
  "rentSqftMax": 1627,
  "rentPriceMin": 2965,
  "rentPriceMax": 6828,
  "rentScore": 8.0,
  "rentPhones": ["858867****", "858867****"],
  "numAvailableUnits": 298,
  "feedSource": "RentPath",
  "descriptionSnippet": "At AMLI Aero, life flows effortlessly between connection and calm. Step outside our San Diego apartments to the flavors of the Convoy District...",
  "requiresAuth": false,
  "sashes": [
    { "name": "New", "openHouseText": "", "timeOnRedfin": 4.09 },
    { "name": "DEAL", "openHouseText": "", "timeOnRedfin": 0.0 }
  ]
}
```

The full field list with type descriptions is available in the dataset schema, accessible from the Storage tab after each run.

### Is it legal to scrape Redfin?

This scraper accesses only data that is publicly visible on redfin.com without authentication. It does not bypass paywalls, sign-in walls, or rate limits beyond what respectful scraping permits. This includes the gated listings noted above, which it explicitly flags rather than attempting to access.

Scraping publicly available data is generally legal. See Apify's overview: [Is web scraping legal? Yes, if you know the rules](https://blog.apify.com/is-web-scraping-legal/). You are responsible for ensuring your specific use case complies with Redfin's Terms of Service and applicable data protection laws (CCPA, GDPR).

### Bugs and feedback

If something doesn't work or a field is missing, the [Issues tab](https://console.apify.com/actors/5ad0z7LUTKeONCndM/issues) is the fastest way to reach me.

# Actor input Schema

## `urls` (type: `array`):

Direct Redfin search-page URLs: for-sale, for-rent, or sold (e.g. /filter/include=sold-3mo).

## `locations` (type: `array`):

City names or ZIP codes to search. Combine with a Sample URL below to apply filters.

## `sampleUrl` (type: `string`):

A Redfin URL whose filters are applied to every Location search.

## `searchLimit` (type: `integer`):

Maximum number of results per search. Applied to each URL or location separately. Set to 0 for no limit. This retrieves all available results. Ignored when Only New Listings is enabled.

## `proxySettings` (type: `object`):

Select proxies to be used by your scraper.

## `onlyNew` (type: `boolean`):

Only retrieve data from properties listed since the last run after activation of this flag. The first startup with this flag will perform a full scan. Result Limit is ignored in this mode so that no new listing is missed. The last-seen position per search is stored in a key-value store (see State Store below), which persists across runs.

## `stateStore` (type: `string`):

Key-value store for Only New Listings monitoring state. Pick an existing store or create a new one. The scraper saves the last-seen position per search here. Leave empty to use the auto-created redfin-tech-store. To reset monitoring and re-run a full scan, pick a different store.

## Actor input object example

```json
{
  "urls": [
    "https://www.redfin.com/zipcode/20024/filter/min-beds=0,min-baths=2,air-conditioning",
    "https://www.redfin.com/city/30749/NY/New-York",
    "https://www.redfin.com/zipcode/20001/rentals/filter/dogs-allowed"
  ],
  "locations": [
    "20001",
    "Philadelphia",
    "New York"
  ],
  "sampleUrl": "https://www.redfin.com/city/15502/PA/Philadelphia/filter/min-beds=0,max-beds=4,guest-house,air-conditioning",
  "searchLimit": 50,
  "proxySettings": {
    "useApifyProxy": false
  },
  "onlyNew": false
}
```

# Actor output Schema

## `overview` (type: `string`):

All properties with key details. Filter by category: ?view=overview\&filter=category:sale

## `saleListings` (type: `string`):

Properties for sale. Add \&filter=category:sale to URL for sale-only

## `rentalListings` (type: `string`):

Rental properties. Add \&filter=category:rental to URL for rentals-only

## `locationData` (type: `string`):

Geographic data: addresses, coordinates, cities, states

## `allData` (type: `string`):

Complete dataset with all fields in organized order

# 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 = {
    "urls": [
        "https://www.redfin.com/zipcode/20024/filter/min-beds=0,air-conditioning"
    ],
    "proxySettings": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mantisus/redfin-fast-scraper-per-results").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 = {
    "urls": ["https://www.redfin.com/zipcode/20024/filter/min-beds=0,air-conditioning"],
    "proxySettings": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("mantisus/redfin-fast-scraper-per-results").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 '{
  "urls": [
    "https://www.redfin.com/zipcode/20024/filter/min-beds=0,air-conditioning"
  ],
  "proxySettings": {
    "useApifyProxy": false
  }
}' |
apify call mantisus/redfin-fast-scraper-per-results --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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