# Google Maps Reviews Scraper (`seemuapps/google-maps-reviews-scraper`) Actor

Scrape all Google Maps reviews for any place — reviewer, rating, text, date, photos, owner replies — from a place URL or search. One row per review.

- **URL**: https://apify.com/seemuapps/google-maps-reviews-scraper.md
- **Developed by:** [Andrew](https://apify.com/seemuapps) (community)
- **Categories:** SEO tools, Social media, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.60 / 1,000 review results

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/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

Extract every Google Maps review for any business — reviewer name and profile, star rating, full text, date, photos, and owner replies — as one clean row per review. Paste a place URL or Place ID, or search a niche and pull reviews for the top results. No API key, no browser, no 5-review limit.

### What you get

- **One dataset row per review**: `reviewId`, `reviewUrl`, `rating`, `text`, `language`, `dateText` ("2 months ago"), exact `publishedAt` / `updatedAt` timestamps, review `photos`
- **Reviewer details**: `reviewerName`, `reviewerProfileUrl`, `reviewerAvatarUrl`, `reviewerUserId`, `reviewerReviewCount`, `reviewerIsLocalGuide`
- **Owner responses**: `ownerReply` text and `ownerReplyDate`
- **Place context on every row**: `placeId`, `googlePlaceId`, `placeName`, `placeAddress`, `placeCategory`, `placeRating`, `placeReviewCount`, `placeUrl`
- **Unlimited depth**: newest-first pagination through tens of thousands of reviews with a resume cursor (`NEXT_PAGE_ID`) so long jobs continue across runs
- Export to JSON, CSV, Excel, or Google Sheets from the Apify console

### Use cases

- **Reputation monitoring** — track new reviews and owner replies for your locations on a schedule
- **Competitor analysis** — compare rating distributions, complaint themes and response rates across competitors
- **Sentiment & NLP datasets** — thousands of labelled (1–5 star) texts per business for analysis or model training
- **Customer research** — mine what people love and hate about restaurants, hotels, clinics, gyms in any city
- **Lead qualification** — spot businesses with low ratings or unanswered reviews for reputation-management outreach

### How to use

1. Paste one or more **Place URLs or IDs** (full Google Maps URL, `maps.app.goo.gl` short link, `?cid=` link, `ChIJ…` Place ID or `0x…:0x…` ID) — or enter **Search queries** and set **Max places per query**.
2. Set **Max reviews per place** (default 100; 0 = all reviews).
3. Run — reviews stream into the **Dataset** tab, newest first.
4. To continue a deep scrape, open the **Key-value store** tab → copy `NEXT_PAGE_ID` → paste it into **Page ID** on the next run. If `NEXT_PAGE_ID` is `null`, every place is fully fetched.

### Output format

```json
{
  "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2pGb2NVRldWV3RDYldoTlgweFVhR3hNY3pkWWFIYxAB",
  "reviewUrl": "https://www.google.com/maps/reviews/data=…",
  "reviewerName": "Kevin Zheng",
  "reviewerProfileUrl": "https://www.google.com/maps/contrib/101605690454614380171?hl=en",
  "reviewerAvatarUrl": "https://lh3.googleusercontent.com/a-/…",
  "reviewerUserId": "101605690454614380171",
  "reviewerReviewCount": 207,
  "reviewerIsLocalGuide": true,
  "rating": 3,
  "text": "Even though they had several lines going, each person in line took close to 5 minutes…",
  "dateText": "2 months ago",
  "publishedAt": "2026-06-08T14:04:50.959Z",
  "updatedAt": "2026-06-08T14:04:50.959Z",
  "language": "en",
  "photos": [],
  "ownerReply": "Thanks for visiting — we're working on speeding up the line!",
  "ownerReplyDate": "2 months ago",
  "placeId": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
  "googlePlaceId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
  "placeName": "Katz's Delicatessen",
  "placeAddress": "205 E Houston St, New York, NY 10002",
  "placeCategory": "Deli",
  "placeRating": 4.5,
  "placeReviewCount": 54692,
  "placeUrl": "https://maps.google.com/?cid=3545819340560108778",
  "searchQuery": null,
  "scrapedAt": "2026-08-16T06:30:00.000Z"
}
```

### Pricing

Pay per review saved to the dataset. Nothing is charged for places that fail to load.

### FAQ

**Can I get *all* reviews for a place with 50,000 reviews?** Yes — set Max reviews per place to 0. The run stops ~60 s before its timeout, writes `NEXT_PAGE_ID`, and you resume on the next run (or raise the run timeout).

**What order are reviews in?** Newest first, as Google Maps sorts them by default.

**Are third-party reviews (Tripadvisor, hotel sites) included?** Google shows some partner reviews on hotel listings; they come through with the partner's profile URL and may not carry a numeric rating.

**Do I need a Google API key?** No.

# Actor input Schema

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

Places to fetch reviews for. Accepts full Google Maps place URLs, maps.app.goo.gl short links, ?cid= links, Google Place IDs (ChIJ…), or hex IDs (0x…:0x…).

## `searchQueries` (type: `array`):

Alternatively search Google Maps and fetch reviews for the top results — e.g. "dentists in Austin TX". Use Max places per query to control how many places are taken from each search.

## `maxPlacesPerQuery` (type: `integer`):

How many places to take from each search query (only used with Search queries).

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

Reviews to fetch per place, newest first. Set 0 for all reviews (large places can have tens of thousands — the run stops safely before the timeout and writes a resume cursor).

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

Language code for the interface strings and place names, e.g. en, de, fr, es, pt-BR. Review text is always returned in its original language.

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

Two-letter country code that biases search results, e.g. us, gb, de, au.

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

Paste NEXT\_PAGE\_ID from the previous run's Key-value store to continue fetching more reviews for the same places.

## `proxyConfiguration` (type: `object`):

Optional. By default the actor connects directly and automatically falls back to Apify datacenter → residential proxies only if Google starts blocking.

## Actor input object example

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"
  ],
  "searchQueries": [],
  "maxPlacesPerQuery": 5,
  "maxReviewsPerPlace": 100,
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One review per record: reviewId, reviewUrl, reviewerName, reviewerProfileUrl, reviewerReviewCount, reviewerIsLocalGuide, rating, text, dateText, publishedAt, updatedAt, language, photos, ownerReply, ownerReplyDate, plus placeId, placeName, placeAddress, placeRating, placeReviewCount, placeUrl.

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

NEXT\_PAGE\_ID record in the default key-value store. Paste into Page ID on the next run to fetch more reviews; null when every place is exhausted.

# 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/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"
    ],
    "searchQueries": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/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 = {
    "placeUrls": ["https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"],
    "searchQueries": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/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 '{
  "placeUrls": [
    "https://www.google.com/maps/place/Katz'\''s+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"
  ],
  "searchQueries": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call seemuapps/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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