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

Scrape Google Maps business listings: names, addresses, phones, websites, ratings, hours, and coordinates. Bulk keyword search or direct place URLs. Essential for local SEO and lead generation.

- **URL**: https://apify.com/emperor1978/google-maps-scraper.md
- **Developed by:** [The Emperor](https://apify.com/emperor1978) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 result items

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 Business Scraper

Extract rich business data from Google Maps using keyword searches or direct place URLs. No API key required.

### What it does

This actor opens Google Maps in a real Chromium browser (via Playwright), runs your search queries, and scrapes the full details for every business listing it finds — just like a human would, but at scale and with structured JSON output.

### Features

- Search by keyword: "restaurants in Austin TX", "plumbers near 90210", "gyms downtown Chicago"
- Scrape direct place URLs (useful when you already have a list of Google Maps links)
- Extracts **all key business fields**: name, category, address, phone, website, star rating, review count, opening hours, photos gallery link, latitude/longitude, Google place_id
- Handles Google's cookie consent page automatically
- Paginates through search results to meet your `maxResults` target
- Rotates Apify residential proxies per request to avoid IP bans
- Retries failed requests up to 3 times with exponential backoff
- Configurable concurrency (parallel tabs) and result limits

### Output fields

Each scraped record contains:

| Field | Type | Description |
|---|---|---|
| `place_id` | string | Google's unique identifier (e.g. `ChIJN1t_tDeuEmsRUsoyG83frY4`) |
| `name` | string | Business name |
| `category` | string | Primary Google Maps category (e.g. "Italian restaurant") |
| `address` | string | Full street address |
| `phone` | string | Listed phone number |
| `website` | string | Business website URL |
| `rating` | number | Average star rating (1.0–5.0) |
| `review_count` | integer | Total number of Google reviews |
| `hours` | object | Opening hours by day: `{ "Monday": "9 AM – 5 PM", ... }` |
| `photos_url` | string | Link to the Google Maps photos gallery |
| `lat` | number | Latitude |
| `lng` | number | Longitude |
| `maps_url` | string | Full Google Maps URL for this place |
| `search_query` | string | The query that surfaced this result |
| `scraped_at` | string | ISO 8601 timestamp |

### Input

#### Search by keyword

```json
{
  "searchQueries": [
    "coffee shops in Seattle WA",
    "pizza restaurants Austin TX"
  ],
  "maxResults": 50,
  "country": "US"
}
```

#### Scrape specific places by URL

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Space+Needle/@47.6205,-122.3493,17z",
    "https://www.google.com/maps/place/Pike+Place+Market/@47.6094,-122.3424,17z"
  ]
}
```

#### Lead generation — find local businesses

```json
{
  "searchQueries": [
    "plumbers in Denver CO",
    "electricians in Denver CO",
    "HVAC contractors in Denver CO"
  ],
  "maxResults": 100,
  "maxConcurrency": 5,
  "country": "US",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### Multi-city restaurant research

```json
{
  "searchQueries": [
    "sushi restaurants in New York City",
    "sushi restaurants in Los Angeles CA",
    "sushi restaurants in Chicago IL"
  ],
  "maxResults": 30,
  "language": "en",
  "country": "US"
}
```

### Input schema reference

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | string\[] | `[]` | Google Maps search queries |
| `placeUrls` | string\[] | `[]` | Direct Google Maps place URLs |
| `maxResults` | integer | `20` | Max results per query (max 200) |
| `maxConcurrency` | integer | `3` | Parallel browser tabs (max 8) |
| `language` | string | `"en"` | Maps UI language code |
| `country` | string | `"US"` | Proxy geo-targeting country (ISO 3166-1 alpha-2) |
| `proxyConfig` | object | residential | Apify proxy configuration |

At least one of `searchQueries` or `placeUrls` is required.

### Use cases

**Local lead generation** — Build prospect lists of businesses in a target city and vertical. Export to CSV for cold outreach.

**Competitive intelligence** — Monitor competitor ratings, review counts, and hours over time. Track new locations opening in your market.

**Market research** — Identify density of business types in geographic areas. Map where certain industries cluster.

**Directory & aggregator sites** — Power a local directory website with up-to-date business data without building a Maps integration.

**Review analysis** — Collect business metadata as a precursor to scraping individual reviews (using a separate reviews actor).

**Real estate & site selection** — Analyse what business categories exist in a given area as part of site selection research.

### Performance & cost estimates

| Queries | Max results each | Approx. time | Approx. cost |
|---|---|---|---|
| 1 | 20 | ~2 min | ~$0.05 |
| 5 | 50 | ~8 min | ~$0.25 |
| 10 | 100 | ~20 min | ~$0.60 |
| 1 | 200 | ~15 min | ~$0.45 |

Actual times depend on Google's response speed and proxy availability. Using more concurrency reduces time but increases memory use.

### Proxy recommendations

**Residential proxies are strongly recommended.** Google Maps is aggressive about rate-limiting datacenter IPs. Apify's RESIDENTIAL proxy group routes requests through real home IP addresses.

Set `country` to match the country of your search queries for best results (e.g., `"US"` for US searches, `"GB"` for UK searches).

### Technical notes

- Built with [Crawlee](https://crawlee.dev/) `PlaywrightCrawler` and Chromium
- Automatically handles Google's cookie/consent page in all EU/EEA regions
- Uses session pooling to rotate browser fingerprints
- Exponential backoff on failures (3 retries per request)
- Data is streamed to the Apify dataset in real-time as each place is scraped

### Legal disclaimer

**This actor is provided for informational and legitimate research purposes only.**

Users are solely responsible for ensuring their use of this actor complies with:

- [Google's Terms of Service](https://policies.google.com/terms)
- Google Maps Platform Terms of Service
- Google's `robots.txt` restrictions
- Applicable data protection laws (GDPR, CCPA, etc.)

Scraping Google Maps at high volume may violate their Terms of Service. The actor's author and Apify assume no legal liability for misuse. Use reasonable rate limits and do not re-sell scraped data in violation of Google's terms.

For high-volume commercial use, consider the official [Google Places API](https://developers.google.com/maps/documentation/places/web-service/overview).

# Actor input Schema

## `searchQueries` (type: `array`):

Search terms to look up on Google Maps. Each query is scraped independently. Examples: "coffee shops in Seattle WA", "plumbers near 90210", "dentists Austin Texas".

## `placeUrls` (type: `array`):

Direct Google Maps place page URLs to scrape (optional). Use these when you already have specific business URLs. Example: https://www.google.com/maps/place/Space+Needle/@47.6205,-122.3493,17z

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

Maximum number of business listings to scrape per search query. Higher values take longer. Maximum allowed: 200.

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

Number of browser tabs to run in parallel. Higher values are faster but use more memory and are more likely to trigger rate limits. Recommended: 3–5.

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

Google Maps UI language code. Affects the language of extracted category names and hours labels. Use standard BCP 47 codes.

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

ISO 3166-1 alpha-2 country code for geo-targeting Apify residential proxies. Matches the country of your search queries for more accurate results.

## `proxyConfig` (type: `object`):

Apify proxy configuration. Leave blank to use the default residential proxy pool. Set to null to disable proxies entirely (not recommended for production).

## Actor input object example

```json
{
  "searchQueries": [
    "coffee shops in Seattle WA"
  ],
  "placeUrls": [],
  "maxResults": 20,
  "maxConcurrency": 3,
  "language": "en",
  "country": "US",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Scraped business data in the default dataset

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("emperor1978/google-maps-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("emperor1978/google-maps-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 '{}' |
apify call emperor1978/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,emperor1978/google-maps-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/6afhOWXY7426r3jGu/builds/WKdyWhDgZeWEYlXsr/openapi.json
