# Google Maps Leads Scraper - Emails, Phones & Socials (`maged120/google-maps-leads-scraper`) Actor

Find businesses on Google Maps and get their emails, phone numbers and social profiles (Facebook, Instagram, LinkedIn, X, TikTok, YouTube) in one run, with ratings, reviews, address and hours.

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

## Pricing

from $7.00 / 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.
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 Scraper** turns a Google Maps search into a **ready-to-use lead list**. Type what you're looking for ("dentist", "plumber", "coffee shop") and where, and get every business with its **phone, website, emails and social profiles (Facebook, Instagram, LinkedIn, X, TikTok, YouTube, Yelp)**, plus rating, reviews, address, opening hours and coordinates, **in a single run**.

### What does Google Maps Leads Scraper do?

Most lead workflows need two or three tools: one to pull businesses from [Google Maps](https://www.google.com/maps), another to visit each website and dig out contact details. This Actor does both:

1. **Finds businesses on Google Maps** for your keywords in your chosen cities, neighborhoods or ZIP codes: name, category, address, phone, website, rating, review count, coordinates, hours and a Maps link.
2. **Visits each business website** (the homepage plus its contact and about pages) and collects **email addresses**, extra phone numbers and **social media profiles**.

You get one clean row per business, ready for your CRM, cold email tool or spreadsheet.

On the Apify platform you also get API access, scheduling, integrations (Google Sheets, HubSpot and CRMs via Zapier or Make, webhooks) and run monitoring.

### Why use Google Maps Leads Scraper?

- **Cold email & outbound sales**: build targeted local business lists with emails in minutes.
- **Agencies**: find prospects for web design, SEO, ads or reputation management by niche and city.
- **Local market research**: map every competitor in an area with ratings, review volume and online presence.
- **Social media outreach**: get Instagram, Facebook and LinkedIn pages for DM or ad campaigns.
- **Data enrichment**: turn a list of business types and cities into a complete contact database.

### How to scrape leads from Google Maps

1. Open the Actor and go to the **Input** tab.
2. Enter **What to search** (e.g. `dentist`, `roofing contractor`).
3. Enter **Where to search**: one or more cities, neighborhoods or ZIP codes.
4. Optionally filter: only businesses with an email, website or phone, minimum rating, minimum reviews.
5. Click **Start**, then open the **Output** tab or export to CSV / Excel.

### Input

| Field | Type | Description |
|---|---|---|
| `searchTerms` | array | Business types or keywords. **Required.** |
| `locations` | array | Cities, neighborhoods, ZIP codes. Every term runs in every location. |
| `maxPlacesPerSearch` | integer | Places per term per location (up to 200). Default `100`. |
| `extractContacts` | boolean | Visit websites for emails and social profiles. Default `true`. |
| `requireEmail` / `requireWebsite` / `requirePhone` | boolean | Only keep businesses that have these. |
| `minRating` / `minReviews` | number | Quality filters. |
| `language` / `countryCode` | string | Localize results, e.g. `en` / `us`. |

```json
{
    "searchTerms": ["dentist", "orthodontist"],
    "locations": ["Austin, TX", "Round Rock, TX"],
    "maxPlacesPerSearch": 100,
    "extractContacts": true,
    "requireEmail": true
}
```

### Output

One row per business. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "name": "Sunny Bliss Plumbing & Air",
    "category": "Plumber",
    "address": "605 Lincoln Rd Ste 250B, Miami Beach, FL 33139",
    "city": "Miami Beach",
    "state": "Florida",
    "countryCode": "US",
    "phone": "(305) 440-0621",
    "phoneInternational": "+13054400621",
    "website": "https://sunnybliss.com/",
    "emails": [
        "info@sunnybliss.com"
    ],
    "phonesFromWebsite": [
        "3055046091",
        "+13055046091",
        "+1-305-504-6091"
    ],
    "facebook": "https://www.facebook.com/sunnyblissplumbingandair",
    "instagram": "https://www.instagram.com/sunnybliss_plumbing_air",
    "linkedin": "https://www.linkedin.com/company/101358808",
    "twitter": "https://x.com/sunnyblissmiami",
    "youtube": "https://youtube.com/@sunnyblissplumbingandair",
    "tiktok": "https://www.tiktok.com/@sunnyblissplumbingandair",
    "yelp": "https://www.yelp.com/biz/sunny-bliss-plumbing-and-air-miami-beach",
    "rating": 4.9,
    "reviewsCount": 844,
    "latitude": 25.7907677,
    "longitude": -80.1344936,
    "placeId": "ChIJA6vG5FG12YgR2z_Bc72KBZU",
    "googleMapsUrl": "https://maps.google.com/?cid=10738141432830312411",
    "openNow": true,
    "openingHours": {
        "Saturday": "Open 24 hours",
        "Sunday": "Open 24 hours",
        "…": "…"
    },
    "websiteReachable": true,
    "searchTerm": "plumber",
    "searchLocation": "Miami, FL"
}
```

#### Dataset views

- **Leads**: business, category, emails, phone, website, social profiles, address, rating and reviews. Export-ready for outreach.
- **Place details**: categories, full address, coordinates, hours, photo and place ID.

### Output data fields

| Field | Description |
|---|---|
| `emails` | Email addresses found on the business website, the business's own domain first. |
| `phone` / `phoneInternational` / `phonesFromWebsite` | Maps phone number (local and international format) and any extra numbers on the website. |
| `facebook` / `instagram` / `linkedin` / `twitter` / `youtube` / `tiktok` / `pinterest` / `yelp` / `whatsapp` | Social and review profiles linked from the website. |
| `rating` / `reviewsCount` | Google rating and number of reviews. |
| `address` / `city` / `state` / `countryCode` / `latitude` / `longitude` | Location. |
| `openNow` / `openingHours` | Current status and weekly hours. |
| `placeId` / `googleMapsUrl` | Google place ID and a direct Maps link. |
| `websiteReachable` | Whether the website could be read (some sites block automated visits). |

### How many results will I get?

One row per business. Each search term in each location returns up to about 200 places. To cover a big city, add neighborhoods or ZIP codes as extra locations; duplicates across searches are removed automatically.

Email coverage depends on the industry. In our tests, about half of local service businesses with websites published an email. Many others use contact forms only. Social profiles are found far more often.

### Tips

- **Cover a whole city**: split it into neighborhoods or ZIP codes (e.g. `78701`, `78702`, …) as locations.
- **Only contactable leads**: turn on **Only businesses with an email**.
- **Quality leads**: set **Minimum rating** `4` and **Minimum reviews** `20`.
- **Maps data only**: turn off **Find emails & social profiles** for a much faster run.

### FAQ

**Why do some businesses have no email?** Many businesses don't publish an email and use a contact form instead. Some websites also block automated visits (`websiteReachable: false`).

**Why is `reviewsCount` sometimes empty?** Google occasionally returns a reduced version of the results that leaves out review counts. The rating is still included, and the Actor re-asks when this happens, but a few places can still come back without a count. The review filter never drops a place just because its count is unknown.

**Is scraping Google Maps legal?** The Actor collects publicly available business information. You're responsible for complying with anti-spam and data-protection rules (CAN-SPAM, GDPR, etc.) when contacting leads.

**Found a bug or need a custom feature?** Open an issue in the **Issues** tab. Custom solutions are available on request.

# Actor input Schema

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

Business types or keywords, exactly as you would type them into Google Maps (e.g. 'dentist', 'plumber', 'coffee shop').

## `locations` (type: `array`):

Cities, neighborhoods, ZIP codes or regions (e.g. 'Austin, TX', 'Brooklyn, NY', '10001'). Every search term is run in every location. Each search returns up to about 200 places, so add more locations (neighborhoods, ZIP codes) to cover a big city fully.

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

Places to collect for each search term in each location (up to 200).

## `extractContacts` (type: `boolean`):

Visit each business website and collect emails, extra phone numbers and social profiles. Turn off for Maps data only (faster).

## `requireEmail` (type: `boolean`):

Only return businesses where an email address was found.

## `requireWebsite` (type: `boolean`):

Skip businesses that do not list a website.

## `requirePhone` (type: `boolean`):

Skip businesses that do not list a phone number.

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

Only businesses rated at least this (e.g. 4.0). 0 = any.

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

Only businesses with at least this many Google reviews. 0 = any.

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

Language for results (e.g. en, es, de, fr).

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

Two-letter country code to localize results (e.g. us, gb, de).

## Actor input object example

```json
{
  "searchTerms": [
    "dentist"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxPlacesPerSearch": 50,
  "extractContacts": true,
  "requireEmail": false,
  "requireWebsite": false,
  "requirePhone": false,
  "minRating": 0,
  "minReviews": 0,
  "language": "en",
  "countryCode": "us"
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchTerms": [
        "dentist"
    ],
    "locations": [
        "Austin, TX"
    ],
    "maxPlacesPerSearch": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("maged120/google-maps-leads-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 = {
    "searchTerms": ["dentist"],
    "locations": ["Austin, TX"],
    "maxPlacesPerSearch": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("maged120/google-maps-leads-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 '{
  "searchTerms": [
    "dentist"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxPlacesPerSearch": 50
}' |
apify call maged120/google-maps-leads-scraper --silent --output-dataset

```

## MCP server setup

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