# Google Maps Leads Scraper | $1.5/1k places (`mamies/google-maps-leads-scraper`) Actor

Scrape unlimited Google Maps business leads — names, addresses, phones, websites, ratings, and optional \[Add On] emails + Social Profiles from business websites. Type any city ('Chicago', 'Paris, France') and grid search covers the entire area, bypassing Google's ~120-results-per-search cap.

- **URL**: https://apify.com/mamies/google-maps-leads-scraper.md
- **Developed by:** [Mamies Tech](https://apify.com/mamies) (community)
- **Categories:** Lead generation, Travel, Automation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/platform/actors/running/actors-in-store#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 Leads Scraper 🗺️

**Extract unlimited business leads from Google Maps** — names, addresses, phone numbers, websites, emails, and ratings — exported clean as JSON, CSV, or Excel. Built for lead generation, sales prospecting, and market research.

Beat Google's 120-result limit with grid search, and enrich your leads with contact emails **and social media profiles** pulled straight from business websites.

***

### 🚀 Why this scraper?

A normal Google Maps search caps out at ~120 places. This scraper uses **grid search** — splitting your target area into a grid of smaller searches — so you can extract *every* business in a city, not just the first screen.

- ✅ **Complete contact data** — name, full address, phone, website
- ✅ **Email + social enrichment** — contact emails, social profiles (Facebook, Instagram, LinkedIn, and 7 more), and the contact page, pulled from business websites
- ✅ **Ratings** — star rating for every business
- ✅ **Precise location** — GPS coordinates for every place
- ✅ **Unlimited results** — grid search bypasses the 120-place cap
- ✅ **Any niche, any city** — just type a search term
- ✅ **Clean export** — JSON, CSV, Excel, XML, or HTML

***

### 📊 Data fields extracted

| Field | Description |
|---|---|
| **title** | Business name |
| **category** | Business type (e.g. "Italian restaurant") |
| **address** | Full street address |
| **phone** | Phone number (where listed) |
| **web\_site** | Business website URL (where listed) |
| **emails** | Contact emails found on the business website *(when contact enrichment is enabled)* |
| **facebook** … **whatsapp** | Social profile links — Facebook, Instagram, LinkedIn, Twitter/X, YouTube, TikTok, Pinterest, GitHub, Telegram, WhatsApp *(when contact enrichment is enabled)* |
| **contact\_page** | URL of the website's contact page *(when contact enrichment is enabled)* |
| **review\_rating** | Average star rating (1–5) |
| **latitude** / **longtitude** | GPS coordinates |

***

### ⬆️ Output example

Each business is returned as one record. With email extraction enabled:

```json
{
  "title": "SoHo Dental Group NYC",
  "category": "Dentist",
  "address": "552 Broadway #505, New York, NY 10012",
  "phone": "(212) 878-7646",
  "web_site": "https://sohodentalgroup.com/",
  "emails": ["info@sohodentalgroup.com"],
  "facebook": "https://www.facebook.com/sohodentalgroup",
  "instagram": "https://www.instagram.com/sohodentalgroup",
  "linkedin": null,
  "contact_page": "https://www.sohodentalgroup.com/contact-us",
  "review_rating": 4.7,
  "latitude": 40.7237243,
  "longtitude": -73.9980315
}
```

*Trimmed for readability — every record carries many more fields, and contact-enriched records always include all 10 social platform fields (`facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `pinterest`, `github`, `telegram`, `whatsapp`); platforms the business doesn't have come back as `null`.*

> **About emails & socials:** Contacts are extracted by visiting each business's website, so they're available **only for businesses that have a website**. Many Google Maps listings have no website, so coverage varies by search — expect contacts on a portion of results, not all of them. Enable **Extract emails + social profiles** in the input to turn this on.

Download the full dataset as JSON, CSV, Excel, XML, or HTML from the Output tab.

***

### 🎯 Use cases

- **Lead generation** — build targeted prospect lists with phone numbers and emails
- **Sales prospecting** — find every business in a niche and city
- **Market research** — analyze competitor density, ratings, and coverage by area
- **Local outreach** — identify top-rated businesses for partnerships

***

### ⬇️ Input

| Parameter | Required | Description |
|---|---|---|
| **queries** | Yes | Search terms, one per line — e.g. `restaurants in New York` |
| **maxResultsPerQuery** | No | Cap on results per query (default 10) |
| **extractEmails** | No | Visit each business website to extract contact emails, social profiles, and the contact page (adds the `emails`, social, and `contact_page` fields) |
| **gridCity** | No | Easiest way to scrape a whole area: a city name, e.g. `Chicago`, `Springfield, Illinois`, `Paris, France`, or `Richmond, Victoria, Australia` — coordinates are resolved automatically; regions/states work for every country |
| **gridRadiusKm** | No | With `gridCity`: how far around the city center to search (default 5 km) |
| **gridBbox** | No | Alternative to `gridCity` for precise control: exact `minLat,minLon,maxLat,maxLon` (takes priority if both are set) |
| **gridCellKm** | No | Grid cell size in km (default 1) — smaller cells are more thorough but slower |
| **language** | No | Google language code (default `en`) |

**Tip:** Use distinct search terms (`restaurant`, `cafe`, `bar`) rather than near-duplicates to maximize unique results.

***

### ⚡ Why not just use the Google Places API?

| | Google Places API | This scraper |
|---|---|---|
| **Result limit** | Caps results per search | Unlimited via grid search |
| **Emails & social profiles** | Not provided | Extracted from business websites |
| **Setup** | API keys, billing, complex config | Just type a search term |
| **Coordinates & ratings** | Available | Included by default |

***

### ❓ FAQ

**How does it work?**
It talks to Google Maps' own search backend directly — no browser, no page rendering — which makes it fast and lightweight. Grid search goes further: it splits your target area into small cells and searches each cell's location separately, so results come from every corner of the area instead of one map viewport.

**How do I get more than 120 results?**
Use grid search: type a city into **gridCity** (e.g. `Chicago` or `Miami`) — or provide exact coordinates via **gridBbox**. Either way your area is divided into smaller cells and each cell searches its own spot on the map, bypassing Google's ~120-per-search cap. Raise **maxResultsPerQuery** accordingly (it caps the total across all cells).

**Why don't all results have emails?**
Emails come from business websites. Listings without a website, or whose website doesn't publish an email, won't have one. Email coverage naturally varies by area and industry.

**What export formats are supported?**
JSON, CSV, Excel, XML, and HTML — from the Output tab or the Apify API.

**Can I automate it?**
Yes — integrate with Make, n8n, Zapier, Google Sheets, and more via Apify's integrations and webhooks, or call it through the Apify API.

**Is scraping Google Maps legal?**
This actor extracts publicly available business information. As with all web scraping, review the applicable terms and only collect data you have a legitimate basis to use.

***

### 💡 Tips

- Proxies are managed automatically — no proxy setup or configuration needed.
- For full-city coverage, use grid search: just type the city name (or a bounding box for exact control).
- Contact enrichment costs more per result — use it when you need emails, social profiles, or contact pages.

> *Unofficial scraper — not affiliated with, endorsed by, or sponsored by Google.*
> *City-name lookup uses [GeoNames](https://www.geonames.org/) data, licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).*

# Actor input Schema

## `queries` (type: `array`):

One search query per line, e.g. 'restaurants in New York' or 'dentists in Austin TX'.

## `maxResultsPerQuery` (type: `integer`):

Roughly caps how many results are kept per query. Note: Google caps a single search at ~120 places — use Grid search (below) to go beyond that.

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

Google language code, e.g. 'en', 'de', 'hi'.

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

Adds 'emails', social profile fields (facebook, instagram, linkedin, twitter, youtube, tiktok, pinterest, github, telegram, whatsapp), and 'contact\_page'. Billed at the higher 'result with email' rate; ~30% of listings have no website so not every result gets contacts.

## `zoom` (type: `integer`):

Only used with Grid search bounding box: the map zoom each grid cell searches at (default 16 gives the best pin density per cell). Has no effect on normal text queries.

## `concurrency` (type: `integer`):

How many queries to process in parallel. Higher uses more compute/proxy resources.

## `gridCity` (type: `string`):

To scrape an entire area beyond the ~120 result cap, just type a city — e.g. 'Chicago' or 'San Francisco'. If the name exists in more than one place, add a region and/or country: 'Springfield, Illinois', 'Austin, TX', 'Cambridge, England', 'Paris, France'. Otherwise the biggest match wins. The scraper finds the coordinates automatically and searches the radius below around the city center. Leave empty to search normally.

## `gridRadiusKm` (type: `number`):

Only used with the city name above: how far around the city center to grid-search (default 5 km). Bigger radius = more results, slower and costlier.

## `gridBbox` (type: `string`):

For precise control instead of the city name: provide 'minLat,minLon,maxLat,maxLon' (e.g. '40.30,-3.80,40.50,-3.60'). Takes priority over the city name if both are set. Leave empty otherwise.

## `gridCellKm` (type: `number`):

Only used with Grid search bounding box. Size of each search cell in kilometers (can be a decimal, e.g. 0.5). Smaller = more thorough but slower/costlier.

## `timeoutSecs` (type: `integer`):

Maximum time the underlying scraper process may run before the Actor fails.

## Actor input object example

```json
{
  "queries": [
    "restaurants in New York"
  ],
  "maxResultsPerQuery": 10,
  "language": "en",
  "extractEmails": false,
  "zoom": 16,
  "concurrency": 2,
  "gridRadiusKm": 5,
  "gridCellKm": 1,
  "timeoutSecs": 3600
}
```

# Actor output Schema

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

All scraped business records — name, address, phone, website, rating, coordinates, and emails + social profiles when contact enrichment is enabled. Append ?format=csv or ?format=xlsx to the URL for spreadsheet exports.

# 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 = {
    "queries": [
        "restaurants in New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mamies/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 = { "queries": ["restaurants in New York"] }

# Run the Actor and wait for it to finish
run = client.actor("mamies/google-maps-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "restaurants in New York"
  ]
}' |
apify call mamies/google-maps-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mamies/google-maps-leads-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aXUh32LmOgEaeEhia/builds/VpHUG2KPjKIih3axQ/openapi.json
