# Realtor.com Agent Leads Scraper (`cirkit/realtor-agent-leads-scraper`) Actor

Scrape Realtor.com agent leads through a fast GraphQL API and export structured JSON data with phones, websites, licenses, brokerages, ratings, service areas, and listing stats.

- **URL**: https://apify.com/cirkit/realtor-agent-leads-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** Real estate, Lead generation
- **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/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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

### What this Actor does

Realtor.com Agent Leads Scraper collects public real estate agent profiles from Realtor.com by US ZIP code or City, ST. Realtor.com Agent Leads Scraper returns structured JSON data with names, phone numbers, websites, biographies, licenses, brokerages, offices, social profiles, service areas, specialties, ratings, review counts, and listing statistics. Use the dataset from JavaScript, Python, an API client, a spreadsheet, or your CRM.

The Actor searches Realtor.com's first-party GraphQL API, deduplicates profiles, and enriches each result before saving it. It does not parse the Kasada-protected rendered pages and does not fabricate missing values.

### Why it is fast and inexpensive

The scraper uses direct HTTP and GraphQL requests with 512 MB of memory. It does not launch a browser, download images, or execute page scripts. The launch price is $0.0008 per result, compared with $0.0015 per result plus a start charge for the sampled market leader. A hard `maxItems` cap protects every run from unexpected output charges.

### Input

| Field | Type | Default | Example | Description |
|---|---|---:|---|---|
| `locations` | string array | `['10001']` | `['10001', 'Austin, TX']` | Required US ZIP codes or City, ST inputs |
| `maxItems` | integer | `100` | `500` | Global hard cap on unique leads |
| `maxAgentsPerZipCode` | integer | `250` | `1000` | Search depth per resolved ZIP code |
| `maxZipCodesPerLocation` | integer | `25` | `10` | City/state expansion cap |
| `agentType` | string | `both` | `seller` | `both`, `buyer`, or `seller` |
| `agentName` | string | empty | `Jane Smith` | Optional name filter |
| `realtorOnly` | boolean | `false` | `true` | Require Realtor.com member status |
| `maxConcurrency` | integer | `8` | `12` | Simultaneous requests |
| `maxRequestRetries` | integer | `5` | `7` | Retries for transient failures |
| `proxyConfiguration` | object | direct | Apify Proxy | Optional proxy fallback |

Example:

