# Google Maps Email Extractor 💰$1.80/1K – Leads with Emails (`rt-solutions/google-maps-email-extractor`) Actor

Get local business leads with emails from Google Maps: name, category, address, phone, website, rating plus the emails and social profiles found on each business website. Only places with an email if you want. $0.80 per 1,000 places + $1 per 1,000 with contacts.

- **URL**: https://apify.com/rt-solutions/google-maps-email-extractor.md
- **Developed by:** [RT SOLUTIONS](https://apify.com/rt-solutions) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 places

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/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 leads with emails · $1.80 per 1,000 leads

Type a business category and a city — "plumber" in "Manchester, United Kingdom" — and get **local businesses from Google Maps with the emails found on their own website**: name, category, address, phone, website, Google rating and review count, opening hours, GPS, plus **emails** and **Instagram, Facebook, LinkedIn, X, YouTube, TikTok** profiles.

By default you get **only the businesses that have an email**. The others are dropped and **not charged**.

### Real run — 5 November 2026

"plumber" in Manchester, United Kingdom, 60 places checked:

| | |
|---|---|
| Places checked on Google Maps | 60 |
| **Leads with at least one email (returned and charged)** | **33 (55 %)** |
| Leads that also have an Instagram profile | 11 |
| Places without email (dropped, free) | 27 |
| Run time | 2 min 10 s |
| Cost | 33 × ($0.0008 + $0.001) = **$0.06** |

First rows of that run:

| Business | Email | Phone | Rating |
|---|---|---|---|
| AD Plumbing Heating and Electrical | contact@plumbingmanchester.co.uk | +447500002379 | 4.9 |
| Kang Heating & Plumbing Ltd | contact@kangheatingplumbing.com | +447424523591 | 4.8 |
| JB7 Plumbing and Heating Limited | queries@jbplumbing.co.uk | +447928486113 | 4.8 |

Another test the same day: 30 dentists in Denver, Colorado → 24 with contacts (email or social profile), 11 with an email.

### Pricing

| Event | Free plan | Starter | Scale | Business+ |
|---|---|---|---|---|
| Place (business returned) | $0.0008 | $0.0007 | $0.0006 | $0.0005 |
| Contact details (email or social profile found) | $0.001 | $0.001 | $0.001 | $0.001 |

With *Only places with an email* on, every lead costs **$1.80 per 1,000** on the free plan and **$1.50 on Business**. Places dropped for having no email cost nothing.

**Compared on 4 November 2026** (Apify Store, free plan): lukaskrivka/google-maps-with-contact-details $5 per 1,000 places + $2.50 per 1,000 contact details; leadsbrary/google-maps-email-extractor $3 per 1,000 results; x_guru/google-maps-email-extractor $3 per 1,000 leads; s-r/google-maps-contact-details $3.50 per 1,000 places + $2.80 per 1,000 enriched; kestrel/google-maps-scraper $4 per 1,000 places + $3 per 1,000 contacts.

#### Apify free plan

One free trial run (1 search, 50 places checked). After that, add your own **DataForSEO login** in the "Apify free plan" section (DataForSEO gives $1 of free credit at sign-up): the Google Maps data is then paid to DataForSEO and **places are not charged here** — only contact details ($1 per 1,000 leads), because the website visits run on this Actor. Paid Apify plans need no key and have no limit.

### Input examples

```json
{
  "searchStringsArray": ["plumber"],
  "locationQuery": "Manchester, United Kingdom",
  "maxCrawledPlacesPerSearch": 100
}
```

Several categories, a whole city (deep search splits the map into tiles), only well-rated businesses:

```json
{
  "searchStringsArray": ["dentist", "orthodontist"],
  "locationQuery": "Denver, Colorado",
  "maxCrawledPlacesPerSearch": 500,
  "deepSearch": 3,
  "placeMinimumStars": 4
}
```

Every business with a website, email or not (phones and social profiles too):

```json
{
  "searchStringsArray": ["hair salon"],
  "locationQuery": "Paris, France",
  "language": "fr",
  "onlyWithEmails": false
}
```

#### Input reference

| Field | What it does | Default |
|---|---|---|
| `searchStringsArray` | What you would type in Google Maps: "plumber", "italian restaurant"… | — |
| `locationQuery` | City, region or country | — |
| `maxCrawledPlacesPerSearch` | Places checked per search (expect 35–55 % with an email) | 100 |
| `onlyWithEmails` | Return only businesses with an email | true |
| `deepSearch` | Split the area into a grid to get more than the ~150–200 places Google shows per search (3 = 3×3) | 0 |
| `language` | Language of results (en, fr, de, es…) | en |
| `placeMinimumStars` | Minimum Google rating | 0 |
| `categoryFilterWords` | Keep only places whose category contains one of these words | — |
| `skipClosedPlaces` | Skip closed places | false |
| `dataForSeoLogin` / `dataForSeoPassword` | Apify free plan only, after the trial | — |

### Output

One row per business: `title`, `categoryName`, `address`, `city`, `postalCode`, `countryCode`, `phone`, `website`, `totalScore`, `reviewsCount`, `openingHours`, `location` (lat/lng), `url` (Google Maps link), `emails`, `phones` (from the website), `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks`, `pinterests`. Field names match the most used Google Maps scraper on Apify, so existing sheets and workflows keep working. Export to CSV, Excel, JSON or Google Sheets.

### How the emails are found

For each business with a website, the Actor reads the home page and, when no email is there, the contact or about page. It reads `mailto:` links, plain-text and `[at]`-obfuscated addresses, and removes image file names, form placeholders, example and masked addresses. Each website is read once per run, even when several branches share it.

### Use cases

- **Cold email to local businesses**: a list of plumbers, dentists or salons with an email, ready for your outreach tool.
- **Agencies**: find businesses with a low rating, few reviews or no Instagram, and pitch your service.
- **B2B sales**: suppliers, wholesalers and service companies by city.
- **Market research**: how many businesses of a type are in a city, and how they present themselves online.

### Who this is not for

- You need **every** business, including those without a website → [Google Maps Scraper](https://apify.com/rt-solutions/google-maps-scraper-leads) (for example "Only without website" to sell websites).
- You need the personal email of the owner (not published on most websites).
- You need Google reviews → [Google Maps Reviews Scraper](https://apify.com/rt-solutions/google-maps-reviews-scraper).
- You already have a list of websites → [Website Contact & Email Extractor](https://apify.com/rt-solutions/website-contact-email-extractor).

### Integrations

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("rt-solutions/google-maps-email-extractor").call(run_input={
    "searchStringsArray": ["plumber"], "locationQuery": "Manchester, United Kingdom", "maxCrawledPlacesPerSearch": 100,
})
for lead in client.dataset(run.default_dataset_id).iterate_items():
    if lead.get("emails"):
        print(lead["title"], lead["emails"][0], lead.get("phone"))
```

Also works from JavaScript, curl (`run-sync-get-dataset-items`), Make, n8n and Zapier through the Apify apps — e.g. new leads straight to Google Sheets or your CRM every week with a schedule.

### 🤖 For AI agents & LLM apps

Through the Apify MCP server (https://mcp.apify.com), Claude, ChatGPT, Cursor and other MCP clients can call `rt-solutions/google-maps-email-extractor`. Example: *"Find 50 dentists in Denver with an email address and a rating above 4."* Minimal input: `{"searchStringsArray": ["<category>"], "locationQuery": "<city>"}`.

### FAQ

**How do I get emails from Google Maps?** Google Maps does not show emails. This Actor takes each business's website from Google Maps and reads the email from that website.

**How many emails will I get?** In our tests, 37–55 % of local businesses with a website published an email (11 of 30 dentists in Denver, 33 of 60 plumbers in Manchester).

**How much does it cost to get 1,000 leads with emails?** $1.80 on the free plan, $1.50 on Business and above. Places without email are not charged.

**Are the emails verified?** They are taken from the business's own website, not guessed. The Actor does not send emails or test mailboxes.

**Can I get more than 200 places for a city?** Yes — use Deep search (e.g. 3 or 5) and raise the maximum.

**Is it legal?** It collects business contact details that businesses publish themselves. You must respect privacy and anti-spam laws (GDPR, PECR, CAN-SPAM, CASL) when contacting them.

### Limits

- Websites that load their email with JavaScript or show it as an image are not read.
- Sites behind an anti-bot page are skipped.
- On the Apify free plan: one trial run, then your DataForSEO login or a paid plan.

### Your feedback

Missing a field or found a wrong email? Open an issue in the **Issues** tab — we answer fast and ship fixes. If the Actor saved you time, a short review helps others find it.

### Related scrapers

- [Google Maps Scraper – Business Leads](https://apify.com/rt-solutions/google-maps-scraper-leads)
- [Website Contact & Email Extractor](https://apify.com/rt-solutions/website-contact-email-extractor)
- [Google Maps Reviews Scraper](https://apify.com/rt-solutions/google-maps-reviews-scraper)
- [Google Search Results Scraper](https://apify.com/rt-solutions/google-search-results-scraper)

# Actor input Schema

## `searchStringsArray` (type: `array`):

What you would type in Google Maps: "plumber", "italian restaurant", "dentist"… One search per line.

## `locationQuery` (type: `string`):

City, region or country, e.g. "Austin, Texas", "Paris, France", "Brooklyn".

## `maxCrawledPlacesPerSearch` (type: `integer`):

Places looked up on Google Maps per search. Usually 35–50 % of local businesses publish an email on their website.

## `onlyWithEmails` (type: `boolean`):

On: only businesses with an email (others are dropped and not charged). Off: every business with a website, with phones and social profiles too.

## `deepSearch` (type: `integer`):

Split the location into a grid to get many more places: 3 = 3×3 tiles (≈ up to 9× more), 5 = 5×5. 0 = off. Duplicates are removed.

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

Language of results (en, fr, de, es, ar…).

## `placeMinimumStars` (type: `number`):

Only places with at least this Google rating (e.g. 4).

## `categoryFilterWords` (type: `array`):

Keep only places whose category contains one of these words (e.g. "plumber").

## `skipClosedPlaces` (type: `boolean`):

Skip places marked permanently or temporarily closed.

## `dataForSeoLogin` (type: `string`):

Only needed on the Apify free plan after your free trial run. With it, places are paid to DataForSEO and not charged here; contact details (if turned on) are still charged. Paid Apify plans need no key.

## `dataForSeoPassword` (type: `string`):

From app.dataforseo.com → API Access.

## Actor input object example

```json
{
  "searchStringsArray": [
    "dentist"
  ],
  "locationQuery": "Denver, Colorado",
  "maxCrawledPlacesPerSearch": 100,
  "onlyWithEmails": true,
  "deepSearch": 0,
  "language": "en",
  "placeMinimumStars": 0,
  "skipClosedPlaces": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per place.

## `overview` (type: `string`):

Main fields.

# 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 = {
    "searchStringsArray": [
        "dentist"
    ],
    "locationQuery": "Denver, Colorado"
};

// Run the Actor and wait for it to finish
const run = await client.actor("rt-solutions/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 = {
    "searchStringsArray": ["dentist"],
    "locationQuery": "Denver, Colorado",
}

# Run the Actor and wait for it to finish
run = client.actor("rt-solutions/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 '{
  "searchStringsArray": [
    "dentist"
  ],
  "locationQuery": "Denver, Colorado"
}' |
apify call rt-solutions/google-maps-email-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rt-solutions/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/u8Gn8ngMPM1RabDUy/builds/531HheFya4W1tQpe6/openapi.json
