# Google Maps Contact Details Scraper (`piotrv1001/google-maps-contact-details-scraper`) Actor

Google Maps email extractor: find places for any search and city, then visit each business website for emails, phone numbers and Facebook, Instagram, LinkedIn, X, YouTube and TikTok links. Name, address, phone, rating and hours included. Build local lead lists in CSV or Excel.

- **URL**: https://apify.com/piotrv1001/google-maps-contact-details-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 places

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?

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 Contact Details Scraper

The **Google Maps Contact Details Scraper** is a Google Maps email extractor and lead scraper in one run: it finds the places for any search term and city, then visits each business website and collects its emails, phone numbers and social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest). Every row also has the full Google Maps listing: name, category, address, phone, website, rating, review count and opening hours. Use it to build a business email list for a niche and a city, for cold outreach, local SEO or sales prospecting.

### 🎯 Use Cases

- **Google Maps email extractor**: get the emails of every dentist, plumber or law firm in a city, ready for a CSV or Excel email list.
- **Local lead generation**: build lead lists with phone, email, website and social links for agencies, SaaS sales and B2B outreach.
- **Business email lists by niche**: a dentist email list for New York or a real estate agent email list for Miami in one run.
- **Social media prospecting**: find the Instagram, Facebook, TikTok and LinkedIn pages of local businesses to pitch social media services.
- **CRM enrichment**: add emails and social profiles to places you already have, by pasting their Google Maps links.
- **Market research**: see which businesses in an area have a website, which are active on social media and which are unclaimed.

### ✨ Features

- 📍 **Full Google Maps Listing**: name, categories, address split into street / city / ZIP / state / country, coordinates, phone, website, rating, review count, opening hours, place ID and CID.
- 📧 **Emails From the Website**: found in email links, page text and the site's structured data, including addresses written as `name [at] domain (dot) com` and the ones hidden from plain view by common website protections.
- ☎️ **Phone Numbers**: every phone number the website links as a call button, next to the Google Maps phone.
- 🔗 **Social Profiles**: Facebook, Instagram, LinkedIn (company and personal), X / Twitter, YouTube, TikTok and Pinterest, cleaned of tracking parameters and share buttons.
- 🧭 **Smart Page Selection**: the homepage plus up to 4 pages most likely to hold contacts (contact, about, team, imprint, legal notice) in many languages.
- 🗺️ **No 120-Result Limit**: a city is searched as a grid of smaller map views until your limit is reached.
- 💸 **Fair Billing**: the contact details charge applies only when the website actually gave an email or a social profile. Places without one cost only the place price.
- 🧹 **No Duplicates**: a place found by two search terms is saved and charged once.

### 🛠️ How It Works

1. **Enter search terms and a location** such as `dentist` in `New York, NY`, or paste Google Maps place links.
2. **Set how many places you want** and run.
3. **Download the leads** as CSV, Excel or JSON, or pull them through the API. The run's status message tells you how many places had a website, an email and social profiles.

### ⚙️ Input

| Field                       | What it does                                                                                                                  |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| **Search terms**            | What to search for on Google Maps, one per line. Default `dentist`.                                                           |
| **Location**                | City, district or region to search in. Default `New York, NY`.                                                                |
| **Place links (optional)**  | Specific Google Maps places (links, ChIJ place IDs or "name + city"), instead of or on top of the search.                     |
| **Max places**              | Stop after this many places in total. Default 50.                                                                             |
| **Language**                | Language of Google Maps categories and opening hours (`en`, `de`, `es`, `pt-BR`...). Default `en`.                            |

```json
{
    "searchQueries": ["plumber", "roofing contractor"],
    "location": "Houston, TX",
    "maxItems": 500
}
```

### 💰 Pricing

Pay only for what you get. No monthly rental.

| Event               | Price                              | When                                                                  |
| ------------------- | ---------------------------------- | --------------------------------------------------------------------- |
| **Place**           | $0.002 per place ($2 per 1,000)    | Every place saved with its Google Maps details                         |
| **Contact details** | $0.002 per place ($2 per 1,000)    | Only when the place's website gave at least one email or social profile |
| **Actor start**     | $0.00005 per run                   | Charged once when the run starts                                        |

Examples:

- 1,000 places, 700 of them with an email or social profile: $2.00 + $1.40 = **$3.40**.
- 100 places, all without a website: **$0.20**.
- 10,000 places with contact details on 70%: **$34.00**.

### 📊 Sample Output Data

