# Google Reviews Scraper: Ratings, Text & Owner Replies (`plainrows/google-reviews-scraper`) Actor

Scrape Google reviews of any business: stars, review text, date, translation, photos, owner reply and the business's rating. Paste Google Maps links, place IDs, CIDs or "business name, city". No reviewer names. Only-new-reviews mode for daily alerts. Pay per review plus small fetch and start fees.

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

## Pricing

from $0.20 / 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/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 Reviews Scraper

Get the **Google reviews of any business**: hotels, restaurants, shops, clinics, agencies, any company with a Google Business Profile. Each row gives the **stars, review text, date, Google's translation and the original text, photos, ratings by topic (rooms, service, food…) and the owner's reply**, plus the business's name, address, average rating and review count. Paste Google Maps links, place IDs, CIDs or simply "business name, city".

It calls a commercial data API instead of driving a browser: **no proxies, no CAPTCHAs, no Google account**. **Reviewer names, profile links and profile pictures are not collected**: you get the opinion, not the person.

### Typical uses

- **Reputation monitoring**: turn on **Only new reviews**, schedule a daily run and send new 1- and 2-star Google reviews to Slack or a spreadsheet: you never get (or pay for) the same review twice.
- **Owner reply audits**: see which reviews a business answered, when, and what it said (`ownerAnswer`, `ownerAnswerAt`).
- **Agencies and local SEO**: compare review volume, rating and reply rate of your clients and their competitors.
- **Sentiment analysis and AI summaries**: feed clean review text (translated into one language, original kept) to an LLM, a BI tool or an AI agent (MCP).
- **Market research**: what customers praise or complain about across the hotels, restaurants or shops of a city.

### What you get

One row per Google review:

| Field | Description |
|---|---|
| `input` | The business as you gave it |
| `placeTitle`, `placeAddress` | Business name and address on Google |
| `placeId`, `cid`, `googleMapsUrl` | Google place ID, CID and a link to the business on Google Maps |
| `placeRating`, `placeReviewsCount` | The business's average Google rating out of 5 and its total number of reviews |
| `position`, `reviewId`, `reviewUrl` | Position in the order you chose; Google's review ID (stable: use it to keep only new reviews); link to the review |
| `rating`, `text` | Stars (1-5) and review text, translated by Google into the run's language when written in another one (`null` for a rating without text: many Google reviews are stars only) |
| `originalText`, `originalLanguage` | The text as written, when Google translated it, and its language |
| `reviewedAt`, `timeAgo` | Review date (UTC, ISO 8601) and as Google shows it ("2 weeks ago") |
| `photoUrls` | Photos attached to the review |
| `reviewHighlights` | Ratings and tags by topic when the reviewer gave them, e.g. `{"feature": "Rooms", "assessment": "4"}` or `{"feature": "Trip type", "assessment": "Business"}` |
| `ownerAnswer`, `originalOwnerAnswer`, `ownerAnswerAt` | The owner's public reply (as Google returns it, line breaks as `<br>`), its original text when Google translated it, and its date |
| `localGuide` | Whether the review was written by a Google Local Guide |
| `searchCountry`, `languageCode`, `observedAt` | Country and language of the run, and when the data was fetched (UTC) |

Missing values are always `null`, never guessed. On a test run of 100 newest reviews of The Plaza (New York) on 2026-10-14, 95 had an owner reply, 33 had text (the rest were stars only, often with topic ratings), 12 were translated and 14 had photos: what you get depends on the business. A business that is not found, or has no review, gets one free row with `found: false` and a `note` explaining why (the blocks requested for it are still charged, see Pricing).

### Input

```json
{
  "places": [
    "The Plaza Hotel, New York",
    "https://www.google.com/maps/place/Joe's+Pizza+Broadway/@40.7546795,-73.989604,17z/data=!4m6!3m5!1s0x89c259ab3c1ef289:0x3b67a41175949f55",
    "ChIJifIePKtZwokRVZ-UdRGkZzs",
    "4280570365733019477"
  ],
  "maxReviewsPerPlace": 100,
  "sortBy": "newest"
}
```

