# 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
- **Features:** Limited permissions
- **Stats:** 38 total users, 4 monthly users, 97.5% 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?

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

### 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.

# Changelog

This Actor's version history is a separate document: https://apify.com/scrape.badger/google-maps-scraper/changelog.md

# 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/mQZ9UzDfqHxbCzpgs/openapi.json