```json
{
    "searchQuery": "plumber",
    "name": "Cooper Plumbing | Houston Plumber",
    "placeId": "ChIJA_eUDQLRQIYR8yJYKP1k_nw",
    "cid": "9006747343253938931",
    "featureId": "0x8640d1020d94f703:0x7cfe64fd285822f3",
    "url": "https://www.google.com/maps/search/?api=1&query=Cooper%20Plumbing%20%7C%20Houston%20Plumber&query_place_id=ChIJA_eUDQLRQIYR8yJYKP1k_nw",
    "category": "Plumber",
    "categories": ["Plumber"],
    "address": "10825 Barely Ln, Houston, TX 77070",
    "street": "10825 Barely Ln",
    "city": "Houston",
    "postalCode": "77070",
    "state": "Texas",
    "countryCode": "US",
    "lat": 29.9410686,
    "lng": -95.5828155,
    "phone": "(832) 441-9683",
    "phoneInternational": "+18324419683",
    "website": "https://www.cooperplumbinghouston.com/?utm_source=google&utm_medium=organic&utm_campaign=gmb-listing",
    "rating": 4.8,
    "reviewsCount": 591,
    "openingHours": [
        { "day": "Monday", "hours": "Open 24 hours" },
        { "day": "Saturday", "hours": "8 AM–5 PM" },
        { "day": "Sunday", "hours": "Closed" }
    ],
    "timezone": "America/Chicago",
    "claimThisBusiness": false,
    "emails": ["cooperplumbinghouston@gmail.com"],
    "phones": ["8324419683"],
    "facebooks": ["https://www.facebook.com/cooperplumbinghouston"],
    "instagrams": ["https://www.instagram.com/cooperplumbinghouston"],
    "linkedIns": ["https://www.linkedin.com/in/cooper-plumbing-339506181"],
    "twitters": ["https://x.com/PlumbingCooper"],
    "youtubes": [],
    "tiktoks": [],
    "pinterests": [],
    "pagesVisited": [
        "https://cooperplumbinghouston.com/?utm_source=google&utm_medium=organic&utm_campaign=gmb-listing",
        "https://cooperplumbinghouston.com/contact/"
    ],
    "websiteLoaded": true,
    "scrapedAt": "2026-10-21T14:17:10.431Z"
}
```

`phone` is the number on Google Maps; `phones` are the numbers linked on the website. `websiteLoaded` is `true` when the website opened, `false` when it did not (dead site, blocked), and `null` when the place has no website or its website is a social profile. `pagesVisited` lists the website pages the contacts come from. The output also has `kgmid`, `neighborhood`, `description`, `reservationUrl` and `additionalInfo` (amenities as yes/no flags).

### 📅 Schedule and Integrate

Lead lists go stale as businesses open and close, so a monthly run per niche and city keeps them fresh. Set it up with Apify **Schedules**, then send the rows to Google Sheets, HubSpot or your outreach tool through the Zapier, Make or n8n integrations, or a webhook when the run finishes.

### 🤖 Use with AI Agents (MCP)

The actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{ "searchQueries": ["real estate agent"], "location": "Miami, FL", "maxItems": 20 }
```

### ❓ FAQ

**How do I extract emails from Google Maps?** Google Maps itself does not show emails. This actor takes the website of each place on Google Maps and reads the emails from the website's homepage and contact pages, so you get the Google Maps listing and the email in the same row.

**Does Google Maps have an official API for emails?** The official Places API gives the listing details (name, address, phone, website) with an API key and billing account, but no emails or social profiles. This actor needs no key and adds the contact details found on each business website.

**Do I need a Google account or API key?** No.

**Why is a place's email empty?** Many small businesses only list a contact form or a phone number on their website, and some websites do not open for automated visits. In our tests on 320 places in five cities, 88% had a website and about 89% of those websites opened; an email was found for 64% of the places with a website and an email or social profile for 81%. The run's status message gives these numbers for your own run, and you are charged the contact details price only when something was found.

**Are the emails verified?** No. They are the addresses published on the business website. Run them through an email validator before a cold email campaign.

**How many places can I get?** As many as Google Maps has for your search in that area: the city is covered with a grid of map searches, so you are not limited to ~120 results.

**Is it legal to scrape business emails?** The actor collects contact details that businesses publish on their own websites. How you may use them depends on your country (for example GDPR in the EU, CAN-SPAM in the US); check the rules for your use case.

### 🔗 Related Scrapers

- [Website Contact Details Scraper](https://apify.com/piotrv1001/website-contact-details-scraper): the same email and social extraction for any list of websites, without Google Maps.
- [Google Maps Scraper](https://apify.com/piotrv1001/google-maps-scraper): Google Maps places only, without website visits, when you need the listings fast.
- [Google Maps Reviews Scraper](https://apify.com/piotrv1001/google-maps-reviews-scraper): every review of the places you found, with dates and owner responses.
- [Facebook Pages Scraper](https://apify.com/piotrv1001/facebook-pages-scraper): followers, contact info and details of the Facebook pages in the `facebooks` column.
- [LinkedIn Company Scraper](https://apify.com/piotrv1001/linkedin-company-scraper): company size, industry and website of the LinkedIn pages in the `linkedIns` column.

# Actor input Schema

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

What to search for on Google Maps, one per line, e.g. dentist, plumber, real estate agent.

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

City, district, ZIP code or region to search in, e.g. "New York, NY" or "Berlin, Germany". Large areas are covered with a grid of searches automatically.

## `placeUrls` (type: `array`):

Specific Google Maps places instead of (or on top of) a search: place links, place IDs (ChIJ...) or place names with a city, one per line.

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

Stop after this many places in total (all search terms and links together).

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

Language of categories, opening hours and other Google Maps texts, as a code like en, de, es or pt-BR.

## Actor input object example

```json
{
  "searchQueries": [
    "dentist",
    "plumber"
  ],
  "location": "New York, NY",
  "placeUrls": [
    "https://www.google.com/maps/place/Joe's+Pizza/data=!4m2!3m1!1s0x89c25b15685ad3a9:0x8f6425b4629f362d"
  ],
  "maxItems": 50,
  "language": "en"
}
```

# Actor output Schema

## `results` (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 = {
    "searchQueries": [
        "dentist"
    ],
    "location": "New York, NY",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/google-maps-contact-details-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 = {
    "searchQueries": ["dentist"],
    "location": "New York, NY",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/google-maps-contact-details-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 '{
  "searchQueries": [
    "dentist"
  ],
  "location": "New York, NY",
  "maxItems": 50
}' |
apify call piotrv1001/google-maps-contact-details-scraper --silent --output-dataset

```

## MCP server setup

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