# Google Maps Reviews Scraper ($0.01 / 1,000 reviews) (`serpdata/google-maps-reviews-scraper`) Actor

Scrape all Google Maps reviews for $0.01 per 1,000: text, rating, exact date, photos, reviewer and place details. Use place names, links, place IDs or cids, or search by keyword and city. Filter by stars, keyword or date.

- **URL**: https://apify.com/serpdata/google-maps-reviews-scraper.md
- **Developed by:** [SerpData](https://apify.com/serpdata) (community)
- **Categories:** Lead generation, SEO tools, Developer tools
- **Stats:** 25 total users, 10 monthly users, 99.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

Get every Google Maps review for any place as clean JSON, from
[SerpData](https://serpdata.dev), for **$0.01 per 1,000 reviews** on every plan, 30 to
60 times cheaper than the most popular reviews scraper on Apify.

Paste business names, Google Maps links, Google place IDs, feature IDs or cids, or search
for places by keyword and city. Get each review's text, star rating, exact date, photos and reviewer,
plus the place's name, address, rating, categories, phone and website on every row.

### Why use this Google Maps reviews scraper?

- **Lowest price on Apify.** $0.01 per 1,000 reviews on every plan, charged only for
  reviews returned. Failed searches and place lookups are free.
- **Full review history.** Google's official Places API returns at most 5 reviews per
  place. This Actor pages through all of them, up to 10,000 per place per run.
- **Exact timestamps.** Every review has its exact publish time in ISO 8601, such as
  `2026-04-22T10:17:13.068Z`, not just "5 months ago".
- **No links needed.** Search Google Maps for "dentist" in "Leeds, UK" and get reviews
  for every place found, in one run.
- **Owner replies and translations.** Get the business owner's reply to each review,
  and reviews in other languages translated into the language you choose.
- **Sort and filter.** Sort by newest, most relevant, highest or lowest rating. Keep
  only certain star ratings, reviews containing a keyword, or reviews from a date range.
  You pay only for reviews that match.
- **Batch or live.** Run it in bulk from the Apify Console, or call it like an API and
  page through reviews in real time.

### What data can I extract from Google Maps reviews?

| Review | Place (on every review) |
| --- | --- |
| Review text, and a translation when written in another language | Place name |
| Star rating (1 to 5) | Address |
| Exact publish date and time | Average rating and review count |
| Relative date ("5 months ago") | Categories |
| Owner's reply, with when it was posted | Phone and website |
| Ratings for parts of the visit, such as Food, Service or Rooms | Google place ID, cid and Google Maps link |
| Review photos and a link to the review | The search query that found it |
| Reviewer name, ID, photo, Local Guide status and review count (optional) | |

### How to scrape Google Maps reviews

1. Click **Try for free**.
2. Add places by name and city, Google Maps link, place ID, feature ID or cid, or add a
   search query and a location.
3. Set how many reviews you want per place, and any filters.
4. Click **Start**, then download the reviews as JSON, CSV, Excel, XML or HTML.

### Input

Reviews for specific places:

```json
{
  "places": [
    "Jo's Coffee South Congress, Austin TX",
    "https://www.google.com/maps/place/...",
    "462561016830669691"
  ],
  "maxReviewsPerPlace": 200
}
```

Reviews for every place a search finds, filtered to 5-star reviews from 2025 that
mention "friendly":

```json
{
  "searchQueries": ["dentist"],
  "searchLocation": "Leeds, UK",
  "maxPlacesPerSearch": 10,
  "maxReviewsPerPlace": 50,
  "starRatings": ["5"],
  "keyword": "friendly",
  "reviewsNewerThan": "2025-01-01",
  "reviewsOlderThan": "2025-12-31"
}
```

| Field | What it does |
| --- | --- |
| `places` | Business name with city, Google Maps link (including `maps.app.goo.gl` share links), Google place ID (`ChIJ…`), feature ID (`0x…:0x…`), or cid |
| `searchQueries`, `searchLocation`, `maxPlacesPerSearch` | Find places by searching Google Maps, up to 200 per query |
| `maxReviewsPerPlace` | Most reviews per place, up to 10,000 |
| `sort` | `relevant`, `newest`, `highest` or `lowest`. Newest when a date filter is set and this is empty |
| `language` | Two-letter code, such as `de`. Reviews in other languages are translated into it. Default `en` |
| `starRatings` | Only these star ratings |
| `keyword` | Only reviews whose text contains this word or phrase |
| `reviewsNewerThan`, `reviewsOlderThan` | Only reviews posted within these dates |
| `includePersonalData` | Turn off to leave out reviewer names, IDs and photos |

### Output

One dataset item per review. The reviewer's details below are placeholders:

```json
{
  "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25Ka2IwTldjME01YVU1dWJ6bHJZMUU1WjFWdVVXYxAB",
  "authorName": "Example Reviewer",
  "authorId": "100000000000000000000",
  "rating": 5,
  "publishedAt": "2026-04-22T10:17:13.068Z",
  "relativeTime": "5 months ago",
  "text": "I had a fantastic experience at Beyu Dental. … The staff is incredibly nice and friendly.",
  "photos": [],
  "cid": "8124398069198573549",
  "url": "https://maps.google.com/?cid=8124398069198573549",
  "placeName": "Beyu Dental",
  "placeAddress": "4 Wellington Pl, Leeds, LS1 4AP, United Kingdom",
  "placeRating": 4.9,
  "placeCategories": ["Dentist", "Cosmetic dentist"],
  "placePhone": "+44 113 465 8888",
  "placeWebsite": "beyudental.com",
  "placeId": "ChIJwc3zxvNdeUgR7U9zwP-ov3A",
  "searchString": "dentist",
  "input": "dentist"
}
```

Reviews also carry these fields when Google has them, as on this hotel review:

```json
{
  "ownerReply": {
    "text": "Dear Guest,\n\nThank you for the great review of our hotel! …",
    "relativeTime": "7 months ago"
  },
  "aspectRatings": { "Location": 5 },
  "isLocalGuide": true,
  "reviewerReviewCount": 171,
  "originalLanguage": "en",
  "reviewUrl": "https://www.google.com/maps/reviews/data=…"
}
```

A review written in another language adds `textTranslated` and `translatedLanguage`,
and its owner reply adds `ownerReply.textTranslated`.

### How much does it cost to scrape Google Maps reviews?

**$0.01 per 1,000 reviews** on every Apify plan, with no start fee and no monthly fee.
You are charged only for reviews returned; looking up places, searching and filtering
are free.

- The **free Apify plan** includes $5 of usage a month, enough for about **500,000
  reviews**.
- The **Starter plan** ($19 a month) covers about **1,900,000 reviews** a month.

### Use cases

- **Sentiment analysis:** track how customers feel over time, and how that changes
  after a new menu, a renovation or a change of management.
- **Reputation management:** watch your own locations and catch negative reviews early.
- **Competitor analysis:** compare ratings, review volume and common complaints with
  nearby competitors.
- **Market research:** see what customers in a category praise and complain about.
- **Multi-location tracking:** compare branches of the same business side by side.
- **AI and NLP datasets:** feed clean, structured reviews into models and pipelines.
- **Testimonials:** find real customer quotes for marketing.

### Live HTTP API

This Actor also runs in Standby mode, so you can page through reviews like any API:

```sh
curl "https://serpdata--google-maps-reviews-scraper.apify.actor/reviews?place=462561016830669691" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

Each response holds one page of reviews and a `nextPageToken`. Pass it back as
`pageToken` for the next page, with the same `sort` and `hl`. You are charged per
review returned. `place` accepts the same values as the `places` input; add
`sort=newest` (or `relevant`, `highest`, `lowest`) and `hl=de` for another language.

Errors return JSON with a `message` and are never charged. `400` means a parameter is
invalid, `402` means the run has reached its maximum cost, `404` means no place
matched, and `429` means too many requests at once. Any `5xx` status is safe to retry.

### Integrations and API access

- **No-code:** connect runs to Make, Zapier, Google Sheets, Google Drive, Slack, Amazon
  S3 and others, or trigger anything with a webhook.
- **Scheduling:** run hourly, daily or weekly with a date filter to collect only new
  reviews.
- **Code:** use the Apify API, or the `apify-client` package for Node.js or Python.
- **AI agents:** call this Actor through the Apify MCP server.

### Frequently asked questions

#### Is it legal to scrape Google Maps reviews?

Google Maps reviews are public and can be read without an account. Whether you can
collect and use them depends on where you are and what you do with the data, so check
Google's terms of service and get legal advice for your use case.

#### What about reviewers' personal data?

Reviewer names, IDs and photos are personal data, protected in the EU by the GDPR and
by similar laws elsewhere. Only collect them if you have a lawful reason to. If you do
not need them, turn off **Include reviewer details** and they are left out of the
results.

#### How many reviews can I scrape?

Up to 10,000 per place per run, and as many places as you like. Google may return fewer
reviews than the total count shown for a place.

#### Can I filter reviews by date, rating or keyword?

Yes. Filters are free: you pay only for the reviews that match. When filtering, the
Actor checks up to 5,000 reviews per place.

#### In what order are reviews returned?

Choose **Sort reviews by**: most relevant (Google's own order), newest, highest rating
or lowest rating. When you set a date filter and leave the order empty, reviews are
sorted newest first, so the Actor stops as soon as it passes your start date.

#### Can I get reviews in other languages?

Yes. Set **Language** to a two-letter code such as `de` or `ja`. Reviews written in
another language come back with `textTranslated` in your language, alongside the
original text and its `originalLanguage`. Owner replies are translated the same way.

#### Can I get reviews for many places in one run?

Yes. List as many places as you like, or use search queries to find them.

#### What export formats are supported?

JSON, CSV, Excel, XML and HTML, from the dataset of any run.

#### What is a cid, and can I use Google place IDs or feature IDs?

A cid is Google's numeric ID for a place, such as `462561016830669691`. It is in Google
Maps links as `?cid=…`, and every result from our
[Google Maps Scraper](https://apify.com/serpdata/google-maps-scraper) includes it.

Google place IDs and feature IDs work too. Paste place IDs like
`ChIJwc3zxvNdeUgR7U9zwP-ov3A`, the kind the Google Places API returns, or feature IDs like
`0x48795df3c6f3cdc1:0x70bfa8ffc0734fed`, the `data_id` other Google Maps APIs return,
straight into **Places**.

### Current limits

- Review like counts are not included.
- Owner replies show when they were posted as a relative date ("a year ago"), not an
  exact date.

### Related Actors

- [Google Maps Scraper](https://apify.com/serpdata/google-maps-scraper): places,
  details and photos from $0.034 per 1,000 places.
- [Google Search API](https://apify.com/serpdata/google-search-api): Google search
  results from $0.17 per 1,000 pages.

# Actor input Schema

## `places` (type: `array`):

One place per line: a business name with its city ("Jo's Coffee, Austin TX"), a Google Maps link (including maps.app.goo.gl share links), a Google place ID (ChIJ…), a feature ID (0x…:0x…), or a Google cid.

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

The most reviews to return for each place. Places with fewer reviews return all of them.

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

The order Google returns reviews in. Newest first makes date filters fastest. When a date filter is set and this is left empty, reviews are sorted newest first.

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

Two-letter language code, such as de. Reviews written in other languages come back with a translation into this language.

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

Find places by searching Google Maps, such as "dentist" or "pizza", and get reviews for each place found. No links needed.

## `searchLocation` (type: `string`):

Where to search, such as "Leeds, UK" or "Austin, TX".

## `maxPlacesPerSearch` (type: `integer`):

How many places to take from each search, up to 200.

## `starRatings` (type: `array`):

Only return reviews with these star ratings. Leave empty for all ratings.

## `keyword` (type: `string`):

Only return reviews whose text contains this word or phrase. Not case-sensitive.

## `reviewsNewerThan` (type: `string`):

Only return reviews posted on or after this date.

## `reviewsOlderThan` (type: `string`):

Only return reviews posted on or before this date.

## `includePersonalData` (type: `boolean`):

Include each reviewer's name, ID and photo. Turn this off if you do not need personal data. In the EU it is protected by the GDPR, so only collect it when you have a lawful reason to.

## Actor input object example

```json
{
  "places": [
    "Jo's Coffee South Congress, Austin TX"
  ],
  "maxReviewsPerPlace": 100,
  "language": "en",
  "maxPlacesPerSearch": 10,
  "includePersonalData": true
}
```

# Actor output Schema

## `overview` (type: `string`):

A table of each review: place, author, rating, date and text.

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

Every field of every review, including review photos and the place's Google cid.

# 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 = {
    "places": [
        "Jo's Coffee South Congress, Austin TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("serpdata/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 = { "places": ["Jo's Coffee South Congress, Austin TX"] }

# Run the Actor and wait for it to finish
run = client.actor("serpdata/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 '{
  "places": [
    "Jo'\''s Coffee South Congress, Austin TX"
  ]
}' |
apify call serpdata/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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