# Realtor.com Scraper — Properties, Agents & Analytics (`brilliant_gum/realtor-scraper`) Actor

No-login realtor.com scraper: property search & detail (price, beds/baths, sqft, tax & price history, schools, AVM, mortgage estimate, flood risk, agent contact) plus full agent profiles (phones, license, reviews, stats). Deal analytics, dedup & monitoring.

- **URL**: https://apify.com/brilliant\_gum/realtor-scraper.md
- **Developed by:** [Yuliia Kulakova](https://apify.com/brilliant_gum) (community)
- **Stats:** 2 total users, 1 monthly users, 62.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.004 / property record

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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.com Scraper — Properties, Agents & Analytics

![Realtor.com Scraper](https://api.apify.com/v2/key-value-stores/IuFu0Cw6PpOkNkDV7/records/realtor-banner)

No-login scraper for **realtor.com** (US real estate) — fast and reliable, no accounts or cookies.
One actor covers **both** property listings and real-estate agents, plus built-in deal analytics,
price-drop tracking, dedup and monitoring.

### Modes (combine any)

- **Property search** — search by location (city, ZIP, county, neighborhood, address) with full
  filters (status, type, price, beds/baths, sqft, lot, year, radius, listed/sold-within).
- **Property details** — full record for any `property_id` or realtor.com detail URL.
- **Agent search** — all agents for a ZIP or city, with optional full profiles.
- **Agent details** — full profile for any agent ID / profile URL.

### Property fields (100+)

IDs & status, list price, `pricePerSqft`, beds / baths / sqft / lot / year / type / stories / garage,
last-sold price & date, full address + coordinates + county + neighborhoods, HOA, tags & features,
description, listing **agent / office / broker** (name, phones, email, license, NRDS, MLS), primary
photo and **all photo URLs**.

With **full details** on (`includePropertyDetails`), each record also carries: **sub-type & pool**,
**price history**, **tax history** (per year, assessment split), **assigned schools** (name, rating,
grades, distance, district), **AVM estimates** (value + high/low), **mortgage payment estimate**
(monthly payment plus the component breakdown realtor.com provides — principal & interest, insurance,
PMI / property-tax / HOA where applicable, down payment, loan amount, tax / insurance rates, county
FHA loan limit), **flood risk** (score, FEMA zone, severity), **noise score**, **open houses**,
monthly / one-time fees, parking, and popularity (views / saves / leads). `sub-type` and `pool` are
part of this detail set, so they are null when full details are off.

#### Analytics (built-in, no extra cost)

`daysOnMarket`, `isNewListing`, `priceReducedAmount` / `priceReducedPct` / `isPriceReduced` (from
listing price history), `estimatedValue` + `estimateVsListPct` (AVM vs list), and a `dealScore`
0–100 undervalued heuristic.

### Agent fields

Name, photo, bio, website, **license number + state**, languages, specializations, designations,
served areas, social links, office & broker, **phones** (agent + office), ratings, **full reviews**
(text, sub-scores, replies) and **recommendations**, for-sale & recently-sold counts and
recently-sold listing samples, plus `dealsLast12mo` (homes sold in the last 12 months) and
`listPriceRangeMid` (midpoint of the active for-sale price range).

Agent **phones, license, bio, reviews and recommendations** come with full profiles — keep
`fetchAgentDetails` on (default). With it off you get the lightweight search card only (name,
office, ratings, listing counts).

> **Agent email:** realtor.com masks the personal email on the public agent profile, so `email`
> is usually null on agent records. A business email for the listing agent **is** returned in
> property mode where the listing publishes one.

### Why this actor

- **Properties *and* agents in one actor** — listings with full detail, plus agent profiles with
  reviews and contact info, under one input.
- **Deal analytics built in** — price-drop tracking, AVM-vs-list gap and a 0–100 deal score, not
  just raw fields.
- **Cross-run dedup & monitoring** for scheduled new-listing and price-change alerts.

### Field availability (honest note)

The core listing fields (id, price, beds/baths/sqft, address, status, photos) are returned for every
result. **Listing-agent contact** is present when the listing publishes an advertiser — the norm for
active for-sale listings, but sometimes absent on sold / new-construction / off-market records.
Detail-only enrichments depend on what realtor.com publishes for a given home — **AVM estimate, noise
score, open houses, sub-type, pool, and some tax rows are best-effort and can be null**. Nothing is
fabricated: absent data is returned as `null`.

### Dedup & monitoring

Enable `deduplicate` and set `deduplicateKeyStore` to a named store to dedupe **across** scheduled
runs. Turn on `monitoringMode` (needs a key store) to emit only records not seen before — ideal for
new-listing alerts. Note: the monitoring key is `property_id + status`, so it flags new listings and
status changes; for pure price-drop alerts, sort by `priceReducedPct` on each run.

### Pricing

Pay-per-event — you are billed only for what a run actually delivers:

| Event | Price |
|---|---|
| Run start | **$0.01** |
| Property record | **$0.004** |
| Agent record | **$0.005** |

Duplicates and records removed by your filters are **not** charged. Example: a run returning 100
full property records costs about **$0.41**. Set a **Maximum cost per run** in the run options to
cap spend.

### Support & feedback

Missing a field, a location that won't resolve, or something off in the data? Open an issue on the
actor's **Issues** tab — feedback shapes the roadmap and bug reports are answered quickly.

### Legal

Scrapes only publicly available realtor.com pages — no login, no authenticated endpoints, nothing
behind a paywall. Agent contact fields are public business-listing data; agent reviews are public.
You are responsible for complying with realtor.com's Terms of Service and applicable data-protection
law (GDPR, CCPA, etc.). Use the data lawfully.

# Actor input Schema

## `mode` (type: `array`):

What to scrape. 'property-search' runs searchLocations x filters and returns one record per listing. 'property-detail' fetches full detail for propertyIds / startUrls. 'agent-search' returns agents for agentLocations / agentZipCodes. 'agent-detail' fetches full profiles for agentIds / agentUrls. Modes can be combined.

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

Locations to search for properties: city+state, ZIP, county, neighborhood or a full street address (e.g. "Austin, TX", "78701", "Travis County, TX"). Each is resolved via realtor.com's location suggester. Property-search mode.

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

Ready-made realtor.com URLs: search result pages (realestateandhomes-search/...), property detail pages (realestateandhomes-detail/...) or agent pages (realestateagents/...). Detected and routed automatically. Advanced alternative to the location fields.

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

Realtor.com numeric property\_id values (e.g. "9565765912") to fetch full details for. Property-detail mode.

## `listingType` (type: `array`):

Which listing statuses to return in property search: for\_sale, for\_rent, sold, pending, ready\_to\_build (new construction). Combine as needed. Default: for sale.

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

Keep only these property types. Empty = any.

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

Minimum list price in USD. Empty = no minimum.

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

Maximum list price in USD. Empty = no maximum.

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

Minimum number of bedrooms. Empty = any.

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

Maximum number of bedrooms. Empty = any.

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

Minimum number of bathrooms. Empty = any.

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

Minimum interior square footage. Empty = any.

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

Maximum interior square footage. Empty = any.

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

Minimum lot size in square feet. Empty = any.

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

Earliest year built. Empty = any.

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

Latest year built. Empty = any.

## `radiusMiles` (type: `integer`):

When a searchLocation is a street address, return comparable listings within this radius (miles) instead of the single home. Empty = off.

## `listedWithinDays` (type: `integer`):

For sale/for rent: keep only listings put on market within the last N days. Empty = any.

## `soldWithinDays` (type: `integer`):

For sold listings: keep only homes sold within the last N days. Empty = any.

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

Return only foreclosure listings.

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

Sort order for property search. Default uses realtor.com's relevance (fractal) sort.

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

Sort direction when Sort by is set.

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

Maximum property listings per search location. 0 = all available (realtor.com caps around a few thousand per query).

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

For each search result, fetch the full detail record (tax & price history, schools, AVM estimates, mortgage payment estimate with tax/insurance/PMI breakdown, flood & noise risk, open houses, sub-type, pool, monthly fees, parking, popularity). Turn off for a faster/cheaper lightweight card (id, price, beds/baths/sqft, address, primary photo, agent).

## `includePhotos` (type: `boolean`):

Include the full photos array (all image URLs) per property. Turn off to keep only the primary photo and reduce record size.

## `agentLocations` (type: `array`):

Locations to find agents in: 'City, ST' or 'city\_st' (e.g. "Austin, TX"). Agent-search mode.

## `agentZipCodes` (type: `array`):

5-digit US ZIP codes to find agents in (e.g. "78701"). Agent-search mode.

## `agentIds` (type: `array`):

Realtor.com agent advertiser IDs (the 24-char id, e.g. "56a649a10fa417010073f11b"). Agent-detail mode.

## `agentUrls` (type: `array`):

Full realtor.com agent profile URLs (https://www.realtor.com/realestateagents/<id>). Agent-detail mode.

## `maxAgents` (type: `integer`):

Maximum agents per location/ZIP in agent search. 0 = all available.

## `fetchAgentDetails` (type: `boolean`):

In agent search, fetch each agent's full profile page (bio, license, phones, website, social links, served areas, specializations, languages). One extra request per agent. Turn off for the lightweight search card only.

## `includeAgentReviews` (type: `boolean`):

Include the agent's public reviews (text, ratings, sub-scores, replies) and recommendations. Requires full profiles.

## `includeAnalytics` (type: `boolean`):

Add computed analytics per record: price per sqft, days on market, price-drop amount/percent, AVM-vs-list gap, deal score (0-100 undervalued heuristic), new-listing flag, and agent 12-month deal counts.

## `deduplicate` (type: `boolean`):

Drop records whose dedupKey (property\_id+status, or agent id) was already produced in this run (and across runs if a key store is set).

## `deduplicateKeyStore` (type: `string`):

Named key-value store to persist seen dedupKeys across scheduled runs. Empty = in-run dedup only.

## `monitoringMode` (type: `boolean`):

Output only records not seen in the previous run (requires a dedup key store). Great for new-listing and price-change alerting.

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

Parallel detail/agent requests. Keep moderate to respect rate limits.

## `maxRequestRetries` (type: `integer`):

Retries with fresh proxy sessions on block / 403 / 429 / 5xx / timeout.

## `proxy` (type: `object`):

Apify Proxy used for requests. US residential is recommended and used by default. A paid Apify Proxy plan is required.

## Actor input object example

```json
{
  "mode": [
    "property-search"
  ],
  "searchLocations": [
    "Austin, TX"
  ],
  "listingType": [
    "for_sale"
  ],
  "foreclosure": false,
  "sortBy": "",
  "sortDirection": "desc",
  "maxItems": 100,
  "includePropertyDetails": true,
  "includePhotos": true,
  "maxAgents": 40,
  "fetchAgentDetails": true,
  "includeAgentReviews": true,
  "includeAnalytics": true,
  "deduplicate": true,
  "monitoringMode": false,
  "maxConcurrency": 6,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

All scraped property and agent records.

# 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 = {
    "mode": [
        "property-search"
    ],
    "searchLocations": [
        "Austin, TX"
    ],
    "listingType": [
        "for_sale"
    ],
    "maxItems": 100,
    "maxAgents": 40,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("brilliant_gum/realtor-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 = {
    "mode": ["property-search"],
    "searchLocations": ["Austin, TX"],
    "listingType": ["for_sale"],
    "maxItems": 100,
    "maxAgents": 40,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("brilliant_gum/realtor-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 '{
  "mode": [
    "property-search"
  ],
  "searchLocations": [
    "Austin, TX"
  ],
  "listingType": [
    "for_sale"
  ],
  "maxItems": 100,
  "maxAgents": 40,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}' |
apify call brilliant_gum/realtor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,brilliant_gum/realtor-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/fp1014kWOxFFsO7ok/builds/lyedU2BnPt5fo3a7O/openapi.json
