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

Scrape Google Maps reviews of any place: text, star rating, exact date, author and profile, photos, owner response and translation. Sort by newest, relevant, highest or lowest. Paste place URLs, place IDs or names. Export to JSON, CSV or Excel for sentiment analysis.

- **URL**: https://apify.com/piotrv1001/google-maps-reviews-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Lead generation, Travel, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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 from any place**. The **Google Maps Reviews Scraper** collects each review's text, star rating, exact publish date, author name and profile, author review and photo counts, attached photos, the owner's response, the review language and Google's English translation. Sort by newest, most relevant, highest or lowest rating, and paste as many places as you like. Use it for sentiment analysis, reputation monitoring, competitor research, review response tracking or AI training data.

### ✨ Features

- 💬 **Full Review Data**: Text, rating, exact timestamp and relative date ("2 months ago"), plus a direct link to every review.
- 🧑 **Author Details**: Name, profile link, avatar, number of reviews and photos, and the Local Guide badge.
- 🏪 **Owner Responses**: The business reply text and when it was posted.
- 📸 **Review Photos**: Links to every photo attached to a review.
- 🌍 **Language & Translation**: Original language code and the translated text when the review is in another language.
- 📋 **Review Details**: Extra answers such as food / service / atmosphere scores, meal type or price per person, where the reviewer gave them.
- 🔃 **Four Sort Orders**: Newest, most relevant, highest or lowest rating. Thousands of reviews deep per place.
- 📦 **Bulk Places**: Place links, place IDs or names, each with its own limit. A place given twice is scraped once and every review is saved once.

### 🛠️ How It Works

1. **Paste places** – Google Maps place links, place IDs (`ChIJ...`) or a name with a city such as `Katz's Delicatessen New York`, one per line.
2. **Choose the order and how many reviews per place** – the default is the 50 newest.
3. **Run the Scraper** – reviews can be downloaded as JSON, CSV or Excel or pulled through the API.

### ⚙️ Input

| Field                     | What it does                                                                                  |
| ------------------------- | --------------------------------------------------------------------------------------------- |
| **Places**                | Google Maps place links, place IDs or names with a city, one per line.                        |
| **Max reviews per place** | Stop after this many reviews for each place. Default 50.                                      |
| **Max reviews in total**  | Stop after this many reviews across all places. Default 1,000.                                |
| **Sort by**               | `newest`, `relevant`, `highest` or `lowest`. Default `newest`.                                |
| **Language**              | Language for relative dates and translations (`en`, `de`, `es`, `pt-BR`...). Default `en`.   |

```json
{
    "placeUrls": [
        "https://www.google.com/maps/place/Joe's+Pizza/data=!4m2!3m1!1s0x89c25b15685ad3a9:0x8f6425b4629f362d",
        "ChIJCar0f49ZwokR6ozLV-dHNTE"
    ],
    "maxReviewsPerPlace": 2000,
    "maxItems": 4000,
    "sort": "newest"
}
```

### 💰 Pricing

Pay only for the reviews you get. No monthly rental.

| Event           | Price                                    | What you get                              |
| --------------- | ---------------------------------------- | ----------------------------------------- |
| **Review**      | $0.0004 per review ($0.40 per 1,000)     | One review with all fields below          |
| **Actor start** | $0.00005 per run                         | Charged once when the run starts.         |

Examples: 1,000 reviews = $0.40 · 10,000 reviews = $4.00.

### 📊 Sample Output Data

