# Google Maps Lead Extractor (`slothtechlabs/google-maps-lead-extractor`) Actor

Extract email-verified business leads from Google Maps — emails, phones, socials, and addresses. No email? No charge. Just enter a keyword and get CRM-ready leads in minutes. Built-in email & social extraction, auto deduplication, and closed business filtering. Only $0.008/lead.

- **URL**: https://apify.com/slothtechlabs/google-maps-lead-extractor.md
- **Developed by:** [SlothTechLabs](https://apify.com/slothtechlabs) (community)
- **Categories:** Lead generation
- **Stats:** 237 total users, 33 monthly users, 99.9% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 email-verified leads

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

## Google Maps Lead Extractor

Get **email-verified leads** from Google Maps. **No email found? No charge.**

Enter a search keyword just like you would in the Google Maps search bar — get a CRM-ready lead list with **email addresses, phone numbers, social media links**, and addresses in minutes. Every lead in your output is guaranteed to have an email.

### What does this Actor do?

This Actor extracts business leads from Google Maps, designed specifically for **sales teams, telemarketing agencies, and lead generation specialists**. Unlike general-purpose Google Maps scrapers with 70+ output fields and complex configuration, this Actor:

- ✅ **Guarantees email on every lead** — output only contains email-verified leads
- ✅ **1 required input field** — type a search keyword and hit Start
- ✅ **Built-in email and social media extraction** — no separate actor needed
- ✅ **Only active businesses** — closed businesses are automatically removed
- ✅ **Success-based pricing** — no email found? No charge

### 🛡️ Sales-Ready Quality Guarantee

Every lead in your output has passed **6 automatic quality checks** — no configuration needed:

| Quality Check | What it means for you |
| --- | --- |
| ✅ **Email verified** | Every lead has a real email address extracted from the business website |
| ✅ **Closed businesses removed** | No wasted calls to businesses that no longer exist |
| ✅ **Phone number required** | Every lead has a working phone number |
| ✅ **Duplicates eliminated** | No embarrassing double-calls to the same business |
| ✅ **Phone numbers formatted** | Dial-ready format (e.g., "(312) 555-0123") |
| ✅ **Social media included** | Facebook, Instagram, LinkedIn, etc. — free bonus data |

### Input parameters

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `search` | string | ✅ | — | Search keyword. Enter it just like you would in the Google Maps search bar. Examples: `"dentists in Chicago"`, `"restaurants Brooklyn"`, `"plumbers Denver CO"` |
| `location` | string | ❌ | — | Area to search. **Dramatically improves results** — see tip below. |
| `maxResults` | integer | ❌ | 100 | Target number of email-verified leads (up to 1,000). The Actor searches until this count is reached or all businesses in the area are exhausted. Without `location`, expect ~60–120 leads max due to Google Maps result limits. |

#### 💡 Pro tip: Use the `location` field for best results

Adding a `location` dramatically improves your lead discovery:

- ✅ **Breaks the 120-lead limit** — without `location`, Google Maps limits results to ~120 per search
- ✅ **Higher email success rate** — more businesses to scan means more emails found
- ✅ **Reach your target count** — larger search pool makes it easier to collect your requested number of leads

```json
{
    "search": "hair salons",
    "location": "Los Angeles, CA",
    "maxResults": 500
}
```

#### Quick start example

```json
{
    "search": "dentists in Chicago",
    "maxResults": 50
}
```

> **⚠️ Why did I get fewer leads than I requested?**
>
> The `maxResults` field sets a **target**, not a guarantee. The actual number depends on how many businesses exist in the area, how many have websites, and how many have discoverable email addresses. If you received significantly fewer leads than requested, try adding a `location` — this enables comprehensive area-wide search and typically yields **3-10x more results**.

### Output

Each lead contains **21 fields** — all as plain strings for easy use in Excel, Google Sheets, and CRMs. No complex objects or arrays. **Every lead has an email address.**

| # | Field | Description | Example |
| --- | --- | --- | --- |
| 1 | `name` | Business name | "Downtown Dental Care" |
| 2 | `googleMapsUrl` | Direct Google Maps link | "https://www.google.com/maps/place/..." |
| 3 | `industry` | Business category | "Dentist" |
| 4 | `phone` | Phone number (local format) | "(312) 555-0123" |
| 5 | `email` | Email address (auto-extracted) | "info@downtowndental.com" |
| 6 | `website` | Website URL | "https://www.downtowndental.com" |
| 7 | `address` | Full street address | "456 Michigan Ave, Chicago, IL 60611" |
| 8 | `rating` | Google rating (as text) | "4.2" |
| 9 | `neighborhood` | Neighborhood/district name | "Chicago Loop" |
| 10 | `postalCode` | Postal/ZIP code | "60611" |
| 11 | `openingHours` | Opening hours (all days, one line) | "Mon: 8 AM–5 PM, Tue: 9 AM–6 PM, ..." |
| 12 | `emailConfidence` | Email reliability: "high" / "medium" / "low" | "high" |
| 13 | `emailSource` | Where email was found | "contact\_page" |
| 14 | `facebook` | Facebook page URL (empty if not found) | "https://facebook.com/downtowndental" |
| 15 | `instagram` | Instagram profile URL (empty if not found) | "https://instagram.com/downtowndental" |
| 16 | `twitter` | X (Twitter) profile URL (empty if not found) | "https://x.com/downtowndental" |
| 17 | `linkedin` | LinkedIn page URL (empty if not found) | "https://linkedin.com/company/downtowndental" |
| 18 | `youtube` | YouTube channel URL (empty if not found) | "https://youtube.com/@downtowndental" |
| 19 | `tiktok` | TikTok profile URL (empty if not found) | "https://tiktok.com/@downtowndental" |
| 20 | `phoneUnformatted` | Phone digits only (for CRM/Twilio) | "3125550123" |
| 21 | `scrapedAt` | Extraction timestamp (ISO 8601) | "2026-03-13T05:40:18Z" |

#### Handling missing data

This Actor **never outputs null values**. When data is unavailable, a human-readable reason is displayed:

| Placeholder | Meaning |
| --- | --- |
| `"Not on Google Maps"` | This information is not listed on the Google Maps business page |
| `"Not on website"` | The business has a website, but this information wasn't found on it |
| *(empty)* | Social media link not found on the business website |

> **Note:** The `email` field always contains a valid email address — every lead is guaranteed to have one.

> **Note on Apify Console display:** Social media columns (Facebook, Instagram, Twitter/X, LinkedIn, YouTube, TikTok) are displayed as clickable links in the Console's table view. When a social media link is not found, the cell is empty. In this case, the Console may display `"Failed to construct 'URL': Invalid URL"` — **this is a normal display behavior and simply means no link was found for that business.** The actual data (CSV/JSON/API) correctly contains an empty value.

#### Example output

```json
{
    "name": "Downtown Dental - Loop",
    "googleMapsUrl": "https://www.google.com/maps/place/Downtown%20Dental%20-%20Loop/data=!4m2!3m1!1s...",
    "industry": "Dentist",
    "phone": "(773) 692-5401",
    "email": "loop@downtown-dental.com",
    "website": "https://www.downtown-dental.com/locations/loop/",
    "address": "Downtown Dental - Loop, 25 E Washington St STE 1921, Chicago, IL 60602",
    "rating": "4.7",
    "neighborhood": "Chicago Loop",
    "postalCode": "60602",
    "openingHours": "Thu: 8 AM–5 PM, Fri: 8 AM–1 PM",
    "emailConfidence": "medium",
    "emailSource": "top_page",
    "facebook": "https://www.facebook.com/downtowndentalloop",
    "instagram": "https://www.instagram.com/downtowndentalloop",
    "twitter": "",
    "linkedin": "",
    "youtube": "",
    "tiktok": "",
    "phoneUnformatted": "7736925401",
    "scrapedAt": "2026-03-13T05:40:18.791Z"
}
```

### Pricing

**No email? No charge.** You only pay for leads where an email is actually found.

| Condition | Cost | Details |
| --- | --- | --- |
| Email found | **$0.008/lead** | Full data + email + social media |
| No email found | **FREE** | Not output, not charged |

#### Cost examples

- **100 leads**: **$0.80**
- **500 leads**: **$4.00**
- **1,000 leads**: **$8.00**
- **Free tier** ($5 credit): Up to **625 email-verified leads**

### ⏱ Processing Time & Background Execution

| Leads Requested | Typical Time | What Happens |
| --- | --- | --- |
| 100 | 5-15 min | Quick batch — results while you grab coffee ☕ |
| 500 | 30-90 min | Medium batch — start it and move on to other tasks |
| 1,000 | 1-4 hours | Large batch — runs in background, come back later |

#### 💡 You don't need to keep the browser open

Your Actor runs in the cloud — **close the tab, shut down your computer, and come back later** to download your leads. The extraction continues in the background.

**Real-time progress** is shown on the run page:

```
🔍 Searching: 150 businesses checked | 45/100 email leads found
📧 Extracting: 78/100 email leads found (78%)
✅ Done! 100 email-verified leads ready for download. Cost: $0.80
```

If fewer leads are found than requested, you'll see a helpful tip:

```
✅ Done! 72/200 email-verified leads found (all available businesses in the area have been searched). Cost: $0.58
💡 Tip: Set the "Location" field (e.g., "Chicago, IL") to search a wider area — this typically yields 3-10x more leads.
```

You can also set up **Webhook notifications** (email or Slack) to be notified when extraction is complete.

### How it compares to other Google Maps tools

| Feature | This Actor | Compass Scraper | Email Extractor |
| --- | --- | --- | --- |
| **Email extraction** | ✅ Built-in | ❌ Separate actor ($0.01/ea) | ✅ But charges for no-email |
| **Pricing model** | No email = free | Charges regardless | Charges regardless |
| **Active businesses only** | ✅ Automatic | ❌ Includes closed | ❌ Includes closed |
| **Phone number required** | ✅ Automatic | ❌ Includes phoneless | N/A |
| **Duplicate removal** | ✅ Automatic | ❌ Manual | N/A |
| **Input complexity** | 1 field | 15+ fields | 3+ fields |
| **Output fields** | 21 (sales-focused) | 70+ (raw data) | 5-10 |
| **Social media** | ✅ Free bonus | ❌ Separate actor | ❌ Not included |

### Limitations

- **`maxResults` is a target, not a guarantee.** The actual number of leads depends on how many businesses exist in the search area, how many have websites, and how many have discoverable emails. Without `location`, Google Maps limits search results to ~120 businesses per query, which typically yields 60–120 email-verified leads after filtering. **Set the `location` field to significantly increase your lead count.**
- **Optimized for English-language markets.** Google Maps data (name, phone, address, rating, etc.) works in all languages. However, email and social media extraction is optimized for **English-language business websites**. Non-English sites may have lower email discovery rates. Multi-language support is planned for a future update.
- Email extraction requires visiting each business website, which increases run time. See the processing time table above.
- Some websites may block automated access, resulting in no email being extracted for that business (you won't be charged).
- The Actor may occasionally be rate-limited by Google during high-volume extractions.

### Disclaimer

This Actor is unofficial and not affiliated with or endorsed by Google. It accesses only publicly available data from Google Maps. Use responsibly and in compliance with applicable laws and regulations.

# Actor input Schema

## `search` (type: `string`):

Enter a search keyword just like you would in the Google Maps search bar. Examples: "dentists in Chicago", "restaurants Brooklyn", "plumbers Denver CO"

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

Specify the city, state, or region to search. This dramatically improves results: without a location, Google Maps returns at most ~120 businesses per query. With a location, the Actor performs a comprehensive area-wide search using geographic grid cells, which typically yields 3-10x more leads and significantly increases your chances of reaching the requested number. Examples: "New York, NY", "Los Angeles", "London, UK", "Osaka, Japan"

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

Number of email-verified leads to extract. The Actor keeps searching until this many leads with emails are collected. Only if all businesses in the area are exhausted will the output contain fewer.

## Actor input object example

```json
{
  "search": "restaurants in New York",
  "location": "New York, NY",
  "maxResults": 100
}
```

# Actor output Schema

## `leads` (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 = {
    "search": "restaurants in New York",
    "location": "New York, NY"
};

// Run the Actor and wait for it to finish
const run = await client.actor("slothtechlabs/google-maps-lead-extractor").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 = {
    "search": "restaurants in New York",
    "location": "New York, NY",
}

# Run the Actor and wait for it to finish
run = client.actor("slothtechlabs/google-maps-lead-extractor").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 '{
  "search": "restaurants in New York",
  "location": "New York, NY"
}' |
apify call slothtechlabs/google-maps-lead-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=slothtechlabs/google-maps-lead-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/BhBs0qeL87DsE8Q57/builds/5CUj7dewdnWihQo18/openapi.json
