# Google Maps Scraper — Places, Reviews, Photos (`scrape.badger/google-maps-scraper`) Actor

Scrape Google Maps at scale: search places by keyword or location, fetch full place details (hours, contact, rating breakdown, popular times), reviews with topic filters, photos, and place posts. 200+ country domains, GPS + business-type targeting. No CAPTCHAs — handled by ScrapeBadger.

- **URL**: https://apify.com/scrape.badger/google-maps-scraper.md
- **Developed by:** [ScrapeBadger](https://apify.com/scrape.badger) (community)
- **Categories:** Developer tools, Automation, Lead generation
- **Stats:** 25 total users, 4 monthly users, 97.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 maps pages

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Google Maps Scraper do?

Scrape [Google Maps](https://www.google.com/maps) at scale — search places by keyword and location, fetch full place details (hours, contact, rating breakdown, popular times), list reviews with topic filters, photos, and merchant posts.

### Why use Google Maps Scraper?

- **Five modes, one actor.** Search Places → Get Place Detail → List Reviews / Photos / Posts — the full Google Maps data surface.
- **GPS viewport targeting.** `@lat,lng,zoom` for pinpoint area searches.
- **Business-type filters.** `restaurant`, `hotel`, `coffee_shop`, `gas_station`, `gym` — 4,000+ Google categories.
- **200+ country domains.** Local rankings with `gl` + `hl` targeting.
- **Reviews sort + topic filter.** `newestFirst`, `highestRating`, filter by topic keyword.

### What data can Google Maps Scraper extract?

| Field | Type | Description |
|---|---|---|
| title | string | Place name |
| place\_id | string | Google Place ID (ChIJ…) |
| data\_id | string | Google Maps data\_id (0x…:0x…) |
| rating | number | Average star rating |
| reviews | number | Total review count |
| address | string | Formatted street address |
| phone | string | Phone number |
| website | string | Business website |
| gps\_coordinates | object | `{lat, lng}` |
| hours | object | Weekly opening hours |
| type | array | Google category slugs |
| photos / reviews / posts | array | In per-mode calls — see the matching micro-actors for batch workflows |

### How to scrape Google Maps

1. Click **Try for free**.
2. Pick a `mode`: `Search Places`, `Get Place Detail`, `List Reviews`, `List Photos`, or `List Posts`.
3. Fill in the required input — `q` for Search Places, `place_id` for the detail / list modes.
4. Optional: set `gl`, `hl`, GPS `ll` viewport, `type` business category.
5. For list modes, set `max_pages` (1-20).
6. Click **Start** — results stream per-place into the dataset.

### How much will it cost?

**$0.003 per page (search / reviews / photos / posts) · $0.005 per Place Detail.** One credit-equivalent per API call. `List Reviews` with `max_pages: 10` is 10 calls = $0.03. `Get Place Detail` is a single richer call.

#### Competitor benchmark

| Actor | Author | Price | Notes |
|---|---|---|---|
| compass/crawler-google-places | Compass | ~$7 / 1k places | Most popular, per-place pricing |
| apify/google-maps-scraper | Apify | ~$9 / 1k places | Official Apify actor |
| lukas\_krivka/google-maps-with-contact-details | Lukas Krivka | ~$5 / 1k | Contact-focused |
| **scrape-badger/google-maps-scraper** | **ScrapeBadger** | **$3 / 1k pages** | **Undercuts every major** |

### Input

Configure the run in the **Input** tab above, or pass a JSON object matching the fields below when calling the Actor via the Apify API.

| Field | Required | Description |
|---|---|---|
| mode | ✅ | `Search Places` / `Get Place Detail` / `List Reviews` / `List Photos` / `List Posts`. |
| q | Search only | Search query. |
| place\_id | Detail / list modes | Google Place ID (ChIJ…). |
| data\_id | — | Alternative to place\_id for list modes. |
| ll | — | GPS viewport `@lat,lng,zoom`. |
| gl / hl | — | Country + language. |
| type | — | Business category (Search only). |
| sort\_by / topic\_id | — | Reviews-only filters. |
| max\_pages | — | 1-20 for list modes. |

### Output

Every successful run streams records into the run's dataset. Download as JSON, CSV, XML, Excel, or HTML from the **Dataset** tab; consume programmatically via the Apify API or webhooks.

Example record:

```json
{
  "title": "Blue Bottle Coffee",
  "place_id": "ChIJ_3Su08fj5UYRkFfNoiuWQUk",
  "rating": 4.6,
  "reviews": 1284,
  "address": "1 Rockefeller Plaza, New York, NY 10020",
  "phone": "+1 212-555-0198",
  "website": "https://bluebottlecoffee.com/",
  "gps_coordinates": {
    "lat": 40.758,
    "lng": -73.978
  },
  "type": [
    "cafe",
    "coffee_shop"
  ]
}
```

### Tips / Advanced options

- **Pipe Search → List Reviews.** Run `Search Places` first, pipe each `place_id` through `google-maps-reviews-scraper` for 100% batch efficiency.
- **GPS viewport beats `q`-based searches for hyperlocal ranking.** Google ranks results differently when you pass `ll` vs. a text-based location in the query.
- **Reviews volume estimate.** Each reviews page ≈ 10 reviews. Budget `max_pages` accordingly.
- **Use micro-actors for single-purpose batch workflows.** `google-maps-reviews-scraper` and `google-maps-photos-scraper` accept many place\_ids per run — one Apify job instead of N.

### FAQ, Disclaimers, Support

#### What's the difference between `place_id` and `data_id`?

`place_id` starts with `ChIJ…` and is Google's durable place identifier. `data_id` (`0x…:0x…`) is Google Maps' internal ID. Either works for list modes; the actor normalises them.

#### Does this include reviews?

Yes — use `mode: List Reviews` or the dedicated `google-maps-reviews-scraper` for batch workflows.

#### Can I filter by opening hours?

Google doesn't expose that as a filter; you'll have to post-filter the output's `hours` field.

#### What's `ludocid`?

Google's Location Document ID (the numeric ID in `cid=` URL parameters). Alternative to `place_id` for direct-lookup.

#### Disclaimer

This Actor scrapes public Google data only. You're responsible for compliance with Google's Terms of Service and any applicable data-protection laws (GDPR, CCPA, etc.) in your jurisdiction. ScrapeBadger does not store the scraped results — they are delivered directly to your Apify dataset.

#### Support

Something not working? Open a ticket in the **Issues** tab above — we triage within one business day. Full API reference: [docs.scrapebadger.com](https://docs.scrapebadger.com).

#### Related Actors

- [`google-maps-reviews-scraper`](https://apify.com/scrape-badger/google-maps-reviews-scraper) — Reviews-only, batch place\_ids
- [`google-maps-photos-scraper`](https://apify.com/scrape-badger/google-maps-photos-scraper) — Photos-only, batch place\_ids

#### Powered by

[ScrapeBadger](https://scrapebadger.com) — Google-optimised residential proxy pool + browser-farm fallback, 99.7% uptime, unmetered bandwidth. No CAPTCHAs reach you.

# Actor input Schema

## `mode` (type: `string`):

Pick the Maps call to run. Each mode uses different required inputs.

## `q` (type: `string`):

Search text (e.g. <b>pizza in New York</b>). Required for <b>Search Places</b> unless a place\_id / ludocid is provided.

## `ll` (type: `string`):

Optional map viewport in <b>@lat,lng,zoom</b> format. Example: <b>@40.745,-74.008,14z</b>. Defaults to country capital at city zoom.

## `gl` (type: `string`):

ISO 3166-1 alpha-2 country code (lowercase).

## `hl` (type: `string`):

Language code for the response (BCP-47, e.g. 'en', 'en-GB', 'de'). Affects result language and locale-specific labels.

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

Google business category slug: <b>restaurant</b>, <b>hotel</b>, <b>coffee\_shop</b>, <b>gas\_station</b>, etc. Optional.

## `place_id` (type: `string`):

Google Place ID (<b>ChIJ…</b>). Required for <b>Get Place Detail</b>, <b>List Reviews</b>, <b>List Photos</b>, <b>List Posts</b> unless data\_id is provided.

## `data_id` (type: `string`):

Google Maps data\_id (<b>0x…:0x…</b>) — alternative to place\_id for reviews / photos / posts.

## `ludocid` (type: `string`):

Google Location Document ID. Alternative to place\_id for Search Places direct-lookup.

## `sort_by` (type: `string`):

Order in which Google should return reviews. mostRelevant returns Google's quality-ranked default; newestFirst chronological; highestRating / lowestRating sort by stars.

## `topic_id` (type: `string`):

Filter reviews by a Google-provided topic keyword (e.g. <b>service</b>, <b>food</b>). Optional.

## `max_pages` (type: `integer`):

How many pages of results to fetch. Each page = 1 API call (credits). Applies to <b>Search Places</b>, <b>List Reviews</b>, <b>List Photos</b>, <b>List Posts</b>.

## Actor input object example

```json
{
  "mode": "Search Places",
  "q": "best coffee shops",
  "gl": "us",
  "hl": "en",
  "sort_by": "mostRelevant",
  "max_pages": 3
}
```

# Actor output Schema

## `dataset` (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 = {
    "q": "best coffee shops"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrape.badger/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 = { "q": "best coffee shops" }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrape.badger/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/UlYSnsRt8jMdUT3EB/builds/rvjokNptqOubvZNOx/openapi.json
