# Realtor.com Agent Scraper \[$1💰 / 1k] - Full Details (`ahmed_jasarevic/realtor-agent-scraper`) Actor

Extract US real estate agents from Realtor.com: names, phones, emails, brokerages, offices, ratings, sales counts and service areas. Search by city, state or ZIP using realtor.com's internal GraphQL API — fast pure-HTTP scraping, no browser.

- **URL**: https://apify.com/ahmed\_jasarevic/realtor-agent-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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 Agent Scraper

Extract **real estate agents** from [Realtor.com](https://www.realtor.com/realestateagents) — names, phone numbers, emails, brokerages, offices, ratings, review counts, active/sold listing stats and service areas — for any US city, state or ZIP code. Built for lead generation, agent outreach, market research and brokerage intelligence.

### What does Realtor.com Agent Scraper do?

This Actor scrapes the [Realtor.com agent directory](https://www.realtor.com/realestateagents) and individual agent profiles. Give it a location like `Los Angeles, CA` or a ZIP like `90210`, and it walks the directory pages, deduplicates agents and enriches each one from their profile page.

Under the hood it talks directly to **Realtor.com's internal GraphQL API** (`frontdoor/graphql`) for location resolution and featured-agent lookups, then fetches directory/profile pages over plain HTTP with Cheerio — no browser, no screenshots, no wasted compute. That makes it dramatically faster and cheaper than browser-based scrapers: one run can pull thousands of agents in minutes.

It runs on the Apify platform, so you get built-in proxy rotation, scheduling, retries, monitoring, and structured datasets exportable as JSON, CSV, Excel or via API.

### Why use this Agent Scraper?

- **Lead generation** — build prospect lists of active agents by market, complete with direct phones and office details.
- **Recruiting** — identify high-performing agents (sold counts, review volume) worth headhunting.
- **Market analysis** — map agent density and activity across cities or ZIP codes.
- **Fast and cheap** — pure HTTP crawling; no headless Chrome. High concurrency without browser overhead.
- **Resilient extraction** — data is mined from the site's embedded JSON payloads rather than fragile CSS selectors, so layout tweaks rarely break it.
- **Deduplicated output** — every agent appears once, keyed by their realtor.com ID.

### How to use Realtor.com Agent Scraper?

1. Add this Actor to your Apify account and click **Start**.
2. On the **Input** tab, enter one or more **Locations** (`Austin, TX`, `Miami`, `90210`). Optionally add direct **agent profile URLs**.
3. Set limits: how many agents total, how many directory pages per location, whether to visit each profile for enrichment.
4. Keep the default **RESIDENTIAL proxy** enabled — Realtor.com blocks datacenter IPs on its web pages.
5. Run the Actor and download results from the **Storage → Dataset** tab in JSON, CSV, Excel, or via API.

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `locations` | array of strings | `["Los Angeles, CA"]` | Cities, states or ZIP codes to scrape. Resolved through Realtor.com's internal location-search API. |
| `startUrls` | array (request list) | – | Optional direct agent profile URLs or directory URLs. |
| `maxAgents` | integer | `100` | Stop after this many unique agents (hard cap 10,000). |
| `maxPagesPerLocation` | integer | `5` | Pagination cap per location. |
| `enrichProfiles` | boolean | `true` | Visit each agent's profile to add email, license, languages, specializations and service areas. |
| `includeFeatured` | boolean | `false` | Also request the paid "featured agent" per location via GraphQL (often empty — it's an ad slot). |
| `useApifyProxy` | boolean | `true` | Route page requests through Apify Proxy (GraphQL lookups run unproxied). |
| `proxyGroups` | array | `["RESIDENTIAL"]` | Proxy group selection. RESIDENTIAL strongly recommended. |
| `proxyUrls` | array | `[]` | Custom proxy URLs that replace the Apify Proxy when set. |
| `maxConcurrency` | integer | `5` | Parallel requests (safe to raise — no browser involved). |

### Output

Each dataset item is one agent:

```json
{
    "type": "agent",
    "agentId": "56ba6c45bb954c01006b5030",
    "fullName": "Jane Doe",
    "profileUrl": "https://www.realtor.com/realestateagents/jane-doe_los-angeles_ca",
    "photoUrl": "https://ap.rdcpix.com/....jpg",
    "phones": [{ "number": "(323) 555-0123", "ext": "101", "type": "Office" }],
    "primaryPhone": "(323) 555-0123 x101",
    "email": "jane@doerealty.com",
    "brokerName": "Doe Realty",
    "officeName": "Doe Realty - Los Angeles",
    "office": { "name": "Doe Realty - Los Angeles", "phone": "(323) 555-0100", "website": "https://doerealty.com" },
    "city": "Los Angeles",
    "stateCode": "CA",
    "postalCode": "90026",
    "serviceAreas": ["Silver Lake", "Echo Park"],
    "specializations": ["Buyer's Agent", "Listing Agent"],
    "languages": ["English", "Spanish"],
    "licenseNumber": "01998877",
    "rating": 5,
    "reviewCount": 47,
    "forSaleListingsCount": 6,
    "recentlySoldCount": 21,
    "source": "directory",
    "sourceLocation": "Los Angeles, CA",
    "scrapedAt": "2026-08-25T14:20:11.402Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Description |
| --- | --- |
| `fullName` / `nickName` | Agent name as shown on Realtor.com |
| `agentId` / `partyId` / `nrdsId` | Realtor.com / NAR identifiers |
| `phones` / `primaryPhone` | Phone numbers with type and extension |
| `email` | Public email, when listed |
| `brokerName` / `officeName` / `office` | Brokerage and office details incl. website & phone |
| `city` / `stateCode` / `postalCode` / `addressLine` | Office address fields |
| `serviceAreas` / `serviceZipCodes` | Areas and ZIPs the agent serves |
| `specializations` / `languages` / `designations` | Profile attributes |
| `licenseNumber` / `mlsName` | License info when exposed |
| `rating` / `reviewCount` / `recommendationsCount` | Reputation metrics |
| `forSaleListingsCount` / `recentlySoldCount` | Activity stats |
| `profileUrl` / `photoUrl` | Links back to Realtor.com |

### How much does it cost to scrape Realtor.com agents?

The Actor is pure HTTP, so runs are cheap: roughly **2–3 requests per agent** with profile enrichment enabled, and ~1 request per directory page per location (a page typically holds dozens of agents). A run for `maxAgents = 1000` usually costs well under $1 in platform usage on residential proxies plus a few minutes of compute. Free Apify plans work too — monthly free credits comfortably cover test runs of a few hundred agents. Non-paying users are preview-capped at 10 agents per run.

### Tips and advanced options

- **Start broad, then narrow**: run one city first, check the output table, then scale up ZIP lists.
- **Speed vs. depth**: turn `enrichProfiles` off to roughly triple throughput if you only need names/phones/brokerages from directory cards.
- **Pagination**: `maxPagesPerLocation` caps crawl size; large metros have hundreds of pages.
- **Proxies**: keep RESIDENTIAL on. If you see repeated blocks, slow down (`maxConcurrency: 2–3`) or plug in your own `proxyUrls`.
- **Scheduling**: schedule daily runs on your target markets and diff results to spot new agents entering a market.

### FAQ, disclaimers and support

**Is scraping Realtor.com legal?** Scraping publicly available business contact data is generally lawful, but you are responsible for complying with Realtor.com's Terms of Service, applicable privacy laws (e.g. TCPA/CAN-SPAM for outreach), and rate-limit etiquette. Do not spam scraped contacts.

**Why do I need residential proxies?** Realtor.com serves bot-protection challenges to datacenter IPs on its web pages. Residential exits look like ordinary visitors. Note the internal GraphQL endpoint used for location resolution currently works unproxied.

**Some agents miss an email — why?** Emails only appear when agents publish them; enrichment picks them up where available.

**A location returned nothing.** Check the slug the Actor resolved in the logs, try the ZIP code instead, or increase `maxPagesPerLocation`.

Found a bug or want a custom solution? Open an issue in the **Issues** tab — custom features and bulk-market pipelines are available on request.

# Actor input Schema

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

US cities, states or ZIP codes to scrape agents from, e.g. "Los Angeles, CA" or "90210". Resolved via realtor.com's internal location-search API.

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

Optional agent profile URLs (https://www.realtor.com/realestateagents/...) and/or agent directory pages. Locations above are usually enough.

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

Stop after this many unique agents across all locations (hard cap 10,000).

## `maxPagesPerLocation` (type: `integer`):

Pagination cap per location directory.

## `enrichProfiles` (type: `boolean`):

Adds one fast HTTP request per agent to fill in email, license, languages, specializations and service areas. Disable for maximum speed.

## `includeFeatured` (type: `boolean`):

Also fetch the paid "featured agent" for each location via the internal GraphQL API. Often empty — it is an ad slot.

## `useApifyProxy` (type: `boolean`):

Route page requests through the Apify Proxy. Strongly recommended — realtor.com blocks datacenter IPs (the GraphQL lookups run unproxied).

## `proxyGroups` (type: `array`):

Apify proxy groups. RESIDENTIAL is strongly recommended for realtor.com pages.

## `proxyUrls` (type: `array`):

Optional custom HTTP(S) proxy URLs (e.g. your own residential provider). When set, these replace the Apify Proxy entirely. Format: \["http://user:pass@host:port"].

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

Parallel requests. This scraper is pure HTTP (no browser), so it can safely go higher than browser-based Actors.

## Actor input object example

```json
{
  "locations": [
    "Los Angeles, CA"
  ],
  "startUrls": [
    {
      "url": "https://www.realtor.com/realestateagents/56ba6c45bb954c01006b5030"
    }
  ],
  "maxAgents": 100,
  "maxPagesPerLocation": 5,
  "enrichProfiles": true,
  "includeFeatured": false,
  "useApifyProxy": true,
  "proxyGroups": [
    "RESIDENTIAL"
  ],
  "proxyUrls": [],
  "maxConcurrency": 5
}
```

# 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": [
        "Los Angeles, CA"
    ],
    "startUrls": [
        {
            "url": "https://www.realtor.com/realestateagents/56ba6c45bb954c01006b5030"
        }
    ],
    "maxAgents": 100,
    "maxPagesPerLocation": 5,
    "enrichProfiles": true,
    "useApifyProxy": true,
    "proxyGroups": [
        "RESIDENTIAL"
    ],
    "proxyUrls": [],
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/realtor-agent-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": ["Los Angeles, CA"],
    "startUrls": [{ "url": "https://www.realtor.com/realestateagents/56ba6c45bb954c01006b5030" }],
    "maxAgents": 100,
    "maxPagesPerLocation": 5,
    "enrichProfiles": True,
    "useApifyProxy": True,
    "proxyGroups": ["RESIDENTIAL"],
    "proxyUrls": [],
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/realtor-agent-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": [
    "Los Angeles, CA"
  ],
  "startUrls": [
    {
      "url": "https://www.realtor.com/realestateagents/56ba6c45bb954c01006b5030"
    }
  ],
  "maxAgents": 100,
  "maxPagesPerLocation": 5,
  "enrichProfiles": true,
  "useApifyProxy": true,
  "proxyGroups": [
    "RESIDENTIAL"
  ],
  "proxyUrls": [],
  "maxConcurrency": 5
}' |
apify call ahmed_jasarevic/realtor-agent-scraper --silent --output-dataset

```

## MCP server setup

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