# Realtor.com Scraper - Properties, Prices & Agent Leads (`scrapesage/realtor-com-scraper`) Actor

Scrape Realtor.com for-sale, for-rent & sold listings — prices, beds/baths, sqft, photos, MLS, geo, schools, price & tax history — plus deduped real-estate agent & office leads with email, phone & website. Keyless, no browser. Filter by location, price & type; monitor new listings & price drops.

- **URL**: https://apify.com/scrapesage/realtor-com-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 90.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 property listings

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/platform/actors/running/actors-in-store#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 — Properties, Prices & Agent Leads

Extract **complete Realtor.com property data** — for-sale, for-rent and recently-sold listings with **real prices, beds/baths, square footage, lot size, MLS number, full address with geo, photos, schools, and complete price & tax history**. Then turn every listing agent and office into a **ready-to-contact B2B lead** with **direct email, phone, personal website and brokerage** — deduped and lead-scored.

No login, no cookies, no browser — fast JSON extraction straight from Realtor.com's own property API, with 98%+ reliability.

### Why this Realtor.com scraper?

Most Realtor.com scrapers either return thin card data or charge a per-run start fee. This actor pulls from Realtor.com's internal GraphQL API and ships the **richest dataset in the category — with no start fee**:

| Data | Typical scrapers | This actor |
|---|---|---|
| List price, beds, baths, sqft, lot size | ✅ | ✅ |
| For-sale **and** for-rent **and** sold (comps) | partial | ✅ all three |
| MLS number, listing ID, source | ❌ | ✅ |
| Full address + lat/long + county + neighborhood | partial | ✅ |
| Listing **agent email + phone + website** | ❌ | ✅ |
| Deduped **agent / office leads** with lead score | ❌ | ✅ |
| Assigned **schools with ratings** | ❌ | ✅ opt-in |
| Full **listing & price history** | ❌ | ✅ opt-in |
| Multi-year **tax & assessment history** | ❌ | ✅ opt-in |
| Complete feature list (interior/exterior/utilities) | ❌ | ✅ opt-in |
| Only-new / price-drop **monitor mode** | ❌ | ✅ |
| Per-run start fee | 💸 often | ✅ none |

### Use cases

