# Realtor.com Property Listings & Agent Contacts (`devil_port369-owner/usa-real-estate-scraper`) Actor

Scrape US homes for sale, rent, and sold listings from Realtor.com. Search by city, ZIP, or Realtor URLs. Export MLS-style data: price, beds, baths, sqft, agent email/phone, broker, photos, coordinates. No official API key required.

- **URL**: https://apify.com/devil\_port369-owner/usa-real-estate-scraper.md
- **Developed by:** [DataFusionX](https://apify.com/devil_port369-owner) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Realtor Scraper – Scrape Realtor.com Listings, Agents & Sold Comps (USA)

> **The fastest way to scrape Realtor.com.** Pull US homes for sale, for rent, sold, and pending listings by city, ZIP, or URL — normalized into clean, flat JSON with price, beds/baths/sqft, coordinates, agent email & phone, broker, and photos. No API key, no code required.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-orange.svg)](https://apify.com)

***

### What is this Realtor.com scraper?

**This Realtor scraper extracts live property listings, sold comps, and agent contact details directly from Realtor.com — no Realtor.com API key needed.** Give it a city, a ZIP code, or a Realtor.com search/detail URL, and it returns structured, ready-to-use data: list price, beds, baths, square footage, address, coordinates, and full agent/broker contact info (name, email, phone, license, office). It's the go-to tool for anyone who's searched *"how to scrape Realtor.com"* and wants a production-ready answer instead of building a custom scraper from scratch.

**What it extracts:** for-sale, for-rent, sold, and pending property listings, plus listing agent, broker, and office contact details.

**Who it's for:** real estate investors, PropTech teams, lead-gen agencies, data analysts, and developers doing real estate web scraping at scale.

**Why choose this over building your own scraper:** Realtor.com's anti-bot protections and GraphQL structure make DIY scraping fragile — this Actor handles request signing, pagination, and proxy routing for you, and outputs a flat schema instead of deeply nested JSON.

***

### Why scrape real estate data from Realtor.com? (Business Use Cases)

- **Lead Generation for Real Estate & Mortgage Teams** — Build targeted buyer/seller lead lists with verified agent emails and phone numbers pulled straight from active listings.
- **Investment & Market Research** — Scrape real estate data across multiple cities or ZIPs to compare pricing trends, inventory levels, and days-on-market for underwriting decisions.
- **Valuation & Comps Modeling** — Pull sold listings (`sold` status) to feed automated valuation models (AVMs) or comparative market analyses (CMAs).
- **PropTech & CRM Integration** — Feed a continuous stream of new listings into your CRM, Slack, or internal dashboard the moment they hit the market, via scheduled runs and webhooks.

***

### Key Features

| Feature | Detail |
|--------|--------|
| **Location search** | ZIP, city, `City, ST`, neighborhood, or county — just type a place name |
| **Bulk Realtor.com URLs** | Mix search pages and detail pages in a single run |
| **Listing types** | `for_sale`, `for_rent`, `sold`, `pending` |
| **Deep filters** | Price, beds, baths, sqft, lot size, year built, property type, foreclosure, past N days |
| **Agent & broker contacts** | Name, email(s), phone(s), state license, office, broker, builder |
| **Enrich mode** | Optional detail-page pass for fuller agent/builder data |
| **Per-location limits** | `maxItems` applies per city/URL; set `0` to paginate until results run out |
| **Streaming output** | Every listing is pushed to the dataset the moment it's scraped — no waiting for the full run |
| **No Realtor.com API key needed** | Runs entirely through the Actor — nothing to authenticate on your end |

***

### Input Parameters

Provide **at least one** of `locations` or `startUrls`.

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `locations` | string\[] | No\* | — | Free-text places to search (ZIP, city, `City, ST`, neighborhood, county) |
| `startUrls` | string\[] | No\* | — | Bulk Realtor.com search and/or detail page URLs, deduplicated automatically |
| `listingType` | string | No | `for_sale` | `for_sale` | `for_rent` | `sold` | `pending` |
| `maxItems` | integer | No | `100` | Max listings **per location or URL**; `0` = unlimited (paginate until empty) |
| `pastDays` | integer | No | — | Only include listings listed/sold within the last N days |
| `priceMin` / `priceMax` | integer | No | — | Minimum / maximum list price in USD |
| `bedsMin` / `bedsMax` | integer | No | — | Minimum / maximum bedrooms |
| `bathsMin` | number | No | — | Minimum bathrooms (supports halves, e.g. `1.5`) |
| `sqftMin` / `sqftMax` | integer | No | — | Minimum / maximum living area in sqft |
| `lotSqftMin` | integer | No | — | Minimum lot size in sqft |
| `yearBuiltMin` / `yearBuiltMax` | integer | No | — | Earliest / latest construction year |
| `propertyTypes` | string\[] | No | — | `single_family`, `multi_family`, `condos`, `townhomes`, `duplex_triplex`, `farm`, `land`, `mobile` |
| `sortBy` | string | No | `list_date` | `list_date` | `sold_date` | `list_price` | `sqft` | `beds` | `baths` | `last_update_date` |
| `sortDirection` | string | No | `desc` | `asc` | `desc` |
| `foreclosure` | boolean | No | `false` | Return only foreclosure listings |
| `excludePending` | boolean | No | `false` | Drop pending listings when `listingType` is `for_sale` |
| `enrichDetails` | boolean | No | `true` | Fetch full listing details for richer agent/builder contact fields |

\*One of `locations` or `startUrls` is required.

Valid input sample:

```json
{
  "locations": ["Austin, TX", "New York"],
  "listingType": "for_rent",
  "maxItems": 100,
  "sortBy": "list_date",
  "sortDirection": "desc",
  "enrichDetails": true
}
```

***

### Output Data Structure

Each output item is one flat property record — no nested objects to unpack. Contact fields prefer the listing agent first, with full multi-value lists available for broker and office contacts.

```json
{
  "country": "US",
  "source": "realtor",
  "propertyUrl": "https://www.realtor.com/realestateandhomes-detail/...",
  "propertyId": "9726862266",
  "status": "for_rent",
  "listPrice": 525000,
  "beds": 3,
  "fullBaths": 2,
  "baths": 2,
  "sqft": 1840,
  "formattedAddress": "9525 Buckstitch Saddle Dr, Austin, TX 78724",
  "city": "Austin",
  "state": "TX",
  "zipCode": "78724",
  "latitude": 30.27,
  "longitude": -97.65,
  "agentName": "Kelly Campbell",
  "agentEmail": "kellycc21@gmail.com",
  "agentPhone": "8452974700",
  "brokerName": "Century 21 Alliance Realty Group",
  "officeName": "Century 21 Alliance Realty Group",
  "officePhones": ["8452974700", "8008961768"],
  "photos": ["https://..."],
  "scrapedAt": "2026-09-18T06:00:00+00:00",
   "..": ".."
}
```

Export straight to JSON, CSV, Excel, or XML from the Apify dataset UI or API — no manual parsing needed.

***

### How to Scrape Realtor.com in 4 Steps

Wondering how to scrape Realtor.com without writing your own crawler? Here's the whole workflow:

1. **Configure input** — Add cities, ZIPs, or Realtor.com URLs to `locations` / `startUrls`, then set your listing type and filters (price, beds, baths, etc.).
2. **Run the Actor** — Click "Start" in the Apify Console, or trigger it via the Apify API, Python, or JavaScript SDK.
3. **Preview results** — Watch listings stream into the dataset in real time as they're scraped.
4. **Export or automate** — Download as JSON, CSV, or Excel, or pipe results into your CRM, spreadsheet, or database via Zapier, Make, n8n, or webhooks.

### Integrations & Export Options

Results export natively to JSON, CSV, Excel, and XML, and connect directly to no-code tools like n8n, Zapier, and Make. Push scraped listings into HubSpot, Salesforce, Google Sheets, or a data warehouse (Postgres, BigQuery, Airtable) via the Apify API, SDKs, or scheduled webhook triggers — ideal for keeping lead lists or market dashboards continuously up to date.

***

### Frequently Asked Questions (FAQ)

#### How do I scrape Realtor.com?

Enter a location (city, ZIP, or `City, ST`) or a Realtor.com URL into the Actor's input, choose a listing type (`for_sale`, `for_rent`, `sold`, `pending`), and run it. No coding, proxies, or Realtor.com login is required — the Actor handles pagination and returns structured JSON automatically.

#### Can you scrape real estate data on Realtor.com?

Yes. This Actor is purpose-built to scrape real estate data from Realtor.com's public listing pages and GraphQL search — including for-sale, for-rent, sold, and pending properties, plus agent and broker contact details.

#### Can you scrape data from Realtor.ca?

No — this Actor targets **Realtor.com (United States)** only. Realtor.ca is a separate Canadian platform with a different site structure and is not covered by this scraper.

#### How do I scrape data from Realtor.com into a spreadsheet?

Run the Actor, then export the resulting dataset directly to CSV or Excel from the Apify Console (or via the API) — no extra transformation step needed. The output is already flat, so it opens cleanly as spreadsheet rows.

#### Why is `agentStateLicense` sometimes empty?

Realtor.com doesn't always include `state_license` on search result cards. Enable `enrichDetails` (on by default) to fetch full listing details — though some listings still omit license info from the public payload entirely.

#### How does `maxItems` work with multiple locations?

It applies **per location or URL**, not globally. Two locations with `maxItems: 100` can return up to **200** listings total. Set `maxItems: 0` to paginate until Realtor.com returns no more results.

#### Can I integrate this with my CRM or spreadsheet tools?

Yes. Use the Apify API, webhooks, or Python/JS SDKs to push scraped listings into HubSpot, Salesforce, Google Sheets, or your own data warehouse automatically.

***

### SEO Keywords

realtor scraper, scrape realtor.com, realtor.com scraper, how to scrape realtor, scrape realtor, real estate web scraping, scrape real estate data, scraping real estate data, scrape real estate, web scraping real estate data, real estate agent email scraper, sold comps scraper, PropTech data pipeline

***

Built by **DataFusionX**

# Actor input Schema

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

Free-text places to search on Realtor.com. Accepts ZIP (90210), city (Austin), city + state (Austin, TX), neighborhood, or county.

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

Bulk Realtor.com links. Mix search pages (realestateandhomes-search/...) and detail pages (realestateandhomes-detail/...). Deduplicated automatically.

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

Market segment to query.

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

Maximum listings to fetch PER location or search URL. Example: 2 cities + maxItems=100 → up to 200 rows. Set 0 for unlimited (paginate until Realtor returns no more results).

## `pastDays` (type: `integer`):

Only include listings listed (or sold) within the last N days.

## `priceMin` (type: `integer`):

Minimum list price in US dollars.

## `priceMax` (type: `integer`):

Maximum list price in US dollars.

## `bedsMin` (type: `integer`):

Minimum bedrooms.

## `bedsMax` (type: `integer`):

Maximum bedrooms.

## `bathsMin` (type: `number`):

Minimum bathrooms (supports halves, e.g. 1.5).

## `sqftMin` (type: `integer`):

Minimum living area in square feet.

## `sqftMax` (type: `integer`):

Maximum living area in square feet.

## `lotSqftMin` (type: `integer`):

Minimum lot size in square feet.

## `yearBuiltMin` (type: `integer`):

Earliest construction year.

## `yearBuiltMax` (type: `integer`):

Latest construction year.

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

Optional property type filter. Leave empty for all types.

## `sortBy` (type: `string`):

Field used to order search results.

## `sortDirection` (type: `string`):

Ascending or descending sort order.

## `foreclosure` (type: `boolean`):

If enabled, only return foreclosure listings.

## `excludePending` (type: `boolean`):

When listing type is for\_sale, drop properties flagged as pending.

## `enrichDetails` (type: `boolean`):

Optional detail GraphQL per listing when agent name/phone is missing. Much slower (≈1 extra request per property). Leave off for speed; turn on for lead enrichment.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "startUrls": [
    "https://www.realtor.com/realestateandhomes-search/San-Francisco_CA"
  ],
  "listingType": "for_sale",
  "maxItems": 200,
  "sortBy": "list_date",
  "sortDirection": "desc",
  "foreclosure": false,
  "excludePending": false,
  "enrichDetails": false
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Austin, TX"
    ],
    "startUrls": [
        "https://www.realtor.com/realestateandhomes-search/San-Francisco_CA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("devil_port369-owner/usa-real-estate-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 = {
    "locations": ["Austin, TX"],
    "startUrls": ["https://www.realtor.com/realestateandhomes-search/San-Francisco_CA"],
}

# Run the Actor and wait for it to finish
run = client.actor("devil_port369-owner/usa-real-estate-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 '{
  "locations": [
    "Austin, TX"
  ],
  "startUrls": [
    "https://www.realtor.com/realestateandhomes-search/San-Francisco_CA"
  ]
}' |
apify call devil_port369-owner/usa-real-estate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devil_port369-owner/usa-real-estate-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/2oXbFyiXVBnLPnHcj/builds/F902cJYfYUYHkdmgm/openapi.json
