# 🏡 Realtor Leads Scraper - Real Estate Agent Emails & Phones (`renzomacar/realtor-leads-scraper`) Actor

Real estate agent and agency leads for any city: name, address, phone, website, emails and social profiles extracted live from each website. $8 per 1,000 realtor leads, pay as you go.

- **URL**: https://apify.com/renzomacar/realtor-leads-scraper.md
- **Developed by:** [Renzo Madueno](https://apify.com/renzomacar) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.44 / 1,000 leads

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/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 Leads Scraper — Real Estate Agent Emails & Phones

There are over 1.5 million licensed real estate agents in the US alone, and almost every one of them is a one-person business that buys tools, leads, photography, signage, CRM software and coaching. If agents or brokerages are your customers, this scraper turns any city into a prospect list in minutes: **agent/agency name, office address, direct phone, website, emails pulled from their own site, Instagram/Facebook/LinkedIn, Google rating and review count** — at $8 per 1,000 leads, pay-as-you-go.

No ZIP-code credit packs, no "contact sales", no subscription. Type `"Phoenix, AZ"`, press Run, export a CSV.

### Built for people who sell TO real estate

- **Mortgage & title reps** — build a co-marketing target list of every active agency in your county, ranked by review count (a proxy for transaction volume).
- **Real estate photographers & stagers** — agencies with strong Instagram presence (the scraper captures it) are the ones already paying for visuals.
- **PropTech & CRM sales** — fill your SDR queue with brokerages city by city; the `techStack` field shows what their website runs on.
- **Recruiting brokers** — map every competing brokerage and independent agent in your metro.
- **Lead-gen agencies** — resell targeted realtor lists or run cold outreach campaigns for clients in the real-estate vertical.

### What comes out

One row per agency/agent office. The core columns:

| Column | What it is |
|---|---|
| `name` / `category` | "Sunset Ridge Realty" / "Real estate agency" |
| `phone` | The office line from Google Maps |
| `website` + `email` + `emails[]` | Emails scraped live from the agency's site |
| `socialProfiles` | Instagram, Facebook, LinkedIn, X — where realtors actually live |
| `rating` + `reviewsCount` | 4.9 ★ / 187 reviews — sort by this to find producers |
| `address`, `city`, `country`, `latitude`, `longitude` | For territory mapping |
| `placeUrl` | Google Maps link to verify any lead in one click |

### Choosing your targets

The **Real estate categories** selector covers the segments that behave differently as buyers:

- `real estate agent` — individual agents with a Maps listing
- `realtor` / `real estate agency` — brokerage offices
- `real estate broker` — broker-owners (decision makers)
- `property management company` — recurring-revenue businesses, great for SaaS
- `commercial real estate agency` — higher ticket, smaller universe

Select several and each becomes its own search against your location. Advanced users can instead paste raw queries (`realtor in Scottsdale, AZ`, one per line) to sweep an entire metro's suburbs in one run.

### Building an agent and brokerage contact list with emails, one metro at a time

A single Maps search stops feeding new listings at roughly 120 offices, so a big metro is not one query — it is a sweep. The reliable recipe:

1. **Pick the segments** in `searchTerms`. Each selected category runs as its own search, so `["real estate agency", "realtor", "real estate broker"]` against one city is three searches, not one diluted list.
2. **Go down a level in geography.** Instead of `Phoenix, AZ`, run the suburbs as custom `searchQueries` — `realtor in Scottsdale, AZ`, `realtor in Tempe, AZ`, `realtor in Mesa, AZ`, `realtor in Chandler, AZ`. Ten suburb queries beat one metro query by a wide margin, because each gets its own 120-listing budget.
3. **Let the run dedupe.** Offices are keyed by their Google Maps place, across every query in the run, so the brokerage that appears under both `realtor` and `real estate agency` in three overlapping suburbs is delivered once and charged once.
4. **Split the file on `emailFound`.** The rows with an address go to email; the rest still carry a phone and a Maps link, which for a one-person agent business is often the better channel anyway.
5. **Sort by `reviewsCount`.** Review count is the closest public proxy for transaction volume: the top of the list is the producers with budget, the middle is the growth-hungry tier that answers cold outreach.

Emails come off each agency's own site — the team, contact and about pages — not from a pattern generator, so what you get is what the brokerage publishes for people to contact them.

### Property management companies as a separate list

`property management company` behaves nothing like the agent categories and is worth running on its own. Property managers are recurring-revenue businesses with staff, an office, real software budgets and a buying cycle measured in months rather than the transaction-to-transaction rhythm of an agent. They are the segment to target for maintenance software, tenant screening, insurance, cleaning and turnover services, accounting and lending.

```json
{ "searchTerms": ["property management company"], "location": "Tampa, FL", "maxResults": 100 }
```

Practical notes: email coverage runs higher than on individual agents because these firms need tenants and owners to reach them; `reviewsCount` skews low and negative even at good firms (tenants review landlords, not vendors), so treat it as a size signal rather than a quality one; and `commercial real estate agency` is the natural companion query when you sell to the commercial side of the same market.

### FAQ

**How many realtors can I pull from one city?**
Google Maps returns up to ~120 listings per query. One category × one big city ≈ 60–120 leads; 5 categories × 10 suburb-level queries can produce 1,000+ unique offices in a single run (duplicates across searches are removed by place, so you don't pay twice).

**Are these individual agents or brokerages?**
Both, depending on category. `real estate agent` surfaces individuals who registered a Maps listing; `real estate agency`/`realtor` surfaces offices. Brokerage rows often include the office email (info@...) — the scraper also grabs any personal emails published on the site's team/contact pages.

**What share of leads include an email?**
Typically 50–70% in US metros — real estate is a web-forward industry. Every lead includes phone + website regardless, and `emailFound` lets you split the file in one filter.

**Can I find agents without a website?**
Yes — leave `onlyWithWebsite` off and you'll also get Maps-only agents (phone but no site). Web designers: that's your pitch list.

**Does it cover Canada / UK / Australia?**
Anywhere Google Maps operates. Try `estate agent in Manchester, UK` (note the local term) via custom queries, or `inmobiliaria in Ciudad de México` with `language: "es"`.

**Is the data current?**
Scraped at run time, never from a stored database. An agency that rebranded last month shows up under its new name; one that shut down doesn't show up at all.

**What does it cost to build a 1,000-lead list?**
$0.02 start + 1,000 × $0.008 = **$8.02 total**. Compare that with per-contact pricing on ZoomInfo or a realtor list broker.

### Pricing

Pay-per-event: **$0.02 per run start** (2 GB) and **$0.008 per lead** delivered to your dataset. Dropped/duplicate businesses are never charged.

### Compliance notes

Everything collected here is information real estate professionals publish publicly to be contacted: their Google Maps business listing and their own public websites. No login walls are bypassed and no MLS data is touched. For cold outreach, follow the rules of your market — CAN-SPAM (US), CASL (Canada), PECR/GDPR (UK/EU) — and honor opt-outs.

# Actor input Schema

## `searchTerms` (type: `array`):

Which real estate segments to find: agencies, individual agents, brokers, property managers. Each selected category runs as its own search in your location.

## `location` (type: `string`):

City, region or country to search in, e.g. 'Phoenix, AZ', 'Austin, TX', 'London, UK'.

## `searchQueries` (type: `array`):

Full searches, one per line (e.g. 'realtor in Scottsdale, AZ'). When set, these override the category picker + location. Use several queries to cover multiple cities or neighborhoods in one run.

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

Maximum number of companies to find per search. One search typically yields up to ~120 companies.

## `maxPagesPerSite` (type: `integer`):

How many pages to check on each company website when hunting for emails (homepage, /contact, /about...). More pages = more emails found, slightly slower run.

## `onlyWithWebsite` (type: `boolean`):

Drop companies that have no website (they can never have an email). You are not charged for dropped companies.

## `includeGenericEmails` (type: `boolean`):

Keep addresses like info@, hello@, contact@. Disable to keep only personal/role emails (fewer results).

## `language` (type: `string`):

Language code for the discovery search (e.g. 'en', 'es', 'fr', 'de').

## Actor input object example

```json
{
  "searchTerms": [
    "real estate agency"
  ],
  "location": "Phoenix, AZ",
  "maxResults": 5,
  "maxPagesPerSite": 1,
  "onlyWithWebsite": false,
  "includeGenericEmails": true,
  "language": "en"
}
```

# Actor output Schema

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

Complete B2B leads (company, website, phone, address, emails, social profiles), one item per lead 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 = {
    "searchTerms": [
        "real estate agency"
    ],
    "location": "Phoenix, AZ",
    "maxResults": 5,
    "maxPagesPerSite": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("renzomacar/realtor-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 = {
    "searchTerms": ["real estate agency"],
    "location": "Phoenix, AZ",
    "maxResults": 5,
    "maxPagesPerSite": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("renzomacar/realtor-leads-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 '{
  "searchTerms": [
    "real estate agency"
  ],
  "location": "Phoenix, AZ",
  "maxResults": 5,
  "maxPagesPerSite": 1
}' |
apify call renzomacar/realtor-leads-scraper --silent --output-dataset

```

## MCP server setup

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