# Realtor.com Scraper (`solidcode/realtorcom-scraper`) Actor

\[💰 $0.8 / 1K] Extract property listings from Realtor.com. Get prices, addresses, photos, schools, listing and price history, value estimates, agent contact info, and more for sale, rent, or sold properties.

- **URL**: https://apify.com/solidcode/realtorcom-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 71 total users, 23 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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.

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

## Realtor.com Scraper

Pull property listings from Realtor.com at scale — prices, addresses, photos, schools, value estimates, agent contacts, price history, and environmental risk scores for every for-sale, rental, and recently sold home across the United States. Built for real estate investors, CRM teams, and analytics platforms that need fresh Realtor.com data without building and maintaining their own scraper.

### Why This Scraper?

- **All 50 US states, every ZIP** — search by city, ZIP, or paste any Realtor.com URL. No hand-crafting search links, no per-state setup.
- **For sale, for rent, and recently sold** — three listing statuses in one actor; flip a single dropdown to switch.
- **Seven property type filters** — single family, condos, townhomes, multi-family, land, mobile homes, or farms & ranches.
- **Multi-source AVM value estimates** — automated valuation models surface alongside the asking price for every detail-enriched property.
- **Five-category environmental risk scoring** — flood, fire, heat, wind, and air quality scores on every property, with severity labels.
- **Verified listing agent contacts** — name, email, phone, and brokerage office captured for every active listing.
- **Full price history and assigned schools** — every sale, list, and price change event, plus nearby schools with ratings and distance.
- **Automatic deduplication** — no duplicate properties, even when overlapping search areas pull the same listing twice.

### Use Cases

**Real Estate Investment & Analysis**

- Compare asking prices to automated value estimates across neighborhoods
- Track recently sold properties to identify market trends
- Analyze price per square foot across ZIP codes
- Monitor days on market to gauge demand

**Market Research**

- Map inventory by city, state, or ZIP
- Compare property types (single family vs. condos) across markets
- Track new construction in growth areas
- Identify foreclosure and price-reduced opportunities

**Lead Generation**

- Build listing-agent contact lists with name, email, and phone
- Find listing offices in target markets
- Target properties by status (coming soon, pending, contingent)
- Identify new listings within the past 14 days

**Data Enrichment & Integration**

- Enrich existing property databases with current pricing and status
- Feed property data into analytics dashboards
- Power real estate comparison tools and market reports
- Build alerting systems for price changes and new listings

### Getting Started

#### Search by Location

The simplest way to start — just a city and state:

```json
{
    "searchLocations": ["Austin, TX"],
    "maxItems": 50
}
```

#### Search by ZIP Code

```json
{
    "searchLocations": ["78701", "78702", "78703"],
    "listingStatus": "for_sale",
    "maxItems": 100
}
```

#### Recently Sold Properties

```json
{
    "searchLocations": ["Denver, CO"],
    "listingStatus": "recently_sold",
    "propertyType": "single_family",
    "maxItems": 200
}
```

#### Rental Listings

```json
{
    "searchLocations": ["Miami, FL"],
    "listingStatus": "for_rent",
    "maxItems": 100
}
```

#### Using Realtor.com URLs

Paste any Realtor.com search or property detail URL directly:

```json
{
    "startUrls": [
        { "url": "https://www.realtor.com/realestateandhomes-search/Austin_TX" },
        { "url": "https://www.realtor.com/realestateandhomes-detail/2401-Thornton-Rd_Austin_TX_78704_M71466-07795" }
    ],
    "maxItems": 100
}
```

#### Full-Featured Example

```json
{
    "searchLocations": ["San Francisco, CA", "94102"],
    "startUrls": [
        { "url": "https://www.realtor.com/realestateandhomes-search/Oakland_CA" }
    ],
    "listingStatus": "for_sale",
    "propertyType": "condos",
    "maxItems": 500,
    "includePropertyDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | URL\[] | `[]` | Realtor.com URLs to scrape. Supports search pages and individual property listings. The scraper auto-detects the URL type. |
| `searchLocations` | string\[] | `[]` | Search by city and state (e.g. "Austin, TX") or ZIP code (e.g. "78701"). No need to build URLs manually. |

#### Search Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `listingStatus` | select | `For Sale` | Type of listings: For Sale, For Rent, or Recently Sold. Applies to location-based searches. |
| `propertyType` | select | `All Types` | Filter by property type: Single Family, Condos, Townhomes, Multi-Family, Land, Mobile Homes, or Farms & Ranches. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxItems` | integer | `100` | Maximum number of results to return. Set to 0 for unlimited. Start with 10-50 to test, then increase. |
| `includePropertyDetails` | boolean | `true` | Fetch full details for each property (schools, price history, estimates, description, environmental risks). Slower but much richer data. When off, only basic search result fields are returned. |

### Output

Here's a representative result with full details enabled:

