# Google Maps Reviews Scraper: Ratings, Text & Owner Reply (`themineworks/google-maps-reviews`) Actor

Scrape Google Maps reviews: star rating, reviewer name, full text, date, owner response and photo count. Works as MCP tool in Claude, ChatGPT & AI agents. Pay per result, first 10 free.

- **URL**: https://apify.com/themineworks/google-maps-reviews.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** MCP servers, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 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.
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 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: Ratings, Text & Owner Replies

### Overview

Google Maps Reviews Scraper extracts reviews from any Google Maps business listing at scale. Paste one or more Google Maps place URLs and get structured review data in seconds: star rating, full expanded review text, date, reviewer name and profile, owner response, photo count, and helpful votes.

It goes beyond the official Google Places API, which caps results at roughly five reviews per place with no control over sort order. This scraper drives a real Chromium browser through residential proxies, dismisses the consent dialog, scrolls the reviews panel, expands every truncated review, and returns up to 1,000 records per place sorted by newest, most relevant, highest, or lowest rating.

✅ No login required | ✅ No API key | ✅ Full expanded review text | ✅ MCP-ready for AI agents

### Features

Up to 1,000 reviews per place URL, far beyond the official API's five review cap.
Four sort orders: newest, most relevant, highest rating, lowest rating.
Full expanded review text, never truncated with a "more" ellipsis.
Handles the EU cookie consent wall automatically across regions.
Pay per review returned, empty results and failed runs never charged.

### How it works

The scraper opens each Google Maps place URL in a stealth hardened Chromium session behind Apify's residential proxy network, dismisses the cookie consent dialog with a multi selector fallback, and clicks into the reviews panel. It then applies your chosen sort order, scrolls to trigger Google's lazy loaded pagination, and clicks "read more" on every truncated review before extracting the content.

Every field is read from the rendered DOM, so review text, ratings, reviewer profiles, owner responses, photo counts, and helpful votes all match what a human visitor sees. The default residential proxy avoids Google's datacenter IP blocks, and you can override the browser locale by setting a `language` code.

### 🧾 Input configuration

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!4m8!3m7!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813!9m1!1b1"
  ],
  "maxReviews": 50,
  "sortBy": "newest",
  "language": "en",
  "proxyConfig": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### 📤 Output format

```json
{
  "reviewId": "ChdDSUhNMG9nS0VJQ0FnSUNuNV9DVnFRRRAB",
  "placeId": "ChIJLU7jZC1u5kcR9wOePBLb38A",
  "placeName": "Eiffel Tower",
  "placeUrl": "https://www.google.com/maps/place/Eiffel+Tower/...",
  "reviewerName": "TALENTO HUMANO",
  "reviewerUrl": "https://www.google.com/maps/contrib/110758759962531004425",
  "rating": 5,
  "reviewText": "Breathtaking at night. Worth the wait to go to the top.",
  "reviewDate": "51 minutes ago",
  "ownerResponse": null,
  "photoCount": 2,
  "helpfulVotes": 0,
  "charged": true,
  "scraped_at": "2026-07-10T04:56:59.605Z"
}
```

Every review record contains these fields:

| Field | Description |
| --- | --- |
| 🆔 `reviewId` | Unique review identifier from Google |
| 📍 `placeId` | Google Maps place identifier |
| 🏢 `placeName` | Name of the business or landmark |
| 🔗 `placeUrl` | The input Google Maps URL |
| 🙋 `reviewerName` | Display name of the reviewer |
| 👤 `reviewerUrl` | Link to the reviewer's Google Maps profile |
| ⭐ `rating` | Star rating from 1 to 5 |
| 📝 `reviewText` | Full expanded review text |
| 📅 `reviewDate` | When the review was posted |
| ✅ `ownerResponse` | Business owner reply if present |
| 📷 `photoCount` | Number of photos attached to the review |
| 👍 `helpfulVotes` | Number of helpful votes |
| 💳 `charged` | Whether this result consumed a paid credit |
| 🕒 `scraped_at` | ISO timestamp when the review was scraped |

### 💼 Common use cases

**Reputation management**
Pull the latest reviews on a schedule, route negatives to your CRM, and catch recurring complaints early.

**Competitive analysis**
Collect competitors' reviews to compare star distributions and surface common praise and criticism.

**Local SEO research**
Study review velocity, rating trends, and owner response rates for top ranking businesses in a category or city.

**Sentiment analysis and NLP**
Feed full `reviewText` into classifiers, topic models, or LLM summarization pipelines without worrying about truncation.

**Product and service improvement**
Mine reviews for recurring issues and feature requests. Extract authentic customer quotes for social proof.

### 🚀 Getting started

