# Redfin Property Scraper — Sale + Sold · Market KPIs (`sian.agency/redfin-property-scraper`) Actor

🏡 Scrape Redfin US real estate listings — for-sale, sold, and coming-soon — with built-in market KPIs (median price, price/sqft, days-on-market, breakdowns by city/zip) and HTML report. Optional Redfin Estimate + Walk Score enrichment. Independent tool — not affiliated with Redfin Corporation.

- **URL**: https://apify.com/sian.agency/redfin-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Automation, Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Property Scraper — Sale + Sold · Market KPIs 🏡

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian)
[![Related Actor](https://img.shields.io/badge/Store-Zillow%20Scraper-006AFF)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian)
[![Related Actor](https://img.shields.io/badge/Store-StreetEasy%20Scraper-3D5A80)](https://apify.com/sian.agency/streeteasy-property-scraper?fpr=sian)

#### 🎯 Extract Redfin US Property Listings With Market KPIs in Seconds
##### Investors, agents, market analysts, and prop-tech builders — get full Redfin listings plus price/sqft analytics, days-on-market, and optional Redfin Estimate + Walk Score

---

### 📋 Overview

**Pull Redfin US property listings — for-sale, sold, and coming-soon — into clean structured data.** Search any US market by region (city, neighborhood, zip) or by lat/lng + radius, and get back complete listings with calculated price-per-sqft, beds/baths, square footage, lot size, year built, days-on-market, listing agent, geo coordinates, and full photo URLs.

**Why investors and agents choose us over the alternatives:**
- 📊 **Analytics included, not just raw data** — auto-generated HTML market report with median price, price/sqft distribution (min/median/avg/p90/max), days-on-market distribution, top cities + zips by inventory, and property-type breakdown — computed for you on every run
- 🧮 **Calculated price/sqft on every listing** — comp sheets and CMAs are ready straight from the dataset
- 🌎 **Nationwide US coverage** — every Redfin region: cities, neighborhoods, zip codes, school districts
- ⭐ **Optional Redfin Estimate + Walk Score** — Redfin's AVM and Walk/Bike/Transit scores per listing for valuation and livability filtering (PAID)
- 🔎 **Built-in autocomplete** — type a city or zip, get back the region IDs you need to scrape — no manual lookup
- 🆓 **FREE tier with full feature parity** — 25 listings per run, no credit card, same KPIs and HTML report — just a smaller cap

---

### ✨ Features

- 🏷️ **For-sale, sold, or coming-soon** — single `listingStatus` toggle picks the side of the market
- 🧭 **Three search modes** — `autocomplete` (region-ID lookup), `byRegionId` (primary scrape mode), `byCoordinates` (lat/lng + radius, PAID)
- 📊 **Auto-calculated price/sqft** — for every listing with usable square footage
- 📈 **Market KPIs in HTML report** — median price, price/sqft distribution, days-on-market distribution, city + zip + property-type tallies
- 🏠 **Rich listing fields** — beds, baths (full + total), sqft, lot size, year built, HOA dues, MLS ID, listing agent name + ID, virtual-tour flag, 3D scan URL, full photo URLs (medium-res)
- ⭐ **Redfin Estimate + Walk Score enrichment** — bundled into one PAID toggle (`includeEnrichment`)
- 📦 **Bulk region search** — pass an array of region IDs in one run (PAID)
- 📱 **Standard Apify exports** — JSON, CSV, XLSX, RSS, HTML

---

### 🎬 Quick Start

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~redfin-property-scraper/runs?token=[YOUR_TOKEN]' \
  -H 'Content-Type: application/json' \
  -d '{"searchMode":"byRegionId","listingStatus":"forSale","regionId":"2_30818","maxResults":50}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Find Your Region ID

Run with `searchMode: "autocomplete"` and `autocompleteQuery: "Austin"` (or any city/zip/neighborhood). The dataset will list matching region IDs in `<type>_<id>` format (e.g. `2_30818` for Austin, TX).

#### Step 2: Scrape The Region

Switch to `searchMode: "byRegionId"`, paste the ID into `regionId`, pick `listingStatus` (`forSale` / `sold` / `comingSoon`), and set `maxResults`.

#### Step 3: Run & Export

Hit Run. Listings stream into the dataset; an HTML market report lands in the key-value store. Export as JSON, CSV, or Excel.

**That's it! In under 2 minutes you'll have:**

- Complete listings with address, specs, pricing, photos, geo, agent
- Auto-calculated price/sqft per listing
- Market-level KPIs (median price, distribution, days-on-market, city + zip + type breakdowns)
- A polished HTML market summary

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchMode` | string | No | `autocomplete`, `byRegionId`, or `byCoordinates` (default: `byRegionId`). |
| `listingStatus` | string | No | `forSale`, `sold`, or `comingSoon` (default: `forSale`). |
| `autocompleteQuery` | string | If `searchMode=autocomplete` | Free-text city / zip / neighborhood lookup. |
| `regionId` | string | If `searchMode=byRegionId` | Region ID in `<type>_<id>` format (e.g. `2_30818`). |
| `regionIds` | array | No | Multiple region IDs in one run (PAID only). |
| `lat`, `lng`, `radius` | number, number, integer | If `searchMode=byCoordinates` | Center lat/lng + radius in miles (1–50). PAID only. |
| `maxResults` | integer | No | Listings per query, 1–350 (default: 100). Applies to `byRegionId` and `byCoordinates`; ignored in `autocomplete` mode (autocomplete always returns the upstream candidate list). FREE tier capped at 25 per run. |
| `includeEnrichment` | boolean | No | Fetch Redfin Estimate + Walk Score per listing — PAID only (default: false). |

**Example — Austin TX for-sale listings:**

```json
{
  "searchMode": "byRegionId",
  "listingStatus": "forSale",
  "regionId": "2_30818",
  "maxResults": 100
}
```

**Example — Look up a region ID:**

```json
{
  "searchMode": "autocomplete",
  "autocompleteQuery": "Park Slope"
}
```

**Example — Bulk regions, sold homes, with enrichment:**

```json
{
  "searchMode": "byRegionId",
  "listingStatus": "sold",
  "regionIds": ["2_30818", "2_29470", "2_17151"],
  "maxResults": 200,
  "includeEnrichment": true
}
```

**Example — Coordinates + radius (PAID):**

```json
{
  "searchMode": "byCoordinates",
  "listingStatus": "forSale",
  "lat": 30.27,
  "lng": -97.74,
  "radius": 5,
  "maxResults": 100
}
```

***

### 📤 Output

Results land in the Apify dataset. Common fields per listing:

| Field | Type | Description |
|-------|------|-------------|
| `propertyId` | string | Unique Redfin property ID |
| `listingId` | string | Unique Redfin MLS listing ID |
| `listingStatus` | string | `forSale`, `sold`, or `comingSoon` |
| `url` | string | Full listing URL on redfin.com |
| `listingTitle` | string | Formatted address |
| `address` | object | `street`, `unit` (condos/apartments only), `city`, `state`, `zip`, `neighborhood`, `full` |
| `pricing` | object | `price`, `pricePerSqft`, `hoaDues` |
| `specs` | object | `beds`, `baths`, `bathsFull`, `bathsTotal`, `sqft`, `lotSize`, `yearBuilt`, `propertyType`, `propertyTypeCode` (Redfin numeric code) |
| `market` | object | `daysOnMarket`, `timeOnRedfinSecs`, `listingAddedDate`, `lastSoldDate`, `mlsId` |
| `location` | object | `latitude`, `longitude`, `timezone` |
| `listingAgent` | object | `name`, `redfinAgentId` *(when available — only emitted when Redfin exposes the agent)* |
| `media` | object | `photoCount`, `hasVirtualTour`, `scanUrl`, `photos[]` |
| `redfinEstimate` | object | (Optional, PAID) AVM data |
| `walkScores` | object | (Optional, PAID) `walkScore`, `bikeScore`, `transitScore` |
| `scrapedAt` | string | ISO timestamp |

**Example listing:**

```json
{
  "propertyId": "31887455",
  "listingId": "214636605",
  "listingStatus": "forSale",
  "url": "https://www.redfin.com/TX/Austin/4159-Steck-Ave-78759/unit-267/home/31887455",
  "listingTitle": "4159 Steck Ave #267, Austin, TX 78759",
  "address": { "street": "4159 Steck Ave", "unit": "#267", "city": "Austin", "state": "TX", "zip": "78759", "neighborhood": "Mesa Village Condo Amd" },
  "pricing": { "price": 250000, "pricePerSqft": 302, "hoaDues": 271 },
  "specs": { "beds": 2, "baths": 1, "bathsFull": 1, "bathsTotal": 1, "sqft": 829, "lotSize": 2583, "yearBuilt": 1977, "propertyType": "Condo" },
  "market": { "daysOnMarket": 4, "listingAddedDate": "2026-05-01T18:51:42.660Z", "mlsId": "5826517" },
  "location": { "latitude": 30.375407, "longitude": -97.75824, "timezone": "US/Central" },
  "listingAgent": { "name": "Andrew Vallejo", "redfinAgentId": "4289" },
  "media": { "photoCount": 22, "hasVirtualTour": true, "scanUrl": "https://my.matterport.com/show/?m=eHpABi2Y4PB" }
}
```

***

### 💼 Use Cases & Examples

#### 1. Investment Comps & Underwriting

**Investors comparing homes by price/sqft across markets**

- **Input**: Bulk region IDs for Austin, Nashville, Tampa
- **Output**: Listings with calculated price/sqft + median per market
- **Use**: Rank markets by entry-price-per-sqft; build comp sheets in minutes.

#### 2. Recently-Sold Comparable Sales

**Agents pulling sold comps for a CMA**

- **Input**: `listingStatus: "sold"` + neighborhood region ID
- **Output**: Sold homes with last-sale-date, beds/baths/sqft
- **Use**: Plug straight into CMAs and pricing strategy decks.

#### 3. Days-On-Market Velocity Tracking

**Brokers tracking how fast markets move**

- **Input**: Same region, weekly schedule
- **Output**: Median + p90 days-on-market per run
- **Use**: Spot when inventory starts to stale or accelerate.

#### 4. Redfin Estimate vs. List-Price Spread

**Investors hunting for under-priced inventory**

- **Input**: `includeEnrichment: true`
- **Output**: Each listing carries the Redfin Estimate (AVM)
- **Use**: Rank by AVM-vs-list-price spread to find mispriced homes.

#### 5. Walkability-Based Filtering

**Buyer-agents matching urban-buyer preferences**

- **Input**: `includeEnrichment: true`
- **Output**: Walk/Bike/Transit scores per listing
- **Use**: Surface walkable inventory in suburban markets.

#### 6. AVM / ML Training Data

**Data scientists building US-wide valuation models**

- **Input**: Bulk regions across multiple states
- **Output**: Comprehensive listings dataset with full specs + geo
- **Use**: Train and validate AVM and pricing models.

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/redfin-property-scraper').call({
  searchMode: 'byRegionId',
  listingStatus: 'forSale',
  regionId: '2_30818',
  maxResults: 100,
  includeEnrichment: true
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/redfin-property-scraper').call(
    run_input={
        'searchMode': 'byRegionId',
        'listingStatus': 'sold',
        'regionId': '2_30818',
        'maxResults': 100
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~redfin-property-scraper/runs?token=YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"searchMode":"byRegionId","listingStatus":"forSale","regionId":"2_30818","maxResults":150}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule (daily / weekly market refresh) or webhook
2. **HTTP Request**: Call Redfin scraper API with target region IDs
3. **Process**: Filter by price band, compute KPIs, dedupe against last run
4. **Action**: Push to DB, send Slack/email digest, update dashboard

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature parity, same data quality
- 1 query per run (use Autocomplete + a single Region ID)
- No credit card required
- Perfect for testing and one-off analyses

#### PAID Tier (Production Ready)

- **Unlimited** listings and queries per run
- Bulk region arrays
- Coordinates + radius mode
- Redfin Estimate + Walk Score enrichment
- Pay-per-result: only charged for listings actually returned

💰 **Transparent per-result pricing** — $0.005 per listing extracted, $0.003 per listing enriched (only on success), $0.005 per actor start. **What you get for the price**: every listing comes with calculated price/sqft and the run produces a full HTML market report with median, distribution, and city/zip breakdowns — no post-processing required.

[🔗 View current pricing](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How do I find a Redfin region ID?**
A: Run the actor with `searchMode: "autocomplete"` and the city or zip you want — the dataset returns matching IDs in `<type>_<id>` format. Plug the ID into `byRegionId` mode for the actual scrape.

**Q: Why does `pricePerSqft` come back null on some listings?**
A: Redfin records sometimes omit square footage, especially on land or new-construction listings. We only compute price/sqft when sqft is reported.

**Q: Does this cover sold homes?**
A: Yes — set `listingStatus: "sold"` to pull recently-sold comps with last-sold date.

**Q: What does the Redfin Estimate enrichment return?**
A: Redfin's AVM payload — when available. Some listings (off-market or in low-data areas) return a "not serviced" flag instead of a number; we surface that explicitly so you can filter.

**Q: How many listings can I extract per run?**
A: FREE tier: 25. PAID tier: unlimited. A single region search returns up to ~350 listings in one call.

**Q: What output formats are available?**
A: JSON, CSV, Excel — exported directly from the Apify dataset.

**Q: Is this legal?**
A: We only extract publicly available listings. See the legal section below.

***

### 🐛 Troubleshooting

**"Invalid regionId" error**

- The format is `<type>_<id>`, e.g. `2_30818` for a city, `6_<id>` for a neighborhood, `13_<zip>` for a zip code. Use `searchMode: "autocomplete"` to look it up.

**"Region ID not found" inside results**

- The ID format was right but Redfin doesn't have data for that exact slot. Try a parent region (city instead of neighborhood) or run autocomplete to see active alternatives.

**FREE tier hit at 25 listings**

- That's the FREE cap. Upgrade for unlimited.

**`byCoordinates` rejected on FREE**

- Coordinates mode is PAID-only. Use `byRegionId` or upgrade.

**No enrichment on a listing**

- Enrichment requires `includeEnrichment: true` on PAID. Some properties have no Redfin Estimate available; we still return the metadata so you can filter.

***

### ⚠️ Trademark Disclaimer

This Actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Redfin Corporation, or any of its subsidiaries**. The name "Redfin" is used solely in a descriptive sense to identify the public data source the Actor reads from. All trademarks, service marks, and trade names referenced in this Actor or its documentation are the property of their respective owners.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. 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

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <hello@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `searchMode` (type: `string`):

How to find listings.

• **autocomplete** — look up region IDs by typing a city / zip / neighborhood (helper mode, returns region candidates)
• **byRegionId** — search a specific Redfin region (use Autocomplete first to get the ID)
• **byCoordinates** — search by lat/lng + radius (PAID)

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

Hard cap on listings returned per query. Redfin returns up to ~350 per region in a single call. FREE tier is always capped at 25 listings per run.

## `listingStatus` (type: `string`):

Which listings to return.

• **forSale** — active for-sale listings
• **sold** — recently sold homes
• **comingSoon** — coming-soon listings

## `autocompleteQuery` (type: `string`):

Free-text place lookup — city, neighborhood, or 5-digit zip code. Returns a list of matching region IDs you can plug into the byRegionId mode.

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

Redfin region identifier in '<type>\_<id>' format. Examples:
• 2\_30818 — Austin, TX (city)
• 2\_29470 — Seattle, WA (city)
• 6\_14462 — a specific neighborhood
• 13\_78641 — zip code 78641

Use Autocomplete mode first to discover region IDs.

## `regionIds` (type: `array`):

Array of region IDs (same '<type>\_<id>' format) — runs one search per ID. PAID tier only.

## `lat` (type: `number`):

Center latitude for a radial search.

## `lng` (type: `number`):

Center longitude for a radial search.

## `radius` (type: `integer`):

Search radius in miles around the lat/lng center (1-50).

## `includeEnrichment` (type: `boolean`):

When ON, fetches the Redfin Estimate (AVM) and Walk Score / Bike Score / Transit Score for each listing (2 extra API calls per listing). Adds one ListingEnriched charge per listing where at least one enrichment fetch succeeds. Disabled on FREE tier.

## Actor input object example

```json
{
  "searchMode": "byRegionId",
  "maxResults": 100,
  "listingStatus": "forSale",
  "autocompleteQuery": "Austin",
  "regionId": "2_30818",
  "lat": 30.27,
  "lng": -97.74,
  "radius": 5,
  "includeEnrichment": false
}
```

# Actor output Schema

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

Structured Redfin property listings with calculated price/sqft, days on market, and (optional) Redfin Estimate + Walk Score.

## `htmlReport` (type: `string`):

HTML summary with run stats, market KPIs (median price, price/sqft, days on market), city + zip + property-type breakdowns, and per-query totals.

# 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("sian.agency/redfin-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("sian.agency/redfin-property-scraper").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 '{}' |
apify call sian.agency/redfin-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Redfin Property Scraper — Sale + Sold · Market KPIs",
        "description": "🏡 Scrape Redfin US real estate listings — for-sale, sold, and coming-soon — with built-in market KPIs (median price, price/sqft, days-on-market, breakdowns by city/zip) and HTML report. Optional Redfin Estimate + Walk Score enrichment. Independent tool — not affiliated with Redfin Corporation.",
        "version": "1.0",
        "x-build-id": "IfpVfFx1PST1apx3j"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~redfin-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-redfin-property-scraper",
                "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/sian.agency~redfin-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-redfin-property-scraper",
                "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/sian.agency~redfin-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-redfin-property-scraper",
                "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",
                "properties": {
                    "searchMode": {
                        "title": "🧭 Search Mode",
                        "enum": [
                            "autocomplete",
                            "byRegionId",
                            "byCoordinates"
                        ],
                        "type": "string",
                        "description": "How to find listings.\n\n• **autocomplete** — look up region IDs by typing a city / zip / neighborhood (helper mode, returns region candidates)\n• **byRegionId** — search a specific Redfin region (use Autocomplete first to get the ID)\n• **byCoordinates** — search by lat/lng + radius (PAID)",
                        "default": "byRegionId"
                    },
                    "maxResults": {
                        "title": "📊 Max results per query",
                        "minimum": 1,
                        "maximum": 350,
                        "type": "integer",
                        "description": "Hard cap on listings returned per query. Redfin returns up to ~350 per region in a single call. FREE tier is always capped at 25 listings per run.",
                        "default": 100
                    },
                    "listingStatus": {
                        "title": "🏷️ Listing Status",
                        "enum": [
                            "forSale",
                            "sold",
                            "comingSoon"
                        ],
                        "type": "string",
                        "description": "Which listings to return.\n\n• **forSale** — active for-sale listings\n• **sold** — recently sold homes\n• **comingSoon** — coming-soon listings",
                        "default": "forSale"
                    },
                    "autocompleteQuery": {
                        "title": "🔎 Autocomplete Query  (used when Search Mode = autocomplete)",
                        "type": "string",
                        "description": "Free-text place lookup — city, neighborhood, or 5-digit zip code. Returns a list of matching region IDs you can plug into the byRegionId mode."
                    },
                    "regionId": {
                        "title": "📍 Region ID  (used when Search Mode = byRegionId)",
                        "type": "string",
                        "description": "Redfin region identifier in '<type>_<id>' format. Examples:\n• 2_30818 — Austin, TX (city)\n• 2_29470 — Seattle, WA (city)\n• 6_14462 — a specific neighborhood\n• 13_78641 — zip code 78641\n\nUse Autocomplete mode first to discover region IDs.",
                        "default": "2_30818"
                    },
                    "regionIds": {
                        "title": "📋 Bulk Region IDs  (PAID, byRegionId mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Array of region IDs (same '<type>_<id>' format) — runs one search per ID. PAID tier only.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "lat": {
                        "title": "🗺️ Latitude  (used when Search Mode = byCoordinates)",
                        "minimum": -90,
                        "maximum": 90,
                        "type": "number",
                        "description": "Center latitude for a radial search."
                    },
                    "lng": {
                        "title": "🗺️ Longitude  (used when Search Mode = byCoordinates)",
                        "minimum": -180,
                        "maximum": 180,
                        "type": "number",
                        "description": "Center longitude for a radial search."
                    },
                    "radius": {
                        "title": "📏 Radius (miles)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Search radius in miles around the lat/lng center (1-50).",
                        "default": 5
                    },
                    "includeEnrichment": {
                        "title": "⭐ Include enrichment — Redfin Estimate + Walk Score (PAID)",
                        "type": "boolean",
                        "description": "When ON, fetches the Redfin Estimate (AVM) and Walk Score / Bike Score / Transit Score for each listing (2 extra API calls per listing). Adds one ListingEnriched charge per listing where at least one enrichment fetch succeeds. Disabled on FREE tier.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