- **Real-estate agent lead generation** — every active listing carries its listing agent's **name, email, phone, website and brokerage**. Deduped and scored, that's a fresh, targeted agent database for CRMs, recruiting brokerages, title/escrow, mortgage, transaction-coordination, photography, staging and proptech vendors.
- **Investor deal-flow & comps** — pull for-sale inventory and recently-sold comparables (with sold dates and full price history) for any city, ZIP or state; filter by price, beds, type and size.
- **Market & pricing intelligence** — track list prices, price reductions, days-on-market signals (`isNewListing`, `isPriceReduced`, `isPending`) and inventory by area.
- **Rental market research** — search for-rent inventory with monthly rents, beds/baths and amenities by neighborhood.
- **Price-drop & new-listing alerts** — schedule the actor with **monitor mode** to emit only new listings, price drops/rises and status changes.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Realtor.com Scraper**, choose a **listing type** (for sale / for rent / sold), enter one or more **locations** (or paste Realtor.com search URLs), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "outputType": "search",
    "searchType": "for_sale",
    "location": ["Austin, TX", "78704"],
    "propertyTypes": ["house", "condo"],
    "priceMin": 300000,
    "priceMax": 900000,
    "bedsMin": 3,
    "sortBy": "newest",
    "includeAgentLeads": true,
    "maxResults": 200
}
```

- **outputType** — `search` (property listings), `agentLeads` (deduped agent/office contacts), or `propertyDetail` (full records by `property_id`).
- **searchType** — `for_sale`, `for_rent`, or `sold` (recently sold comps).
- **location** — one or more of `City, ST` (`Austin, TX`), a 5-digit ZIP (`78704`), a county, or a full state name (`Vermont`). Each is searched independently.
- **searchUrls** — paste Realtor.com search pages directly: `realestateandhomes-search/...` (for sale), `apartments/...` (rent), `soldhomeprices/...` (sold). The listing type is taken from the URL.
- **propertyTypes** — `house` / `single_family`, `condo`, `townhome`, `multi_family`, `duplex`, `mobile`, `land`, `farm`, `coop`.
- **priceMin / priceMax / bedsMin / bedsMax / bathsMin / sqftMin / sqftMax** — filters (price is monthly rent for rentals).
- **sortBy** — `relevant`, `newest`, `price_low`, `price_high`, `sqft`, `lot_size`, `sold_date`.
- **includePropertyDetails** *(default false)* — also fetch each property's full record: complete feature list, assigned schools with ratings, full listing & price history, multi-year tax history and the photo gallery (billed as a property detail).
- **includeAgentLeads** *(default false)* — also emit one deduped agent/office lead per listing agent.
- **propertyIds** — numeric `property_id` values for `propertyDetail` mode.
- **monitorMode / monitorKey** — only-new / changed output (see below).

### Output

One record per property (`type: "property"`), plus optional `propertyDetail` and `agentLead` records:

```json
{
    "type": "property",
    "propertyId": "7291872309",
    "listingId": "2997460536",
    "status": "for_sale",
    "listingType": "for_sale",
    "url": "https://www.realtor.com/realestateandhomes-detail/11910-Sunhillow-Bnd_Austin_TX_78758_M72918-72309",
    "price": 599900,
    "priceText": "$599,900",
    "beds": 6,
    "baths": 4,
    "sqft": 1936,
    "lotSqft": 7187,
    "propertyType": "multi_family",
    "yearBuilt": 1983,
    "line": "11910 Sunhillow Bnd",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78758",
    "county": "Travis",
    "latitude": 30.398839,
    "longitude": -97.711,
    "listDate": "2026-06-12T03:35:54.000Z",
    "isNewListing": true,
    "mlsName": "AUTX",
    "mlsNumber": "4342289",
    "agentName": "Deep Parikh",
    "agentPhone": "(512) 659-4726",
    "officeName": "RealTech Realty, LLC",
    "photos": ["https://ap.rdcpix.com/...jpg"],
    "scrapedAt": "2026-06-23T17:12:35.503Z"
}
```

Agent lead record (`type: "agentLead"`):

```json
{
    "type": "agentLead",
    "agentId": "3147563",
    "name": "Deep Parikh",
    "email": "deep@real-tech.com",
    "phone": "(512) 659-4726",
    "website": "https://real-tech.com",
    "officeName": "RealTech Realty, LLC",
    "brokerName": "Real Broker, LLC",
    "sourceCity": "Austin",
    "sourceState": "TX",
    "listingsInRun": 3,
    "sampleListingUrl": "https://www.realtor.com/realestateandhomes-detail/...",
    "sampleListingPrice": 599900,
    "leadScore": 78,
    "scrapedAt": "2026-06-23T17:12:35.503Z"
}
```

`propertyDetail` records add `features` (complete interior/exterior/utility list), `schools` (name, rating, distance), `priceHistory` (listed/sold/price-change events) and `taxHistory` (per-year tax + assessed value).

### Monitor mode — only new & changed

Turn on **monitorMode** and the actor remembers what it emitted in previous runs (in a named key-value store) and outputs **only**:

- **new** listings (or new agent leads),
- **price\_drop** / **price\_rise**,
- **status\_change** (e.g. for-sale → pending).

Each record carries a `monitorReason`. This is built into the actor and works **independently of [Apify Schedules](https://docs.apify.com/platform/schedules)** — schedule the run as often as you like and only get the deltas. Use a distinct `monitorKey` per saved search so separate watch lists don't share state.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it hourly/daily to monitor new listings and price drops in a city, ZIP or for a saved search.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/realtor-com-scraper').call({
    outputType: 'search',
    searchType: 'for_sale',
    location: ['Austin, TX'],
    sortBy: 'newest',
    includeAgentLeads: true,
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} properties & agent leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new agent leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new listings or price drops.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find new 3-bed homes under $700k in Austin and list the agents" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **real-estate + agent lead-gen stack**:

- **[Redfin Scraper](https://apify.com/scrapesage/redfin-scraper)** — US for-sale & sold listings with prices and agent data.
- **[Realtor.ca Scraper](https://apify.com/scrapesage/realtor-ca-scraper)** — Canadian listings and agent/brokerage leads.
- **[Rent.com Scraper](https://apify.com/scrapesage/rent-com-scraper)** — US rental listings and property-management contacts.
- **[Rightmove Scraper](https://apify.com/scrapesage/rightmove-scraper)** — UK property listings and agents.
- **[Crexi Scraper](https://apify.com/scrapesage/crexi-scraper)** — US commercial real estate and broker leads.
- **[FastExpert Scraper](https://apify.com/scrapesage/fastexpert-scraper)** — top real-estate agent profiles, reviews and leads.
- **[Property Finder Scraper](https://apify.com/scrapesage/property-finder-scraper)** — UAE/GCC property listings and agent leads.
- **[US Property Records Scraper](https://apify.com/scrapesage/us-property-records-scraper)** — public ownership & assessor records.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** — enrich any agent's website with emails, phones and socials.

### Tips

- **Big states / cities**: Realtor.com paginates up to ~9,800 results per search. To exhaust a large area, split runs by ZIP, price band or property type.
- **Cheapest rich run**: leave `includePropertyDetails` off — the listing record already carries price, beds/baths, sqft, geo, MLS, photos and the listing agent. Turn details on only when you need schools, full feature lists or price/tax history.
- **Agent leads**: use the dedicated `agentLeads` mode to get one deduped, lead-scored record per agent across all matching listings (most-active agents first).
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` and `sortBy: "newest"` to capture only fresh inventory and price changes.

### FAQ

