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

Scrape Google Maps at scale — business names, addresses, phones, websites, ratings, reviews, categories, hours, and more. Pure HTTP, no browser. 3x faster than alternatives. Export as JSON, CSV, or Excel. Connect via API, webhooks, Zapier, Make, or as a tool for AI agents like Claude and ChatGPT.

- **URL**: https://apify.com/crustapi/google-maps-scraper.md
- **Developed by:** [Crust](https://apify.com/crustapi) (community)
- **Categories:** Lead generation, Travel, AI
- **Stats:** 7 total users, 3 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.30 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper

### 🗺️ What is Google Maps Scraper?

Google Maps Scraper pulls business data straight from Google Maps — names, addresses, phone numbers, websites, ratings, reviews, opening hours, and more. No API key. No browser. Just fast, structured data.

#### Why is it so fast?

Most scrapers open a headless browser, wait for JavaScript to render, then scroll through results one by one. This scraper skips all of that. It sends direct HTTP requests to Google's internal endpoints, which means:

- **100 places in under 20 seconds** (3-5x faster than browser-based scrapers)
- **Lower compute costs** — no Chrome instance eating up memory
- **Higher reliability** — no page crashes, no element selectors to break

#### What data do you get?

Every place comes back with 20+ fields, automatically enriched with review counts and descriptions:

| | |
|---|---|
| 🏷️ Business name | 🆔 Google Place ID and CID |
| 🌐 Google Maps URL | 📝 Business description |
| 📍 Full address | 🏠 Street address |
| 🏙️ City and state | 📮 Postal code and country |
| 🗺️ Latitude and longitude | 📞 Phone number (formatted and raw) |
| 🌍 Website URL | 🏪 Primary category |
| 📂 All categories | ⭐ Star rating |
| 💬 Total review count | 🕐 Today's hours |
| 🚫 Permanently closed status | 📅 Scraped timestamp |

### ⬇️ Input

#### Search term(s)

Add one or more search terms — each runs as a separate Google Maps search, and results are combined and deduplicated automatically. Works exactly like the Google Maps search bar:

````

hotel
dentist near me
coworking space
HVAC contractor
Starbucks

```

You can add multiple terms in a single run. For example, searching `hotel` + `motel` + `hostel` in one location gives you all three result sets combined.

#### Location

Type any city, state, country, or street address. We convert it to coordinates automatically — no need to look up lat/lng yourself.

```

New York, USA
Miami, FL
London, UK
Tokyo, Japan

````

Defaults to New York City if left blank.

#### Number of places to extract

Controls how many results you want. Default is **100**. The scraper pages through Google Maps results automatically until it hits your limit.

Google Maps returns ~500 results per search term, so to get larger datasets, add multiple search terms or run separate queries with different locations.

#### Language

Sets the language for place names, addresses, and descriptions. Supports 16 languages: English, Spanish, French, German, Italian, Portuguese, Japanese, Korean, Chinese, Arabic, Russian, Dutch, Polish, Turkish, Thai, and Vietnamese.

### ⬆️ Output

Results land in an Apify dataset that you can browse, filter, and export.

#### Output tabs

Your results are organized into three views:

- **Overview** — Business name, category, address, rating, review count, website, phone, and Google Maps link. The quick-glance view.
- **Contact info** — Phone numbers, website, and full address breakdown (street, city, state, postal code, country). Built for CRM imports.
- **Ratings & Reviews** — Star rating, review count, description, categories, and business status. Great for filtering and prioritization.

#### Export formats

Download your data as **JSON**, **CSV**, **Excel**, **XML**, or **HTML** — or pull it programmatically through the Apify API.

#### Sample output

Here's what a single place looks like in JSON:

```json
{
    "title": "LOS TACOS No.1",
    "placeId": "ChIJ6WooklRYwokR3qd-J59t-k0",
    "cid": "0x89c2585492286ae9:0x4dfa6d9f277ea7de",
    "url": "https://www.google.com/maps/place/?q=place_id:ChIJ6WooklRYwokR3qd-J59t-k0",
    "address": "229 W 43rd St, New York, NY 10036, United States",
    "street": "229 W 43rd St",
    "city": "New York",
    "state": "New York",
    "postalCode": "10036",
    "countryCode": "US",
    "location": {
        "lat": 40.7573214,
        "lng": -73.9876540
    },
    "phone": null,
    "phoneUnformatted": null,
    "website": "http://www.lostacos1.com/",
    "categoryName": "Taco restaurant",
    "categories": [
        "Taco restaurant",
        "Mexican restaurant"
    ],
    "totalScore": 4.8,
    "reviewsCount": 12717,
    "description": "Small pit stop with standing tables serving authentic Mexican street food.",
    "openingHours": [
        {
            "day": "Thursday",
            "hours": ["11 AM–12 AM"]
        }
    ],
    "permanentlyClosed": false,
    "scrapedAt": "2026-04-09T10:25:21.625Z"
}
````

### 🔥 Tips for better results

#### Cast a wide net, then filter

It's better to scrape more places and filter afterward than to run a narrow search and miss results. Google Maps doesn't always return businesses in the order you'd expect — casting a wider net ensures you catch everything.

#### Use specific search terms

`"hotel"` returns hotels. `"boutique hotel"` returns boutique hotels. `"Hilton"` returns Hilton locations. The more specific your query, the more relevant your results.

#### Break large areas into smaller locations

If you're scraping an entire country, don't just search `"USA"`. Google Maps caps results at ~500 per query. Instead, break it into cities: `"New York"`, `"Los Angeles"`, `"Chicago"`, etc. You'll get far more complete coverage.

#### Schedule recurring runs

Use Apify's built-in scheduler for daily, weekly, or monthly scrapes. This is useful for tracking new businesses opening up, monitoring review counts over time, or keeping your lead database fresh.

### 💰 How much does it cost?

Google Maps Scraper costs **$3.90 per 1,000 places** (~$0.004 per place), plus a small Apify platform compute fee.

| Volume | Actor cost | Estimated total |
|---|---|---|
| 100 places (test run) | $0.39 | Under $1 |
| 1,000 places | $3.90 | ~$5 |
| 10,000 places | $39 | ~$45 |
| 100,000 places | $390 | ~$450 |

The Apify Free plan gives you enough credits to scrape several hundred places. Higher subscription tiers get discounted compute rates automatically.

### 🔗 Integrations

Connect Google Maps Scraper to the rest of your stack:

- **Zapier and Make** — trigger workflows when a scrape finishes
- **Google Sheets** — push results directly to a spreadsheet
- **Webhooks** — get notified the moment your data is ready
- **Apify API** — pull results programmatically into any app
- **Slack, Airbyte, GitHub**, and [dozens more](https://docs.apify.com/integrations)

### ❓ FAQ

#### Is it legal to scrape Google Maps?

This scraper only extracts publicly visible business data. No login required, no private data accessed. See Apify's posts on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) and [ethical scraping](https://blog.apify.com/web-scraping-ethics/).

#### How is this different from other Google Maps scrapers?

Speed and cost. Most scrapers launch a headless browser to scroll through results. This one sends direct HTTP requests — no browser overhead, no waiting for pages to render. Every place also gets automatically enriched with review counts and descriptions via a second request.

#### What's the maximum number of results per run?

Google Maps returns ~500 results per search term. To go beyond that, add multiple search terms in a single run or run separate queries targeting different locations. There's no hard cap on our side — add as many search terms as you need.

#### Can I export data through the API?

Yes. The Apify API gives you RESTful endpoints to trigger runs, check status, and download results programmatically. See the [API docs](https://docs.apify.com/api/v2).

#### Something not working?

Open an issue on the actor's **Issues** tab and we'll look into it.

***

Built by CrustAPI

# Actor input Schema

## `query` (type: `array`):

Add one or more search terms. Each term runs as a separate Google Maps search — results are combined and deduplicated automatically.

## `location` (type: `string`):

City, state, country, or full address. We geocode it automatically so you don't need coordinates.

## `radiusMiles` (type: `integer`):

How far from the location to search. Use 1-5 for a neighborhood, 10-30 for a city, 50-100 for a metro area, or 500+ to cover a whole state/region.

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

How many places to extract for each search term. Google Maps returns up to ~500 per term. Use multiple search terms or locations to go higher.

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

Language for place names, addresses, and descriptions in results.

## Actor input object example

```json
{
  "query": [
    "hotel"
  ],
  "location": "New York, USA",
  "radiusMiles": 30,
  "maxResults": 100,
  "language": "en"
}
```

# Actor output Schema

## `places` (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 = {
    "query": [
        "hotel"
    ],
    "location": "New York, USA",
    "radiusMiles": 30,
    "maxResults": 100,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crustapi/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 = {
    "query": ["hotel"],
    "location": "New York, USA",
    "radiusMiles": 30,
    "maxResults": 100,
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("crustapi/google-maps-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 '{
  "query": [
    "hotel"
  ],
  "location": "New York, USA",
  "radiusMiles": 30,
  "maxResults": 100,
  "language": "en"
}' |
apify call crustapi/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Scraper",
        "description": "Scrape Google Maps at scale — business names, addresses, phones, websites, ratings, reviews, categories, hours, and more. Pure HTTP, no browser. 3x faster than alternatives. Export as JSON, CSV, or Excel. Connect via API, webhooks, Zapier, Make, or as a tool for AI agents like Claude and ChatGPT.",
        "version": "0.0",
        "x-build-id": "JvhCwE6BpJj2b65KP"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crustapi~google-maps-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crustapi-google-maps-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/crustapi~google-maps-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crustapi-google-maps-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/crustapi~google-maps-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crustapi-google-maps-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": [
                    "query"
                ],
                "properties": {
                    "query": {
                        "title": "🔎 Search term(s)",
                        "type": "array",
                        "description": "Add one or more search terms. Each term runs as a separate Google Maps search — results are combined and deduplicated automatically.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "hotel"
                        ]
                    },
                    "location": {
                        "title": "📍 Location (use only one location per run)",
                        "type": "string",
                        "description": "City, state, country, or full address. We geocode it automatically so you don't need coordinates.",
                        "default": "New York, USA"
                    },
                    "radiusMiles": {
                        "title": "📏 Search radius (miles)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How far from the location to search. Use 1-5 for a neighborhood, 10-30 for a city, 50-100 for a metro area, or 500+ to cover a whole state/region.",
                        "default": 30
                    },
                    "maxResults": {
                        "title": "💯 Number of places to extract (per each search term)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many places to extract for each search term. Google Maps returns up to ~500 per term. Use multiple search terms or locations to go higher.",
                        "default": 100
                    },
                    "language": {
                        "title": "🌍 Language",
                        "enum": [
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "ja",
                            "ko",
                            "zh",
                            "ar",
                            "ru",
                            "nl",
                            "pl",
                            "tr",
                            "th",
                            "vi"
                        ],
                        "type": "string",
                        "description": "Language for place names, addresses, and descriptions in results.",
                        "default": "en"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
