# Google Maps Leads: Emails, Phones & Socials from Businesses (`benexe/google-maps-leads`) Actor

Find local businesses on Google Maps and get their emails, phones, LinkedIn/Instagram/Facebook, contact forms and best email per lead. MX-checked, one step, pay per lead with a website.

- **URL**: https://apify.com/benexe/google-maps-leads.md
- **Developed by:** [Marcel Tomas](https://apify.com/benexe) (community)
- **Categories:** Lead generation, Automation, Travel
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 lead enricheds

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 Leads: Emails, Phones & Socials from Businesses

**Type "dentist" + "Barcelona" and get a spreadsheet of local businesses with their best email, phone, LinkedIn, Instagram, Facebook and contact form — in one step.**

> 🎉 **Launch offer: the first 10 leads of every run are free** until 19 November 2026. From 20 November the price per lead drops to $0.0018 (down to $0.0012 on paid plans).

- ✅ Google Maps search built in (no second Actor to chain)
- ✅ **Best email per business** (own domain, MX-checked, info@/contact@ first)
- ✅ Maps phone + website phones
- ✅ LinkedIn, Instagram, Facebook, X, TikTok, YouTube as flat columns
- ✅ Contact page and **contact form URL**
- ✅ Rating, reviews, address, coordinates
- ✅ **Pay only for leads whose website we reached**

### How it works

1. **Places:** Apify's official **Google Maps Scraper** runs in your account with your search terms and location (or your Maps URLs). Basic place data only — no paid add-ons or filters are switched on unless you enable them. You can also enrich a dataset you already have.
2. **Contacts:** each business website is crawled politely (robots.txt respected): the homepage and the most contact-like pages (contact, about, team, imprint, legal… in 7 languages).
3. **One row per business**, ready for Excel, Google Sheets or your CRM.

### Output

| Field | Meaning |
|---|---|
| `name`, `category`, `address`, `city`, `postalCode`, `countryCode` | From Google Maps |
| `rating`, `reviewsCount`, `mapsUrl`, `placeId`, `latitude`, `longitude` | From Google Maps |
| `primaryEmail` | The best email to use |
| `primaryPhone`, `mapsPhone`, `phones` | Maps phone first, then phones found on the website |
| `emails` | Every email with `type` (role/personal), `sameDomain`, `freeProvider`, `mxValid`, `foundOn` |
| `linkedin`, `instagram`, `facebook`, `x`, `tiktok`, `youtube` | First profile per network (all in `socials`) |
| `contactPageUrl`, `contactFormUrl`, `legalName` | Where to get in touch; legal name from schema.org |
| `websiteStatus` | `ok`, `no-contacts`, `no-website`, `blocked-by-robots` or `error` |

Views: **Leads**, **All emails** (one row per email), **Location**.

### Pricing (pay per event)

| What you pay | Price |
|---|---|
| `lead-enriched` — a place whose website was crawled (this Actor) | **$0.003**, down to $0.002 on paid plans; from 20 Nov 2026 **$0.0018**, down to $0.0012 |
| `apify-actor-start` — once per run, per GB of memory (from 20 Nov 2026; default 1 GB = one event) | $0.0005 |
| Places without a website, blocked or unreachable websites | **Free** |
| Places without email when "Only leads with an email" is on | **Free** |
| Google Maps search | Billed by Apify's Google Maps Scraper in your account (basic place data ≈ $0.004 per place on its free tier; measured 2026-11-03) |

Until 19 November 2026 the first 10 leads of every run are free (launch offer). Set **Max leads** and the run's max charge to control spend.

### Example

```json
{ "searchTerms": ["web design agency"], "location": "Lisbon, Portugal", "maxPlacesPerSearch": 50, "onlyWithEmail": true }
```

### Good to know

- Only public pages are read; no login, no CAPTCHA solving; addresses hidden on purpose (email-protection scripts) are not decoded.
- Contact data can be personal data. Use it in line with the GDPR/CAN-SPAM and local law (legitimate interest, opt-out, no spam).
- Already have websites or another dataset? Use [Website Contact Extractor](https://apify.com/benexe/website-contact-extractor) (per page).

### Related

- [Website Contact Extractor](https://apify.com/benexe/website-contact-extractor) · [Keyword Search Volume & Difficulty](https://apify.com/benexe/keyword-metrics) · [AI Image Upscaler](https://apify.com/benexe/ai-image-upscaler) · [PDF, YouTube, Audio & Video to Markdown](https://apify.com/benexe/pdf-to-markdown-ocr)

### Support

Open an issue on the Actor's *Issues* tab with the run ID.

# Actor input Schema

## `searchTerms` (type: `array`):

What to look for on Google Maps, e.g. "dentist", "web design agency", "restaurant". One search per term.

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

City, region or country, e.g. "Barcelona, Spain" or "Austin, TX". Use one location per run.

## `maxPlacesPerSearch` (type: `integer`):

How many Google Maps places to collect for each search term.

## `mapsUrls` (type: `array`):

Google Maps search or place links, instead of or in addition to search terms.

## `datasetIds` (type: `array`):

Already scraped places (e.g. a Google Maps Scraper dataset). They are enriched directly, without a new Google Maps search.

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

Language of place names and categories.

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

Ignore places marked as permanently closed. Google Maps Scraper bills this filter as an extra event (≈ $0.001 per place).

## `maxLeads` (type: `integer`):

Upper limit of places enriched in this run.

## `onlyWithEmail` (type: `boolean`):

Deliver only places where an email was found. Places without an email are not charged.

## `maxPagesPerSite` (type: `integer`):

Homepage plus the most contact-like pages (contact, about, team, imprint, legal…). Included in the lead price.

## `sameDomainEmailsOnly` (type: `boolean`):

Drop Gmail/Outlook and third-party addresses.

## `verifyEmailDomains` (type: `boolean`):

Flags emails whose domain cannot receive mail. Free.

## `requestsPerSecondPerHost` (type: `number`):

Polite crawling speed. robots.txt Crawl-delay is always respected.

## `healthCheck` (type: `boolean`):

Internal monitoring run.

## `healthProfile` (type: `string`):

Internal monitoring profile.

## Actor input object example

```json
{
  "searchTerms": [
    "dentist"
  ],
  "location": "Andorra la Vella, Andorra",
  "maxPlacesPerSearch": 20,
  "language": "en",
  "skipClosedPlaces": false,
  "maxLeads": 500,
  "onlyWithEmail": false,
  "maxPagesPerSite": 5,
  "sameDomainEmailsOnly": false,
  "verifyEmailDomains": true,
  "requestsPerSecondPerHost": 2,
  "healthCheck": false,
  "healthProfile": "dataset"
}
```

# Actor output Schema

## `leads` (type: `string`):

Best email, phone, socials and Maps data per place.

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

One row per email with type, domain match, MX check and the page it was found on.

## `runSummary` (type: `string`):

Places, leads with email, free launch leads, stop reason.

# 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 = {
    "searchTerms": [
        "dentist"
    ],
    "location": "Andorra la Vella, Andorra"
};

// Run the Actor and wait for it to finish
const run = await client.actor("benexe/google-maps-leads").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 = {
    "searchTerms": ["dentist"],
    "location": "Andorra la Vella, Andorra",
}

# Run the Actor and wait for it to finish
run = client.actor("benexe/google-maps-leads").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 '{
  "searchTerms": [
    "dentist"
  ],
  "location": "Andorra la Vella, Andorra"
}' |
apify call benexe/google-maps-leads --silent --output-dataset

```

## MCP server setup

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

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/grDuGnchyWa0X3KKW/builds/5j2e5Cxdu8XrHvF2M/openapi.json
