# Google Maps Scraper & Lead Extractor (`tuhin/google-maps-lead-extractor`) Actor

Scrape Google Maps business listings at scale — names, ratings, reviews, phone numbers, websites, full address & GPS — and enrich every lead with emails and social profiles pulled from the business website. Export B2B leads to CSV, Excel, JSON.

- **URL**: https://apify.com/tuhin/google-maps-lead-extractor.md
- **Developed by:** [Tuhin](https://apify.com/tuhin) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.90 / 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.

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 Scraper & Lead Extractor 📍 Emails, Phones & Business Data

**Extract unlimited business leads from Google Maps — names, ratings, reviews, phone numbers, websites, full addresses and GPS coordinates — and automatically enrich every lead with email addresses and social-media profiles scraped from the business website.**

The fastest way to build targeted B2B lead lists from Google Maps and export them to **CSV, Excel, JSON or Google Sheets**. No Google Maps API key required.

***

### 🚀 Why this Google Maps scraper?

Most Google Maps scrapers give you a name and a phone number. **This one gives you the whole lead** — including the *emails* and *social profiles* that actually let you reach the business:

- ✅ **Email extraction** — visits each business's website (homepage + contact/about/imprint pages) and pulls real email addresses
- ✅ **Social profiles** — LinkedIn, Facebook, Instagram, X/Twitter, YouTube, TikTok
- ✅ **Complete business data** — rating, review count, category, phone, website, full address, city, postal code, plus code, latitude/longitude, Google place ID
- ✅ **Any location, any niche** — "dentists in Berlin", "law firms New York", "plumbers near Manchester"
- ✅ **No API key, no limits** — powered by residential proxies, exports anywhere

### 🔍 What you can do with it

- Build **B2B lead lists** and cold-outreach campaigns
- Find **local businesses** by category and city for sales prospecting
- **Enrich** existing company lists with emails, phones and socials
- Market research, competitor mapping, and local SEO audits
- Feed a CRM, Google Sheets, or your own database

### ⚙️ Input

| Field | Description |
|-------|-------------|
| `searchQueries` | What to search, e.g. `["dentist Berlin", "law firm New York"]`. |
| `maxPlacesPerQuery` | Businesses per search (Google caps a search around ~120). |
| `language` / `countryCode` | Maps language + region/proxy country. |
| `extractContactsFromWebsite` | Scrape emails + socials from each website (the lead-gen feature). |
| `scrapePlaceDetails` | Open each place for extra detail. |
| `maxWebsitePagesPerBusiness` | Contact pages to check per site. |

#### Example

```json
{ "searchQueries": ["coffee shop in Portland", "dentist Austin"], "maxPlacesPerQuery": 60, "extractContactsFromWebsite": true, "countryCode": "us" }
```

### 📦 Output (one row per business)

```json
{
  "title": "Drip Drop Coffee",
  "categoryName": "Coffee shop",
  "rating": 4.9, "reviewsCount": 312,
  "phone": "(503) 555-0123",
  "website": "http://dripdroppdx.com/", "domain": "dripdroppdx.com",
  "emails": ["marcus@dripdroppdx.com"],
  "socials": { "instagram": "https://instagram.com/dripdroppdx", "twitter": "https://x.com/dripdroppdx" },
  "address": "1729 NW Everett St, Portland, OR 97209",
  "city": "Portland", "postalCode": "97209", "countryCode": "us",
  "plusCode": "84QV+2R Portland, Oregon",
  "latitude": 45.5261, "longitude": -122.6896,
  "placeId": "0x5495a0…", "googleMapsUrl": "https://www.google.com/maps/place/…",
  "scrapedAt": "2026-08-31T19:00:00Z"
}
```

Export to **CSV / Excel / JSON / HTML / RSS** from the dataset, or pull via the Apify API.

### 📅 Run on a schedule

Schedule it to keep lead lists fresh, or run it on-demand per campaign. Combine multiple queries in one run to cover a whole city or niche.

### ❓ FAQ

**Do I need a Google Maps API key?** No — it scrapes public Google Maps data directly.
**Does it get emails?** Yes — it visits each business website and extracts public emails + social links.
**How many results per search?** Google Maps itself limits a single search to roughly 120 places; split by city/area to get more.
**Which proxies?** Residential (required) — Google blocks datacenter traffic.

### 🔑 Keywords

google maps scraper, google maps lead extractor, google maps email extractor, business leads scraper, local business scraper, extract emails from google maps, google maps data extractor, b2b lead generation, phone number scraper, google places scraper.

### ⚠️ Notes

- Uses Residential proxy (billed per GB). Emails/socials come from **public** business websites only.
- Respect applicable laws (GDPR/CAN-SPAM) when contacting scraped leads.

# Actor input Schema

## `searchQueries` (type: `array`):

What to search on Google Maps, e.g. "restaurants in Berlin", "dentist Chicago", "plumbers near Manchester". One or many.

## `maxPlacesPerQuery` (type: `integer`):

How many businesses to extract per search (Google Maps typically caps a search around ~120).

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

Google Maps interface language (hl), e.g. "en", "de", "fr".

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

2-letter country for the residential proxy + Google region (gl), e.g. "us", "gb", "de".

## `extractContactsFromWebsite` (type: `boolean`):

For each business with a website, visit it and extract email addresses and social-media profiles. This is the key lead-generation feature.

## `scrapePlaceDetails` (type: `boolean`):

Open each place for extra fields (opening hours, plus code, description, additional categories). Slower but richer.

## `maxWebsitePagesPerBusiness` (type: `integer`):

Homepage + this many contact/about/imprint pages per business when enriching emails.

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

Google Maps requires Residential proxies. Keep this on.

## Actor input object example

```json
{
  "searchQueries": [
    "dentist Berlin",
    "law firm New York"
  ],
  "maxPlacesPerQuery": 25,
  "language": "en",
  "countryCode": "us",
  "extractContactsFromWebsite": true,
  "scrapePlaceDetails": false,
  "maxWebsitePagesPerBusiness": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One row per business with contact, geo and rating data, plus emails/socials enriched from the website.

# 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 = {
    "searchQueries": [
        "restaurants in Amsterdam"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tuhin/google-maps-lead-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 = { "searchQueries": ["restaurants in Amsterdam"] }

# Run the Actor and wait for it to finish
run = client.actor("tuhin/google-maps-lead-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 '{
  "searchQueries": [
    "restaurants in Amsterdam"
  ]
}' |
apify call tuhin/google-maps-lead-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tuhin/google-maps-lead-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/frgTqMtTZ9HScOQcr/builds/nEQwv6GciQpSyGXgE/openapi.json
