# Advanced Google Maps Reviews Scraper (`slash-scrape/advanced-google-maps-reviews-scraper`) Actor

This actor lets you collect Google Maps reviews by place ID or Maps URL. Get review text, star rating, date, and author fields when present; optional photo URLs and reviewer profile details. Headless + “See more” supported on the current build.

- **URL**: https://apify.com/slash-scrape/advanced-google-maps-reviews-scraper.md
- **Developed by:** [slash scrape](https://apify.com/slash-scrape) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 494 total users, 0 monthly users, 100.0% runs succeeded, 10 bookmarks
- **User rating**: 3.00 out of 5 stars

## Pricing

from $4.00 / 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/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

## Google Maps Reviews Scraper

### ❓ What does it do?

This Google Maps Reviews scraper collects reviews from public Google Maps place pages. Target places by **Place ID** and/or **Maps URL**. Core fields include review text, star rating, and relative date when Google shows them; author / reviewer fields and owner responses appear **when available**. Photo URLs and richer reviewer profile fields are **optional** inputs. The current public build runs headless and expands truncated review text (“See more”) where Google provides it.

***

### 💾 What data can users scrape from Google Maps?

Fields returned **as available** on each review (not every review has every field):

- ⭐️ star rating
- 📝 review text
- 📸 photo URLs (optional input; URLs only — not downloaded; video not guaranteed)
- ⏳ time elapsed (days / weeks / months / years since the review was left)
- 👍 like count
- 📋 attributes (e.g. day visited, price range, wait time...)
- 💬 response from owner
- 🗣️ language
- 🆔 review id
- 🙋‍♀️ reviewer details (optionally, if you need personal info):
  - 🪪 reviewer id
  - 📇 reviewer name
  - 🧮 number of reviews
  - 🧭 Local Guide status
  - 🔗 profile link
  - 🤳 profile photo

Place summary fields (review count, average rating, ratings distribution) when present on the page:

- 👪 number of reviews
- 💯 average rating
- 📊 rating distribution (number of 5 star ratings, 4 star ratings, etc.)
- \#️⃣ tags

By default, the dataset contains **one item per review** (place details are nested under `placeDetails` on each review). That shape matches pay-per-event billing: each default-dataset item is a billed review/result event.

To get more details about a place, you can use the [Advanced Google Maps Scraper](https://apify.com/slash-scrape/google-maps-scraper) or to get photos of a place, you can use the [Advanced Google Maps Photos Scraper](https://apify.com/slash-scrape/advanced-google-maps-photos-scraper). Both of these can be triggered to run automatically by the [Advanced Google Maps Scraping Manager](https://apify.com/slash-scrape/advanced-google-maps-scraping-manager), in the same way as this reviews scraper.

### 🏭 Example Output

Here's an example of Google Maps data that users might get when they scrape Google Maps reviews for Sydney Opera House. Each dataset item is one review:

```json
{
  "id": "DfjHUYtJTR5nUYGKJSAbSDKJHkBH7GkGHRSH",
  "placeId": "ChIJ3S-JXmauEmsRUcIaWtf4MzE",
  "rating": 5,
  "timeElapsed": {"value": 1, "unit": "day"},
  "language": "en",
  "text": "Great tour of the Opera House! Would visit again",
  "attributes": {"Visited on": "Weekday", "Wait time": "No wait", "Reservation recommended": "Yes"},
  "photoURLs": [
    "https://lh5.googleusercontent.com/p/AF1QipM_aIW0SVw3zAJuAr_f6lheFe2doNFwsuczGPab",
    "https://lh5.googleusercontent.com/p/AF1QipM8XJ5hOcmAxJhGlwEUkfHcLlUfWCFBefqIdcDp",
    "https://lh5.googleusercontent.com/p/AF1QipN9oKOGcCB9jL9fuqqtoO_pWzz5IaoMZJ-eKLtM"
  ],
  "placeDetails": {
    "id": "ChIJ3S-JXmauEmsRUcIaWtf4MzE",
    "name": "Sydney Opera House",
    "summary": {
      "rating": 4.7,
      "count": 75391,
      "ratingsDistribution": {"1": 671, "2": 360, "3": 2123, "4": 11391, "5": 60820},
      "tags": []
    }
  }
}
```

NOTE: Sample is illustrative. Many reviews return text + rating + date only. Attributes, photos, and owner replies are omitted when Google does not show them.

*NOTE*: Flat (one object per review) is the default. To restore the previous nested-per-place shape (one object per place with a `reviews` array), set `flatOutput` to `false`.

### 📝 Input format

You can configure the input options to get exactly the results you want:

- 🎯 Targets
  - 🔗 Place URLs
  - 🆔 Place IDs
  - 💾 Dataset ID
- 👪 Max reviews per place
- ⬆️ Sort order
- ⏳ Max time elapsed since review
- ⭐️ Minimum review rating
- 🪪 Get personal information about reviewers
- 📸 Get photo URLs for each review
- 📄 Flat output (one dataset item per review; on by default)

Each of these options is explained further below:

- 🎯 Targets
  - You can use a sharing URL for a place or use its Place ID to scrape reviews. You can supply a list of URLs and Place IDs at the same time and you will get results for all of them.
  - **If you are using the the [Advanced Google Maps Scraping Manager](https://apify.com/slash-scrape/advanced-google-maps-scraping-manager) to find places to scrape, use the integrations tab in the manager actor to trigger this scraper automatically when places are found**
- 👪 Max reviews per place
  - How many reviews to get before stopping. The scraping will take longer to complete the higher this is set.
- ⬆️ Sort order
  - The most relevant reviews will be scraped first by default, but you can also scrape the latest reviews by setting this option to "Most Recent", or get reviews with the highest / lowest ratings first.
- ⏳ Max time elapsed since review
  - **Only works if review sort order is set to "Most Recent"**
  - Allows you to specify the max time elapsed for a review to be scraped, e.g. "2 weeks"
- ⭐️ Minimum review rating
  - The minimum rating a review must have to be scraped, e.g. "3"
- 🪪 Get personal information about reviewers
  - Details for the reviewer such as name, profile link and profile photo will not be collected by default
  - If you need this information, set this option to turn on personal data collection (taking care to respect privacy and ensure that your collection is necessary and permitted)
- 📸 Get photo URLs for each review
  - Collect the photos included with each review
  - To reduce data usage, the photos will not be downloaded - the download URL will be included in the output
- 📄 Flat output
  - On by default: each review is its own dataset item, with place details nested under `placeDetails`
  - Uncheck / set `flatOutput` to `false` to output one nested object per place

### 🏎️ Speed

Speed is dependent on the memory available to your Actor and the settings you're using. In general, scraping more reviews will increase the time taken per review as the Actor is loading a lot of data. To assess how long your scraping will take, you should try scraping a small number of places and review the time taken to estimate time and cost of your planned run.

To help you calculate, each place that you get reviews from will produce a summary like the example below (which was run on an Actor with 4,096MB memory, capturing 50 reviews and 437 photos from Google Maps):

```text
----------------------------------------
Review data captured for Edge:
Name:             Edge
---
Rating:           4.5 / 5.0
---
Distribution:     13,625: ⭐️⭐️⭐️⭐️⭐️
                   1,947: ⭐️⭐️⭐️⭐️
                     619: ⭐️⭐️⭐️
                     339: ⭐️⭐️
                     959: ⭐️
---
Reviews processed: 50 of 17,489
---
Photo URLs:        421
---
Processing time:   40.48 seconds (0.81s per review)
----------------------------------------
```

### 💳 Pricing (pay-per-event)

**Pricing:** Pay-per-event. Bronze **$5** / Silver **$4.50** / Gold **$4.00** per 1,000 events at 1 GB RAM. Actor-start billing also applies (events scale with memory GB). One Bronze unit ≈ one billed review/dataset event (flat output recommended).

Free Apify users can run all documented features — nothing core is paid-only gated. Optional richer fields (reviewer profiles, photo URLs) cost more via events/runtime, not feature locks.

### 🙋‍♀️ FAQs

**Q: Can the data be exported in different formats?**\
A: Yes, the scraped data can be downloaded in formats such as JSON or CSV for analysis.

**Q: Is it legal to scrape Google Maps reviews?**\
A: You should consult the Terms of Service for Google Maps to determine if your use case is permitted.

**Q: Can I input a location and search term to find places to scrape?**
A: Yes, using the [Advanced Google Maps Scraping Manager](https://apify.com/slash-scrape/advanced-google-maps-scraping-manager). This reviews scraper can be chained so it runs automatically when the manager finds places that match your search.

# Actor input Schema

## `targets` (type: `array`):

List of Google Maps URLs to scrape reviews from

## `placeIds` (type: `array`):

List of Google Maps Place IDs to scrape reviews from

## `maxReviews` (type: `integer`):

Maximum number of reviews to return (all categories)

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

Sort reviews by Most Relevant (default if no option is selected), Most Recent, Rated Highest, or Rated Lowest

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

Only get reviews that are more recent than this (only works if reviews are sorted by most recent)

## `reviewMinRating` (type: `integer`):

Only get reviews with at least this rating

## `getPersonalInfo` (type: `boolean`):

If selected, personal information such as the name of the reviewer will be collected

## `getPhotoURLs` (type: `boolean`):

If selected, photo URLs will be collected and included in the output. They will not be automatically downloaded to reduce data usage

## `flatOutput` (type: `boolean`):

If selected (default), each review is a separate dataset item. Uncheck to output one nested object per place.

## Actor input object example

```json
{
  "targets": [
    {
      "id": "ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw",
      "url": "https://www.google.com/maps/place/?q=place_id:ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw"
    }
  ],
  "placeIds": [
    "ChIJbf8C1yFxdDkR3n12P4DkKt0"
  ],
  "maxReviews": 20,
  "reviewMaxTimeElapsed": "1 year",
  "getPersonalInfo": false,
  "getPhotoURLs": false,
  "flatOutput": true
}
```

# 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 = {
    "targets": [
        {
            "id": "ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw",
            "url": "https://www.google.com/maps/place/?q=place_id:ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw"
        }
    ],
    "placeIds": [
        "ChIJbf8C1yFxdDkR3n12P4DkKt0"
    ],
    "maxReviews": 20,
    "reviewMaxTimeElapsed": "1 year"
};

// Run the Actor and wait for it to finish
const run = await client.actor("slash-scrape/advanced-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 = {
    "targets": [{
            "id": "ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw",
            "url": "https://www.google.com/maps/place/?q=place_id:ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw",
        }],
    "placeIds": ["ChIJbf8C1yFxdDkR3n12P4DkKt0"],
    "maxReviews": 20,
    "reviewMaxTimeElapsed": "1 year",
}

# Run the Actor and wait for it to finish
run = client.actor("slash-scrape/advanced-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 '{
  "targets": [
    {
      "id": "ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw",
      "url": "https://www.google.com/maps/place/?q=place_id:ChIJ3aqq5Q1ZwokRb9hLO7Gyxgw"
    }
  ],
  "placeIds": [
    "ChIJbf8C1yFxdDkR3n12P4DkKt0"
  ],
  "maxReviews": 20,
  "reviewMaxTimeElapsed": "1 year"
}' |
apify call slash-scrape/advanced-google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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