# Redfin Listings Search (`apt_marble/redfin-listings-search`) Actor

Collect every for-sale listing for a city or metro area into clean rows: price, beds, baths, address, days on market and more.

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

## Pricing

$0.70 / 1,000 listing rows

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 Listings Search

Give it a city or metro area and get back every for-sale listing as clean rows: price, beds, baths, square feet, address, coordinates, days on market and more. Built for anyone who needs Redfin listings as data: investors sourcing deals, agents watching their farm area, analysts tracking a market, and proptech teams feeding a pipeline.

### What you can do with it

- **Dump a whole metro feed** — pull thousands of active and coming-soon listings for a city area in one run, up to 20,000 rows.
- **Spot stale listings and price-drop candidates** — every row carries days on market and time on site, so filters surface what has been sitting.
- **Build a buyer lead list** — export addresses, prices, beds, baths and square feet for outreach or mailers.
- **Track a market over time** — re-run the same area daily or weekly and diff each fresh dataset against the last.
- **Zoom into a box** — give four bounding-box edges to keep only the homes inside your streets.

### What you get

One row per listing. Abridged sample of a single record:

```json
{
  "propertyId": 31319297,
  "listingId": 221300113,
  "url": "https://www.redfin.com/TX/Austin/6707-Winnipeg-Cv-78759/home/31319297",
  "address": "6707 Winnipeg Cv",
  "unit": null,
  "city": "Austin",
  "state": "TX",
  "zip": "78759",
  "neighborhood": "Great Hills Ph 02 Sec 01 Amd",
  "latitude": 30.4982414,
  "longitude": -97.760054,
  "price": 1100000,
  "pricePerSqFt": 313,
  "beds": 5,
  "baths": 4,
  "sqFt": 3510,
  "lotSize": 10667,
  "yearBuilt": 1999,
  "stories": 2,
  "daysOnMarket": 1,
  "timeOnRedfinDays": 0,
  "hoaMonthly": null,
  "propertyType": "House",
  "mlsStatus": "Active",
  "garageSpaces": 2,
  "mlsId": "8611632",
  "isNewConstruction": false,
  "has3DTour": false,
  "numPictures": 40
}
```

### Input reference

| Setting | Type | Default | What it does |
| --- | --- | --- | --- |
| Region ID | text | — | Numeric area identifier from a Redfin home link for the area you want, e.g. `30818` (Austin TX). There is no place-name lookup. **Required unless a bounding box is given.** |
| Region type | whole number | `6` | Area kind the region ID belongs to. 6 means city and is correct in almost every case. |
| Bounding box edges | numbers | — | Optional north/south/east/west edges. Prefers that metro area and keeps only rows inside the box. |
| Max items | whole number | `1000` | Maximum listings to collect, up to 20,000. The actor pages through the whole area until this number is reached or the area runs out. |
| Page size | whole number | `350` | Listings requested per page (50–2,000). Larger pages mean fewer requests. |
| Sort order | choice | `redfin-recommended-asc` | Result ordering: the site default, or most expensive first. |
| Minimum price | number | — | Optional. Keeps listings at or above this USD price. |
| Maximum price | number | — | Optional. Keeps listings at or below this USD price. |
| Minimum bedrooms | number | — | Optional. Keeps listings with at least this many bedrooms. |
| Minimum bathrooms | number | — | Optional. Keeps listings with at least this many bathrooms. |
| Minimum interior size | number | — | Optional. Keeps listings with at least this many interior square feet. |
| Maximum days on market | number | — | Optional. Keeps listings on market at most this many days. |
| Property types | list of text | — | Optional. Keeps only House, Condo, Townhouse, Multi-family or Land. Empty keeps everything. |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `propertyId` | number | Stable property key — use it to dedup across runs. |
| `listingId` | number | Listing key (changes when a home is relisted). |
| `url` | text | Full link to the home page. |
| `address` | text | Street address. |
| `unit` | text | Unit designator when shown. |
| `city` | text | City. |
| `state` | text | State code. |
| `zip` | text | ZIP code. |
| `neighborhood` | text | Neighborhood or subdivision when shown. |
| `latitude` | number | Latitude. |
| `longitude` | number | Longitude. |
| `price` | number | List price in USD. |
| `pricePerSqFt` | number | Dollars per square foot when shown. |
| `beds` | number | Bedroom count. |
| `baths` | number | Bathroom count (can be fractional, e.g. 2.5). |
| `sqFt` | number | Interior square feet when shown. |
| `lotSize` | number | Lot square feet when shown. |
| `yearBuilt` | number | Year built when shown. |
| `stories` | number | Story count when shown. |
| `daysOnMarket` | number | Days on market. |
| `timeOnRedfinDays` | number | Days the listing has been on the site. |
| `hoaMonthly` | number | HOA dues per month when shown. |
| `propertyType` | text | House, Condo, Townhouse, Multi-family or Land. |
| `mlsStatus` | text | Human status such as Active or Coming Soon. |
| `garageSpaces` | number | Garage spaces when shown. |
| `mlsId` | text | MLS number. |
| `isNewConstruction` | true/false | Whether flagged as new construction. |
| `has3DTour` | true/false | Whether a 3D tour is attached. |
| `numPictures` | number | Photo count. |
| `description` | text | Full listing description text when shown. |
| `tags` | list of text | Feature tags when shown. |

