# Google Maps Leads Extractor – Fast & Low-Cost Business Data (`localdatakit/google-maps-leads-extractor`) Actor

Scrape business leads from Google Maps by keyword and location — name, address, phone, website, rating, reviews, hours, and coordinates. Fast, low-cost, with precise result limits. Export to CSV, JSON, or Excel.

- **URL**: https://apify.com/localdatakit/google-maps-leads-extractor.md
- **Developed by:** [Nischal khatiwada](https://apify.com/localdatakit) (community)
- **Categories:** Lead generation, E-commerce, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.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.

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 Leads Extractor

Scrape business leads from Google Maps by keyword and location — **name, address, phone, website, rating, reviews, opening hours, and coordinates**. Fast, low-cost, and built to respect the exact result limit you set, so you never pay for data you didn't ask for. Export to CSV, JSON, or Excel for sales prospecting, local SEO, and market research.

### What it does

Give it what to search for (e.g. `plumbers`, `coffee shop`) and where (a city name, or a map center with a grid). It scrolls Google Maps like a real user, opens each business, and returns clean, structured records.

Two things make it different from a plain scraper:

- **It gets past Google's ~120-results-per-search cap.** Turn on grid search and it splits your area into tiles, searches each one, and de-duplicates by Place ID — so a dense city returns hundreds of unique businesses, not just the first 120.
- **It stops exactly at your limit.** Set a cap of 500 and you get 500, billed for 500. It never loads and discards extra pages at the tail of a run, which keeps your cost predictable.

It also blocks images and map tiles while scraping, which cuts proxy bandwidth to a fraction of what browser-based scrapers usually burn.

### Example output

Each business is one record:

```json
{
  "placeId": "ChIJN3douN4Z6zkRGce-pzlve0g",
  "cid": "5222890486284338969",
  "name": "Coffee Circle",
  "category": "Coffee shop",
  "address": "M8FV+7J5, Kathmandu 44600",
  "phone": "984-9183170",
  "website": null,
  "rating": 4.9,
  "reviewCount": 118,
  "priceLevel": "Rs 1–500",
  "lat": 27.6729322,
  "lng": 85.3440389,
  "openingHours": [
    { "day": "Monday", "hours": "7 AM to 8:30 PM" },
    { "day": "Tuesday", "hours": "7 AM to 8:30 PM" }
  ],
  "permanentlyClosed": false,
  "temporarilyClosed": false,
  "claimThisBusiness": true,
  "url": "https://www.google.com/maps/place/Coffee+Circle/...",
  "searchString": "coffee shop",
  "scrapedAt": "2026-08-27T08:34:53.152Z"
}
```

`claimThisBusiness: true` flags an unclaimed Google Business Profile — useful if you sell local SEO or listing-management services.

### Input

| Field | What it does |
|---|---|
| `searchStrings` | One or more search terms, e.g. `["plumbers", "electricians"]`. Required. |
| `locationQuery` | Text location appended to each search, e.g. `"Kathmandu, Nepal"`. Ignored if coordinates are set. |
| `lat`, `lng` | Map center. Setting both turns on grid search for the area. |
| `gridSize` | Grid is N×N tiles. `1` = single search. `3` = 9 tiles around the center. |
| `gridSpacingKm` | Distance between neighbouring tiles. Default `1.5`. |
| `zoom` | Map zoom per tile. Default `16` (smaller, denser tiles). |
| `maxPlacesPerSearch` | Stop scrolling a single search after this many results. |
| `maxPlacesTotal` | Hard cap on total places saved — your main cost control. |
| `language` | Interface language code. Keep `en` for stable field labels. |
| `proxyConfiguration` | Residential Apify proxies are strongly recommended; Google blocks datacenter IPs quickly. |

### Tips

- For a whole city, set `lat`/`lng` to the center, `gridSize` 3–5, and a `maxPlacesTotal` that fits your budget.
- For a quick sample, leave coordinates empty, set `locationQuery`, and keep `maxPlacesTotal` low.
- `maxPlacesTotal` is the number to watch — it directly controls how much a run costs.

### Output formats

Every run produces a dataset you can export as CSV, JSON, or Excel from the Console, or pull via the Apify API. It also integrates with Make, n8n, Zapier, and Google Sheets through Apify's built-in connectors.

### Legal

This Actor collects publicly available business listing data from Google Maps. It does not log in or bypass access controls. You are responsible for using the data in line with Google's Terms of Service and any laws that apply to you, including data-protection rules such as GDPR and CCPA when handling personal information. Use it for legitimate business purposes only.

# Actor input Schema

## `searchStrings` (type: `array`):

What to search for, e.g. "plumbers", "coffee shop".

## `locationQuery` (type: `string`):

Appended to each search, e.g. "Kathmandu, Nepal". Ignored if coordinates are set.

## `lat` (type: `number`):

Latitude of the area center. Enables grid search when set together with lng.

## `lng` (type: `number`):

Longitude of the area center. Enables grid search when set together with lat.

## `gridSize` (type: `integer`):

1 = single search. 3 = 9 searches around the center. Each tile can return up to ~120 places.

## `gridSpacingKm` (type: `number`):

Distance in kilometres between neighbouring grid tiles.

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

Google Maps zoom level for each search. Higher = smaller area per tile.

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

Stop scrolling a single search after this many results.

## `maxPlacesTotal` (type: `integer`):

Hard cap on places saved in one run. Use it to control cost.

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

Google Maps interface language code, e.g. "en". Keep "en" for stable field labels.

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

Proxy settings. Residential Apify proxies are strongly recommended; Google blocks datacenter IPs quickly.

## Actor input object example

```json
{
  "searchStrings": [
    "coffee shop"
  ],
  "locationQuery": "Kathmandu, Nepal",
  "gridSize": 1,
  "gridSpacingKm": 1.5,
  "zoom": 16,
  "maxPlacesPerSearch": 120,
  "maxPlacesTotal": 10,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `downloadCsv` (type: `string`):

No description

## `totalScraped` (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 = {
    "searchStrings": [
        "coffee shop"
    ],
    "locationQuery": "Kathmandu, Nepal"
};

// Run the Actor and wait for it to finish
const run = await client.actor("localdatakit/google-maps-leads-extractor").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 = {
    "searchStrings": ["coffee shop"],
    "locationQuery": "Kathmandu, Nepal",
}

# Run the Actor and wait for it to finish
run = client.actor("localdatakit/google-maps-leads-extractor").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 '{
  "searchStrings": [
    "coffee shop"
  ],
  "locationQuery": "Kathmandu, Nepal"
}' |
apify call localdatakit/google-maps-leads-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,localdatakit/google-maps-leads-extractor"
        }
    }
}

```

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/6oewKidx05umz1KiD/builds/oMXs6slLdhIfEEj7y/openapi.json
