# Google Maps Leads Scraper (`tangerine_loom/google-maps-leads-scraper`) Actor

Scrape business leads from Google Maps in one run every published email, every phone number, named staff, address, category, rating, reviews, opening hours, coordinates and six social networks. One row per business, no add-ons.

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

## Pricing

from $6.00 / 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?

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 — Emails, Phones & Contacts

**Extract complete business leads from [Google Maps](https://www.google.com/maps)** — email addresses, every phone number, staff names, address, category, rating, reviews, opening hours, coordinates and social profiles — without writing a single line of code. Works for any industry, in any city, worldwide.

Search the way you would in Maps yourself: `dental clinic, Berlin` · `marketing agency, Austin` · `law firm, Manchester`.

### What does Google Maps Leads Scraper do?

Google Maps Leads Scraper searches Google Maps for businesses matching your industry and location, then visits each company's website to collect its contact details and staff.

It outputs **one row per business**, containing everything a Maps listing offers plus the email addresses and people published on the company's own site. No second run, no separate enrichment step.

Run it on Apify's infrastructure with automatic proxy rotation, scheduling, API access, and integrations to Google Sheets, Airtable, Make, Zapier, and hundreds of other tools.

### Why use Google Maps Leads Scraper?

- **Cold email outreach** — every address a business publishes, in one column
- **Sales prospecting** — build territory lists by industry and city, with the staff to contact
- **Agency lead generation** — find local businesses that have no website, or no booking system
- **Cold calling** — every phone number a business lists, not just the one on Maps
- **Market research** — categories, ratings, review counts and opening hours across a whole city
- **CRM enrichment** — attach emails, phones, socials and coordinates to your company records
- **Territory mapping** — GPS coordinates and Plus Codes for mapping or route planning

### How to use Google Maps Leads Scraper

1. **Open this Actor** and click **Try for free**
2. **Enter an industry** — `dental clinic`, `marketing agency`, `plumber`, `law firm`
3. **Add locations** — one or more cities, regions or countries, e.g. `Austin, Texas` and `Lyon, France`
4. **Set how many** businesses to pull per location — start with 20 to see the results before scaling up
5. **Optionally filter** — keep only businesses with an email address, or only those with named staff
6. **Click Start** and watch results appear in the **Output** tab
7. **Download** as JSON, CSV, Excel or HTML — or pull them through the API

There is nothing else to configure. Everything the scraper needs to tune itself — how many pages to crawl, how much to run in parallel — it works out from the run.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| **Industry / business type** | string | `dental clinic` | What kind of business to find |
| **Locations** | string list | Berlin, Germany | Cities, regions or countries. One search runs per entry |
| **Max businesses per location** | integer | `40` | How many Google Maps results to pull per location |
| **Only businesses with an email address** | boolean | false | Drops businesses that publish no email |
| **Only businesses with named contacts** | boolean | false | Drops businesses where no staff names were found |
| **Proxy** | proxy | Apify Residential | Required. Google Maps blocks datacenter and unproxied traffic |

**Example input:**

```json
{
  "industry": "marketing agency",
  "locations": ["Austin, Texas"],
  "maxBusinesses": 20,
  "requireEmail": false,
  "requireContacts": false
}
```

### Output

One row per business. Results appear in the **Output** tab and download in JSON, CSV, Excel or HTML.

```json
{
  "companyName": "Winning Smiles - Buffalo",
  "category": "Dentist",
  "businessStatus": "operational",
  "emails": "info@winningsmilespd.com; office@winningsmilespd.com",
  "emailCount": 2,
  "phones": "7163513293; +17163322444; 7169954456",
  "contacts": "Cody Wiktorski; Kathleen Rusnak; Edwin Jauch",
  "contactCount": 3,
  "website": "https://winningsmilespd.com/buffalo",
  "domain": "winningsmilespd.com",
  "hasWebsite": true,
  "bookingLink": "https://app.nexhealth.com/appt/winning-smiles",
  "address": "205 Linwood Ave, Buffalo, NY 14209, United States",
  "city": "Buffalo",
  "region": "NY",
  "country": "United States",
  "latitude": 42.9079029,
  "longitude": -78.8687661,
  "plusCode": "W45J+5F Buffalo, New York, USA",
  "rating": 4.7,
  "reviewCount": 962,
  "openingHours": [
    "Monday, 8 AM to 5 PM",
    "Tuesday, 8 AM to 5 PM",
    "Saturday, Closed"
  ],
  "socialMedia": {
    "linkedin": "https://www.linkedin.com/company/winning-smiles",
    "facebook": "https://www.facebook.com/winningsmiles",
    "instagram": null,
    "twitter": null,
    "youtube": null,
    "tiktok": null
  },
  "placeId": "0x89d313cf18c80b81:0x4b296e46ec7bcc6b",
  "mapsUrl": "https://www.google.com/maps/place/..."
}
```

### Data fields

| Field | Type | Description |
|---|---|---|
| `companyName` | string | Business name |
| `category` | string | Google Maps category, e.g. `"Dentist"` |
| `businessStatus` | string | `operational`, `temporarily_closed` or `permanently_closed` |
| `emails` | string | Email addresses published on the website, `;` separated |
| `emailCount` | number | How many addresses were found |
| `phones` | string | Every phone number found, `;` separated |
| `contacts` | string | Names of staff found on the website, `;` separated |
| `contactCount` | number | How many people were found |
| `website` | string | Company website |
| `domain` | string | Website domain |
| `hasWebsite` | boolean | `false` when the listing has no website |
| `bookingLink` | string | Appointment or ordering link, e.g. NexHealth, Solutionreach, OpenTable |
| `address` | string | Full address |
| `city` / `region` / `country` | string | Address components |
| `latitude` / `longitude` | number | GPS coordinates |
| `plusCode` | string | Google Plus Code |
| `rating` | number | Star rating, 1–5 |
| `reviewCount` | number | Number of Google reviews |
| `openingHours` | string\[] | Opening hours, one entry per day |
| `socialMedia` | object | `linkedin`, `facebook`, `instagram`, `twitter`, `youtube`, `tiktok` |
| `placeId` | string | Google's place identifier — use it to deduplicate across runs |
| `mapsUrl` | string | Link to the Google Maps listing |

### How much does it cost to scrape Google Maps leads?

**$6.00 per 1,000 leads.** One price covering the Maps listing, the website crawl, emails, phones, staff and social profiles.

Every billed row includes at least one way to contact the business — an email address or a phone number. Listings with neither are not returned.

That price is the whole cost. This Actor is priced per event, so Apify compute and proxy usage are not billed to you on top of it. Apify's **free tier** includes $5 of platform credits per month, which covers roughly 830 leads.

Comparable Actors quote a lower headline by selling the parts separately — a Maps listing at one price, then contact enrichment, social profiles and lead extraction as extra charges per row. Here the emails, phone numbers, named staff and six social networks are in the $6.00.

To keep costs predictable, set **Max businesses per location**, search one city at a time, and use **Only businesses with an email address** when every row needs to be mailable.

### Tips

- **Keep the residential proxy on** — Google Maps blocks datacenter and unproxied traffic, and a run without it returns almost nothing
- **Coverage depends on the industry and country** — independent practices and professional-services firms publish more contact detail than national franchises, and European sites more than North American ones
- **Filter on `hasWebsite: false`** to find businesses with a Maps listing but no website — a strong lead for web design and SEO services
- **Filter on `bookingLink`** to find businesses already using booking software, or its absence to find those who aren't
- **Search city by city for large runs** — Google caps a single search at roughly 120 results, so several focused searches return far more than one broad one. For a large city, list its boroughs or neighbourhoods as separate locations rather than raising **Max businesses per location**
- **Give the run 8 GB to go roughly twice as fast** — Apify allocates one CPU core per 4 GB, and the scraper sizes its own parallelism to the cores it has. Nothing to configure, but the memory setting is the lever
- **Deduplicate across runs on `placeId`** — Google's own identifier for the listing, and a more reliable key than the name or website
- **Schedule weekly runs** to keep a list current as businesses open, close and change details

### FAQ, disclaimers, and support

**Where do the email addresses come from?**
From each company's own website — contact, about and team pages. Google Maps does not publish email addresses, so no tool can take them from there.

**Why do some businesses have no email?**
Some publish no address anywhere and use a contact form instead. Those rows still include phone numbers, staff names, socials and everything else. Use **Only businesses with an email address** if you need every row to be mailable.

**Are the email addresses verified?**
Not currently — they are returned exactly as published. Email verification is planned as an optional add-on.

**Does it work outside the United States?**
Yes. Company websites are read in over 20 languages, so team and contact pages are found on German, French, Spanish, Italian, Dutch, Polish and Turkish sites as well as English ones.

**Some fields are empty — why?**
The business did not publish that detail. An empty field means the data was not available, not that the scraper failed.

**The run returned very few results — what should I do?**
Check that Apify Proxy is enabled with the residential group. That is by far the most common cause.

**Which industries and countries give the best results?**
Businesses that publish a team page give the most — agencies, law firms, clinics, consultancies and studios. Coverage also varies by country: European sites tend to publish more contact detail than North American ones, where a contact form is more common.

**What happens if a run is interrupted?**
Click **Resurrect** and it continues from where it stopped, without repeating businesses it has already returned. Starting a new run instead begins from scratch.

**Will I get the same business twice?**
No. Businesses are deduplicated by their Google place ID, so overlapping searches never return a listing twice. Separate branches of a chain are returned as separate rows, since they are separate locations.

**Is scraping Google Maps legal?**
This Actor collects publicly available business information. Business contact details can still be personal data under the GDPR when they identify an individual, so you need a lawful basis for using them — legitimate interest is the usual basis for B2B outreach — and you must honour deletion requests. Please take your own legal advice for your jurisdiction and intended use.

**Can you build a custom version?**
Yes — open a ticket on the **Issues** tab or get in touch for a version tailored to your industry, region or output format.

# Actor input Schema

## `industry` (type: `string`):

What kind of business to find. Passed to Google Maps as the search term — use the words you would type there yourself.

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

Cities, regions or countries. One Google Maps search runs per entry, and results are deduplicated across them.

## `maxBusinesses` (type: `integer`):

How many Google Maps results to pull per location. Google caps a single search at roughly 120 results, so asking for more than that returns everything Maps has and stops there — to go higher, add more locations (for a big city, its boroughs or neighbourhoods). Start at 20 to see the shape of the data before scaling.

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

Drops businesses that publish no email address anywhere on their site. Smaller list, but every row can be emailed. About one business in five uses a contact form only.

## `requireContacts` (type: `boolean`):

Drops businesses where no staff names could be found on the website. Use when you need a person to address rather than a company inbox.

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

Google Maps blocks datacenter and unproxied traffic, so residential proxy is required — without it runs return few or no results. Company websites start on datacenter proxy and switch to residential automatically if a site blocks them.

## Actor input object example

```json
{
  "industry": "marketing agency",
  "locations": [
    "Austin, Texas",
    "Lyon, France"
  ],
  "maxBusinesses": 40,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "industry": "dental clinic",
    "locations": [
        "Berlin, Germany"
    ],
    "maxBusinesses": 40,
    "requireEmail": false,
    "requireContacts": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tangerine_loom/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 = {
    "industry": "dental clinic",
    "locations": ["Berlin, Germany"],
    "maxBusinesses": 40,
    "requireEmail": False,
    "requireContacts": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tangerine_loom/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 '{
  "industry": "dental clinic",
  "locations": [
    "Berlin, Germany"
  ],
  "maxBusinesses": 40,
  "requireEmail": false,
  "requireContacts": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call tangerine_loom/google-maps-leads-scraper --silent --output-dataset

```

## MCP server setup

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