### Pricing

You pay per listing row, with no monthly minimum.

| What you are charged for | Price |
| --- | --- |
| Listing row — one listing added to your dataset | **$0.70 per 1,000** |

### Limits & what this actor cannot do

- Areas are picked by numeric region ID, not by typing a city name — there is no place-name lookup, so copy the ID from a home link in the area you want.
- Price, bedroom and similar refinements are applied to the collected rows, not on the listing site — the actor always reads the full area feed first.
- A wrong region ID can return a different city's listings instead of an error; the run summary reports which area the site actually answered with, so check it.
- Sold homes are not included here — only active and coming-soon listings. Use the sold-comparables actor for past sales.
- Fields the listing does not show come back empty rather than guessed.
- Rows are a snapshot at the moment of collection; prices and statuses keep changing afterwards.
- Speed depends on the size of the job and on the listing site's own response times; no fixed throughput is promised.
- The source site's terms govern automated access. You are responsible for using the data lawfully and in line with the source site's terms, and for handling any personal data in line with applicable privacy law.

### FAQ

**Do I need an account on the listing site?**
No. The actor reads only what the site shows publicly, and there is nothing to connect — paste a region ID and press start.

**How do I find my region ID?**
Open any home page in the area you want and copy the identifier the actor asks for (for example, Austin TX is 30818).

**How many listings can I collect per run?**
Up to 20,000 rows in one run; large metros take a few paged requests.

**Can I filter by price or bedrooms?**
Yes — set the minimums and the actor keeps only matching rows from the area feed.

**Can I schedule it?**
Yes. Schedule it hourly, daily or weekly from the Apify console, and each run writes a fresh dataset you can compare against the last.

**Is the data complete?**
It is complete for everything the site shows openly on its for-sale feed. Where a listing omits a field, the actor leaves it empty rather than guessing.

# Actor input Schema

## `regionId` (type: `string`):

Numeric area identifier from a Redfin home link for the area you want, e.g. "30818" (Austin TX). There is no place-name lookup: copy it from a home link in that area. Required unless a bounding box is given.

## `regionType` (type: `integer`):

Area kind the region ID belongs to. 6 means city and is correct in almost every case.

## `northLat` (type: `number`):

Optional. North edge of a bounding box. Give all four edges to prefer this metro and keep only rows inside the box.

## `southLat` (type: `number`):

Optional. South edge of a bounding box.

## `eastLng` (type: `number`):

Optional. East edge of a bounding box.

## `westLng` (type: `number`):

Optional. West edge of a bounding box.

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

Maximum listings to collect. The actor pages through the whole area until this number is reached or the area runs out.

## `pageSize` (type: `integer`):

Listings requested per page. Larger pages mean fewer requests; 350 is a good default.

## `sortOrder` (type: `string`):

Result ordering. "redfin-recommended-asc" is the site default; "price-desc" sorts most expensive first.

## `minPrice` (type: `number`):

Optional. Keep listings at or above this price in USD. Applied to the collected rows.

## `maxPrice` (type: `number`):

Optional. Keep listings at or below this price in USD. Applied to the collected rows.

## `minBeds` (type: `number`):

Optional. Keep listings with at least this many bedrooms. Applied to the collected rows.

## `minBaths` (type: `number`):

Optional. Keep listings with at least this many bathrooms. Applied to the collected rows.

## `minSqft` (type: `number`):

Optional. Keep listings with at least this many interior square feet. Applied to the collected rows.

## `maxDaysOnMarket` (type: `number`):

Optional. Keep listings on market at most this many days. Applied to the collected rows.

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

Optional. Keep only these kinds: House, Condo, Townhouse, Multi-family, Land. Empty keeps everything.

## Actor input object example

```json
{
  "regionId": "30818",
  "regionType": 6,
  "maxItems": 100,
  "pageSize": 350,
  "sortOrder": "redfin-recommended-asc",
  "propertyTypes": []
}
```

# Actor output Schema

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

Every row this run produced.

## `runSummary` (type: `string`):

What this run collected, and anything it could not read.

# 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 = {
    "regionId": "30818",
    "regionType": 6,
    "maxItems": 100,
    "pageSize": 350,
    "sortOrder": "redfin-recommended-asc",
    "propertyTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/redfin-listings-search").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 = {
    "regionId": "30818",
    "regionType": 6,
    "maxItems": 100,
    "pageSize": 350,
    "sortOrder": "redfin-recommended-asc",
    "propertyTypes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/redfin-listings-search").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 '{
  "regionId": "30818",
  "regionType": 6,
  "maxItems": 100,
  "pageSize": 350,
  "sortOrder": "redfin-recommended-asc",
  "propertyTypes": []
}' |
apify call apt_marble/redfin-listings-search --silent --output-dataset

```

## MCP server setup

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

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/WegoMVdp14nNLqH2Z/builds/h3pfewShgfQhLNHw1/openapi.json
