# Google Maps Business Email Scraper (`googleapi/google-maps-business-email-scraper`) Actor

Extract public business email evidence and rich profile fields from Google Maps.

- **URL**: https://apify.com/googleapi/google-maps-business-email-scraper.md
- **Developed by:** [Google API](https://apify.com/googleapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 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

Find public business contact details and profiles on Google Maps. The Actor can collect email addresses displayed on Maps and, when enabled, check the public website linked from the business profile for additional email addresses and social links.

Profile details, photos, and listed-website checks are optional. Email addresses are included only when they are publicly visible; the Actor does not verify deliverability or account ownership.

### Quick start

```json
{
  "queries": ["coffee shops"],
  "locationQuery": "Seattle, WA",
  "maxItems": 10,
  "maxPages": 2
}
```

To check linked business websites for public contact details, enable **includeWebsiteEnrichment**. Website checks are off by default.

### Input

#### Search sources

| Input | Description |
| --- | --- |
| **queries** | Search phrases (up to 50). **searchStringsArray** and **searchKeywords** are aliases; **searchQuery** and **query** accept one phrase. |
| **locationQuery** | Optional location added to generated searches. **location** is an alias. |
| **startUrls** | Up to 25 public Google Maps search or business profile URLs. These replace generated searches. **urls** is an alias. |

#### Results and profile details

| Input | Description |
| --- | --- |
| **page / maxPages** | Starting result batch and maximum batches per search (defaults: 1 and 3). |
| **maxItems** | Global maximum business records across the run (default 25). **maxCrawledPlacesPerSearch** is a legacy alias. |
| **deduplicate** | Remove duplicate businesses across searches (default true). |
| **sortBy** | Sort collected results by recommended order, rating, review count, or name. |
| **minRating / minReviews** | Keep businesses meeting the displayed rating or review-count threshold. Businesses without the corresponding value do not pass. |
| **categoryFilter** | Keep businesses whose visible category contains the supplied text. |
| **includeDetails** | Open selected public Maps profiles for hours, price, Plus Code, and other profile details (default false). |
| **maxDetailItems** | Maximum number of profiles to open (default 5). Also limits optional website checks. |
| **includeAttributes** | Include public accessibility and business attributes (default true). |
| **includeMedia** | Include public business photo URLs when visible (default true). |

#### Optional website enrichment

| Input | Description |
| --- | --- |
| **includeWebsiteEnrichment** | Check the listed business website for public email addresses and social links (default false). |
| **maxWebsitePagesPerPlace** | Maximum listed-website pages to inspect per business (default 1; maximum 2). |
| **websiteTimeoutMs** | Timeout for each website request (default 8 seconds). |

#### Page settings

| Input | Description |
| --- | --- |
| **renderJavaScript** | Render Google Maps pages in a standard browser (default true). **useBrowser** is a compatibility alias. |
| **proxyConfiguration** | Optional Apify proxy settings for browser requests. |
| **locale** | Maps language such as en or en-US. **language** is a compatibility alias. |

### Dataset

Each dataset row represents one business. It can include:

- **Business identity:** name, place ID, CID, profile URL, category, address, and location.
- **Contact:** phone number, website, menu link, public emails, and social profiles.
- **Email source:** whether an email was visible on Maps or on the listed business website.
- **Profile details:** rating and review count, price range, current status, weekly hours, and business attributes.
- **Photos:** public business image URLs and their count.
- **Website profile:** when website enrichment is enabled, public website information is grouped separately so it can be distinguished from the Google Maps profile.

Only public business contact information is collected. Information from a linked business website is labeled separately from information shown on Maps.

```json
{
  "businessName": "Harbor Coffee",
  "title": "Harbor Coffee",
  "placeId": "ChIJexamplePlaceId",
  "canonicalUrl": "https://www.google.com/maps/place/Harbor+Coffee/",
  "categoryName": "Coffee shop",
  "address": "10 Market Street, Seattle, WA 98101, United States",
  "phone": "+1 206-555-0100",
  "website": "https://harbor.example/",
  "primaryEmail": "hello@harbor.example",
  "emails": ["hello@harbor.example"],
  "emailCount": 1,
  "totalScore": 4.6,
  "reviewsCount": 3206
}
```

The example is illustrative. Google may not display every field for each business. Download dataset records from the Apify run page in JSON, CSV, Excel, or another supported format. Run totals and access outcomes are available in the run output.

### Limits and troubleshooting

Google Maps pages and business websites can change or limit what is publicly available. If no email is found, the profile or linked site may not display one. If a run returns no or partial results, check the run log and summary.

Website enrichment checks only the public website linked from the Maps profile. It is bounded by the page-count and timeout settings. The Actor does not sign in or bypass CAPTCHAs or other access controls.

### Privacy

The Actor sends search phrases, location settings, or supplied Maps URLs to Google. If website enrichment is enabled, it also visits the public website linked from each selected business profile. Avoid submitting sensitive information. This independent Actor is not affiliated with Google.

# Changelog

This Actor's version history is a separate document: https://apify.com/googleapi/google-maps-business-email-scraper/changelog.md

# Actor input Schema

## `queries` (type: `array`):

Google Maps searches, such as coffee shops in Seattle.

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

Compatibility alias for queries.

## `searchKeywords` (type: `array`):

Compatibility alias for queries.

## `searchQuery` (type: `string`):

Single-query alias for queries.

## `query` (type: `string`):

Compatibility alias for searchQuery.

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

Optional location appended to generated search queries.

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

Compatibility alias for locationQuery.

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

Public Google Maps search or business profile URLs. When supplied, these replace generated queries.

## `urls` (type: `array`):

String-list compatibility alias for startUrls.

## `page` (type: `integer`):

One-based Google Maps result batch to start from. Earlier rendered batches are skipped when the feed permits scrolling.

## `maxItems` (type: `integer`):

Global maximum across all queries, pages, and start URLs.

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

Compatibility alias for maxItems.

## `maxPages` (type: `integer`):

Maximum rendered result batches to collect for each search URL after the starting page.

## `deduplicate` (type: `boolean`):

Deduplicate globally by Maps place ID, CID, knowledge graph ID, or canonical profile URL.

## `sortBy` (type: `string`):

Sort the bounded result set after filtering.

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

Keep businesses with a visible rating at or above this value. Records without a rating do not pass.

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

Keep businesses with a visible review count at or above this value.

## `categoryFilter` (type: `string`):

Optional case-insensitive substring filter on the visible business category.

## `includeDetails` (type: `boolean`):

Open up to maxDetailItems public Google Maps profiles to collect hours, price range, plus code, business attributes, and other visible profile fields.

## `maxDetailItems` (type: `integer`):

Maximum detail profiles opened per run. This also caps optional website contact enrichment.

## `includeAttributes` (type: `boolean`):

Include public accessibility, service, offering, dining, amenity, atmosphere, crowd, payment, and parking attributes.

## `includeMedia` (type: `boolean`):

Include filtered public Google-hosted business photo URLs when visible.

## `includeWebsiteEnrichment` (type: `boolean`):

Optional external website fetch for public email and social links. Disabled by default.

## `maxWebsitePagesPerPlace` (type: `integer`):

Maximum pages on the listed business website to inspect. One page is the default; two pages may include one same-site contact page.

## `websiteTimeoutMs` (type: `integer`):

Timeout for each optional public website request.

## `renderJavaScript` (type: `boolean`):

Use regular headless Chromium rendering for Maps pages. Google Maps profile and result panels commonly require JavaScript.

## `useBrowser` (type: `boolean`):

Compatibility alias for renderJavaScript.

## `requestDelayMs` (type: `integer`):

Bounded pause between Maps pages and profile navigations.

## `maxRequestRetries` (type: `integer`):

Finite retries for transient direct HTTP failures. Access challenges are not retried.

## `requestTimeoutSecs` (type: `integer`):

Navigation and HTTP timeout.

## `requestTimeoutMs` (type: `integer`):

Compatibility alias for requestTimeoutSecs in milliseconds.

## `browserWaitMs` (type: `integer`):

Bounded wait after a Maps page opens.

## `maxResponseBytes` (type: `integer`):

Maximum direct HTTP response size.

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

Optional Apify Proxy for the browser transport. Proxy use may incur charges; no proxy is configured by default.

## `locale` (type: `string`):

Maps page language, such as en or en-US.

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

Compatibility alias for locale.

## Actor input object example

```json
{
  "page": 1,
  "maxItems": 25,
  "maxPages": 3,
  "deduplicate": true,
  "sortBy": "recommended",
  "includeDetails": false,
  "maxDetailItems": 5,
  "includeAttributes": true,
  "includeMedia": true,
  "includeWebsiteEnrichment": false,
  "maxWebsitePagesPerPlace": 1,
  "websiteTimeoutMs": 8000,
  "renderJavaScript": true,
  "requestDelayMs": 750,
  "maxRequestRetries": 1,
  "requestTimeoutSecs": 60,
  "browserWaitMs": 1500,
  "maxResponseBytes": 5000000,
  "locale": "en"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("googleapi/google-maps-business-email-scraper").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("googleapi/google-maps-business-email-scraper").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 googleapi/google-maps-business-email-scraper --silent --output-dataset

```

## MCP server setup

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

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/aWJxowJBefWvyfoSc/builds/OKJY9y4pIibRUF1nV/openapi.json
