# Google Maps Email Extractor — Business Leads, Emails & Phones (`intelscrape/google-maps-email-extractor`) Actor

Google Maps email extractor: turn a search like 'plumbers in Austin TX' into local business leads with emails, phones, websites, ratings and social links. Multi-city search, lead score, rating filters and email classification. Pay per lead.

- **URL**: https://apify.com/intelscrape/google-maps-email-extractor.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** Lead generation, Business, Marketing
- **Features:** Limited permissions
- **Stats:** 34 total users, 2 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Maps Email Extractor — Local Business Email Leads

![Actor Banner](https://api.apify.com/v2/key-value-stores/PyvJzfQg02FD3RYhd/records/google-maps-email-extractor-banner.png)

> 🇨🇳 **中文简介 (Chinese — China & Singapore):**
> 还在手动从地图抄本地商家邮箱？用业务类型+地区搜索 Google Maps，或直接提供网址，自动提取企业邮箱、电话与社交媒体链接，并尽量过滤垃圾邮箱。按结果计费，无需自备 API Key——适合本地拓客、SEO 与 SDR。需要更深网站联系页？接 **Website Contact Scraper**；找没有官网的商家？用 **Google Maps No-Website Leads**。现在运行，把可外联线索导出到表格或 Claude / Cursor。

> 🇸🇬 **Ringkasan Melayu (Singapore):**
> Masih salin e-mel perniagaan tempatan dari peta? Cari Google Maps mengikut jenis + lokasi, atau beri URL — kami ekstrak e-mel, telefon dan pautan sosial. Bayar per hasil, tiada API key. Untuk crawl laman hubungi: Website Contact Scraper; untuk perniagaan tanpa laman: Google Maps No-Website Leads. Cuba di Apify.

#### 🤖 NEW: Connect This To Your AI!

Want local Maps email leads inside Claude, Cursor, or ChatGPT? Use the **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — ask your AI to pull Maps emails (`cities` + `categories`), draft outreach, then deepen contacts with **[Website Contact Scraper](https://apify.com/intelscrape/contact-info-scraper)** or enrich people via **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)**. No-website listings? Soft-cross to **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)**.

#### 🏆 Featured Bots by IntelScrape

1. **[Google Maps Email Extractor](https://apify.com/intelscrape/google-maps-email-extractor)** — Local Business Email Leads
2. **[Website Contact Scraper](https://apify.com/intelscrape/contact-info-scraper)** — Website Email & Phone Finder
3. **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)** — Local Businesses Without a Website
4. **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)** — Name, Address, Phone & Email People Lookup
5. **[TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper)** — Phone & Email Matches
6. **[Building Permit Scraper](https://apify.com/intelscrape/building-permit-scraper)** — Roofing, Solar & HVAC Leads
7. **[TikTok Scraper](https://apify.com/intelscrape/tiktok-scraper)** — Emails & Influencer Leads
8. **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — Use Skip Trace inside Claude, Cursor, ChatGPT

### Multi-city + niches (new)

Use `cities` + `categories` to fan out searches (e.g. plumbers/HVAC across Austin + Miami) without hand-writing every query. Optional `skipWithoutEmail` keeps only email-ready leads. `demoMode` saves 3 fictional sample leads to the run's Key-value store (`OUTPUT`) for format preview; it writes nothing to the dataset and charges no result or email events (only the one-time Actor start event applies).

***

⚡ **Use this Actor in n8n — no code**

1. Add the official **Apify** node in n8n.
2. Connect your Apify API token.
3. Run Actor ID: `IntelScrape/google-maps-email-extractor`.

***

![billing](https://img.shields.io/badge/billing-pay_per_result-2ea44f)
![API key](https://img.shields.io/badge/API_key-not_required-blue)
![coverage](https://img.shields.io/badge/coverage-Google_Maps_+_websites-8a2be2)

**Local business email leads from Google Maps** — extract emails, phones, and social links by niche + location, or from direct website URLs.\
**Outbound-ready local B2B / SMB prospecting without maintaining your own Maps + crawl stack.**

> **Honest coverage & billing (read this):** Charged for **dataset items ($0.005)** + actor start (**$0.00005**) + **email-found ($0.002)** when an email is harvested + optional **email-verified ($0.001)** when `verifyEmails` finds ≥1 `likely_valid` address + **phone-line-type ($0.001)** when `includePhones` delivers ≥1 `phoneLineTypes[{ e164, lineType }]` (libphonenumber — not live carrier / not WhatsApp-active / not DNC). Emails only appear when the business website (or Maps profile) **publishes** them — many listings have phone only. Contact-page crawling is best-effort. Not affiliated with Google.

***

> 🧭 Built for **local agencies, franchise developers, SEO shops, and SDR teams** hunting **local business emails**.

> ⭐ **Store rating is driven by daily power users.** Please [leave a review](https://apify.com/intelscrape/google-maps-email-extractor).

> ⚖️ **Lawful business use only.** Public Maps/website contacts. Comply with TCPA/CAN-SPAM/PDPA for outreach.

> 📌 *Examples in this README are **fictional** unless stated otherwise.*

***

### Lead score + website filter (new)

- `leadScore` (0–100) + `leadScoreBreakdown` on every lead — email/phone/social/rating/reviews/tech weighted (khadinakbar `minLeadScore` parity).
- `minLeadScore` — drop weak leads before export.
- `requireWebsite` — keep only rows with a website/domain.
- `filtersApplied` echoes active filters on each row.

### Incremental + email classify + quality filters

- `onlyNew` + `seenStoreName` — skip domains already seen (KV store), for monitoring runs.
- `verifyEmails` — local email labels (`likely_valid` / `role_based` / `disposable`) with no external API.
- `minRating` — drop rated leads below your floor; unrated leads kept.
- `minReviews` — drop leads below your review-count floor when reviewCount is known (rival-parity).
- `requirePhone` — keep only leads with at least one phone.
- **email-found PPE** — charged only when a harvested email is present on the pushed lead (not on phone-only rows).
- **email-verified PPE** — opt-in via `verifyEmails`; charged only when ≥1 address is classified `likely_valid`.
- **phone-line-type PPE** — when `includePhones` delivers ≥1 E.164 with libphonenumber `lineType` (MOBILE / FIXED_LINE / VOIP / …). Honest offline type — not live carrier registry, not WhatsApp-active, not DNC.

### 🕵️‍♂️ Why Choose Us vs. "Cheaper" Competitors?

| Feature | Maps Email Extractor | YellowPages clones |
| :--- | :--- | :--- |
| **Source** | Google Maps + sites | Stale directories |
| **Query** | Local business email leads | Generic directory dump |
| **Contacts** | Site deep links | Thin NAP dumps |
| **Billing** | Per result | Per listing scanned |
| **Siblings** | Contact Info + No-Website Leads | Dead-end |

### Quick start

```json
{
  "websiteUrls": ["https://apify.com"],
  "maxResults": 5,
  "scrapeContactPages": true,
  "includePhones": true,
  "includeSocial": true,
  "verifyEmails": true
}
```

Or pass `websiteUrls` to skip Maps discovery.

### Email verification, phone line types and next-step links

- **`verifyEmails` (opt-in):** local classification (`likely_valid` / `role_based` / `disposable`) — bills **`email-verified`** only when ≥1 address is `likely_valid` on the delivered lead.
- **`includePhones` + phone lineType:** each delivered number can include `phoneLineTypes[{ e164, lineType }]` from libphonenumber — bills **`phone-line-type`** once per lead when ≥1 enrichment is present. Not a live carrier lookup; not WhatsApp-active; not DNC.
- **Next-step links:** every lead row gets a personalized `softCta` links object, plus one `emails-batch-summary` row with links — Contact / Website Leads / Email / Phone / B2B / Shopify / License / BBB / UCC / MCA / Yelp / Trustpilot / Google Reviews / Watson / TPS / Skip Trace PRO (no self-link). These links add no extra charge.
- Need emails/phones from **known website URLs** (contact / about pages)? Use **[Website Contact Scraper](https://apify.com/intelscrape/contact-info-scraper)** — MX verify + phone lineType bundle available there too.
- Hunting **businesses with no website** for web-design outreach? **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)**.
- Enriching **owners / people** behind a listing? **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)** or **[TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper)**.
- Broader **company leads** beyond Maps? **[B2B Lead Generator](https://apify.com/intelscrape/b2b-lead-generator)**.

### What you get

- Business name, phone, Maps data when found
- Phone lineType depth (`phoneLineTypes[]`) via libphonenumber when phones are included
- Emails from website/contact pages when published
- Social links (optional)

### Pricing (PPE)

| Event | Price |
| :--- | ---: |
| Actor start | **$0.00005** |
| Result (dataset item) | **$0.005** |
| Email found (`email-found`) | **$0.002** — only when the lead includes ≥1 harvested email |
| Email verified (`email-verified`) | **$0.001** — only when `verifyEmails` finds ≥1 `likely_valid` |
| Phone line type (`phone-line-type`) | **$0.001** — when `includePhones` delivers ≥1 enriched E.164 |

### 💡 Use cases

- **Local lead generation:** build email lists of plumbers, dentists, roofers, salons or any other local niche.
- **Agencies:** prospect local businesses for SEO, web design, ads or reputation services.
- **Sales teams:** fill a CRM with phone and email contacts by city and category.
- **Market research:** compare ratings and review counts across cities.

### ⏰ Schedule this Actor — new leads every Monday, skipping domains you already have

Run it once with your own settings, save that run as a **task**, then let Apify Schedules repeat it. About two minutes, no code.

1. In Apify Console open **Schedules** → **Create new**.
2. Click **Add** → pick your saved task (or this Actor), set the cron expression and time zone below, and click **Enable** (new schedules start disabled).
3. Optional: open the task's integrations and add a **webhook** on `ACTOR.RUN.SUCCEEDED` so every finished run is pushed to your CRM, Zapier, Make or n8n. Payload template: `{"runId": {{resource.id}}, "datasetId": {{resource.defaultDatasetId}}, "status": {{resource.status}}}`. Your tool then reads `https://api.apify.com/v2/datasets/<datasetId>/items?format=csv`, or use the Apify integrations for Google Sheets, Make and Zapier.

| Cadence | Cron expression |
| :--- | :--- |
| Every day, 8 AM | `0 8 * * *` |
| Weekdays, 8 AM | `0 8 * * 1-5` |
| Every Monday, 8 AM | `0 8 * * 1` |
| 1st of the month, 8 AM | `0 8 1 * *` |

**Starter task input for this Actor** (edit the values, then paste into the task):

```json
{
  "searchQueries": [
    "plumbers"
  ],
  "cities": [
    "Austin TX",
    "Miami FL"
  ],
  "maxResults": 100,
  "skipWithoutEmail": true,
  "onlyNew": true,
  "seenStoreName": "plumbers-weekly"
}
```

- `onlyNew` remembers every business domain it has delivered in a named key-value store in **your** account (`seenStoreName`). On the next scheduled run those domains are skipped before a lead is written, so you are not charged for them again.
- Use one `seenStoreName` per list or niche (for example `roofers-weekly`). Change the name to start a fresh list.
- Each scheduled run still pays the small Actor start event once; the per-lead events apply only to the new leads delivered.

**Prefer the API?** `POST https://api.apify.com/v2/schedules` with a body like the one below (send your token in the `Authorization: Bearer` header):

```json
{
  "name": "google-maps-email-extractor-weekly",
  "userId": "YOUR_USER_ID",
  "actions": [
    {
      "type": "RUN_ACTOR_TASK",
      "actorTaskId": "YOUR_TASK_ID"
    }
  ],
  "cronExpression": "0 8 * * 1",
  "timezone": "America/New_York",
  "isEnabled": true
}
```

Docs: [Apify Schedules](https://docs.apify.com/platform/schedules) · [Webhook actions](https://docs.apify.com/platform/integrations/webhooks/actions)

### ❓ FAQ

**How do I extract emails from Google Maps?**
Enter a search such as `plumbers in Austin TX`, set **Max Results**, and run. The Actor finds the businesses on Google Maps, visits each website and its contact pages, and returns the emails, phones and social links it finds.

**Can I search several cities at once?**
Yes. Add a list of **Cities** and **Niche categories** and the Actor fans the search out across every combination.

**Can I keep only good leads?**
Yes. Filter by minimum star rating, minimum review count, required phone or website, minimum lead score, and role-based email prefixes such as `info@`.

**Will every business have an email?**
No. Emails are only found when the business publishes them on its website. Turn on **Only keep leads with email** to drop the rest.

**How is it billed?**
Pay per event: a fee per delivered lead plus optional events for emails found, email checks and phone line types. See the **Pricing** tab on this page for the current per-event prices. You are only charged for the events listed there, and you can cap spend with the run's maximum charge setting.

**How do I export the leads to CSV or Google Sheets?**
Use the Output tab (CSV, Excel, JSON) or the Apify integrations for Google Sheets, Zapier, Make and webhooks.

**Is this a Google Maps email scraper?**
Yes. Give it a niche and a place (for example `dentists in Denver CO`, or `cities` + `categories`) and it finds the businesses on Google Maps, then visits each business website and its contact pages for published emails, phones and social links. It returns an email only when the business publishes one.

**Can I use it as a Google Maps leads scraper?**
Yes. Every lead row carries the business name, phone numbers, website, social links, rating and review count when known, and a 0-100 `leadScore`. Use `minLeadScore`, `requireWebsite`, `requirePhone`, `minRating` and `minReviews` to keep only outreach-ready leads, or `skipWithoutEmail` to keep only leads that have an email.

**How do I extract emails from Google Maps without coding?**
Open the Actor in Apify Console, enter `searchQueries` (or `cities` + `categories`), set `maxResults`, keep `scrapeContactPages` on, click Start, then export CSV, Excel or JSON. Google Maps listings rarely show an email themselves, so the emails come from the business websites the Actor visits. You can also call it from n8n, Make, Zapier or the Apify API.

**Does it work as a Google Maps contact scraper for phones and social links?**
Yes. `includePhones` collects phone numbers (with a libphonenumber line type, not a live carrier lookup) and `includeSocial` collects Facebook, Instagram, LinkedIn and other social links. If you already have a list of business websites, pass them in `websiteUrls` to extract emails from those sites directly.

**What do Google Maps business emails cost with this Actor?**
Pay per event: $0.00005 per run start, $0.005 per delivered lead, plus $0.002 only when that lead includes at least one harvested email. `verifyEmails` is on by default and adds $0.001 only when a likely-valid email is found (turn it off to skip it), and `includePhones` can add $0.001 when a phone line type is delivered. So a lead with an email and no extras is $0.007. Set a maximum charge per run to cap spend.

### Legal

Public data for lawful B2B prospecting only. You are responsible for outreach compliance.

# Actor input Schema

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

Full search queries (e.g. 'plumbers in Austin TX'). Used as-is when cities/categories are empty. When cities are set, each query is treated as a niche/category and combined with each city.

## `cities` (type: `array`):

Optional city list. When set, each category (or searchQueries entry without a city) is expanded as '{category} in {city}'. Cap 25 cities. Matches Store rivals' locationQuery / city packs.

## `categories` (type: `array`):

Optional vertical niches (plumbers, HVAC, roofing, dentists). Paired with cities\[]. If empty and cities\[] is set, searchQueries are used as niches.

## `websiteUrls` (type: `array`):

Direct URLs of business websites to extract emails from. Use this if you already have a list of websites.

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

Google Maps place or search URLs (e.g. https://www.google.com/maps/place/…). The actor parses placeId and coordinates from the URL and attempts to find the linked business website for email extraction. Rival-parity with lukaskrivka startUrls.

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

Maximum number of businesses to process

## `skipWithoutEmail` (type: `boolean`):

When true, only push dataset items that have at least one email (phone-only rows dropped). Rival-parity filter for outreach lists.

## `scrapeContactPages` (type: `boolean`):

Automatically find and scrape /contact, /about pages for more emails

## `includePhones` (type: `boolean`):

Extract phone numbers from websites

## `includeSocial` (type: `boolean`):

Extract social media links (Facebook, Twitter, Instagram, LinkedIn, etc.)

## `demoMode` (type: `boolean`):

Save 3 fictional sample leads to the Key-value store (OUTPUT) and exit, for format preview. Not real businesses. Nothing is written to the dataset and no result or email events are charged; the one-time Actor start event still applies.

## `onlyNew` (type: `boolean`):

When true, skip domains already saved in the named key-value store (monitoring / incremental runs). Rival-parity with onlyNewListings / seen-ID patterns.

## `seenStoreName` (type: `string`):

Key-value store used when onlyNew is on. Default maps-email-seen.

## `verifyEmails` (type: `boolean`):

On by default. Adds emailVerification\[] (local heuristics: likely_valid / role_based / disposable / invalid_syntax, no external API) and bills email-verified ($0.001) once per place where at least one email is likely_valid. Turn off to skip.

## `minRating` (type: `number`):

When a lead has a known rating, drop it if below this value. Leads without rating are kept. Rival-parity with placeMinimumStars.

## `minReviews` (type: `integer`):

When a lead has a known reviewCount, drop it if below this value. Leads without reviewCount are kept. Rival-parity with min_reviews / totaka / poidata.

## `requirePhone` (type: `boolean`):

When true, only keep leads that include at least one phone. Rival-parity with requirePhone / phone-first outreach lists.

## `requireWebsite` (type: `boolean`):

When true, only keep leads that have a website/domain (khadinakbar requireWebsite parity). Direct URL runs always have websites; useful with mixed discovery.

## `minLeadScore` (type: `integer`):

Drop leads whose leadScore is below this floor. Score blends email/phone/social/rating/reviews/tech (khadinakbar minLeadScore parity). Unscored kept only if scoring fails.

## `excludeRolePrefixes` (type: `array`):

Drop emails whose local-part equals or starts with these prefixes (e.g. info, sales, support, hello, contact, admin). Leave empty to keep all non-spam emails. contact-info / outreach list parity.

## `maxEmailsPerSite` (type: `integer`):

Cap emails kept per business website (leadharbor maxEmailsPerSite parity). Leave empty for no cap.

## `maxContactPages` (type: `integer`):

How many /contact /about /team pages to enqueue per website when deep scan is on (default 3). Higher finds more emails, slower.

## Actor input object example

```json
{
  "searchQueries": [
    "plumbers in Austin TX"
  ],
  "cities": [
    "Austin TX",
    "Miami FL"
  ],
  "categories": [
    "plumbers",
    "HVAC contractors"
  ],
  "websiteUrls": [],
  "startUrls": [],
  "maxResults": 50,
  "skipWithoutEmail": false,
  "scrapeContactPages": true,
  "includePhones": true,
  "includeSocial": true,
  "demoMode": false,
  "onlyNew": false,
  "seenStoreName": "maps-email-seen",
  "verifyEmails": true,
  "requirePhone": false,
  "requireWebsite": false,
  "excludeRolePrefixes": [],
  "maxContactPages": 3
}
```

# Actor output Schema

## `businessName` (type: `string`):

The name of the business

## `emails` (type: `string`):

List of found emails

## `phones` (type: `string`):

List of found phones

## `techStack` (type: `string`):

Detected website technologies (Shopify, WordPress, React, etc.)

## `pixels` (type: `string`):

Detected advertising pixels (Facebook, Google, TikTok)

## `seoDescription` (type: `string`):

Website Meta description for audit outreach

# 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 = {
    "cities": [
        "Austin TX",
        "Miami FL"
    ],
    "categories": [
        "plumbers",
        "HVAC contractors"
    ],
    "verifyEmails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/google-maps-email-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 = {
    "cities": [
        "Austin TX",
        "Miami FL",
    ],
    "categories": [
        "plumbers",
        "HVAC contractors",
    ],
    "verifyEmails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/google-maps-email-extractor").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 '{
  "cities": [
    "Austin TX",
    "Miami FL"
  ],
  "categories": [
    "plumbers",
    "HVAC contractors"
  ],
  "verifyEmails": true
}' |
apify call intelscrape/google-maps-email-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,intelscrape/google-maps-email-extractor"
        }
    }
}
```

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/eaqzXeB6sJ2BQkCIJ/builds/HG7NZDXX3zhAnm2xK/openapi.json