```json
{
  "locations": ["10001", "90210", "Austin, TX"],
  "maxItems": 250,
  "agentType": "both",
  "realtorOnly": false
}
````

### Output

Guaranteed fields are generated for every saved record. Best-effort fields are populated only when Realtor.com exposes them.

| Field | Coverage contract | Description |
|---|---|---|
| `id`, `name`, `profileUrl` | Guaranteed | Realtor.com profile identity |
| `sourceZipCode`, `sourceLocation`, `scrapedAt` | Guaranteed | Search and audit context |
| `phone`, `phones` | Best effort | Agent and office phone numbers |
| `email` | Always `null` | Realtor.com does not expose email in the validated payload |
| `website`, `bio`, `avatar` | Best effort | Public profile details |
| `office`, `brokerage`, `license`, `mls` | Best effort | Professional relationships and credentials |
| `languages`, `specializations`, `servedAreas` | Best effort | Agent capabilities and markets |
| `ratings`, `listingStats` | Best effort | Ratings, reviews, recommendations, and listing metrics |
| `socialProfiles`, `aboutVideo` | Best effort | Public social and video links |

### Measured coverage

The pre-deployment benchmark contains 51 live profiles across ZIP codes `10001`, `90210`, and `73301`. The guaranteed identity, source, and timestamp fields reached 100% extraction coverage and 100% record reliability. Final three-run cloud variance numbers are recorded in `benchmark/variance_report.md` after deployment.

Source sparsity is normal. In the 100-item paid competitor sample, names were present on 100%, phones on 99%, licenses on 98%, websites on 96%, ratings on 41%, and for-sale listing counts on 70% of profiles.

### Pricing

| Subscription tier | Price per result |
|---|---:|
| FREE | $0.0008 |
| BRONZE | $0.00076 |
| SILVER | $0.00068 |
| GOLD | $0.00060 |
| PLATINUM | $0.00056 |
| DIAMOND | $0.00052 |

At the FREE-tier price, 100 leads cost $0.08, 1,000 cost $0.80, and 10,000 cost $8.00. There is no Actor start event charge in the checked-in pricing contract.

### Limits and FAQ

#### Does it return email addresses?

No. The validated Realtor.com profile API does not expose agent email addresses. The Actor returns `email: null` instead of guessing or scraping unrelated third-party sites.

#### Which location format is most accurate?

Use explicit five-digit ZIP codes for lossless searches. City, ST inputs are a convenience feature that expands through an offline US ZIP registry and respects `maxZipCodesPerLocation`.

#### Why can some fields be null?

Realtor.com profiles are user-maintained and sparse. A null rating, license, website, language, or listing statistic means the source profile did not provide it.

#### What happens if profile enrichment fails?

The crawler retries transient errors up to five times by default. If a profile still fails, it saves the valid search identity with `enrichmentStatus: 'failed'` instead of silently losing the lead.

#### Are results deduplicated?

Yes. The Realtor.com profile ID is the run-wide deduplication key, including when multiple location inputs surface the same agent.

### Changelog

#### 0.1 - 2026-07-21

- Initial private release with GraphQL search, profile enrichment, ZIP and City, ST inputs, filters, retries, deduplication, stable null handling, benchmark scoring, and pay-per-result pricing.

# Actor input Schema

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

One or more five-digit US ZIP codes or City, ST values. Explicit ZIP codes are the most precise option.

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

Hard cap on the total number of unique agent leads saved across all locations.

## `maxAgentsPerZipCode` (type: `integer`):

Maximum number of search results inspected for each resolved ZIP code. Realtor.com may return fewer.

## `maxZipCodesPerLocation` (type: `integer`):

Caps offline ZIP expansion for City, ST inputs. This does not affect explicit ZIP-code inputs.

## `agentType` (type: `string`):

Return both buyer and seller agents, or restrict the Realtor.com search to one intent.

## `agentName` (type: `string`):

Optional Realtor.com agent-name filter, such as Jane Smith. Leave empty to return all matching names.

## `realtorOnly` (type: `boolean`):

When enabled, return only profiles Realtor.com marks as Realtor members.

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

Maximum simultaneous GraphQL requests. The tested default balances speed and endpoint stability.

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

Retry count for rate limits, network failures, invalid responses, and temporary Realtor.com errors.

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

Optional proxy routing. Direct GraphQL access is the tested default; enable Apify Proxy if your run environment is blocked.

## Actor input object example

```json
{
  "locations": [
    "10001"
  ],
  "maxItems": 100,
  "maxAgentsPerZipCode": 250,
  "maxZipCodesPerLocation": 25,
  "agentType": "both",
  "realtorOnly": false,
  "maxConcurrency": 8,
  "maxRequestRetries": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `leads` (type: `string`):

All Realtor.com agent leads in the overview dataset view.

## `leadsCsv` (type: `string`):

Download the complete lead dataset as CSV.

## `leadsJson` (type: `string`):

Download the complete lead dataset as JSON.

## `consoleRun` (type: `string`):

Open the run, logs, usage, and storage in Apify Console.

# 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": [
        "10001"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/realtor-agent-leads-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": ["10001"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/realtor-agent-leads-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 '{
  "locations": [
    "10001"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call cirkit/realtor-agent-leads-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Realtor.com Agent Leads Scraper",
        "description": "Scrape Realtor.com agent leads through a fast GraphQL API and export structured JSON data with phones, websites, licenses, brokerages, ratings, service areas, and listing stats.",
        "version": "0.1",
        "x-build-id": "e8nqIcCPhHuUZPao7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/cirkit~realtor-agent-leads-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-cirkit-realtor-agent-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/cirkit~realtor-agent-leads-scraper/runs": {
            "post": {
                "operationId": "runs-sync-cirkit-realtor-agent-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/cirkit~realtor-agent-leads-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-cirkit-realtor-agent-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "locations"
                ],
                "properties": {
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "One or more five-digit US ZIP codes or City, ST values. Explicit ZIP codes are the most precise option.",
                        "default": [
                            "10001"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Maximum leads",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Hard cap on the total number of unique agent leads saved across all locations.",
                        "default": 100
                    },
                    "maxAgentsPerZipCode": {
                        "title": "Maximum agents per ZIP code",
                        "minimum": 1,
                        "maximum": 3000,
                        "type": "integer",
                        "description": "Maximum number of search results inspected for each resolved ZIP code. Realtor.com may return fewer.",
                        "default": 250
                    },
                    "maxZipCodesPerLocation": {
                        "title": "Maximum ZIP codes per city",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Caps offline ZIP expansion for City, ST inputs. This does not affect explicit ZIP-code inputs.",
                        "default": 25
                    },
                    "agentType": {
                        "title": "Agent type",
                        "enum": [
                            "both",
                            "buyer",
                            "seller"
                        ],
                        "type": "string",
                        "description": "Return both buyer and seller agents, or restrict the Realtor.com search to one intent.",
                        "default": "both"
                    },
                    "agentName": {
                        "title": "Agent name",
                        "maxLength": 100,
                        "type": "string",
                        "description": "Optional Realtor.com agent-name filter, such as Jane Smith. Leave empty to return all matching names."
                    },
                    "realtorOnly": {
                        "title": "Realtor.com members only",
                        "type": "boolean",
                        "description": "When enabled, return only profiles Realtor.com marks as Realtor members.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrency",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum simultaneous GraphQL requests. The tested default balances speed and endpoint stability.",
                        "default": 8
                    },
                    "maxRequestRetries": {
                        "title": "Request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retry count for rate limits, network failures, invalid responses, and temporary Realtor.com errors.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy routing. Direct GraphQL access is the tested default; enable Apify Proxy if your run environment is blocked.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
