# Redfin Scraper & Investment Analysis (`zapticx/redfin-scraper-investment-analysis`) Actor

Scrape Redfin active, sold, rental, pending and coming-soon listings by ZIP or search URL. Compare sold comps and calculate transparent investment metrics using available property data and your assumptions.

- **URL**: https://apify.com/zapticx/redfin-scraper-investment-analysis.md
- **Developed by:** [Zapticx](https://apify.com/zapticx) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 94.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 properties

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?

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 Scraper & Investment Analysis

### Scrape Redfin property data across locations

Enter ZIP codes or Redfin city/ZIP URLs and receive structured listing records, sample market summaries, and optional sold comparisons and investment calculations. This Redfin scraper helps compare asking prices, screen properties, and export real estate market data through Apify's property data API.

Public V1 returns up to **100 properties per location**, across up to **10 locations**. It reports coverage explicitly. Investment metrics depend on available property data and your assumptions; every property does not receive complete underwriting.

### Key features

- Redfin listings scraper for active, sold, rental, pending/contingent and coming-soon inventory.
- Structured IDs, address, price, beds, baths, square feet, property type, status and listing URL.
- Price per sqft and price-drop amounts/percentages when source values exist.
- Redfin comps selected from sampled sold homes using disclosed similarity rules.
- Sample market pricing, property-type distribution and collection timestamps.
- Mortgage, ownership, NOI, cap rate, cash-on-cash and DSCR calculations when inputs permit.
- Deterministic Deal Score with components and coverage.
- JSON/CSV export and preservation of valid locations when another fails.

### Supported listing types

| Input value | Output |
|---|---|
| `forSale` | Active listings |
| `sold` | Redfin sold homes within `soldWithin` |
| `forRent` | Rental listings; source ranges use the minimum value |
| `pending` | Pending, contingent and under-contract source statuses |
| `comingSoon` | Coming-soon listings in the exposed search sample |

### Multi-location searches

Use ZIP codes or city/ZIP search URLs. A Redfin property URL is not a supported search input. City-name text lookup is experimental; ZIP codes and URLs are preferred.

```json
{
  "locations": ["78704", "https://www.redfin.com/city/30818/TX/Austin"],
  "listingType": "forSale",
  "maxResultsPerLocation": 100
}
```

Results retain their first input location. Duplicate listings across overlapping locations are emitted only once per run; each summary describes the newly emitted records for that location.

### Sold comps

Enable `includeComps` to compare properties with up to 100 sampled recent sold records. Candidates must share a normalized property type. Where values exist, they must be within three miles, one bedroom and 25% of target square feet. Up to ten nearest candidates are selected; ties use stable IDs.

Output includes comparable IDs, counts, median price and the target's percentage difference from that median. The time window uses `soldWithin` (default three months). These are screening comparisons, not an appraisal. If the sold search fails, base properties remain available and a warning is logged.

### Market analysis

Each location receives one `MARKET_SUMMARY` with count, median/average price, price per sqft, days on market and property-type distribution. Every statistic describes the collected sample, not the entire market.

`CAPPED` means the user limit or source response limit restricted collection. `PARTIAL` means full-market completeness has not been established. Public V1 does not claim `COMPLETE`.

### Investment analysis

Set `investmentAnalysis.enabled` to true for transparent real estate investment analysis. Mortgage estimates require a valid purchase price. Ownership cost requires known tax and HOA. Rent-based metrics additionally require `monthlyRentOverride`.

Automatic Redfin rent estimates are not part of V1. When required data is missing, the affected metric stays null. Rental asking prices are not silently treated as sale prices or as a source rent estimate for another property.

### Input

The Store form has four sections: Search, Filters, Analysis and Advanced.

| Input | Default / meaning |
|---|---|
| `locations` | ZIP 78704; up to 10 locations |
| `listingType` | `forSale` |
| `maxResultsPerLocation` | 20; maximum 100 |
| Price, beds, baths, sqft, property type | Optional filters applied to the exposed search sample |
| `includeComps` | false |
| `investmentAnalysis` | `{"enabled": false}` |
| `proxyConfiguration` | Direct networking unless supplied |

Property detail enrichment is disabled in V1. Detail, photo and history flags set to true are rejected before network work.

### Output

Important property fields appear first in the Dataset: address, price, asking rent, beds, baths, sqft, property type, status, price per sqft and URL. For rental searches, `askingRent` is the source listing's monthly asking price; `price` retains the same value for backward compatibility. `rentEstimate` remains null unless an independent estimate is available. Stable IDs and timestamps support downstream comparisons. Optional analysis is nested; unavailable property fields are null.

`PROPERTY` rows contain listings. `MARKET_SUMMARY` rows contain sample statistics. `ERROR` rows report failed locations. Filter by record type for property-only exports. In a mixed table, columns that do not apply to a record type may be blank.

### Example

Fast default:

```json
{
  "locations": ["78704"],
  "listingType": "forSale",
  "maxResultsPerLocation": 20
}
```

Assumption-based analysis:

```json
{
  "locations": ["78704"],
  "listingType": "forSale",
  "maxResultsPerLocation": 20,
  "includeComps": true,
  "investmentAnalysis": {
    "enabled": true,
    "monthlyRentOverride": 3500,
    "propertyTaxPercentAnnual": 2,
    "downPaymentPercent": 20,
    "interestRate": 7,
    "loanTermYears": 30
  }
}
```

The tax-rate assumption is used only when source tax is absent. This example can calculate returns for a condo with known HOA, while a house with unknown HOA retains null returns.

### Financial assumptions

Defaults when analysis is enabled: 20% down, 7% interest, 30-year loan, 3% closing costs, 0.5% annual insurance, 1% annual maintenance and 5% vacancy. These are editable assumptions, not current market quotes.

NOI excludes debt service. Cap rate is NOI divided by price. Cash-on-cash deducts debt service and divides by down payment plus closing costs. DSCR is NOI divided by debt service. Percentages are percentage points: 6.8 means 6.8%. Unknown tax/HOA never silently becomes zero.

Analysis of purchase financing is intended for sale/sold/pending/coming-soon records; rental searches return listings without purchase-financing calculations.

### Deal Score methodology

No AI is used. Six components are clamped to 0–100: comp discount, price drop, days on market, cap rate, cash-on-cash and DSCR. Their available-component mean is emitted only when at least two exist. `dealScoreCoverage` is the available fraction of six, not a confidence probability.

Component formulas: clamp(50 − 2 × comp premium percent), clamp(5 × price-drop percent), clamp(100 × days/90), clamp(100 × cap rate/10), clamp(100 × cash-on-cash/12), and clamp(100 × (DSCR − 0.8)/0.8). Longer time on market is a negotiation signal in this heuristic. The score is a screening aid, not investment advice.

### API & automation

Use this Redfin data scraper through Apify Console, the Apify REST API or JavaScript/Python clients. The property data API exports JSON and CSV for spreadsheets, databases, Make, Zapier and n8n workflows. It is an independent Redfin property scraper, not an official Redfin API.

### Scheduling / monitoring

Use Apify schedules to collect snapshots. Compare stable property/listing IDs externally to track changes in Redfin real estate data. V1 does not include a separate change-detection or notification engine.

### Pricing

Price: **$2 per 1,000 PROPERTY records**, plus Apify platform usage shown separately. Optional comps and investment calculations have no additional event fee. There is no startup, summary, error or enrichment fee.

The live Store pricing panel is authoritative. Failed searches can still incur platform compute/proxy usage even when they deliver no billable property records. A named property event excludes summaries and errors; overlapping-location duplicates are not emitted or charged again.

### Limitations

- Maximum 100 results per location. Large-market completeness is not claimed; filters operate on the available sample.
- Source availability and MLS fields vary. Missing history, tax, rent estimates or contact data is expected.
- Detail enrichment is disabled. No bulk-enrichment claim is made.
- Rent returns require user rent; unknown tax/HOA suppresses dependent metrics.
- Direct networking passed small cloud runs but may be denied under sustained activity. US residential Apify Proxy is a tested, more expensive option. Standard datacenter proxy failed validation.
- An empty market emits a summary and the run fails if no location produces properties.
- Redfin website routes can change. Use the data within your applicable access and data-use rights.

### FAQ

**Can this Redfin rental scraper calculate returns automatically?**
No. Rental records are collected, but returns on a purchase require a valid sale price, user rent and known material expenses.

**Does it collect every matching home?**
No. V1 returns bounded samples with coverage labels.

**Can I export Redfin sold homes and comps to CSV?**
Yes. Use Dataset export and choose the fields needed; nested analysis produces extra CSV columns.

**Why is a metric null?**
A necessary price, expense, rent or denominator is missing. Supply supported assumptions where appropriate.

**Why keep “Investment Analysis” in the title?**
The Actor provides sold comparisons, mortgage estimates, conditional ownership/return calculations and disclosed scoring, while showing exactly which inputs are available.

# Actor input Schema

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

Up to 10 ZIP codes or Redfin city/ZIP URLs for real estate market data. City text lookup is experimental.

## `listingType` (type: `string`):

Pending includes Redfin's pending and contingent/under-contract statuses.

## `maxResultsPerLocation` (type: `integer`):

1–100 results per location. This is a sample limit, not a full-market guarantee. Check coverageStatus.

## `soldWithin` (type: `string`):

Applied only to sold searches.

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

Exclude properties priced below this amount.

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

Exclude properties priced above this amount.

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

Exclude properties with fewer bedrooms.

## `maxBeds` (type: `number`):

Exclude properties with more bedrooms.

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

Exclude properties with fewer bathrooms.

## `maxBaths` (type: `number`):

Exclude properties with more bathrooms.

## `minSqFt` (type: `integer`):

Exclude properties below this interior size.

## `maxSqFt` (type: `integer`):

Exclude properties above this interior size.

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

Optional normalized property-type filter.

## `includeComps` (type: `boolean`):

Select nearby recent sales using explicit property-type, bed, size, time, and distance rules.

## `investmentAnalysis` (type: `object`):

Optional real estate investment analysis. Supply monthlyRentOverride for rental returns. Unknown tax or HOA keeps dependent metrics null.

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

Direct networking is the default. Use your Apify US RESIDENTIAL proxy for sustained workloads if needed. Standard datacenter proxy failed validation.

## Actor input object example

```json
{
  "locations": [
    "78704"
  ],
  "listingType": "forSale",
  "maxResultsPerLocation": 20,
  "soldWithin": "3_months",
  "includeComps": false,
  "investmentAnalysis": {
    "enabled": false
  }
}
```

# Actor output Schema

## `dataset` (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": [
        "78704"
    ],
    "listingType": "forSale",
    "maxResultsPerLocation": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("zapticx/redfin-scraper-investment-analysis").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": ["78704"],
    "listingType": "forSale",
    "maxResultsPerLocation": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("zapticx/redfin-scraper-investment-analysis").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": [
    "78704"
  ],
  "listingType": "forSale",
  "maxResultsPerLocation": 20
}' |
apify call zapticx/redfin-scraper-investment-analysis --silent --output-dataset

```

## MCP server setup

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

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/ktXL61nYY4QnYJ3W8/builds/2h0ui5tKGwCypFotE/openapi.json