```json
{
    "property_id": "9797030113",
    "status": "for_sale",
    "href": "https://www.realtor.com/realestateandhomes-detail/2401-Thornton-Rd_Austin_TX_78704_M97970-30113",
    "list_price": 575000,
    "price_per_sqft": 345,
    "last_sold_price": 420000,
    "last_sold_date": "2019-06-15",
    "days_on_market": 12,
    "list_date": "2026-04-01T00:00:00Z",
    "photo_count": 28,
    "address_line": "2401 Thornton Rd",
    "address_city": "Austin",
    "address_state_code": "TX",
    "address_postal_code": "78704",
    "address_lat": 30.2432,
    "address_lon": -97.7654,
    "county_name": "Travis",
    "neighborhoods": "Zilker",
    "beds": 3,
    "baths_consolidated": "2.5",
    "sqft": 1665,
    "lot_sqft": 6500,
    "year_built": 1972,
    "property_type": "single_family",
    "description_text": "Charming updated home in the heart of Zilker with open floor plan...",
    "tags": ["central_air", "hardwood_floors", "updated_kitchen"],
    "primary_agent_name": "Jane Smith",
    "primary_agent_email": "jane@realestate.com",
    "primary_agent_phone": "5125551234",
    "primary_office_name": "Austin Premier Realty",
    "hoa_fee": 150,
    "mortgage_monthly_payment": 3450,
    "assigned_schools": [
        { "name": "Zilker Elementary", "rating": 8, "distance_in_miles": 0.4 }
    ],
    "property_history": [
        { "date": "2019-06-15", "event_name": "Sold", "price": 420000 }
    ],
    "local_flood_score": 2,
    "local_fire_score": 1,
    "estimates_current": [
        { "source": { "name": "Quantarium" }, "estimate": 589000 }
    ],
    "photo_urls": ["https://ap.rdcpix.com/example1.jpg"],
    "scraped_at": "2026-04-16T14:30:00Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `property_id` | string | Unique Realtor.com property identifier |
| `status` | string | Listing status (for\_sale, for\_rent, sold, etc.) |
| `href` | string | Direct Realtor.com listing URL |
| `list_price` | number | Current asking price in USD |
| `price_per_sqft` | number | Price per square foot |
| `days_on_market` | number | Days the current listing has been live. Resets when a property is relisted. Empty on sold listings, whose clock has already stopped |
| `list_date` | string | Date the current listing went live |
| `beds` | number | Number of bedrooms |
| `baths_consolidated` | string | Formatted bathroom count (e.g. "2.5") |
| `sqft` | number | Living area in square feet |
| `lot_sqft` | number | Lot size in square feet |
| `year_built` | number | Year constructed |
| `property_type` | string | single\_family, condos, townhomes, etc. |
| `description_text` | string | Full listing description |
| `tags` | string\[] | Amenity and feature tags |
| `photo_urls` | string\[] | All listing photo URLs |
| `photo_count` | number | Number of listing photos |
| `scraped_at` | string | ISO timestamp of data extraction |

#### Address & Location

| Field | Type | Description |
|-------|------|-------------|
| `address_line` | string | Full street address |
| `address_city` | string | City |
| `address_state_code` | string | Two-letter state code |
| `address_postal_code` | string | ZIP code |
| `address_lat` | number | Latitude |
| `address_lon` | number | Longitude |
| `county_name` | string | County name |
| `neighborhoods` | string | Neighborhood names |

#### Price & Market History

| Field | Type | Description |
|-------|------|-------------|
| `last_sold_price` | number | Previous sale price |
| `last_sold_date` | string | Previous sale date |
| `is_new_construction` | boolean | New construction flag |
| `is_foreclosure` | boolean | Foreclosure flag |
| `is_pending` | boolean | Pending sale flag |
| `is_contingent` | boolean | Contingent sale flag |
| `property_history` | object\[] | Price and listing history events |

#### Agent & Listing Office

| Field | Type | Description |
|-------|------|-------------|
| `primary_agent_name` | string | Listing agent name |
| `primary_agent_email` | string | Listing agent email |
| `primary_agent_phone` | string | Listing agent phone number |
| `primary_office_name` | string | Listing office name |
| `source_name` | string | MLS name |
| `source_listing_id` | string | MLS listing ID |

#### Financial Estimates

| Field | Type | Description |
|-------|------|-------------|
| `hoa_fee` | number | Monthly HOA fee |
| `mortgage_monthly_payment` | number | Estimated monthly mortgage payment |
| `estimates_current` | object\[] | Current automated property value estimates from multiple sources |

#### Schools & Environmental Risk

Populated when `includePropertyDetails` is on.

| Field | Type | Description |
|-------|------|-------------|
| `assigned_schools` | object\[] | Nearby schools with ratings, grades, and distance |
| `local_flood_score` | number | Flood risk score (1-10) |
| `local_fire_score` | number | Wildfire risk score (1-10) |
| `local_heat_score` | number | Heat risk score (1-10) |
| `local_wind_score` | number | Wind risk score (1-10) |
| `local_air_score` | number | Air quality risk score (1-10) |

Each risk score also has a matching `*_severity` string field (e.g. `local_flood_severity: "Minor"`).

### Tips for Best Results

- **Start small** — set `maxItems` to 10-50 on your first run to verify the data matches your needs, then scale up.
- **Use location search over URLs** — typing "Austin, TX" or "78701" is easier and more reliable than constructing search URLs.
- **Toggle details for speed vs. depth** — turn off `includePropertyDetails` for faster runs when you only need basic listing data. Turn it on for schools, value estimates, price history, and environmental risk scores.
- **Use `recently_sold` for comps** — sold-price data is the gold standard for investment underwriting and CMA reports. Pair with a tight ZIP list for accurate comparables.
- **Combine inputs** — mix location searches, ZIP codes, and URLs in a single run.
- **Read `days_on_market` as "days since this listing went live"** — it resets when a seller relists, which is exactly how a stale-inventory hunt should count it. Sort descending to surface listings ripe for a price cut. Treat it loosely on new-construction rows, where builders refresh the listing date as plans move.
- **Pull agent contacts in bulk** — `for_sale` listings always include `primary_agent_email` and `primary_agent_phone` when the brokerage publishes them, making this a one-shot lead list for target ZIPs.

### Pricing

**From $0.80 per 1,000 results** — one flat rate whether you pull basic listings or full property details. No compute or time-based charges: you pay per result, plus a small fixed start fee each time a run begins. Bronze, Silver, and Gold subscribers pay progressively less, and the table below shows the total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.096 | $0.091 | $0.085 | $0.080 |
| 1,000 | $0.96 | $0.91 | $0.85 | $0.80 |
| 10,000 | $9.60 | $9.10 | $8.50 | $8.00 |
| 100,000 | $96.00 | $91.00 | $85.00 | $80.00 |

A "result" is one property row in your dataset. Standard Apify platform fees apply on top.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Custom API integrations
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate real estate research, market analysis, and lead generation. Users are responsible for complying with applicable laws and Realtor.com's Terms of Service. Do not use extracted data for spam, harassment, or any illegal purpose. Be mindful of fair housing regulations when using property and demographic data.

# Actor input Schema

## `startUrls` (type: `array`):

Paste Realtor.com URLs directly. The scraper auto-detects the listing type from the URL: /realestateandhomes-search/ = For Sale, /apartments/ or /rentals/ = For Rent, /show-recently-sold = Recently Sold. Any filters in the URL (price, beds, type, keywords) are applied automatically. The Listing Status and Property Type settings below do NOT apply to URLs — everything comes from the URL itself.

## `searchLocations` (type: `array`):

Search for properties by typing a city and state (e.g. 'Austin, TX') or a ZIP code (e.g. '78701'). No need to build URLs manually.

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

What type of listings to find. Only applies to Search Locations below — ignored when using URLs (URLs determine their own status: /realestateandhomes-search/ = For Sale, /apartments/ = For Rent).

## `propertyType` (type: `string`):

Filter by property type. Only applies to Search Locations — ignored when using URLs (use /type-townhome, /type-condo etc. in the URL instead).

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

Maximum number of results to return across all URLs and searches. Set to 0 for unlimited. Tip: start with 10-50 to test, then increase.

## `includePropertyDetails` (type: `boolean`):

Fetch the full detail page for each property (schools, history, estimates, full description, environmental risks). Slower but much richer data. When off, only basic search result data is returned.

## `expandRadius` (type: `integer`):

Expand each search to include properties within this many miles of the location. Realtor.com's website automatically shows nearby properties when there are few exact matches in a city — set this (e.g. 25) to match that behavior. Leave at 0 to return only properties strictly inside the city/ZIP.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.realtor.com/realestateandhomes-search/Austin_TX"
  ],
  "searchLocations": [],
  "listingStatus": "for_sale",
  "propertyType": "all",
  "maxItems": 100,
  "includePropertyDetails": true,
  "expandRadius": 0
}
```

# Actor output Schema

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

Table of scraped property listings with key fields.

# 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 = {
    "startUrls": [
        "https://www.realtor.com/realestateandhomes-search/Austin_TX"
    ],
    "searchLocations": [],
    "listingStatus": "for_sale",
    "propertyType": "all",
    "maxItems": 100,
    "includePropertyDetails": true,
    "expandRadius": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/realtorcom-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 = {
    "startUrls": ["https://www.realtor.com/realestateandhomes-search/Austin_TX"],
    "searchLocations": [],
    "listingStatus": "for_sale",
    "propertyType": "all",
    "maxItems": 100,
    "includePropertyDetails": True,
    "expandRadius": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/realtorcom-scraper").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 '{
  "startUrls": [
    "https://www.realtor.com/realestateandhomes-search/Austin_TX"
  ],
  "searchLocations": [],
  "listingStatus": "for_sale",
  "propertyType": "all",
  "maxItems": 100,
  "includePropertyDetails": true,
  "expandRadius": 0
}' |
apify call solidcode/realtorcom-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/cAo9lq3J40RIgZYng/builds/3x2ayQWKpfW3RskZO/openapi.json
