# Google Maps Business with Emails Extractor (`logical_scrapers/google-maps-email-extractor`) Actor

Google Maps email extractor for lead generation. Get business emails from Google Maps listings with ratings, opening hours, phones, websites and social links. A Google Maps contact scraper that returns Google Maps emails for outreach lists.

- **URL**: https://apify.com/logical_scrapers/google-maps-email-extractor.md
- **Developed by:** [Goldmine](https://apify.com/logical_scrapers) (community)
- **Categories:** Lead generation, Business, Automation
- **Features:** Limited permissions
- **Stats:** 745 total users, 3 monthly users, 100.0% runs succeeded, 22 bookmarks
- **User rating**: 2.02 out of 5 stars

## Pricing

from $5.99 / 1,000 results

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 — business emails, contact details and social media links from Google Maps

This Google Maps email extractor searches [Google Maps](https://www.google.com/maps) for a type of
business in a location, then visits each business's own website to collect the email addresses and
social media profiles it publishes. Every row combines the Google Maps listing (name, category,
rating, review count, address, phone, website, opening hours, booking link) with the Google Maps
emails and social links found on the website. Sales teams use it to build outreach lists, agencies to
find local clients, and researchers to map who operates in a market.

Type a business type and a location, for example "dentists" in "Manhattan, NY", and get back one row
per business as JSON, CSV or Excel. No Google account, cookies or API key are needed.

***

### 🚀 Key Features

- 🔎 **Search by business type and location** — the same search you would type into Google Maps, in any country
- 📧 **Business emails from Google Maps listings** — the homepage and up to three contact, about or team pages of each business website are checked for email addresses, including addresses hidden by email protection scripts
- 🔗 **Social media profiles** — Facebook, Instagram, X/Twitter, LinkedIn, YouTube, TikTok and Pinterest links from the business's own pages
- 🧾 **Full listing data** — name, category, rating, review count, address, phone, website, opening hours per weekday, booking link and the Google Maps URL
- 📑 **Clear limits** — `maxResults` caps how many businesses one run returns; a search with no matches ends with a message, not an empty success
- 🛡️ **No setup** — no login, cookies or proxy settings to manage
- 📤 **Multiple export formats** — JSON, CSV, Excel, XML via the Apify dataset
- 🔁 **Schedulable runs** — re-run a search monthly to pick up new businesses in an area

***

### 👥 Who Is This Actor For?

- **Sales and business development teams** — build lead lists of local businesses with an email to write to
- **Marketing agencies** — find prospects by trade and city, with their social profiles for research
- **Recruiters and partnership managers** — reach practices, clinics, shops or restaurants in a region
- **Market researchers** — count and profile the businesses of one type in an area
- 🤖 **AI builders** — feed an outreach agent or a CRM enrichment pipeline with contact data per business

### 💡 Common Use Cases

- Export business emails from Google Maps for every dentist in a city
- Build a cold-outreach list of plumbers, lawyers or restaurants in a region
- Find the Instagram and Facebook pages of local businesses in one niche
- Enrich a list of target areas with phone numbers, websites and opening hours
- Compare ratings and review counts of competitors in a neighbourhood

***

### 📥 Input

| Field | Type | Description | Default |
| ----- | ---- | ----------- | ------- |
| `businessType` | String | Type of business to search for, e.g. `restaurants`, `lawyers`, `dentists`. | Required |
| `location` | String | Location to search within, e.g. `New York, NY` or `London, UK`. | Required |
| `maxResults` | Integer | Maximum number of businesses to return for this search (1–1000). Google Maps stops listing after a limited number of businesses per search, so for more results split a large area into smaller locations. | `6` |

One run is one search. To cover several business types or cities, start one run per search (for
example from a schedule or the API).

#### Example Input

```json
{
  "businessType": "Dentists",
  "location": "Manhattan, NY",
  "maxResults": 6
}
```

***

### 📤 Output

Each dataset item is one business:

| Field | Type | Description |
| ----- | ---- | ----------- |
| `name` | String | Business name as shown on Google Maps |
| `category` | String | Main Google Maps category, e.g. `Dentist` |
| `rating` | Number | Star rating, 1–5 |
| `totalReviews` | Number | Number of Google reviews |
| `address` | String | Street address |
| `phone` | String | Phone number as shown on Google Maps |
| `website` | String | Website link from the listing |
| `businessStatus` | String | Opening status at the time of the run, e.g. `Open · Closes 6 PM` |
| `hours` | Object | Opening hours per weekday: `{ "open", "close" }`, `"Closed"` or `"Open 24 hours"`; `null` when the listing shows none |
| `bookingLinks` | String | Booking or appointment link from the listing, or `null` |
| `googleMapsUrl` | String | Link to the place on Google Maps |
| `emails` | Array | Email addresses found on the business website, addresses on the business's own domain first |
| `socialLinks` | Object | Profile links found on the website: `facebook`, `instagram`, `twitter`, `linkedin`, `youtube`, `tiktok`, `pinterest` (only those found) |

When the listing's website is itself a social profile (for example a Facebook page), that link is
returned under `socialLinks` and `emails` is empty.

#### Example Output

One item from a run of the example input on 2026-11-04:

```json
{
  "name": "209 NYC Dental",
  "category": "Dentist",
  "rating": 4.9,
  "totalReviews": 1929,
  "address": "209 E 56th St 1st floor, New York, NY 10022",
  "phone": "(212) 355-2290",
  "website": "https://www.209nycdental.com/?utm_source=google&utm_medium=organic&utm_campaign=gmb",
  "businessStatus": "Closed · Opens 7:30 AM Wed",
  "hours": {
    "tuesday": { "open": "7:30 AM", "close": "6:30 PM" },
    "wednesday": { "open": "7:30 AM", "close": "6:30 PM" },
    "thursday": { "open": "7:30 AM", "close": "6:30 PM" },
    "friday": { "open": "7:30 AM", "close": "5 PM" },
    "saturday": { "open": "7:30 AM", "close": "3 PM" },
    "sunday": { "open": "9 AM", "close": "3 PM" },
    "monday": { "open": "7:30 AM", "close": "6:30 PM" }
  },
  "bookingLinks": "https://nyc.identalcloud.com/209NYCDental/Patient/_practice/1/Appointment",
  "googleMapsUrl": "https://www.google.com/maps/place/209+NYC+Dental/data=!4m7!3m6!1s0x89c258e446e4e16f:0x278f5e2c13ac9a17!8m2!3d40.7594146!4d-73.9671025!16s%2Fg%2F1thqbs3j!19sChIJb-HkRuRYwokRF5qsEyxejyc?authuser=0&hl=en&g_ep=EgoyMDI2MTEwMS4wIJJjKgBIAVAD&rclk=1",
  "emails": [
    "info@209nycdental.com",
    "emergency@209nycdental.com"
  ],
  "socialLinks": {
    "facebook": "https://www.facebook.com/209nycDentist",
    "instagram": "https://www.instagram.com/209nycdental",
    "linkedin": "https://www.linkedin.com/company/209-nyc-dental-llp",
    "youtube": "https://www.youtube.com/channel/UCb906oasqFebISHXaSZloVw"
  }
}
```

You can export the dataset as **JSON, CSV, Excel, XML, RSS, or HTML** from the Apify Console or
via the [Apify API](https://docs.apify.com/api/v2).

***

### 💰 Pricing

This Actor is **pay per event** (you pay per result): **$0.00799 per business**, so **1,000
businesses cost $7.99**, with lower per-result prices on higher Apify plans (down to $0.00599 per
business). Each run also has a start fee of $0.005 per GB of memory, which is $0.02 at the default
4 GB. Apify platform usage is included, not billed on top. You pay for each business saved, whether
or not its website lists an email; listings that fail to load, and places with no business details,
are skipped and not charged. A free Apify account is enough to try it.

***

### ❓ FAQ

#### What is the Google Maps Email Extractor?

It is a Google Maps contact scraper: it runs a Google Maps search and adds the emails and social
profiles each business publishes on its own website to the listing data.

#### How many businesses come back with an email?

That depends on how many businesses publish an address on their website. In test runs on
2026-11-04, 5 of 5 dentists in Manhattan, 12 of 15 plumbers in Austin and 5 of 5 restaurants in
Berlin had at least one email. Businesses without a website, or whose website shows only a contact
form, are returned without one.

#### Do I need an account, cookies or an API key?

No. The Actor reads public Google Maps listings and public business websites. It needs no Google
account, no cookies and no API key.

#### Do I need a proxy?

No. There is no proxy setting to fill in; the Actor uses Apify Proxy for Google Maps on its own, and
proxy traffic is included in the price.

#### How many results can I get per run?

Up to `maxResults` businesses for one search. Google Maps itself stops listing after a limited
number of businesses per search, so for a whole city run several searches with smaller locations
(neighbourhoods or postcodes).

#### What happens if my search finds nothing?

The run ends successfully with a status message saying Google Maps found no businesses for that
search, and nothing is charged beyond the run start. If Google Maps opens a single place instead of
a list, that one business is returned.

#### Is there a Google Maps API I could use instead?

Google's Places API needs a Google Cloud project with billing and an API key. It returns phone
numbers and websites but no email addresses or social media profiles, which this Actor collects
from each business's website.

#### Can I schedule it or integrate it with my app?

Yes — every Apify Actor exposes a REST API, webhooks, and integrations with Zapier, Make, Google
Sheets and Slack, and can be called from an AI agent via the Apify MCP server. A monthly schedule per
search picks up businesses that opened since the last run.

#### Is it legal to scrape Google Maps and business websites?

This Actor accesses only publicly available pages. You are responsible for making sure your use,
including any email outreach, complies with Google's terms of service and the laws in your
jurisdiction, such as anti-spam and data-protection rules.

#### What if the site changes and the Actor breaks?

Open an issue on the Actor's **Issues** tab and we will look at it.

***

### 🧩 Part of the Contact Data Suite

Actors that turn public listings and websites into contact data for outreach. Also try:

- [Google Maps Business Scraper](https://apify.com/logical_scrapers/google-map-business-scraper) — names, addresses, phones, websites, ratings, opening hours and coordinates from a Google Maps search
- [Google Maps Enrichment](https://apify.com/logical_scrapers/google-maps-enrichment) — Google Maps contact details by business type and location, with emails, phones and social links
- [Extract Emails, Socials and Contacts from Any Website](https://apify.com/logical_scrapers/extract-email-from-any-website) — emails, phone numbers and social links from any list of websites
- [Instagram Likers Profile Scraper](https://apify.com/logical_scrapers/instagram-likers-profile-with-email-scraper) — profiles of the accounts that liked an Instagram post

See every Goldmine Actor at [apify.com/logical_scrapers](https://apify.com/logical_scrapers).

***

### 📬 Contact & Support

- **Issues & feature requests**: use the Issues tab on this Actor's page — it reaches us directly.
- **Email**: `coredev.dan@gmail.com`
- **If this Actor saved you time, please leave a ⭐ rating on the Apify Store.** It helps us keep
  it maintained.

# Actor input Schema

## `businessType` (type: `string`):

Type of business to search for (e.g., 'restaurants', 'lawyers', 'dentists')

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

Location to search within (e.g., 'New York, NY', 'London, UK')

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

Maximum number of businesses to return for this search. Each business is one result. Google Maps stops listing after a limited number of businesses per search, so for more results split a large area into smaller locations.

## Actor input object example

```json
{
  "businessType": "Dentists",
  "location": "Manhattan, NY",
  "maxResults": 6
}
```

# Actor output Schema

## `overview` (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 = {
    "businessType": "Dentists",
    "location": "Manhattan, NY"
};

// Run the Actor and wait for it to finish
const run = await client.actor("logical_scrapers/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 = {
    "businessType": "Dentists",
    "location": "Manhattan, NY",
}

# Run the Actor and wait for it to finish
run = client.actor("logical_scrapers/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 '{
  "businessType": "Dentists",
  "location": "Manhattan, NY"
}' |
apify call logical_scrapers/google-maps-email-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logical_scrapers/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/Mp5SKYkxgSr5e3Svs/builds/97Bt038mEGbW3zS6t/openapi.json
