# 📍 Google Maps Scraper: Business Leads, Emails & Reviews (`ha55an_dev/google-maps-leads-scraper`) Actor

Extract business data from Google Maps with just a few clicks. Get business names, emails, phone numbers, addresses, reviews, ratings, social profiles, and hours. Export unlimited leads to CSV, Excel, or JSON for cold outreach, lead generation, and market research with no coding.

- **URL**: https://apify.com/ha55an\_dev/google-maps-leads-scraper.md
- **Developed by:** [Hassan Amer](https://apify.com/ha55an_dev) (community)
- **Categories:** Lead generation, Automation, SEO tools
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.50 / 1,000 leads

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: Extract Business Leads, Emails & Reviews

An ultra-fast, comprehensive **Google Maps Scraper and Business Lead Extractor** built for marketers, sales teams, agencies, and researchers. Extract business names, verified emails, phone numbers, addresses, reviews, ratings, social profiles, and opening hours from Google Maps listings across any city, region, or country—**with zero coding and no 120-place result limits**.

***

### 🎯 What is Google Maps Scraper?

**Google Maps Scraper** is an automated web data extraction tool that turns Google Maps into a rich, structured database of local business leads. Whether you need 50 local plumbers in Chicago or 50,000 restaurants across Germany, this Actor extracts all public data directly into spreadsheets, CSV, Excel, or JSON in minutes.

#### 💼 Top Use Cases & Business Benefits:

- **🚀 B2B Lead Generation & Cold Outreach:** Build hyper-targeted prospect lists with verified company emails, direct phone numbers, websites, and business addresses for cold email, cold calling, and direct mail campaigns.
- **📈 Competitor Intelligence & Benchmarking:** Monitor competitors across cities, compare average ratings (`totalScore`), analyze review volumes, and track operational hours to identify market gaps.
- **🔍 Local SEO & Citation Audits:** Verify NAP (Name, Address, Phone) consistency, audit business categories, check claimed business statuses, and evaluate local map pack visibility.
- **🏢 Agency & Freelance Client Acquisition:** Find local businesses with low ratings, missing websites, or unclaimed profiles to pitch marketing, website redesign, reputation management, and SEO services.
- **📊 Market Research & Site Selection:** Analyze business density, restaurant saturation, popular times, and customer foot traffic patterns across target neighborhoods.

***

### 📊 What Data Does Google Maps Scraper Extract?

Every scraped business profile is returned with complete, structured metadata:

| Business Information | Location & Coordinates | Contact & Social Details | Reviews & Operations |
|---|---|---|---|
| 🏢 **Business Name** | 📍 **Full Address** | ☎️ **Phone Number** | ⭐️ **Average Star Rating** |
| 🏷️ **Main Category** | 🛣️ **Street Address** | 📞 **Unformatted Phone** | 💬 **Total Review Count** |
| 🗂️ **Additional Categories** | 🏙️ **City & Neighborhood** | 🌐 **Website URL** | 📊 **1–5 Star Distribution** |
| 🆔 **Place ID & CID** | 🗺️ **State & Postal Code** | ✉️ **Company Emails** | 📝 **Customer Reviews Text** |
| 🔗 **Google Maps URL** | 🌍 **Country Code** | 📸 **Instagram Profile** | 🧑‍🍳 **7-Day Opening Hours** |
| 🏷️ **Price Bracket (`$–$$$$`)** | 🌐 **Latitude & Longitude** | 👥 **Facebook Page** | ⌚ **Popular Times & Live Occupancy** |
| 🔒 **Claimed / Verified Status** | 🧭 **Plus Code** | 💼 **LinkedIn Profile** | ♿ **Wheelchair & Accessibility Info** |
| 🚪 **Permanently/Temporarily Closed** | 🏬 **Located Inside (Venue/Mall)** | 🐦 **Twitter / X Profile** | 💳 **Accepted Payment Methods** |

***

### 🚀 How to Scrape Google Maps in 3 Easy Steps

No technical skills, proxy setups, or browser extensions are required.

1. **Enter Search Keywords & Location:** Type what you are looking for (e.g., `Dentist`, `Roofing Contractor`, `Italian Restaurant`) and where you want to find them (e.g., `Austin, TX`, `Miami, FL`, `London, UK`).
2. **Choose Your Data Options:** Toggle email extraction on to find verified contact emails from business websites, or set the number of reviews to collect.
3. **Click "Start" & Export:** Click **Save & Start**. Once complete, preview your data in the interactive table or export to **CSV**, **Excel (XLSX)**, or **JSON** with one click.

***

### ⚙️ Input Configuration & Parameters

The Actor interface provides intuitive fields for customizing your crawl:

#### 1. `searchTerms` *(Array of Strings - Required)*

Enter the business types or keywords you want to search for.

- *Best Practice:* Use distinct keyword categories (e.g., `["Dentist", "Orthodontist", "Dental Clinic"]`).
- *Examples:* `["Plumber"]`, `["Real Estate Agency"]`, `["Coworking Space"]`.

#### 2. `locations` *(Array of Strings - Required)*

Specify target cities, counties, states, countries, or postal codes. You can provide multiple locations in a single run.

- *Examples:* `["New York, NY"]`, `["Los Angeles, CA"]`, `["Toronto, Canada"]`, `["London, UK"]`.
- *Broad Search:* You can enter an entire state or country (e.g., `["Texas, USA"]`). The scraper automatically tiles across the region to capture all listings without hitting limits.

#### 3. `maxPlacesPerLocation` *(Integer - Optional)*

The maximum number of places to extract per search query and location combination.

- Leave empty or set to `0` to scrape **all available businesses** in the target area.

#### 4. `extractEmails` *(Boolean - Optional, Default: `true`)*

When enabled, the scraper automatically visits the business's official website and candidate contact pages (`/contact`, `/about`, `/team`) to discover and verify direct email addresses and social media links. Includes built-in spam and font-file filters.

#### 5. `maxReviewsPerPlace` *(Integer - Optional, Default: `0`)*

Specify how many customer reviews to extract per business.

- Set to `0` to skip reviews for maximum speed.
- Set to `10`, `50`, or `100` to collect detailed review text, star ratings, reviewer names, review dates, and owner responses.

#### 6. `language` & `countryCode` *(String - Optional, Default: `en` / `US`)*

Sets the display language for categories, opening hours, and regional search results.

***

### 📋 Example Input (JSON)

```json
{
  "searchTerms": [
    "Dentist",
    "Dental Clinic"
  ],
  "locations": [
    "Austin, TX",
    "Dallas, TX"
  ],
  "maxPlacesPerLocation": 100,
  "extractEmails": true,
  "maxReviewsPerPlace": 10,
  "language": "en"
}
```

***

### 📦 Example Output (JSON)

```json
{
  "title": "Austin Dental Arts",
  "categoryName": "Dentist",
  "categories": [
    "Dentist",
    "Cosmetic Dentist",
    "Dental Clinic"
  ],
  "address": "123 Congress Ave, Austin, TX 78701",
  "street": "123 Congress Ave",
  "city": "Austin",
  "state": "Texas",
  "postalCode": "78701",
  "countryCode": "US",
  "location": {
    "lat": 30.267153,
    "lng": -97.743061
  },
  "phone": "(512) 555-0199",
  "phoneUnformatted": "+15125550199",
  "website": "https://www.austindentalarts-example.com",
  "companyEmails": [
    "contact@austindentalarts-example.com",
    "appointments@austindentalarts-example.com"
  ],
  "socialMedia": {
    "instagram": "https://instagram.com/austindentalarts",
    "facebook": "https://facebook.com/austindentalarts",
    "linkedin": "https://linkedin.com/company/austindentalarts"
  },
  "totalScore": 4.9,
  "reviewsCount": 342,
  "price": "$$",
  "claimThisBusiness": false,
  "permanentlyClosed": false,
  "openingHours": [
    { "day": "Monday", "hours": "8:00 AM – 5:00 PM" },
    { "day": "Tuesday", "hours": "8:00 AM – 5:00 PM" },
    { "day": "Wednesday", "hours": "8:00 AM – 5:00 PM" },
    { "day": "Thursday", "hours": "8:00 AM – 5:00 PM" },
    { "day": "Friday", "hours": "8:00 AM – 2:00 PM" },
    { "day": "Saturday", "hours": "Closed" },
    { "day": "Sunday", "hours": "Closed" }
  ],
  "placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
  "url": "https://www.google.com/maps/place/?q=place_id:ChIJN1t_tDeuEmsRUsoyG83frY4",
  "scrapedAt": "2026-08-24T12:00:00.000Z"
}
```

***

### 📑 Dedicated Output Views & Formats

The Actor stores results in clean, organized dataset views accessible directly from the **Storage** tab:

1. **📋 Overview View:** The primary spreadsheet showing company name, category, phone, email, website, star rating, address, and city.
2. **✉️ Contacts & Leads View:** Specially filtered for outreach teams, highlighting verified emails, direct phone numbers, and social profile links.
3. **💬 Reviews View:** Formats customer feedback with one review per row, linking the reviewer name, star rating, review text, publish date, and owner response directly to the parent `placeId`.

#### Export Formats Supported:

- **CSV:** Ready to import into Excel, Google Sheets, Airtable, or CRM platforms (HubSpot, Salesforce).
- **Excel (XLSX):** Formatted spreadsheets with header rows and column filters.
- **JSON / JSONL:** For developers, AI agents, and programmatic data pipelines.
- **XML / HTML Table:** For web widgets and CMS imports.

***

### 🔌 Integrations & Automated Workflows

You can connect Google Maps Scraper to your existing tech stack:

- **Google Sheets:** Automatically sync new leads directly to a live Google Sheet using Apify integrations.
- **Zapier & Make.com:** Trigger email outreach campaigns in Instantly, Lemlist, or Smartlead whenever a new batch of businesses is scraped.
- **CRMs:** Push enriched contacts directly into HubSpot, Salesforce, Pipedrive, or Close CRM.
- **Webhooks:** Receive real-time HTTP POST notifications when your scraping run completes.

#### Programmatic API Access:

##### Python (`apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

run_input = {
    "searchTerms": ["Roofing Contractor"],
    "locations": ["Miami, FL"],
    "maxPlacesPerLocation": 50,
    "extractEmails": True
}

## Start the Actor and wait for results
run = client.actor("YOUR_USERNAME/google-maps-leads-scraper").call(run_input=run_input)

## Iterate through scraped business leads
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"Company: {place['title']} | Phone: {place['phone']} | Email: {place.get('companyEmails')}")
```

##### Node.js / JavaScript (`apify-client`)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_API_TOKEN' });

const run = await client.actor('YOUR_USERNAME/google-maps-leads-scraper').call({
    searchTerms: ['Real Estate Agency'],
    locations: ['Denver, CO'],
    maxPlacesPerLocation: 50,
    extractEmails: true
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Successfully extracted ${items.length} business leads!`);
```

***

### ❓ Frequently Asked Questions (FAQ)

##### How is this different from the official Google Places API?

The official Google Places API charges heavily per request, enforces strict query quotas, caps search results to a maximum of 60 places per area, and **does not provide contact email addresses or social media profiles**. This Google Maps Scraper extracts comprehensive business listings without 60-place restrictions and enriches profiles with verified email addresses and social links.

##### Does this scraper hit the 120-result limit on Google Maps?

No. Standard browser searches on Google Maps stop displaying results after scrolling through 120 places. This Actor uses an intelligent geographic tiling system that automatically subdivides target regions into micro-sectors, capturing up to 100% of businesses across the entire city or state.

##### Can I extract business email addresses for cold outreach?

Yes. When `extractEmails` is checked, the scraper visits each business's official website in the background, extracts verified contact emails from the homepage and contact pages, eliminates font/theme spam, and includes them directly in your spreadsheet.

##### Do I need to provide proxies or pay extra for proxy pools?

No. The Actor connects directly and handles request management automatically. You do not need to configure external proxy subscriptions or provide residential proxy credentials.

##### Is it legal to scrape Google Maps data?

Yes. Web scraping is legal when extracting publicly available commercial information (business names, public phone numbers, addresses, and listed website URLs). Ensure compliance with local regulations (such as GDPR or CAN-SPAM) when conducting cold outreach.

***

### 💬 Support & Feedback

Need help setting up your search, or looking for custom data extraction features?

- Open an inquiry on the **Issues** tab of this Actor.
- Leave a review on the Apify Store to suggest new features!

# Actor input Schema

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

List of business types or keywords to search (e.g. Dentist, Italian Restaurant, Plumber).

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

List of target cities, counties, states, or zip codes (e.g. Austin, TX; Miami, FL).

## `maxPlacesPerLocation` (type: `integer`):

Maximum number of places to scrape per location query. Leave blank or 0 for exhaustive search.

## `enableAutoTiling` (type: `boolean`):

Automatically subdivides dense geographic areas to uncover all hidden places beyond Google's 120-result limit.

## `extractEmails` (type: `boolean`):

Asynchronously crawl target business websites for contact emails, phones, and social media profiles with anti-junk filtering.

## `maxReviewsPerPlace` (type: `integer`):

Number of customer reviews to extract per place (0 to disable review scraping).

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

Google Maps interface language (e.g. en, es, fr, de, it).

## `country` (type: `string`):

Country code for search relevance (e.g. us, uk, ca, au, de).

## `customProxies` (type: `array`):

List of custom HTTP/SOCKS5 proxy URLs. Leave empty to use direct resilient connections.

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

Apify Proxy settings if running on the Apify platform.

## Actor input object example

```json
{
  "searchTerms": [
    "Dentist"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxPlacesPerLocation": 100,
  "enableAutoTiling": true,
  "extractEmails": true,
  "maxReviewsPerPlace": 0,
  "language": "en",
  "country": "us",
  "customProxies": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `places` (type: `string`):

Primary dataset containing detailed business profiles, contact emails, phone numbers, ratings, addresses, and opening hours.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ha55an_dev/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"],
}

# Run the Actor and wait for it to finish
run = client.actor("ha55an_dev/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"
  ]
}' |
apify call ha55an_dev/google-maps-leads-scraper --silent --output-dataset

```

## MCP server setup

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