# Google Maps Reviews Scraper - $0.30 / 1000 Reviews (`scrapeunblocker/google-maps-reviews-scraper`) Actor

Scrape Google Maps reviews of any place: star rating, exact date, full text with language and translation, reviewer name and profile, photos, guided answers and owner replies. Newest, relevant, highest or lowest first, up to 50,000 per place. $0.30 per 1000 reviews.

- **URL**: https://apify.com/scrapeunblocker/google-maps-reviews-scraper.md
- **Developed by:** [Scrapeunblocker](https://apify.com/scrapeunblocker) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 reviews

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

Scrape **Google Maps reviews** of any place as clean structured JSON - star rating, exact date and time, full review text with its language and Google's translation, reviewer name, profile, avatar and review count, review photos, the guided answers Google asks for (e.g. "Rooms: 5", "Meal type: Lunch") and the owner's public reply. Many places in one run, up to 50,000 reviews each, in Google's own sort orders. No Google account, no API key, no proxies to configure.

### Features

- **Any place input** - a Google Maps place URL, a `maps.app.goo.gl` share link, a `place_id` (`ChIJ...`), a feature id (`0x47e66e2964e34e2d:0x8ddca9ee380ef7e0`) or a CID (`10222232094831998944` or a `maps?cid=` URL).
- **Google's sort orders** - newest, most relevant (Google's default), highest rated, lowest rated.
- **Exact dates** - every review has an ISO 8601 date (UTC) and a Unix timestamp, not only "2 months ago".
- **Original text and translation** - `text` is always the original, `language` its language, and `translatedText` Google's translation into the language you choose.
- **Reviewer data** - name, profile URL, avatar, number of reviews and photos.
- **Owner replies, photos and guided answers** - the business's reply, the review's photo URLs and Google's per-topic answers (rooms, service, food, price ...).
- **Monitoring mode** - with `Newest first` and `since`, paging stops at the first older review, so a scheduled run only pays for new reviews.
- **Deduplicated** - the same place given twice (URL, feature id, CID or place_id) is collected once, and every review once.

### Use cases

- **Reputation monitoring** - a daily or weekly run with `Newest first` and `since` delivers every new review of your locations or your competitors'.
- **Complaint analysis** - collect `Lowest rated` reviews to find what customers complain about.
- **Local SEO and market research** - compare ratings and review themes of restaurants, hotels, clinics or shops across a city.
- **Sentiment and LLM pipelines** - feed clean review text, ratings and dates into BI tools, spreadsheets or an LLM for summaries.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `places` | array | Eiffel Tower | Google Maps place URLs, share links, place_ids, feature ids or CIDs. |
| `maxReviewsPerPlace` | integer | `20` | Reviews per place (1-50000). |
| `sort` | string | `newest` | `newest`, `relevant`, `highest`, `lowest`. |
| `language` | string | `en` | Google interface language; also the target of `translatedText`. |
| `since` | string | - | With `newest` only: reviews written on or after this date (YYYY-MM-DD). |

#### Example input

```json
{
  "places": [
    "https://www.google.com/maps/place/Eiffel+Tower/data=!4m2!3m1!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0",
    "ChIJN1t_tDeuEmsRUsoyG83frY4"
  ],
  "maxReviewsPerPlace": 500,
  "sort": "newest",
  "language": "en",
  "since": "2026-01-01"
}
```

### Output

One dataset item per review:

```json
{
  "placeName": "Lagermax Logistics Austria GmbH",
  "placeAddress": "Lagermax Logistics Austria GmbH, Radingerstraße 1, 5020 Salzburg, Austria",
  "placeRating": 3.3,
  "placeReviewCount": 304,
  "placeCategories": ["Shipping service", "Logistics service"],
  "placeFeatureId": "0x4776901a5d4813b3:0x2a497c8b414893c",
  "placeCid": "190443972526901564",
  "placeUrl": "https://www.google.com/maps?cid=190443972526901564",
  "reviewId": "ChdDSUhNMG9nS0VJQ0FnSURqeC1mMDNnRRAB",
  "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSURqeC1mMDNnRRAB!2m1!1s0x0:0x2a497c8b414893c!3m1!1s2@1:CIHM0ogKEICAgIDjx-f03gE%7C%7C?hl=en-US",
  "rating": 1,
  "date": "2024-05-08T08:10:08Z",
  "timestamp": 1715155808,
  "relativeDate": "2 years ago",
  "text": "Have unloading here, it was terrible, unloading goods okay, making stamp in documents here takes for 2 hour ...",
  "language": "en",
  "translatedText": null,
  "authorName": "Valerii Popov",
  "authorProfileUrl": "https://www.google.com/maps/contrib/101672191789267758700/reviews?hl=en-US",
  "authorAvatar": "https://lh3.googleusercontent.com/a-/ALV-UjX3TDwi7ary8ERVjwQMI830GXD_HKCeU1MrvHNhcVDFbO_td_Sh=s64-c-rp-mo-br100",
  "authorReviewCount": 1,
  "authorPhotoCount": 0,
  "photos": [],
  "photosCount": 0,
  "details": [],
  "ownerResponseText": null,
  "ownerResponseRelativeDate": null,
  "sort": "lowest",
  "placeInput": "0x4776901a5d4813b3:0x2a497c8b414893c"
}
```

`details` holds Google's guided answers, each `{"label": ..., "rating": 1-5}` or `{"label": ..., "value": ...}`. A review with only a star rating has `text: null`.

The key-value store also holds:

- `PLACES` - per place: name, address, rating, review count, categories, feature id, CID, Maps URL, the reviews collected and whether Google has more (`hasMore`).
- `ERRORS` - places that returned no reviews (unknown or removed place, input that is not a place identifier, no reviews since the date, blocked) with the reason. These are **not billed**.

### Pricing

**$0.30 per 1000 reviews.** You pay only for reviews delivered; failed places are not charged. The run stops collecting when it reaches your maximum total charge.

### Notes

- About 600 reviews are collected per minute per place (up to three places run in parallel). For many thousands of reviews per place, raise the run timeout; a run that hits its timeout still finishes with the reviews collected so far.
- Search terms ("pizza in Rome") are not accepted - give the place itself. To find places first, run a Google Maps search scraper and pass its place URLs or feature ids here.
- Google's review list can hold fewer reviews than the place's `reviewCount` shows; the run collects everything the list has.

# Actor input Schema

## `places` (type: `array`):

Google Maps places to collect reviews for: a place URL (https://www.google.com/maps/place/...), a share link (https://maps.app.goo.gl/...), a place_id (ChIJ...), a feature id (0x47e66e2964e34e2d:0x8ddca9ee380ef7e0) or a CID (10222232094831998944, or a maps?cid= URL). A feature id, CID or place URL is the fastest; a place_id costs one extra lookup.

## `maxReviewsPerPlace` (type: `integer`):

How many reviews to collect for each place (1-50000). Google serves reviews 20 at a time; about 750 reviews are read per minute per place, so for many thousands raise the run timeout.

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

The order Google lists the reviews in, as the 'Sort' menu on Google Maps.

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

Google interface language (en, de, fr, pt-BR ...). Reviews written in another language also come with Google's translation into this language (translatedText); the original is always in text.

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

Optional, with 'Newest first' only. Only reviews written on or after this date (YYYY-MM-DD); paging stops at the first older review, which makes monitoring runs fast and cheap.

## Actor input object example

```json
{
  "places": [
    "https://www.google.com/maps/place/Eiffel+Tower/data=!4m2!3m1!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0"
  ],
  "maxReviewsPerPlace": 20,
  "sort": "newest",
  "language": "en"
}
```

# Actor output Schema

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

One item per review, with the place name, address, rating and feature id

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

Per place: name, address, rating, review count, categories, feature id, CID, Maps URL and the reviews collected

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

Places that returned no reviews (unknown place, not a place identifier, no reviews since the date, or blocked), with the reason (not billed)

# 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 = {
    "places": [
        "https://www.google.com/maps/place/Eiffel+Tower/data=!4m2!3m1!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapeunblocker/google-maps-reviews-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 = { "places": ["https://www.google.com/maps/place/Eiffel+Tower/data=!4m2!3m1!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapeunblocker/google-maps-reviews-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 '{
  "places": [
    "https://www.google.com/maps/place/Eiffel+Tower/data=!4m2!3m1!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0"
  ]
}' |
apify call scrapeunblocker/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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