- **places**: one business per line, up to 500. Any of:
  - **"business name, city"**: Google picks the best match, so add the city or street for chains,
  - a **Google Maps link** to the business (copy it from the address bar; short `maps.app.goo.gl` links are not accepted, open them first and copy the full link),
  - a **place ID** (`ChIJ…`),
  - a **CID** (the number in `maps.google.com/?cid=…`).
- **maxReviewsPerPlace**: 1 to 500 (default 100).
- **sortBy**: `newest` (default), `most_relevant` (Google's default order), `highest_rating` or `lowest_rating`.
- **country**: US, GB, CA, AU, IE, IN, DE, AT, CH, FR, BE, ES, MX, IT, NL, PT, BR, PL, SE, JP: the Google country used for the lookup. **languageCode** (optional) defaults to the country's main language; reviews written in other languages come translated into it, with the original in `originalText`.
- **onlyNewReviews** (optional, monitoring): return only reviews never delivered to you before for the same business, country and language. See below.
- **monitorName** (optional): name of the key-value store in your account that remembers delivered reviews (default `plainrows-maps-reviews-monitor`).

### Find businesses first, then get their reviews

Find businesses by category and city with [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses), then paste its **`placeId`**, **`cid`** or **`googleMapsUrl`** column into **places** here, as they are. In n8n, Make or Zapier, map the `placeId` of each result to the `places` list of this tool.

### Monitor a business: get only new Google reviews

Turn on **Only new reviews** (`"onlyNewReviews": true`), keep `sortBy: "newest"` and add an Apify **schedule** (daily, for example). The first run returns the reviews it finds and remembers their IDs in a key-value store of your own Apify account; each later run returns **and bills only reviews it has never delivered**. A business with nothing new gets a free row with `notFoundReason: "no-new-reviews"`. The blocks requested are still charged on every check (the data source bills them either way): set `maxReviewsPerPlace` just above the number of new reviews the business gets between two runs (for example 30 for about 15 new reviews a day, checked daily), not lower.

- The history is kept per business: a link, a place ID and a CID of the same business share it.
- Each run reads only the `maxReviewsPerPlace` newest reviews. **If more new reviews arrive between two runs than that limit, the older new ones are not read again and are missed.** When a check finds a full page of reviews and none of them was delivered before, the run warns you (`more than … new reviews since the last run`, also counted in `placesPossiblyMissingReviews` in the run summary): raise `maxReviewsPerPlace` or run the check more often. When a check reads new reviews that your limit leaves out (reviews are read in blocks of 10, so a limit of 15 reads 20), the run warns too (`… new reviews beyond your limit were not delivered this run`, counted in `reviewsBeyondLimitNotDelivered` in the run summary): they come with a later run only if still among the reviews it reads.
- Use a different **monitorName** per monitoring task to keep separate histories, or a new name to start over.

### Output example

Real row from a run on 2026-10-14 (The Plaza, New York, newest first; a review written in Spanish, translated by Google):

```json
{
  "input": "The Plaza Hotel, New York",
  "found": true,
  "placeTitle": "The Plaza",
  "placeAddress": "768 5th Ave, New York, NY 10019, United States",
  "placeId": "ChIJYaVdffBYwokRnTOoCzCq9mE",
  "cid": "7059016589280555933",
  "placeRating": 4.5,
  "placeReviewsCount": 6759,
  "googleMapsUrl": "https://maps.google.com/?cid=7059016589280555933",
  "position": 14,
  "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT214VlVHcFlkRGcyVlhaRU4yaDZNSGQzTlRodVNtYxAB",
  "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT214VlVHcFlkRGcyVlhaRU4yaDZNSGQzTlRodVNtYxAB!2m1!1s0x0:0x61f6aa300ba8339d!3m1!1s2@1:CAIQACodChtycF9oOmxVUGpYdDg2VXZEN2h6MHd3NThuSmc%7C%7C?hl=en-US",
  "rating": 5,
  "text": "I only went to see it as a tourist and I loved it",
  "originalText": "Solo fui a conocerlo como turista y me encantó",
  "originalLanguage": "es",
  "reviewedAt": "2025-12-26T00:29:15.000Z",
  "timeAgo": "9 months ago",
  "photoUrls": [],
  "reviewHighlights": [],
  "ownerAnswer": "Dear Guest,<br><br>Thank you for the great review of our hotel! We are glad that you enjoyed your visit and hope to see you again very soon.<br><br>Sincerely,<br>[name]<br>Managing Director",
  "originalOwnerAnswer": null,
  "ownerAnswerAt": "2026-01-13T22:58:57.000Z",
  "localGuide": true,
  "searchCountry": "US",
  "languageCode": "en",
  "observedAt": "2026-10-13T22:58:46.921Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Pay per result, no subscription, no proxy costs. See the **Pricing** tab for current prices. Three events, nothing else:

- **Review**: one per review returned, cheaper on higher Apify plans. Translation, photos, topic ratings, owner reply and the business's rating are included.
- **Block of 10 reviews requested**: Google reviews are fetched in blocks of 10 per place, and the data source bills us every block requested. So 100 reviews = 10 blocks. A block is charged once Google has answered, even if the business has fewer reviews than you asked for, or is not found. Tip: set `maxReviewsPerPlace` to what you need to pay for fewer blocks (with Only new reviews, keep it above the number of new reviews expected between two runs).
- **Actor start**: a small fixed fee per run, charged by Apify when the run starts.

Example, 100 reviews of one business at free Apify plan prices, run start included: about **$0.043**, i.e. about $0.0004 per review, about 30% less than the per-review price of the most used Google Maps reviews tool on the Store.

Duplicates and input mistakes cost nothing beyond the start fee, and requests Google does not answer are not charged. The same business given in several forms (link, place ID, CID, name) is recognised once Google has answered: its reviews and blocks are charged once, the other forms get a free row with `notFoundReason: "duplicate-place"`. A review with stars only (no text) is a normal review and is billed; a review that comes back without its text or date field at all (the data source changed its format) is neither delivered nor charged, and neither are the blocks of a business where no review was readable. The run never spends more than the maximum cost you set.

**Free Apify plan:** each run returns up to 50 reviews for up to 2 businesses, so you can check the output. A paid Apify plan removes these limits.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~google-reviews-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"places": ["The Plaza Hotel, New York"], "maxReviewsPerPlace": 50, "sortBy": "newest"}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/google-reviews-scraper`, schedule it daily with Only new reviews and post new reviews with 1 or 2 stars to Slack.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/google-reviews-scraper` to Claude, Cursor or any MCP client. The agent gets a typed tool and pays per result.

### What this is not

- **No reviewer names, profile links, profile pictures or reviewer IDs** (privacy by design, in line with GDPR data minimisation).
- Not every review ever written: up to 500 per business and run, in the order you chose. Use Only new reviews to build a full history over time.
- Not a search tool: to find businesses by category and city, use [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) first.
- Not affiliated with Google.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): businesses submitted and run, blocks of reviews charged, how many returned nothing, reviews billed, requests Google did not answer, monitored businesses that probably got more new reviews than `maxReviewsPerPlace` since the last run (`placesPossiblyMissingReviews`), new reviews read but left out by that limit (`reviewsBeyondLimitNotDelivered`), duplicates (`duplicatePlaces`, `duplicateReviewsSkipped`), reviews dropped because the data source changed its format (`reviewsWithChangedFormat`) and invalid values (with the reason, e.g. `SHORT_LINK`), and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I export the Google reviews of a business?**
Type "business name, city" (or paste its Google Maps link, place ID or CID) and run: one row per review with stars, text, date, photos and owner reply.

**Does it get the owner's replies?**
Yes: `ownerAnswer` and `ownerAnswerAt` on every review the business answered.

**Where do I find a place ID or CID?**
You do not need them: "name, city" or a full Google Maps link works. [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) returns both for every business it finds.

**How many reviews per business?**
Up to 500 per run. For more history, run on a schedule with Only new reviews.

**Does it include reviewer names?**
No: reviewer names, profile links and pictures are not collected.

**Reviews in other languages?**
Google translates them into the run's language (`text`); the original is in `originalText` with its language in `originalLanguage`.

**Is it the same as PlainRows Google Maps Reviews Scraper?**
Yes, same engine, same prices: [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews). Use either one.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Google Maps Email Extractor](https://apify.com/plainrows/google-maps-email-extractor) · [Google Maps Businesses Without Website](https://apify.com/plainrows/google-maps-no-website-leads) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [Website Email Extractor](https://apify.com/plainrows/website-email-extractor) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Workday Jobs Scraper](https://apify.com/plainrows/workday-jobs-scraper) · [Greenhouse Jobs Scraper](https://apify.com/plainrows/greenhouse-jobs-scraper) · [Lever Jobs Scraper](https://apify.com/plainrows/lever-jobs-scraper) · [Ashby Jobs Scraper](https://apify.com/plainrows/ashby-jobs-scraper) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews) · [Trustpilot Reviews Scraper](https://apify.com/plainrows/trustpilot-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper) · [Google Play Reviews Scraper](https://apify.com/plainrows/google-play-reviews-scraper) · [App Store Reviews Scraper](https://apify.com/plainrows/app-store-reviews-scraper)

### Support

Missing a field, a country or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

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

One per line: a Google Maps link to the place, a place ID ("ChIJ…"), a CID ("4280570365733019477", the number in maps.google.com/?cid=…) or "business name, city". The placeId, cid and googleMapsUrl columns of PlainRows Google Maps Scraper work as they are. Short links (maps.app.goo.gl) are not accepted: open them and copy the full link. Up to 500 places per run.

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

Up to 500. Reviews are fetched in blocks of 10: each block requested and each review returned is billed; see Pricing.

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

Newest first suits monitoring. Lowest rating first finds complaints fast.

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

Google country used for the lookup (and for finding a place by name). Reviews are not limited to this country: the place's reviews are the same everywhere.

## `languageCode` (type: `string`):

Two-letter language code, e.g. "en" or "de". Google shows reviews in other languages translated into this one (the original text is kept in originalText). Leave empty to use the country's main language.

## `onlyNewReviews` (type: `boolean`):

Return only reviews this tool has never delivered to you for the same place, country and language. The first run returns the reviews and remembers them; later runs (for example a daily schedule) return and bill only new reviews. Each run reads only the newest "Max reviews per place": set it above the number of new reviews expected between two runs, or older new reviews are missed (the run warns you). The block fee still applies.

## `monitorName` (type: `string`):

Name of the key-value store in your Apify account that remembers delivered reviews (default "plainrows-maps-reviews-monitor"). Use a different name per monitoring task to keep separate histories, or a new name to start over. Lowercase letters, digits and hyphens.

## Actor input object example

```json
{
  "places": [
    "The Plaza Hotel, New York"
  ],
  "maxReviewsPerPlace": 100,
  "sortBy": "newest",
  "country": "US",
  "onlyNewReviews": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "places": [
        "The Plaza Hotel, New York"
    ],
    "maxReviewsPerPlace": 100,
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/google-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": ["The Plaza Hotel, New York"],
    "maxReviewsPerPlace": 100,
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/google-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": [
    "The Plaza Hotel, New York"
  ],
  "maxReviewsPerPlace": 100,
  "country": "US"
}' |
apify call plainrows/google-reviews-scraper --silent --output-dataset

```

## MCP server setup

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