# Redfin Scraper: Homes for Sale, Price Drops & Area Comps (`wellbuilt_zythem/redfin-listings`) Actor

Redfin homes for sale by US city, ZIP or Redfin URL. Each home compared with recent sales in its ZIP ($/sq ft vs median, Redfin Data Center). Schedule it: new listings, price drops and homes that left the market since your last run. No proxy needed.

- **URL**: https://apify.com/wellbuilt_zythem/redfin-listings.md
- **Developed by:** [Carlos Escanez](https://apify.com/wellbuilt_zythem) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 homes

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Redfin Scraper: Homes for Sale, Price Drops & Area Comps

Every home for sale on **Redfin** in a US city, ZIP code, county or neighborhood, and for each one **how its price compares with recent sales in its ZIP code**: price per square foot against the ZIP's median sold price per square foot, from Redfin's own published market data. Schedule it and it becomes a feed: **new listings, price drops and homes that left the market since your last run**.

Type `Austin, TX` or `78758`, no URL hunting needed. No proxy needed.

### What you get

```json
{
  "recordType": "home",
  "searchLocation": "Austin, TX",
  "address": "1704 Cherry Orchard Dr",
  "city": "Austin", "state": "TX", "zip": "78745",
  "price": 315000, "beds": 3, "baths": 1, "sqft": 934, "pricePerSqft": 337,
  "propertyType": "house", "status": "Active", "daysOnMarket": 1, "listedDate": "2026-10-14",
  "marketArea": "ZIP 78745",
  "areaMedianSalePricePerSqft": 308.3,
  "areaMedianSalePrice": 471000,
  "areaMedianDaysOnMarket": 48,
  "areaSaleToListPct": 97.7,
  "pricePerSqftVsAreaPct": 9.3,
  "isNewSinceLastRun": true,
  "photoUrl": "https://ssl.cdn-redfin.com/photo/104/bigphoto/392/84517392_0.jpg",
  "url": "https://www.redfin.com/TX/Austin/1704-Cherry-Orchard-Dr-78745/home/31762242"
}
```

`pricePerSqftVsAreaPct: 9.3` means this home asks 9.3 % more per square foot than homes in its ZIP actually sold for. Set **Max $/sq ft vs ZIP sales** to `-10` to keep only homes listed at least 10 % below recent sales.

### Use it as a feed

Turn on **Only new listings and price drops since the last run** and schedule the Actor daily. Each run compares with the previous one, per place:

| Signal | Field |
|---|---|
| Listed since the last run | `isNewSinceLastRun: true` |
| Price cut since the last run (at least **Price drop %**) | `previousPrice`, `priceChange`, `priceChangePct` |
| For sale last run, gone now (pending, sold or withdrawn) | a row with `recordType: "off_market"`, with **Also deliver homes that left the market** |

The **first run of a place** has nothing to compare with. It remembers every home and, in "only changes" mode, delivers the homes listed in the last 7 days plus Coming Soon. Homes that left the market are only reported for places read to the end (raise **Max homes per place** above the place's size).

### Input

| Field | Example |
|---|---|
| Cities, ZIP codes or Redfin URLs | `Austin, TX` · `Miami, Florida` · `78758` · `https://www.redfin.com/county/2866/TX/Travis-County` · `https://www.redfin.com/neighborhood/219259/FL/Miami/Coconut-Grove` |
| Max homes per place | Newest listings first. Default 5,000 |
| Filters | price, beds, baths, property type, days on market, Coming Soon, $/sq ft vs ZIP sales |

City names are matched against Redfin's list of about 23,000 US cities with sales data. If a name exists in several states, write the state: `Portland` gets you a list of suggestions; `Portland, OR` works.

### Fields

`recordType`, `searchLocation`, `propertyId`, `listingId`, `mlsId`, `status` (Active, Coming Soon), `price`, `beds`, `baths`, `sqft`, `pricePerSqft`, `lotSqft`, `yearBuilt`, `stories`, `hoaMonthly`, `propertyType`, `address`, `city`, `state`, `zip`, `neighborhood`, `latitude`, `longitude`, `daysOnMarket`, `listedDate`, `lastSoldDate`, `tags` (new, open_house, hot_home, new_construction, for_sale_by_owner, coming_soon, ready_to_build), `keyFacts`, `photos`, `photoUrl`, `has3DTour`, `marketArea`, `marketPeriodEnd`, `marketPeriodDays`, `areaMedianSalePrice`, `areaMedianSalePricePerSqft`, `areaHomesSold`, `areaMedianDaysOnMarket`, `areaSaleToListPct`, `pricePerSqftVsAreaPct`, `priceVsAreaMedianPct`, `isNewSinceLastRun`, `firstSeenAt`, `previousPrice`, `priceChange`, `priceChangePct`, `url`, `scrapedAt`.

How full they are, measured on all 5,783 homes for sale in Austin on 2026-10-15: price, address, ZIP, coordinates, type, link and photo **100 %**; days on market 98 %; square feet 93 %; comparison with the ZIP 92 %; year built 84 %; last sold date 63 %; HOA 53 %.

#### About the area comparison

The ZIP figures come from **Redfin Data Center**, the market data Redfin publishes for anyone to download. ZIP figures cover the **last 3 months** of sales up to `marketPeriodEnd` (the latest file, as of October 2026, runs to **May 31, 2026**). When a ZIP has fewer than 5 sales in that period, the percentages are left empty rather than compared with noise. Homes with no ZIP figures fall back to their city's. Market data provided by Redfin, a national real estate brokerage (Redfin Data Center).

### What this Actor does not give

- **Sold homes and rentals.** Redfin's search only returns homes for sale here; the Actor does not offer sold or rental searches.
- **Agent name, phone or email.** Redfin's search data names the agent on about 1 % of homes, so it is not delivered.
- **Price history and the Redfin Estimate.** They live on each home's page, which Redfin does not serve to scripts. Price changes come from comparing your own runs instead.
- **Description text and all photos.** One main photo per home (`photoUrl`) and the number of photos.

### Speed

Austin (5,783 homes) in 3 requests and about 4 to 7 seconds; Houston (16,557 homes) in 9 requests and about 30 seconds. No browser, no proxy: Redfin's own search data.

### Pricing

Per home row delivered (`home` event), plus the platform's start fee. In "only changes" mode you pay only for the new listings, price drops and homes that left the market.

# Actor input Schema

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

One per line: a US city with its state ("Austin, TX", "Miami, Florida"), a ZIP code ("78758"), or a Redfin URL of a city, ZIP, county or neighborhood ("https://www.redfin.com/county/2866/TX/Travis-County").

## `maxHomesPerLocation` (type: `integer`):

Newest listings first. Austin has about 5,800 homes for sale, Houston about 16,500. To detect homes that left the market, read the whole place (leave the default or higher).

## `onlyChanges` (type: `boolean`):

Deliver only homes not seen in the previous run of this feed, or whose price fell at least "Price drop %". The first run of a place has nothing to compare with: it delivers the homes listed in the last 7 days (and Coming Soon) and remembers the rest. Off: every home found, with the same signals as columns.

## `priceDropThresholdPct` (type: `integer`):

A home counts as a price drop when its price is at least this much lower than in the last run.

## `includeOffMarket` (type: `boolean`):

Add a row for each home that was for sale in the last run and is not anymore (went pending, sold or was withdrawn). Only for places read completely, from the second run on.

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

Leave empty for no minimum.

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

Leave empty for no maximum.

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

Leave empty for any.

## `minBaths` (type: `integer`):

Leave empty for any.

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

Empty: all types.

## `maxDaysOnMarket` (type: `integer`):

Only homes listed at most this many days ago. Coming Soon homes have no days on market and are kept.

## `excludeComingSoon` (type: `boolean`):

Leave out homes marked Coming Soon (not yet open for showings).

## `maxPricePerSqftVsAreaPct` (type: `integer`):

Only homes whose price per square foot is at most this far from the median sale price per square foot of their ZIP code. -10 keeps homes listed at least 10 % below recent sales; homes without square feet are left out.

## `maxResults` (type: `integer`):

Cap for the whole run. Empty for no cap.

## `stateStoreName` (type: `string`):

Key-value store that remembers the homes and prices seen, one record per place. Use the same name every run of a feed.

## `resetState` (type: `boolean`):

Start the feed memory of these places from scratch in this run.

## `proxyConfiguration` (type: `object`):

Not needed: Redfin answers without a proxy. Turn it on only if your runs start getting refused.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "maxHomesPerLocation": 300,
  "onlyChanges": false,
  "priceDropThresholdPct": 1,
  "includeOffMarket": false,
  "excludeComingSoon": false,
  "stateStoreName": "redfin-listings-seen",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (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 = {
    "locations": [
        "Austin, TX"
    ],
    "maxHomesPerLocation": 300,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("wellbuilt_zythem/redfin-listings").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 = {
    "locations": ["Austin, TX"],
    "maxHomesPerLocation": 300,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("wellbuilt_zythem/redfin-listings").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 '{
  "locations": [
    "Austin, TX"
  ],
  "maxHomesPerLocation": 300,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call wellbuilt_zythem/redfin-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wellbuilt_zythem/redfin-listings"
        }
    }
}
```

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/xLQHaSRT9GAooblSf/builds/XOKvFF7MvGTAylMH5/openapi.json