1. Open the actor and add one or more Google Maps place URLs. Open the place on Google Maps and copy the URL from the address bar.
2. Set `maxReviews` per place (default 50, up to 1,000).
3. Choose `sortBy`: `newest`, `most_relevant`, `highest_rating`, or `lowest_rating`.
4. Optionally set the `language` ISO code (e.g. `fr`, `de`, `ja`) and keep the default `RESIDENTIAL` proxy.
5. Click Start, then export the dataset as JSON, CSV, or Excel, or pull it via API or MCP.

### FAQ

**How many reviews can I scrape per place?**
Up to 1,000 per place URL. Google lazy loads reviews through scroll events rather than traditional pagination, so the ceiling keeps runs bounded. For more than 1,000, run the actor again with a different `sortBy` value to capture distinct slices of the review corpus.

**Does it handle the Google cookie consent dialog?**
Yes. The scraper runs a real Chromium browser and automatically detects and dismisses the EU cookie consent wall (trying multiple selector strategies) before any interaction, across regions.

**Can I filter reviews by language?**
Set the `language` input to any ISO 639 1 code. That sets the browser locale so Google serves reviews in or near your preferred language. Google still shows reviews in the reviewer's own language, so for strict filtering, post process `reviewText` with a language detection library.

**How much does it cost?**
Pay per event. You are charged per review actually returned, and there is no free tier. Empty results and failed runs are never charged. Residential proxy usage is billed separately by Apify at standard rates.

**Can I use it inside an AI agent?**
Yes. It is exposed as an MCP tool. See below.

### Use in Claude, ChatGPT & any MCP agent

```
https://mcp.apify.com/?tools=themineworks/google-maps-reviews
```

Or call it programmatically with the Apify client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/google-maps-reviews').call({
  placeUrls: ['https://www.google.com/maps/place/Taj+Mahal/...'],
  maxReviews: 100,
  sortBy: 'highest_rating',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => !i._type));
```

### 🛠️ Complete your Google Maps pipeline

Pair this reviews scraper with the rest of the themineworks Google Maps and lead gen suite:

- **[Google Maps Search Scraper](https://apify.com/themineworks/google-maps-search-scraper)**: turn a Maps search into a plain business listing dataset, no email step, the cheapest way to find the businesses in the first place.
- **[Google Maps Leads Scraper](https://apify.com/themineworks/maps-leads)**: turn a Maps search into B2B leads with verified emails.
- **[Website Contact Scraper](https://apify.com/themineworks/website-contact-finder)**: extract emails, phones, and socials from any domain list.
- **[Email Verifier & Validator](https://apify.com/themineworks/email-verifier-validator)**: MX and SMTP verify addresses before you send.
- **[B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder)**: find named decision makers at target companies.

Common flow: google-maps-search-scraper finds businesses, maps-leads adds verified emails, then google-maps-reviews pulls reviews for the same businesses to gauge reputation.

# Actor input Schema

## `placeUrls` (type: `array`):

Google Maps place URLs to scrape reviews from (e.g. https://www.google.com/maps/place/Eiffel+Tower/...)

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

Maximum number of reviews to scrape per place URL

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

How to sort reviews before scraping

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

Preferred language for reviews (ISO code, e.g. en, fr, de, ja)

## `proxyConfig` (type: `object`):

Apify proxy configuration. Residential proxy recommended.

## Actor input object example

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Starbucks/@40.7566447,-73.9859019,17z/data=!3m1!4b1!4m6!3m5!1s0x89c258552071bcb3:0x5cc7129cc313de1a!8m2!3d40.75664!4d-73.9859!16s%2Fg%2F1tj6vr2s"
  ],
  "maxReviews": 5,
  "sortBy": "newest",
  "language": "en",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "placeUrls": [
        "https://www.google.com/maps/place/Starbucks/@40.7566447,-73.9859019,17z/data=!3m1!4b1!4m6!3m5!1s0x89c258552071bcb3:0x5cc7129cc313de1a!8m2!3d40.75664!4d-73.9859!16s%2Fg%2F1tj6vr2s"
    ],
    "maxReviews": 5,
    "language": "en",
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/google-maps-reviews").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 = {
    "placeUrls": ["https://www.google.com/maps/place/Starbucks/@40.7566447,-73.9859019,17z/data=!3m1!4b1!4m6!3m5!1s0x89c258552071bcb3:0x5cc7129cc313de1a!8m2!3d40.75664!4d-73.9859!16s%2Fg%2F1tj6vr2s"],
    "maxReviews": 5,
    "language": "en",
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/google-maps-reviews").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 '{
  "placeUrls": [
    "https://www.google.com/maps/place/Starbucks/@40.7566447,-73.9859019,17z/data=!3m1!4b1!4m6!3m5!1s0x89c258552071bcb3:0x5cc7129cc313de1a!8m2!3d40.75664!4d-73.9859!16s%2Fg%2F1tj6vr2s"
  ],
  "maxReviews": 5,
  "language": "en",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call themineworks/google-maps-reviews --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/0bXQKjmwptDNjBbQq/builds/ggqMPPqzbRvwETNbk/openapi.json
