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

Scrape all reviews from any Google Maps place: full text, star ratings, detailed per-aspect ratings, reviewer profiles, owner responses, and review images. Just paste place URLs.

- **URL**: https://apify.com/thodor/google-maps-reviews-scraper.md
- **Developed by:** [Thodor](https://apify.com/thodor) (community)
- **Categories:** Lead generation, Other, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 review scrapeds

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

Scrape every review from any Google Maps place — full text, star ratings, detailed ratings, author profiles, owner responses, and review images. Just paste place URLs and go. Run via API, schedule runs, or integrate with webhooks.

Pass one URL or thousands. The scraper fetches reviews concurrently across all places, sorts them however you want, and pushes each review as a separate dataset row — ready to export as JSON, CSV, or Excel.

### Input

| Parameter | Description | Example |
|-----------|-------------|---------|
| Place URLs | Google Maps place URLs to scrape reviews from | `https://www.google.com/maps/place/...` |
| Max reviews | Maximum reviews to fetch per place | `100`, `500`, `5000` |
| Language | Language for results | `en`, `nl`, `de`, `ja`, `fr` |

Paste any Google Maps place URL — the scraper extracts the place ID automatically. No need to find IDs manually.

### What you get for every review

- Star rating (1-5)
- Full review text
- Detailed ratings (Food, Service, Atmosphere, etc.)
- Publication date (ISO 8601)
- Relative time ("2 months ago")
- Reviewer name, photo, profile URL
- Reviewer stats (number of reviews, Local Guide status)
- Owner response text + date
- Review images
- Review URL (direct link)
- Likes count
- Review origin and language context

### Example output

```json
{
  "place_name": "La Donna Re's",
  "place_id": "0x89c25d8a10261a7d:0x148b4752f2b99ae2",
  "place_url": "https://www.google.com/maps/place/La+Donna+Re's/...",
  "review_id": "Ci9DQUlRQUNvZENodHljRjlvT2pkRmVVVlRhazVo...",
  "name": "Isatta Bassie",
  "reviewer_photo_url": "https://lh3.googleusercontent.com/a-/ALV-UjVPL1SQ...",
  "reviewer_id": "109283811363605044639",
  "reviewer_number_of_reviews": 5,
  "is_local_guide": false,
  "reviewer_url": "https://www.google.com/maps/contrib/109283811363605044639/reviews?hl=en",
  "published_at_date": "2026-01-11T02:01:27Z",
  "publish_at": "2 months ago",
  "stars": 5,
  "text": "10/10! Super friendly staff and everything was delicious. I went in anticipating oxtails but they were out, so I opted for jerk chicken, Mac and cheese and rice and peas...",
  "text_translated": null,
  "review_url": "https://www.google.com/maps/reviews/data=...",
  "review_detailed_rating": [
    {"category": "Food", "rating": 5},
    {"category": "Service", "rating": 5},
    {"category": "Atmosphere", "rating": 5}
  ],
  "likes_count": 1,
  "review_origin": "Google",
  "response_from_owner_text": null,
  "response_from_owner_date": null,
  "review_image_urls": [
    "https://lh3.googleusercontent.com/geougc-cs/ABOP9puDf15..."
  ],
  "review_context": "en"
}
````

Each review is a separate dataset row — easy to filter by place, sort by date, or export to spreadsheets.

### Review fields

| Field | Type | Description |
|-------|------|-------------|
| `place_name` | `string` | Name of the place this review belongs to |
| `place_id` | `string` | Google Maps hex place ID |
| `place_url` | `string` | Original input URL |
| `review_id` | `string` | Unique review identifier |
| `name` | `string` | Reviewer name |
| `reviewer_photo_url` | `string` | Reviewer profile photo |
| `reviewer_id` | `string` | Reviewer Google ID |
| `reviewer_number_of_reviews` | `int` | Total reviews by this reviewer |
| `is_local_guide` | `boolean` | Whether reviewer is a Local Guide |
| `reviewer_url` | `string` | Link to reviewer's profile |
| `published_at_date` | `string` | ISO 8601 publication date |
| `publish_at` | `string` | Relative time ("2 months ago") |
| `stars` | `int` | Star rating (1-5) |
| `text` | `string` | Full review text (null if rating-only) |
| `text_translated` | `string` | Translated text (when available) |
| `review_url` | `string` | Direct link to the review |
| `review_detailed_rating` | `{category, rating}[]` | Per-aspect ratings (Food, Service, etc.) |
| `likes_count` | `int` | Number of likes on the review |
| `review_origin` | `string` | Where the review came from |
| `response_from_owner_text` | `string` | Owner's reply (null if none) |
| `response_from_owner_date` | `string` | When the owner replied |
| `review_image_urls` | `string[]` | Photos attached to the review |
| `review_context` | `string` | Language code of the review |

### Use cases

- **Reputation monitoring** — Track reviews across all your locations in one dataset, detect negative trends early
- **Sentiment analysis** — Feed review text into NLP pipelines to measure customer satisfaction at scale
- **Competitor benchmarking** — Compare review volumes, ratings, and detailed scores across competing businesses
- **Market research** — Analyze what customers value most in a category by mining review text and detailed ratings
- **Review response tracking** — Monitor which reviews have owner responses and measure response times

### FAQ

**What URLs are supported?**
Any Google Maps place URL that contains a place ID. Just copy the URL from your browser when viewing a place on Google Maps.

**How many reviews can I fetch?**
Set `max_reviews` to however many you need per place. The scraper paginates automatically. Google's API returns up to ~25,000 reviews per place — for places with more reviews than that, you'll get the most recent 25k.

**What output formats are available?**
Results are available as JSON, CSV, and Excel. You can also export directly to Google Sheets via the Apify platform.

**What if a place has no reviews?**
The scraper will simply return 0 results for that place and move on to the next one.

**Are there rate limits?**
No artificial limits. The scraper handles multiple places concurrently with automatic retry logic.

# Actor input Schema

## `start_urls` (type: `array`):

Google Maps place URLs to scrape reviews from

## `max_reviews` (type: `integer`):

Maximum number of reviews to fetch per place

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

Language code for results (e.g. 'en', 'nl', 'de', 'fr')

## Actor input object example

```json
{
  "start_urls": [
    {
      "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB"
    }
  ],
  "max_reviews": 100,
  "language": "en"
}
```

# 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 = {
    "start_urls": [
        {
            "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB"
        }
    ],
    "max_reviews": 100,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("thodor/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 = {
    "start_urls": [{ "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB" }],
    "max_reviews": 100,
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("thodor/google-maps-reviews-scraper").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 '{
  "start_urls": [
    {
      "url": "https://www.google.com/maps/place/Yellowstone+National+Park/@44.5857951,-110.5140571,9z/data=!3m1!4b1!4m5!3m4!1s0x5351e55555555555:0xaca8f930348fe1bb!8m2!3d44.427963!4d-110.588455?hl=en-GB"
    }
  ],
  "max_reviews": 100,
  "language": "en"
}' |
apify call thodor/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Reviews Scraper",
        "description": "Scrape all reviews from any Google Maps place: full text, star ratings, detailed per-aspect ratings, reviewer profiles, owner responses, and review images. Just paste place URLs.",
        "version": "0.3",
        "x-build-id": "11xxCmHw8hYzAZ5MB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/thodor~google-maps-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-thodor-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/thodor~google-maps-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-thodor-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/thodor~google-maps-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-thodor-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "start_urls"
                ],
                "properties": {
                    "start_urls": {
                        "title": "Place URLs",
                        "type": "array",
                        "description": "Google Maps place URLs to scrape reviews from",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "max_reviews": {
                        "title": "Max Reviews",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of reviews to fetch per place"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for results (e.g. 'en', 'nl', 'de', 'fr')"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
