# Google Maps Email Extractor ✅ $1.5/1k emails (`x_guru/google-maps-email-extractor`) Actor

From $1.50 / 1,000 saved email leads. Fast Google Maps Email Extractor for public business emails, websites, phones, social links, ratings, addresses, Place IDs, CIDs, and Google Maps URLs from keywords, categories, Place IDs, or map areas.

- **URL**: https://apify.com/x\_guru/google-maps-email-extractor.md
- **Developed by:** [Hundevmode Labs](https://apify.com/x_guru) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 98 total users, 26 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 saved email leads

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?

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 Email Extractor: Scrape Business Emails from Google Maps

From **$1.50 / 1,000 saved email leads** on paid Apify plans. Use this Google Maps Email Extractor to find public business emails from Google Maps places, together with websites, phone numbers, social media links, ratings, addresses, coordinates, Google Place IDs, CIDs, and source URLs.

The actor is built for Google Maps lead generation. It searches Google Maps by keyword and location, Google Maps URL, Place ID, or selected map area, opens each business website, checks likely contact pages, and saves one dataset item when a public email address is found by default.

Unlike a generic Google Maps scraper, this actor is optimized around email leads: it scans more Google Maps candidates internally when needed, enriches places with fast Google Maps detail payloads to get websites, crawls business sites concurrently, and charges the primary result event only for saved email leads.

### AI agent skill

Use the dedicated [Google Maps Email Extractor Apify agent skill](https://github.com/hundevmode/apify-google-maps-email-extractor-agent-skill) when you want AI agents to build local email lead searches, run this actor through Apify, control spend with `maxTotalChargeUsd`, and return public business email leads for outreach, CRM, Sheets, n8n, BI, or enrichment workflows.

Install with skills.sh-compatible agents:

```bash
npx skills add hundevmode/apify-google-maps-email-extractor-agent-skill \
  --skill google-maps-email-extractor-apify
```

ClawHub skill slug: `google-maps-email-extractor-apify`.

### At a glance

| Need | Use this actor for |
| --- | --- |
| Local email leads | Public business emails from Google Maps places |
| Sales outreach | Company name, website, email, phone, address, rating, category, and social links |
| Agency prospecting | Niche and city lead lists such as dentists, roofers, lawyers, photographers, gyms, clinics, restaurants, and contractors |
| CRM enrichment | Start from Google Maps URLs, Place IDs, or existing Google business records |
| Local SEO research | Find competitors with websites, reviews, categories, coordinates, and public contact channels |
| Data export | Download leads as JSON, CSV, Excel, or use the Apify Dataset API |

### Quick start

1. Add a business type to `searchStringsArray`, for example `wedding photographer`, `dentist`, `roofing contractor`, or `real estate agent`.
2. Add a specific `locationQuery`, for example `Austin, Texas, USA`.
3. Set `maxCrawledPlacesPerSearch` to the number of email leads you want.
4. Keep `contactResultMode` as `emailsOnly` to save only places where a public email is found.
5. Run the actor and export the dataset from Apify.

```json
{
  "searchStringsArray": ["wedding photographer"],
  "locationQuery": "Austin, Texas, USA",
  "maxCrawledPlacesPerSearch": 100,
  "contactResultMode": "emailsOnly",
  "contactPagesLimit": 2,
  "includePersonalData": true,
  "website": "withWebsite",
  "skipClosedPlaces": true,
  "language": "en"
}
```

### Pricing

The actor uses Apify pay-per-event pricing. The primary event is `contact-lead-saved`, which is charged when a lead is saved to the dataset.

| Event | Free | Paid plans |
| --- | --- | --- |
| Saved email lead | $3.00 / 1,000 saved email leads | $1.50 / 1,000 saved email leads |
| Add-on: filter applied | $0.80 / 1,000 saved leads | $0.35 / 1,000 saved leads |
| Actor start | $0.00005 per start event | $0.00001 per start event |

Internal Google Maps candidate scanning, fast place-detail lookup, and website pages that do not produce a saved lead are not charged as primary result events.

The actor respects Apify `maxTotalChargeUsd`. If your run budget only allows 500 saved email leads, the actor stops before saving more than 500 charged leads and finishes successfully with a `RUN_SUMMARY`.

### What this Google Maps email scraper extracts

| Data group | Example fields |
| --- | --- |
| Business identity | `title`, `categoryName`, `categories`, `description`, `rank`, `searchString` |
| Email data | `emails`, `emailDetails.email`, `emailDetails.type`, `emailDetails.sourceUrl`, `emailDetails.domainMatch` |
| Website data | `website`, `additionalInfo.companyContacts.sourceUrl`, `fetchedUrls`, `pagesFetched` |
| Phone data | `phone`, `phoneUnformatted`, `additionalPhones` |
| Social links | `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks` |
| Address and location | `address`, `street`, `neighborhood`, `city`, `state`, `postalCode`, `countryCode`, `location`, `plusCode` |
| Google Maps metrics | `totalScore`, `reviewsCount`, `reviewsDistribution`, `permanentlyClosed`, `temporarilyClosed`, `claimThisBusiness` |
| Google identifiers | `placeId`, `cid`, `fid`, `kgmid`, `url`, `searchPageUrl`, `language` |
| Contact diagnostics | `contactSignals`, `contactStatus`, `additionalInfo.companyContacts` |

Email classification:

| Type | Meaning |
| --- | --- |
| `role` | Generic company inbox such as `info@`, `sales@`, `hello@`, or `contact@` |
| `personal` | Person-like email found on a public business website |
| `unknown` | Public email where the local part is not clearly role-based or person-like |

`domainMatch` helps you distinguish emails on the business domain from emails found on third-party pages.

### Popular use cases

- Build local business email lists from Google Maps.
- Find public emails for dentists, doctors, clinics, law firms, contractors, restaurants, agencies, real estate companies, wedding vendors, repair services, schools, gyms, and local shops.
- Enrich Google Maps places with websites, email addresses, phones, and social media links.
- Collect outreach-ready leads by city, niche, category, rating, and website availability.
- Find businesses that publish direct contact emails instead of only contact forms.
- Create local market datasets with business name, email, phone, website, address, reviews, and coordinates.
- Run repeatable lead generation workflows through the Apify API.

### Input options

#### Search terms and location

Use `searchStringsArray` with `locationQuery` for standard Google Maps email extraction.

```json
{
  "searchStringsArray": ["dentist"],
  "locationQuery": "Phoenix, Arizona, USA",
  "maxCrawledPlacesPerSearch": 250,
  "contactResultMode": "emailsOnly",
  "language": "en"
}
```

| Field | What it does |
| --- | --- |
| `searchStringsArray` | One or more Google Maps search terms, such as `dentist`, `roofing contractor`, `yoga studio`, or `restaurant`. |
| `locationQuery` | Search area for all terms, such as `Phoenix, Arizona, USA` or `Berlin, Germany`. Use one concrete area per run for cleaner leads. |
| `maxCrawledPlacesPerSearch` | Target number of saved leads per search term or URL. In `emailsOnly` mode, the actor may scan more candidates internally to find enough public emails. |
| `language` | Google Maps language code used for localized place data when Google provides it. |

#### Google Maps URLs and Place IDs

Use `startUrls` when you already have Google Maps URLs. Use `placeIds` when another system stores Google Place IDs.

```json
{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/search/marketing+agency+near+Chicago,+IL"
    }
  ],
  "placeIds": ["ChIJ..."],
  "maxCrawledPlacesPerSearch": 50,
  "contactResultMode": "emailsOnly"
}
```

| Field | What it accepts |
| --- | --- |
| `startUrls` | Google Maps search URLs, place URLs, CID URLs, and prepared Google Maps links |
| `placeIds` | Google Place IDs and compatible values prefixed with `place_id:` |

Direct place URLs and Place IDs are useful for CRM enrichment. Search URLs are useful when you prepared Google Maps queries outside Apify.

#### Contact result mode

| Mode | Saved dataset items |
| --- | --- |
| `emailsOnly` | Only places where at least one public email was found. This is the default. |
| `contactsOnly` | Places with at least one email, phone, or social profile. |
| `allPlaces` | All scanned places after filters, with contact fields when available. |

Use `emailsOnly` for priced email lead generation. Use `contactsOnly` when phone numbers and social links are also acceptable lead signals.

#### Website pages to check

`contactPagesLimit` controls how many pages the actor fetches from each business website.

| Value | Typical behavior |
| --- | --- |
| `1` | Fastest. Checks the homepage only. |
| `2` | Recommended default. Checks the homepage and the best contact/about page. |
| `3-5` | Deeper search for niches where emails are usually hidden on team, staff, imprint, footer, or legal pages. |

The actor follows likely same-domain contact links such as contact, about, team, staff, imprint, footer, privacy, and legal pages. Higher values can find more emails but increase runtime.

#### Personal data toggle

`includePersonalData` controls person-like emails and personal LinkedIn profile URLs found on public business websites.

```json
{
  "includePersonalData": false
}
```

Set it to `false` when you want mostly generic company contacts such as `info@`, `sales@`, `hello@`, `office@`, or `contact@`.

#### Filters and categories

Use filters to narrow results before contact extraction.

| Field | Values |
| --- | --- |
| `placeCategories` | Predefined Google Business Profile categories |
| `customPlaceCategories` | Custom category text matched against `categoryName` and `categories` |
| `categoryFilterWords` | Keyword filter matched against categories |
| `searchMatching` | `all`, `only_includes`, or `only_exact` |
| `minStars` | Minimum Google rating |
| `website` | `allPlaces`, `withWebsite`, or `withoutWebsite` |
| `skipClosedPlaces` | Remove closed businesses when Google exposes the status |

For email extraction, `website: "withWebsite"` is recommended because public emails are usually found on the business website.

#### Search area options

For broader or custom geography, use:

- `countryCode`
- `city`
- `state`
- `county`
- `postalCode`
- `customGeolocation`
- `locationBounds`
- `strictLocationBounds`

The free-text `locationQuery` has priority when provided. Use structured fields or custom map areas when you need more control over coverage.

### How it works

1. The actor builds Google Maps search sources from keywords, location, URLs, Place IDs, or map area.
2. Base discovery uses fast Google Maps payload responses to collect candidate places.
3. In email extraction mode, the actor scans extra candidates internally because not every business publishes an email.
4. A fast Google Maps detail request enriches each candidate with website and place metadata.
5. The website contact crawler fetches the homepage and likely contact pages.
6. Emails, phones, and social profiles are normalized and merged into the place record.
7. The actor saves only records that match `contactResultMode`.
8. `RUN_SUMMARY` records target, saved count, budget guard, enrichment stats, and exhaustion reason.

### Output example

```json
{
  "title": "Caitlin McWeeney Photography",
  "categoryName": "Wedding photographer",
  "categories": ["Wedding photographer"],
  "address": "4704 Sylvandale Dr, Austin, TX 78745",
  "website": "http://caitlinmcweeney.com/",
  "emails": ["caitlin@caitlinmcweeney.com"],
  "emailDetails": [
    {
      "email": "caitlin@caitlinmcweeney.com",
      "type": "unknown",
      "sourceUrl": "https://caitlinmcweeney.com/",
      "domainMatch": true
    }
  ],
  "facebooks": ["https://www.facebook.com/caitlinmcweeneyphotography"],
  "instagrams": ["https://www.instagram.com/caitlinmcweeneyphotography/"],
  "contactSignals": {
    "emails": 1,
    "phones": 0,
    "socialProfiles": 2,
    "website": true,
    "pagesFetched": 2
  },
  "contactStatus": "found",
  "totalScore": 5,
  "reviewsCount": 72,
  "placeId": "ChIJE2Flwy-1RIYRWqJr_ZiMGc",
  "cid": "14617641969142499583",
  "location": {
    "lat": 30.2216055,
    "lng": -97.7879264
  },
  "url": "https://www.google.com/maps/search/?api=1&query=Caitlin%20McWeeney%20Photography&query_place_id=ChIJE2Flwy-1RIYRWqJr_ZiMGc"
}
```

### Output fields explained

| Field | Description |
| --- | --- |
| `emails` | Deduplicated public email addresses found for the business |
| `emailDetails` | Per-email metadata with classification, source page, and domain match |
| `contactSignals` | Counts for emails, phones, social profiles, website, and fetched pages |
| `additionalInfo.companyContacts` | Raw contact crawl details, including fetched URLs and extracted contact data |
| `contactStatus` | `found` when a saved record has contact data |
| `url` | Google Maps URL for the place |
| `placeId`, `cid`, `fid` | Google identifiers for deduplication and downstream enrichment |

### Run summary

Every run writes diagnostics to `RUN_SUMMARY` in the default key-value store.

Useful fields:

| Field | Meaning |
| --- | --- |
| `target` | Requested saved leads |
| `saved` | Saved dataset items |
| `targetReached` | Whether the requested saved lead count was reached |
| `exhaustionReason` | Why the run stopped, such as `target_reached`, `frontier_exhausted`, or `charge_limit_reached` |
| `datasetItemBudget` | Pay-per-event budget guard and remaining item estimate |
| `enrichment.detailHttpSucceeded` | Fast Google Maps detail lookups that succeeded |
| `enrichment.contactsSucceeded` | Website contact crawls that produced contact data |
| `enrichment.contactPagesFetched` | Website pages fetched during contact extraction |
| `enrichment.filteredBeforePush` | Candidates skipped because they did not match `contactResultMode` |

If a selected niche or area has fewer public emails than requested, the actor finishes successfully and saves the email leads it found.

### API usage

Start a run through the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/x_guru~google-maps-email-extractor/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchStringsArray": ["roofing contractor"],
    "locationQuery": "Dallas, Texas, USA",
    "maxCrawledPlacesPerSearch": 100,
    "contactResultMode": "emailsOnly",
    "contactPagesLimit": 2,
    "includePersonalData": true,
    "website": "withWebsite",
    "skipClosedPlaces": true,
    "language": "en"
  }'
```

After the run finishes, export the default dataset as JSON, CSV, Excel, XML, RSS, or HTML from Apify Console or through the Dataset API.

### Tips for better email lead results

- Use specific niches: `orthodontist`, `commercial electrician`, `wedding photographer`, `HVAC contractor`, or `estate planning attorney`.
- Use one concrete location per run: city, metro area, postal code, county, or custom map area.
- Keep `website` set to `withWebsite` for email extraction.
- Increase `contactPagesLimit` for industries where emails are often on team, staff, imprint, or legal pages.
- Use category filters when a search term returns mixed businesses.
- Use `contactsOnly` when phone and social profile leads are acceptable.
- Set `maxTotalChargeUsd` on Apify runs when you want a hard spending cap.

### Notes

- Public website contacts are best-effort because each business controls what it publishes.
- Some businesses publish only contact forms, booking widgets, or social profiles instead of direct emails.
- `emailsOnly` can scan more Google Maps places internally than the requested saved lead count.
- The run finishes successfully even when individual places or websites fail; diagnostics are saved in `RUN_SUMMARY`.
- For broad geographic coverage, use a concrete city, postal code, county, state, or custom map area.

# Actor input Schema

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

Business type or niche to search in Google Maps, for example dental clinic, wedding photographer, roofing contractor, or yoga studio. Use one clear term per row.

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

Location context for all search terms, for example Austin, Texas, USA or Berlin, Germany. Use one concrete city/area per run for cleaner email leads.

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

Target number of saved email leads for each search term or Google Maps URL. The actor may scan more Google Maps places internally to find enough businesses with public email addresses. If fewer public emails are available, the run finishes successfully with the emails it found.

## `contactResultMode` (type: `string`):

Choose what should be saved to the dataset. Emails only is the default and saves only places where a public email was found. Contacts only can also save places with a phone or social profile.

## `contactPagesLimit` (type: `integer`):

How many pages to fetch from each business website. The default checks the homepage and the best contact/about page for speed. Increase this for deeper email discovery.

## `includePersonalData` (type: `boolean`):

Enable to include person-like emails and personal LinkedIn profile URLs found on public business websites. Disable to keep mostly generic company contacts such as info@, sales@, or contact@.

## `contactScanMultiplier` (type: `integer`):

How many Google Maps places may be scanned internally for each requested saved lead. Increase this for niches where few websites publish email addresses.

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

Results details will show in this language when Google Maps provides localized text.

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

Optional paid category filter matched against categoryName and categories. Add synonyms you want to keep, for example pizza, italian restaurant, or divorce attorney.

## `placeCategories` (type: `array`):

Optional paid category filter from known Google Business Profile categories. Choose one or more categories; for broader synonym matching, also use Category keywords above.

## `searchMatching` (type: `string`):

Paid name matching filter. Leave the default to scrape all places returned by Google Maps.

## `placeMinimumStars` (type: `string`):

Paid rating filter. Only save places with this rating or higher.

## `website` (type: `string`):

Keep places with websites when you need emails and social links from business websites. Use All places if Google Maps phone numbers are enough for your workflow.

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

Skip permanently or temporarily closed businesses before contact extraction.

## `countryCode` (type: `string`):

Optional country used for structured search area and Google Maps region bias. Free-text Location has priority when it is filled.

## `city` (type: `string`):

Optional city used to build the search area when the main Location field is empty.

## `state` (type: `string`):

Optional state, province, or region used to build the search area when the main Location field is empty.

## `county` (type: `string`):

Optional county or district used to build the search area when the main Location field is empty.

## `postalCode` (type: `string`):

Optional postal or ZIP code used to build the search area when the main Location field is empty.

## `customGeolocation` (type: `object`):

Optional GeoJSON-like custom area. Use longitude, latitude coordinate order. Supports polygon-like coordinate lists and circle-style point/radius inputs when provided by the Apify form.

## `strictLocationBounds` (type: `boolean`):

Filter out places whose coordinates are outside the geocoded or custom search area. Keep this on for bounded area runs.

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

Paste Google Maps search URLs or place URLs copied from google.com/maps or the Google Maps app share dialog. URL sources run before normal search terms. Search URLs can return multiple places; direct place URLs return one place when Google exposes the place payload. In API JSON, pass items as objects, for example \[{"url":"https://www.google.com/maps/..."}].

## `placeIds` (type: `array`):

Paste Google Place IDs, one per row, for example ChIJN1t\_tDeuEmsRUsoyG83frY4. The actor also accepts values prefixed with place\_id: and can extract query\_place\_id from Google Maps URLs pasted here.

## `allPlacesNoSearchAction` (type: `string`):

Use only when you do not provide Search terms, Google Maps URLs, or Place IDs. Requires a concrete Search area above: Location, city/state/postal fields, or a custom area. Country-only is too broad for this mode.

## `allPlacesZoom` (type: `integer`):

Optional zoom override for All visible places mode. Leave 0 for automatic zoom based on area size. Higher zoom can expose more local pins but can take longer. Typical useful values are 14 to 17.

## Actor input object example

```json
{
  "searchStringsArray": [
    "wedding photographer"
  ],
  "locationQuery": "Austin, Texas, USA",
  "maxCrawledPlacesPerSearch": 100,
  "contactResultMode": "emailsOnly",
  "contactPagesLimit": 2,
  "includePersonalData": true,
  "contactScanMultiplier": 6,
  "language": "en",
  "searchMatching": "all",
  "placeMinimumStars": "",
  "website": "withWebsite",
  "skipClosedPlaces": true,
  "strictLocationBounds": true,
  "allPlacesNoSearchAction": "",
  "allPlacesZoom": 0
}
```

# Actor output Schema

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

Google Maps business contact leads saved to the default dataset.

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

Run-level diagnostics, including saved contact lead count, target, exhaustion reason, and PPE budget details.

# 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": [
        "wedding photographer"
    ],
    "locationQuery": "Austin, Texas, USA",
    "maxCrawledPlacesPerSearch": 100,
    "contactResultMode": "emailsOnly",
    "contactPagesLimit": 2,
    "includePersonalData": true,
    "contactScanMultiplier": 6,
    "language": "en",
    "website": "withWebsite",
    "skipClosedPlaces": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("x_guru/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": ["wedding photographer"],
    "locationQuery": "Austin, Texas, USA",
    "maxCrawledPlacesPerSearch": 100,
    "contactResultMode": "emailsOnly",
    "contactPagesLimit": 2,
    "includePersonalData": True,
    "contactScanMultiplier": 6,
    "language": "en",
    "website": "withWebsite",
    "skipClosedPlaces": True,
}

# Run the Actor and wait for it to finish
run = client.actor("x_guru/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": [
    "wedding photographer"
  ],
  "locationQuery": "Austin, Texas, USA",
  "maxCrawledPlacesPerSearch": 100,
  "contactResultMode": "emailsOnly",
  "contactPagesLimit": 2,
  "includePersonalData": true,
  "contactScanMultiplier": 6,
  "language": "en",
  "website": "withWebsite",
  "skipClosedPlaces": true
}' |
apify call x_guru/google-maps-email-extractor --silent --output-dataset

```

## MCP server setup

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