# Google Maps Business Leads Scraper (`paduchak/google-maps-business-leads-scraper`) Actor

Collect business listings from Google Maps search results and export them as structured records in an Apify Dataset.

- **URL**: https://apify.com/paduchak/google-maps-business-leads-scraper.md
- **Developed by:** [Dmytro Paduchak](https://apify.com/paduchak) (community)
- **Categories:** Other, Travel, Real estate
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Leads Scraper

Collect business listings from Google Maps search results and export them as structured records in an Apify Dataset.

Use this Actor to build local lead lists, enrich CRM data, research competitors, map locations in a market, or collect business contact details for sales and operations workflows. Enter a search like `coffee shops in London`, choose how many results you want, and the Actor returns business names, categories, addresses, websites, phone numbers, ratings, opening hours, coordinates, and Google Maps URLs when available.

No Google Maps API key is required.

### What You Can Use It For

- Build prospect lists by city, niche, or service category
- Find local businesses with websites, phone numbers, and addresses
- Research competitors in a target area
- Collect store, restaurant, clinic, agency, venue, or service-provider locations
- Feed business data into CRM, spreadsheets, BI tools, or enrichment workflows
- Monitor public business listings for market research

### Input

Configure the Actor with a simple JSON input:

```json
{
  "searchQuery": "coffee shops in London",
  "maxResults": 100,
  "language": "en",
  "country": "uk",
  "apifyProxy": true,
  "apifyProxyGroups": ["RESIDENTIAL", "DATACENTER"],
  "proxyCountries": [],
  "proxyUrls": [],
  "proxySessionRetries": 2,
  "adaptiveThrottle": true
}
````

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQuery` | `string` | required | Search phrase to run on Google Maps, such as `dentists in Manchester` or `plumbers in Austin`. |
| `maxResults` | `number` | `50` | Maximum number of unique businesses to save. |
| `language` | `string` | `"en"` | Preferred Google Maps interface language. |
| `country` | `string` | - | Optional country hint, such as `uk`, `us`, `de`, or `fr`. |
| `apifyProxy` | `boolean` | `true` | Enable Apify Proxy for more reliable scraping. |
| `apifyProxyGroups` | `string[]` | `["RESIDENTIAL", "DATACENTER"]` | Proxy pools: `RESIDENTIAL`, `DATACENTER`, `SERP`. |
| `proxyCountries` | `string[]` | `[]` | Route through specific countries using ISO 2-letter country codes. |
| `proxyUrls` | `string[]` | `[]` | Custom proxy URLs. If provided, these override Apify Proxy. |
| `proxySessionRetries` | `number` | `2` | Number of retryable browser sessions after blocking, empty results, or navigation failures. |
| `adaptiveThrottle` | `boolean` | `true` | Automatically slows down when Google Maps loads slowly, returns sparse results, or shows blocking signals. |
| `baseThrottleDelayMs` | `number` | `250` | Starting adaptive delay before business-card actions. |
| `maxThrottleDelayMs` | `number` | `10000` | Maximum adaptive delay. |
| `slowLoadThresholdMs` | `number` | `12000` | Load duration that causes the Actor to increase adaptive delay. |

### Output

Each result is saved to the default Apify Dataset as one business record.

```json
{
  "businessName": "Example Coffee",
  "category": "Coffee shop",
  "rating": 4.6,
  "reviewCount": 321,
  "address": "10 Example Street, London",
  "phone": "+44 1234 567890",
  "website": "https://example.com/",
  "googleMapsUrl": "https://www.google.com/maps/place/Example+Coffee/...",
  "latitude": 51.5072,
  "longitude": -0.1276,
  "placeId": "0x487...",
  "openingHours": ["Monday: 8 AM-6 PM"],
  "sourceQuery": "coffee shops in London",
  "scrapedAt": "2026-05-08T12:00:00.000Z"
}
```

Some fields may be missing when they are not publicly visible on a business listing. The Actor still saves the available data and continues with the next result.

### How It Works

The Actor opens public Google Maps search results, loads the listings for your query, visits each business profile, extracts available business data, skips duplicates, and stores clean records in the dataset.

Deduplication uses:

- Google Maps URL
- place ID
- business name plus address

### Reliability Notes

Google Maps can show captcha or automated-traffic blocking, especially on repeated runs, high result counts, or datacenter IPs. The Actor detects common blocking pages and fails clearly instead of silently saving bad data.

For larger production runs:

- Enable `apifyProxy`
- Set `apifyProxyGroups`, `proxyCountries`, or `proxyUrls` when you need a specific proxy pool or geography
- Increase `proxySessionRetries` and `maxThrottleDelayMs` for long or sensitive runs
- Keep each query reasonably focused
- Prefer moderate `maxResults` values
- Run searches at a steady cadence
- Review output quality before scaling to many queries

### No API Key Required

This Actor collects publicly visible Google Maps listing data. It does not use the Google Maps API and does not require a Google API key.

### Legal Disclaimer

This Actor is intended for academic, educational, and research purposes only. Users are responsible for ensuring that their use of this tool complies with Google's [Terms of Service](https://policies.google.com/terms), [Google Maps Terms](https://www.google.com/help/terms_maps/), and any applicable local laws regarding data privacy and scraping (such as GDPR or CCPA).

Automated access to Google services may be restricted. We do not encourage or condone the use of this tool for any activity that violates the rights of others or the service provider.

# Actor input Schema

## `searchQuery` (type: `string`):

Google Maps search query, for example: coffee shops in London.

## `maxResults` (type: `integer`):

Maximum number of unique business records to save. For faster runs, keep this value low (e.g., 20).

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

Google interface language passed as the hl URL parameter.

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

Optional country hint passed as the gl URL parameter, for example uk, us, de, fr.

## `apifyProxy` (type: `boolean`):

Enable Apify Proxy for more reliable scraping.

## `apifyProxyGroups` (type: `array`):

Proxy pools: RESIDENTIAL, DATACENTER, SERP.

## `proxyCountries` (type: `array`):

Route through specific countries using ISO 2-letter country codes.

## `proxyUrls` (type: `array`):

Custom proxy URLs. If provided, these override Apify Proxy.

## `proxySessionRetries` (type: `integer`):

How many times to retry the browser scrape with a fresh proxy session after blocking, empty results, or navigation failures.

## `adaptiveThrottle` (type: `boolean`):

Automatically increases delays when Google Maps loads slowly, returns sparse results, or shows blocking signals.

## `baseThrottleDelayMs` (type: `integer`):

Starting delay before business-card actions. The adaptive throttle can increase from this value.

## `maxThrottleDelayMs` (type: `integer`):

Upper limit for adaptive delays.

## `slowLoadThresholdMs` (type: `integer`):

Load duration that causes adaptive throttling to slow down future actions.

## Actor input object example

```json
{
  "searchQuery": "coffee shops in London",
  "maxResults": 20,
  "language": "en",
  "apifyProxy": true,
  "apifyProxyGroups": [
    "RESIDENTIAL"
  ],
  "proxyCountries": [],
  "proxyUrls": [],
  "proxySessionRetries": 2,
  "adaptiveThrottle": true,
  "baseThrottleDelayMs": 250,
  "maxThrottleDelayMs": 10000,
  "slowLoadThresholdMs": 12000
}
```

# Actor output Schema

## `businesses` (type: `string`):

Business records scraped from public Google Maps search results.

# 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 = {
    "searchQuery": "coffee shops in London",
    "apifyProxyGroups": [
        "RESIDENTIAL"
    ],
    "proxyCountries": [],
    "proxyUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("paduchak/google-maps-business-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 = {
    "searchQuery": "coffee shops in London",
    "apifyProxyGroups": ["RESIDENTIAL"],
    "proxyCountries": [],
    "proxyUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("paduchak/google-maps-business-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 '{
  "searchQuery": "coffee shops in London",
  "apifyProxyGroups": [
    "RESIDENTIAL"
  ],
  "proxyCountries": [],
  "proxyUrls": []
}' |
apify call paduchak/google-maps-business-leads-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Business Leads Scraper",
        "description": "Collect business listings from Google Maps search results and export them as structured records in an Apify Dataset.",
        "version": "0.0",
        "x-build-id": "QOxfsT2I3IIdQlVWw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/paduchak~google-maps-business-leads-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-paduchak-google-maps-business-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/paduchak~google-maps-business-leads-scraper/runs": {
            "post": {
                "operationId": "runs-sync-paduchak-google-maps-business-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/paduchak~google-maps-business-leads-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-paduchak-google-maps-business-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "searchQuery"
                ],
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Google Maps search query, for example: coffee shops in London."
                    },
                    "maxResults": {
                        "title": "Maximum Results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of unique business records to save. For faster runs, keep this value low (e.g., 20).",
                        "default": 20
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Google interface language passed as the hl URL parameter.",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Optional country hint passed as the gl URL parameter, for example uk, us, de, fr."
                    },
                    "apifyProxy": {
                        "title": "Enable Apify Proxy",
                        "type": "boolean",
                        "description": "Enable Apify Proxy for more reliable scraping.",
                        "default": true
                    },
                    "apifyProxyGroups": {
                        "title": "Apify Proxy Groups",
                        "type": "array",
                        "description": "Proxy pools: RESIDENTIAL, DATACENTER, SERP.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "RESIDENTIAL",
                                "DATACENTER",
                                "SERP"
                            ]
                        },
                        "default": [
                            "RESIDENTIAL"
                        ]
                    },
                    "proxyCountries": {
                        "title": "Proxy Countries",
                        "type": "array",
                        "description": "Route through specific countries using ISO 2-letter country codes.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "proxyUrls": {
                        "title": "Custom Proxy URLs",
                        "type": "array",
                        "description": "Custom proxy URLs. If provided, these override Apify Proxy.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "proxySessionRetries": {
                        "title": "Proxy Session Retries",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "How many times to retry the browser scrape with a fresh proxy session after blocking, empty results, or navigation failures.",
                        "default": 2
                    },
                    "adaptiveThrottle": {
                        "title": "Adaptive Throttle",
                        "type": "boolean",
                        "description": "Automatically increases delays when Google Maps loads slowly, returns sparse results, or shows blocking signals.",
                        "default": true
                    },
                    "baseThrottleDelayMs": {
                        "title": "Base Throttle Delay (ms)",
                        "minimum": 0,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "Starting delay before business-card actions. The adaptive throttle can increase from this value.",
                        "default": 250
                    },
                    "maxThrottleDelayMs": {
                        "title": "Max Throttle Delay (ms)",
                        "minimum": 0,
                        "maximum": 120000,
                        "type": "integer",
                        "description": "Upper limit for adaptive delays.",
                        "default": 10000
                    },
                    "slowLoadThresholdMs": {
                        "title": "Slow Load Threshold (ms)",
                        "minimum": 1000,
                        "maximum": 120000,
                        "type": "integer",
                        "description": "Load duration that causes adaptive throttling to slow down future actions.",
                        "default": 12000
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
