# Google Maps Business Scraper (`seeb/google-maps-business-scraper`) Actor

Fast Google Maps lead scraper for clean business lists. Extract names, categories, ratings, addresses, phone numbers, websites, and Google Maps URLs from keyword and location searches.

- **URL**: https://apify.com/seeb/google-maps-business-scraper.md
- **Developed by:** [Techionik](https://apify.com/seeb) (community)
- **Categories:** Lead generation, SEO tools, Automation
- **Stats:** 10 total users, 0 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.00 / 1,000 business 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 Business Scraper

Fast Google Maps lead scraper for clean local business lists.

Enter business keywords and locations. The actor returns a simple, sales-ready dataset with business names, categories, ratings, addresses, phone numbers, websites, and Google Maps URLs.

### Why This Actor Is Fast

Most Google Maps scrapers open every business listing page one by one. That is slow and expensive.

This actor uses a faster direct map-response parser. It loads each Google Maps search, captures the structured map results response, and parses business records directly. This makes it suitable for high-volume lead discovery where speed and compute cost matter.

In testing, a 6-keyword New York run produced 130 business rows in about 16 seconds of actor runtime.

### Best For

- Lead generation agencies
- Local SEO prospecting
- Sales teams building local business lists
- Market and competitor research
- CRM enrichment
- Business directory creation
- Fast keyword/location lead discovery

### Features

- Fast direct Google Maps response parsing
- Multiple keywords and locations in one run
- Clean lead-list dataset without unnecessary technical fields
- Business name, category, rating, address, phone, website, and Google Maps URL
- Phone number extraction when available in map results
- Website extraction when available in map results
- Configurable result limit per keyword/location
- Configurable parallel searches
- Optional sponsored-result inclusion
- CSV, Excel, JSON, XML, and API-ready output
- Run summary saved to key-value storage

### Input

| Field                     | Type    | Required | Description                                                                             |
| ------------------------- | ------- | -------- | --------------------------------------------------------------------------------------- |
| `keywords`                | array   | Yes      | Business types or services, such as `dentist`, `coffee shop`, `plumber`, or `law firm`. |
| `locations`               | array   | Yes      | Cities, regions, neighborhoods, or postal areas.                                        |
| `maxResultsPerSearch`     | integer | No       | Maximum businesses to save per keyword/location pair. Default: `50`.                    |
| `maxConcurrency`          | integer | No       | Parallel keyword/location searches. Default: `3`, maximum: `6`.                         |
| `language`                | string  | No       | Google Maps language code. Default: `en`.                                               |
| `includeSearchMetadata`   | boolean | No       | Adds keyword and location fields to each result. Default: `true`.                       |
| `includeSponsoredResults` | boolean | No       | Includes sponsored listings when Google returns them. Default: `true`.                  |

### Example Input

```json
{
    "keywords": ["dentist", "coffee shop", "plumber", "gym", "real estate agent", "law firm"],
    "locations": ["New York, USA"],
    "maxResultsPerSearch": 25,
    "maxConcurrency": 3,
    "language": "en",
    "includeSearchMetadata": true,
    "includeSponsoredResults": true
}
```

### Output

Each dataset item uses a clean lead-list structure:

```json
{
    "searchKeyword": "plumber",
    "searchLocation": "New York, USA",
    "name": "RR Plumbing Roto-Rooter",
    "category": "Plumber",
    "rating": 4.8,
    "address": "450 7th Ave Ste B, New York, NY 10123, United States",
    "phone": "+1 212-687-1215",
    "website": "https://www.rotorooter.com/manhattan/",
    "googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=RR%20Plumbing%20Roto-Rooter"
}
```

### Output Fields

| Field            | Description                                             |
| ---------------- | ------------------------------------------------------- |
| `searchKeyword`  | Keyword used for the search, if metadata is enabled.    |
| `searchLocation` | Location used for the search, if metadata is enabled.   |
| `name`           | Business name from Google Maps.                         |
| `category`       | Primary business category.                              |
| `rating`         | Google Maps rating when available.                      |
| `address`        | Business address when available.                        |
| `phone`          | Phone number when Google exposes it in map results.     |
| `website`        | Business website when Google exposes it in map results. |
| `googleMapsUrl`  | Google Maps search URL for the business.                |

### Performance

Performance depends on Google Maps response speed, location breadth, and result availability. In testing:

- 130 rows extracted in about 16 seconds of actor runtime
- 124/130 rows included phone numbers
- 113/130 rows included websites
- 130/130 rows included names, ratings, and Maps URLs

Google may return around 20-25 strong results per keyword/location response. For larger datasets, use multiple keywords, multiple nearby locations, or neighborhood-level searches.

### Limitations

- Phone numbers and websites are only returned when Google exposes them in map results.
- This actor is optimized for fast lead lists, not full place-detail pages or review scraping.
- Google Maps results vary by language, region, time, and ranking changes.
- Very broad locations can return mixed regional results.
- Google may rate limit or change response structures.
- Users are responsible for complying with Google Maps terms and applicable laws.

### Recommended Pricing

Recommended Apify pricing model: paid per result.

Suggested price: `$4 per 1,000 results`.

Reason: customers are buying usable local business leads, not browser waiting time. Per-result pricing is simple, marketplace-friendly, and fair because buyers pay only for saved rows.

### Marketplace Text

Short description: Fast Google Maps lead scraper for clean business lists with names, categories, ratings, addresses, phones, websites, and Maps URLs.

Long description: Build local business lead lists from Google Maps keyword and location searches. This actor is optimized for speed and clean output, using direct map-response parsing instead of opening every business page. It is useful for sales prospecting, local SEO research, agency lead generation, competitor research, and CRM enrichment.

Use cases: local lead generation, sales prospecting, local SEO audits, market research, competitor lists, business directory creation, CRM enrichment.

Search keywords: `google maps scraper`, `business leads`, `local business scraper`, `lead generation`, `local SEO`, `sales leads`, `business data`, `maps scraper`, `phone number scraper`, `website scraper`, `CRM enrichment`, `local prospecting`.

# Actor input Schema

## `keywords` (type: `array`):

Business types, niches, or services to search for. Add one keyword per line.

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

Cities, regions, neighborhoods, or postal areas to search in. Add one location per line.

## `maxResultsPerSearch` (type: `integer`):

Maximum number of businesses to save for each keyword and location combination.

## `maxConcurrency` (type: `integer`):

How many keyword/location searches can be processed in parallel. Use 2-3 for stability, up to 6 for faster runs with more memory.

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

Language code used for Google Maps results and labels.

## `includeSearchMetadata` (type: `boolean`):

Adds searchKeyword and searchLocation to every dataset item.

## `includeSponsoredResults` (type: `boolean`):

Includes Google Maps sponsored listings when they appear in the map results.

## Actor input object example

```json
{
  "keywords": [
    "dentist",
    "coffee shop"
  ],
  "locations": [
    "New York, USA"
  ],
  "maxResultsPerSearch": 50,
  "maxConcurrency": 3,
  "language": "en",
  "includeSearchMetadata": true,
  "includeSponsoredResults": true
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "dentist",
        "coffee shop"
    ],
    "locations": [
        "New York, USA"
    ],
    "maxResultsPerSearch": 50,
    "maxConcurrency": 3,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("seeb/google-maps-business-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 = {
    "keywords": [
        "dentist",
        "coffee shop",
    ],
    "locations": ["New York, USA"],
    "maxResultsPerSearch": 50,
    "maxConcurrency": 3,
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("seeb/google-maps-business-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 '{
  "keywords": [
    "dentist",
    "coffee shop"
  ],
  "locations": [
    "New York, USA"
  ],
  "maxResultsPerSearch": 50,
  "maxConcurrency": 3,
  "language": "en"
}' |
apify call seeb/google-maps-business-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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