**How do I scrape Realtor.com for a specific city?** Put the city in `location` as `City, ST` (e.g. `Austin, TX`), a ZIP, or a full state name. Combine with `searchType`, `propertyTypes` and the price/beds filters to narrow results.

**Does it work without the Realtor.com API key?** Yes — there is no public Realtor.com API. This actor reads the same data Realtor.com's own website uses, no key or login needed.

**Can I get sold-home comps?** Yes — set `searchType: "sold"` and `sortBy: "sold_date"`. Turn on `includePropertyDetails` for the full price history of each comp.

**Where do the agent emails come from?** From the listing's own publicly displayed agent/office contact card on Realtor.com — the same details a visitor sees. Some agents publish only a phone or office email; fields are `null` only when the data doesn't exist.

**Can I export to Google Sheets, CSV or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor new listings or price drops automatically?** Turn on `monitorMode`, then create a [Schedule](https://docs.apify.com/platform/schedules). Each run emits only new/changed records, with a `monitorReason`. Add a [webhook](https://docs.apify.com/platform/integrations/webhooks) or [Zapier zap](https://docs.apify.com/platform/integrations/zapier) to push them into your CRM.

**Is scraping Realtor.com legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and Realtor.com's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `outputType` (type: `string`):

search = property listings (the headline mode). agentLeads = deduped real-estate agent & office contact leads sourced from the matching listings. propertyDetail = full property records by numeric property\_id.

## `searchType` (type: `string`):

Which market to search: homes for sale, rentals, or recently sold homes (great for comps & sold-price history).

## `location` (type: `array`):

Where to search — one or more of: "City, ST" (e.g. "Austin, TX"), a 5-digit ZIP ("78704"), a county or a full state name ("Vermont"). Each location is searched independently. Leave empty if you use Search URLs.

## `searchUrls` (type: `array`):

Paste Realtor.com search pages to scrape directly — for-sale (realestateandhomes-search/...), rentals (apartments/...) or sold (soldhomeprices/...). The listing type is taken from the URL. Works alongside the filters below.

## `propertyIds` (type: `array`):

For outputType = propertyDetail: numeric Realtor.com property\_id values (the number you get back in the dataset, e.g. 8231543993).

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

Filter by property type. Accepts friendly names: house / single\_family, condo, townhome, multi\_family, duplex, mobile, land, farm, coop. Leave empty for all types.

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

Only listings priced at or above this value. For rentals this is monthly rent.

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

Only listings priced at or below this value. For rentals this is monthly rent.

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

Minimum number of bedrooms.

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

Maximum number of bedrooms.

## `bathsMin` (type: `integer`):

Minimum number of bathrooms.

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

Minimum interior square footage.

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

Maximum interior square footage.

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

Result order. "newest" is ideal for monitoring fresh inventory; "sold\_date" for recent comps.

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

In search mode, fetch each property's full record (complete feature list, assigned schools with ratings, full listing & price history, multi-year tax history, photo gallery). Off = faster & cheaper (the listing record is already rich). When on, each record is billed as a property detail.

## `includeAgentLeads` (type: `boolean`):

In search / propertyDetail mode, also emit one deduped agent/office lead per listing agent (name, email, phone, website, brokerage, lead score). The dedicated "Agent leads" mode outputs only leads.

## `maxPhotos` (type: `integer`):

Cap on photo URLs collected per property in detail records.

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

Overall cap on records (listings or leads) collected for this run.

## `monitorMode` (type: `boolean`):

Remember what was emitted in previous runs (in a named key-value store) and output only NEW or CHANGED records — new listings, price drops/rises, status changes (and only-new agent leads). Each record carries a monitorReason. Perfect for scheduled deal-flow & price-watch alerts. Works independently of Apify Schedules.

## `monitorKey` (type: `string`):

Namespace for monitor memory. Use a distinct key per saved search so separate watch lists don't share state.

## `maxConcurrency` (type: `integer`):

Parallel requests. The actor rotates a fresh proxy IP per request; lower this if you hit throttling.

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

Proxy settings. Apify Proxy (datacenter) is recommended and enabled by default — Realtor.com's data API is clean from datacenter IPs with fresh-session rotation.

## Actor input object example

```json
{
  "outputType": "search",
  "searchType": "for_sale",
  "location": [
    "Austin, TX"
  ],
  "sortBy": "relevant",
  "includePropertyDetails": false,
  "includeAgentLeads": false,
  "maxPhotos": 25,
  "maxResults": 100,
  "monitorMode": false,
  "monitorKey": "default",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped property, property-detail and agent-lead records as JSON items in the default dataset.

# 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 = {
    "location": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/realtor-com-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 = { "location": ["Austin, TX"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/realtor-com-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 '{
  "location": [
    "Austin, TX"
  ]
}' |
apify call scrapesage/realtor-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8bayuoNwgnkZV30WW/builds/aYcvx1dUbsgV9ewx9/openapi.json