```json
{
    "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25ZNFZIQm5SRlpKV0dSMGFHOXpRVmR2UTFSMlZGRRAB",
    "placeName": "Katz's Delicatessen",
    "placeId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
    "featureId": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
    "rating": 1,
    "text": "Meat was dry and a lot of black stuff inside portable service. French fries doesn’t have a salt.",
    "translatedText": null,
    "language": "en",
    "publishedAt": "2026-08-10T00:23:50.665Z",
    "relativeDate": "2 months ago",
    "author": {
        "name": "Nikki MMM",
        "profileUrl": "https://www.google.com/maps/contrib/108097424563585261391/reviews?hl=en-US",
        "photoUrl": "https://lh3.googleusercontent.com/a-/ALV-UjWVUIfRohnANgajKD9fMOiFGb5BTHjhB49bxy4JSBiHz0iNX9_q=s64-c-rp-mo-ba12-br100",
        "reviewsCount": 53,
        "photosCount": 23,
        "isLocalGuide": true
    },
    "photos": [
        "https://lh3.googleusercontent.com/grass-cs/AABkmLexzFefjeADu57EM4baFZHjTKggk-Veqolh6idHbDRSJwZLMaCFB7GWM017S7Deq4rRZXotm4gJLN2s8yezw1IB3y72LI56_RquDyDjxTELiM-UKLhab_0ByYig5mX85LwtjKRw-lVDlSc=k-no"
    ],
    "details": {
        "Order type": "Dine in",
        "Meal type": "Dinner",
        "Price per person": "$100+",
        "Food": 1,
        "Service": 1,
        "Atmosphere": 2
    },
    "ownerResponse": {
        "text": "We’re sorry to hear that you were disappointed by your sandwich. The dark coating you noticed is actually our seasoned spice rub - it’s part of what gives our pastrami its signature flavor! ...",
        "relativeDate": "a month ago"
    },
    "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT25ZNFZIQm5SRlpKV0dSMGFHOXpRVmR2UTFSMlZGRRAB!2m1!1s0x0:0x313547e757cb8cea!3m1!1s2@1:CAIQACodChtycF9oOnY4VHBnRFZJWGR0aG9zQVdvQ1R2VFE%7C%7C?hl=en-US",
    "scrapedAt": "2026-10-18T10:41:41.174Z"
}
```

### ❓ FAQ

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

**How many reviews can I get per place?** As many as the place shows on Google Maps, thousands deep. Set "Max reviews per place" high enough.

**Why is `text` empty for some reviews?** Many Google reviews are a star rating only, without text. They are still saved with the rating, date and author.

**Why does the owner response have only a relative date?** Google Maps shows only "a month ago" style dates for owner responses.

**What happens with a broken link or a place that does not exist?** It is skipped and named in the run's status message; nothing is charged for it.

**Where do I get place links in bulk?** Run the [Google Maps Scraper](https://apify.com/piotrv1001/google-maps-scraper) for your search and paste its `url` or `placeId` column here.

### 🔗 More Google Maps Actors

- [Google Maps Scraper](https://apify.com/piotrv1001/google-maps-scraper): places for any search and location with phone, website, rating, hours and coordinates.

# Actor input Schema

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

Google Maps place links, place IDs (ChIJ...) or place names with a city (e.g. "Katz's Delicatessen New York"), one per line.

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

Stop after this many reviews for each place.

## `maxItems` (type: `integer`):

Stop after this many reviews across all places.

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

Which reviews come first.

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

Language for relative dates and translated review text, as a code like en, de, es or pt-BR.

## Actor input object example

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Joe's+Pizza/data=!4m2!3m1!1s0x89c25b15685ad3a9:0x8f6425b4629f362d"
  ],
  "maxReviewsPerPlace": 50,
  "maxItems": 1000,
  "sort": "newest",
  "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 = {
    "placeUrls": [
        "https://www.google.com/maps/place/Joe's+Pizza/data=!4m2!3m1!1s0x89c25b15685ad3a9:0x8f6425b4629f362d"
    ],
    "maxReviewsPerPlace": 50,
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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/Joe's+Pizza/data=!4m2!3m1!1s0x89c25b15685ad3a9:0x8f6425b4629f362d"],
    "maxReviewsPerPlace": 50,
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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/Joe'\''s+Pizza/data=!4m2!3m1!1s0x89c25b15685ad3a9:0x8f6425b4629f362d"
  ],
  "maxReviewsPerPlace": 50,
  "maxItems": 1000
}' |
apify call piotrv1001/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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