# Real Estate Agent Google Maps Lead Generator (`clura/real-estate-google-maps-lead-generator`) Actor

Scrapes real estate agent and broker leads from Google Maps by location, with email/services/social enrichment from each agency's website. Drives the real Clura Chrome extension headlessly.

- **URL**: https://apify.com/clura/real-estate-google-maps-lead-generator.md
- **Developed by:** [Clura](https://apify.com/clura) (community)
- **Categories:** AI, Agents, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 leads without enrichments

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

## Real Estate Agent Google Maps Lead Generator

Scrapes real estate agent, broker, and property manager leads directly from Google Maps by location — business name, rating, category, address, phone, website, and a direct Google Maps listing link — then visits each agency's own website to detect email addresses, the specialties they offer, and their social media profiles.

Built on a real Chrome browser driven by the actual Clura Chrome extension (not a lightweight HTTP scraper), so it holds up against the same anti-bot measures a real user's browser would face, and self-heals its selectors with AI if Google changes Maps' markup.

### How it works

1. **Search Google Maps** — for each location you provide, the actor searches Google Maps for each of your chosen business types (Real Estate Agent, Real Estate Broker, Real Estate Agency, Property Manager, Real Estate Attorney, Home Inspector, Mortgage Broker, or your own custom search terms), rotating across all of them to surface more distinct businesses per area than a single generic query would.
2. **Extract listing data** — business name, rating, category, address, phone, website, and Google Maps URL are read directly from the search results, using the same selectors verified live against real Real Estate Agent searches.
3. **Deduplicate** — agencies found under more than one search term are merged into one record, keyed on phone number first, then website domain.
4. **Enrich from each agency's website** — the actor visits each website's homepage once and extracts:
   - The first email address found on the page
   - Which of 11 real estate specialties the page mentions (Residential Sales, Commercial Real Estate, Property Management, Home Staging, Relocation Services, First-Time Homebuyer, Luxury Homes, Investment Properties, New Construction, Mortgage/Financing Assistance, Free Home Valuation)
   - Facebook, Instagram, LinkedIn, and Twitter/X profile links

### Input

| Field | Type | Description |
|---|---|---|
| `locations` | array (required) | Zip codes or city/state to search, e.g. `["75201", "Austin, TX"]`. Every search term runs once per location. |
| `searchTerms` | array | Business types to search for. Defaults to the 7 standard ones listed above if left empty — add your own for a custom search. |
| `maxLeadsPerSearch` | integer | Max leads per location × search-term combination. Default 30. |
| `maxPagesPerSearch` | integer | Max scroll/pagination steps per search before stopping. Default 5. |
| `enrichWebsite` | boolean | Visit each lead's website to extract email/services/social links. Default true. |
| `openaiApiKey` | string | Only used if Google Maps' markup has changed enough that the built-in selectors stop working, to re-detect them via AI. Optional. |
| `proxyConfiguration` | object | Apify Proxy settings. |

### Output

Each record: `name`, `rating`, `category`, `address`, `phone`, `website`, `mapsUrl`, `searchTerm`, `location`, `email`, `services` (array), `emergency24_7` (boolean, generally false for this niche), `socialLinks` (object).

### What this actor does NOT do (please read before running)

- **No email verification.** Extracted emails are exactly what's published on the agency's website — there's no DNS/SMTP deliverability check.
- **Homepage only.** Website enrichment reads the agency's homepage — it doesn't crawl into separate Contact/About/Listings pages.
- **No review count.** Google Maps' search-results list doesn't render review count for every listing, so it isn't a reliable field to offer here.
- Results per search are capped by what Google Maps itself returns for a single query (typically well under 200).

### Who this is for

- **Real estate software/CRM vendors** sourcing agents and brokers to sell into.
- **Marketing agencies** serving real estate clients who need fresh prospect lists.
- **Mortgage lenders and title companies** building referral-partner outreach lists.
- **Recruiters** sourcing agents for a brokerage in a specific market.
- **Market research** — agent density and specialty mix by city.

# Actor input Schema

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

Zip codes or city/state to search, e.g. \["75201", "Austin, TX"]. Every search term below is run once per location.

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

Real estate business types to search for, rotated across each location to surface more leads (Google Maps' ranking varies by query wording). Defaults to the 7 standard types if left empty: Real Estate Agent, Real Estate Broker, Real Estate Agency, Property Manager, Real Estate Attorney, Home Inspector, Mortgage Broker. Add your own for a custom search.

## `maxLeadsPerSearch` (type: `integer`):

Maximum leads to collect per location x search term combination.

## `maxPagesPerSearch` (type: `integer`):

Maximum pagination steps (scrolls) per search before stopping.

## `enrichWebsite` (type: `boolean`):

Visit each lead's website homepage to extract email, detected real estate specialties, and social media links.

## `crawlContactPages` (type: `boolean`):

If the homepage has no email, follow one Contact/About-style link on the site to look there too. Costs one extra page visit per lead that needs it. Default false.

## `openaiApiKey` (type: `string`):

Used only if Google Maps' markup has changed enough that the built-in recipe stops working, to re-map fields via AI. Falls back to the OPENAI\_API\_KEY env var if omitted.

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

Apify Proxy settings to route the browser's traffic through.

## `recipeOverride` (type: `object`):

Advanced use only. Overrides the actor's built-in Google Maps selectors.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "searchTerms": [
    "Real Estate Agent"
  ],
  "maxLeadsPerSearch": 5,
  "maxPagesPerSearch": 2,
  "enrichWebsite": true,
  "crawlContactPages": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every lead found, one row per business — the actor's main result.

## `runSummary` (type: `string`):

Status, total leads found, searches run, searches that needed the contact-page fallback, and how many leads had an email — one JSON record for the whole run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("clura/real-estate-google-maps-lead-generator").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("clura/real-estate-google-maps-lead-generator").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 '{}' |
apify call clura/real-estate-google-maps-lead-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clura/real-estate-google-maps-lead-generator"
        }
    }
}

```

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/5dcfqxMFWBdVY5LDF/builds/fOZd8Ot1GPmv689q6/openapi.json
