# Google Maps Reviews Scraper | Ratings & Replies (`datascraperes/google-maps-reviews-scraper`) Actor

Extract Google Maps reviews from up to 50 business URLs. Choose a review count or retrieve all available reviews. Export ratings, dates, text, owner replies, review links, and business metadata for local SEO and reputation monitoring. Extraction only: no sentiment labels or generated summaries.

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

## Pricing

from $0.45 / 1,000 review extracteds

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?

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

Extract public Google Maps reviews for one or more business listings and receive **structured review records** with ratings, dates, text, owner replies, review links, and business metadata. Enter a normal Google Maps business URL, optionally choose a review count, and open the resulting Dataset.

### What this Actor does

This Actor collects reviews from public Google Maps business listings. It accepts one URL for a single business or up to 50 different business URLs in one run, resolves each listing, follows the available review pages, removes duplicate review IDs, and stores one result item per business.

Each result combines the resolved business name, Place ID, current rating, total review count, and rating distribution with the normalized reviews exposed by Google Maps. A review can include its stable review ID, source date and timestamp, star rating, text, public review URL, and the business owner's reply when those values are available. The Actor is focused on extraction: it does not classify sentiment, generate summaries, or add inferred topics.

### Use cases

- Build review datasets for local SEO, reputation monitoring, and reporting.
- Export customer feedback text for analysis in your own tools or dashboards.
- Compare review volume, ratings, and owner-response coverage across businesses.
- Create a historical snapshot by running the Actor on a schedule.
- Feed business review records into a CRM, spreadsheet, warehouse, or research workflow.

### How to use

1. Open the Actor in Apify Console.
2. Add one Google Maps business listing URL, or one URL per line for a batch.
3. Optionally choose the number of reviews per business. Leave it empty to collect all reviews available, then choose the localization options.
4. Click **Start** and open the default Dataset when the run finishes.

### Input

The required field is `urls`. Use one complete HTTPS Google Maps business listing URL per array item. Standard `/maps/place/` links, `maps.app.goo.gl` links, `goo.gl/maps` links, and supported URLs containing a Place ID, CID, or LUDOCID are accepted. Google Search URLs, directions, user profiles, generic Maps searches, non-Google URLs, HTTP links, and duplicate URLs are rejected before collection starts.

`maxReviews` is optional. Apify Console starts with a prefilled value of `5`; set another positive integer to request that many unique reviews per business, or clear the field to follow the available review pages until Google returns no next page. API calls that omit this field also keep the unlimited behavior. In pay-per-event runs, the configured spending limit can reduce the effective number collected before extraction starts. `sort` defaults to `recent` and accepts `relevance`, `recent`, `highest`, or `lowest`; the selected value is recorded in the result, while Google can apply its own ranking to the current review endpoint. `language` and `country` default to `es` and `ES` and localize the Google Maps request; they do not translate review text.

This is the exact input used for the example below:

```json
{
  "urls": [
    "https://www.google.com/maps/place/?q=place_id:ChIJ--511_65pBIR4Tl2-D4grUw"
  ],
  "maxReviews": 5,
  "sort": "recent",
  "language": "es",
  "country": "ES"
}
```

### Output

The default Dataset contains one item per submitted business URL. `place` identifies the business and includes metadata when Google exposes it. `collection` reports the requested limit (or `null` when all available reviews were requested), records collected, unique records collected, selected order, and stable status. `reviews` contains the extracted records, and `quality` reports the observed coverage of text, ratings, timestamps, and owner replies. Error, blocked, and partial outcomes are also written as business-level items when the business was submitted successfully for processing.

This is the complete Dataset item from a successful extraction:

```json
{
  "place": {
    "inputUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ--511_65pBIR4Tl2-D4grUw",
    "resolvedUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ--511_65pBIR4Tl2-D4grUw",
    "placeId": "ChIJ--511_65pBIR4Tl2-D4grUw",
    "name": "LA FARMÀCIA DE CAN COROMINES MERITXELL PARERA GOL",
    "rating": 4.3,
    "totalReviews": 87,
    "ratingDistribution": {
      "1": 12,
      "2": 2,
      "3": 1,
      "4": 8,
      "5": 64
    }
  },
  "collection": {
    "status": "ok",
    "requested": 5,
    "collected": 5,
    "uniqueCollected": 5,
    "sort": "recent"
  },
  "reviews": [
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT21SQlRFbEdRa1F4TVRabFJFUXlXRW93VWtSVVNuYxAB",
      "date": "Hace un mes",
      "timestamp": 1783173085241142,
      "timestampDisplay": 1783173085241142,
      "rating": 5,
      "text": "Una farmacia con mucha empatía , me trataron súper bien , son divertidas cariñosas emprendedoras , el dueño guau de 100 el equipo lo aman ,Meritxell tan bonita .. Laia maravillosa te ríes mucho , son cercanas empaticas y siempre buscan tu satisfacción .. son excelentes todas\nEstás ahí y no te quieres ir . Gracias equipo",
      "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT21SQlRFbEdRa1F4TVRabFJFUXlXRW93VWtSVVNuYxAB!2m1!1s0x0:0x4cad203ef87639e1!3m1!1s2@1:CAIQACodChtycF9oOmRBTElGQkQxMTZlREQyWEowUkRUSnc%7C%7C?hl=es",
      "ownerReply": null,
      "ownerReplyDate": null
    },
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25VeE9YZHdXVUZ3WDFWbVpHdFJlVEl6ZERSSmIwRRAB",
      "date": "Hace 2 meses",
      "timestamp": 1779975855380747,
      "timestampDisplay": 1779975855380747,
      "rating": 5,
      "text": "Buen servicio! Hoy he comprado gafas para vista cansada. Me ayudaron a elegir exactamente lo que necesitaba, con amabilidad y de manera profesional. Estoy muy contento y recomiendo esta farmacia a todo el mundo.",
      "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT25VeE9YZHdXVUZ3WDFWbVpHdFJlVEl6ZERSSmIwRRAB!2m1!1s0x0:0x4cad203ef87639e1!3m1!1s2@1:CAIQACodChtycF9oOnUxOXdwWUFwX1VmZGtReTIzdDRJb0E%7C%7C?hl=es",
      "ownerReply": "Muchísimas gracias por tus palabras. Nos esforzamos en antender vustras necesidades de la mejor manera",
      "ownerReplyDate": "Hace 2 meses"
    },
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT201NlpqWnJPRU4wU0cxSk5rVnlRbGhrUmxkU2RsRRAB",
      "date": "Hace 6 meses",
      "timestamp": 1772207950691049,
      "timestampDisplay": 1772207950691049,
      "rating": 5,
      "text": "Excelente atención, horario estupendo, trato cercano y siempre con una sonrisa. Tienen todo lo que necesito y me asesoran con profesionalidad y paciencia. Sin duda, la mejor farmacia del pueblo.",
      "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT201NlpqWnJPRU4wU0cxSk5rVnlRbGhrUmxkU2RsRRAB!2m1!1s0x0:0x4cad203ef87639e1!3m1!1s2@1:CAIQACodChtycF9oOm56ZjZrOEN0SG1JNkVyQlhkRldSdlE%7C%7C?hl=es",
      "ownerReply": "Muchas gracias, nos alegra que te sientas bien atendido",
      "ownerReplyDate": "Hace 5 meses"
    },
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT21kQlYxUTVlSFJqZWprNFVYRlVjSFo1VlhSc05HYxAB",
      "date": "Hace 9 meses",
      "timestamp": 1763056088872060,
      "timestampDisplay": 1763056088872060,
      "rating": 5,
      "text": "Farmacia Can Corominas ofrece un trato excelente. El personal es muy atento, profesional y siempre dispuesto a ayudar. Resuelven dudas con claridad y te aconsejan con mucha cercanía. Además, la farmacia está bien organizada y suele tener todo lo necesario. Muy recomendable.",
      "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT21kQlYxUTVlSFJqZWprNFVYRlVjSFo1VlhSc05HYxAB!2m1!1s0x0:0x4cad203ef87639e1!3m1!1s2@1:CAIQACodChtycF9oOmdBV1Q5eHRjejk4UXFUcHZ5VXRsNGc%7C%7C?hl=es",
      "ownerReply": "David es muy gratificante oir tus palabras. Nos llena de orgullo y nos da energía para seguir en esta linea. Textos como los tuyos suman y nos ayudan a crecer. Gracias",
      "ownerReplyDate": "Hace 9 meses"
    },
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xSQ2FuUTVjMVZGWmw5UlgxazFlbWxRTkMweFZFRRAB",
      "date": "Hace 2 meses",
      "timestamp": 1780921434434411,
      "timestampDisplay": 1780921434434411,
      "rating": 5,
      "text": "Farmacia moderna, actual con productos de primer nivel y personal muy profesional y amable",
      "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2xSQ2FuUTVjMVZGWmw5UlgxazFlbWxRTkMweFZFRRAB!2m1!1s0x0:0x4cad203ef87639e1!3m1!1s2@1:CAIQACodChtycF9oOlRCanQ5c1VFZl9RX1k1emlQNC0xVEE%7C%7C?hl=es",
      "ownerReply": null,
      "ownerReplyDate": null
    }
  ],
  "quality": {
    "textCoverage": 1,
    "ratingCoverage": 1,
    "timestampCoverage": 1,
    "ownerReplyCoverage": 0.6,
    "deduplicated": true
  }
}
```

Dataset items can be inspected in Apify or exported in JSON, JSONL, CSV, Excel, XML, and other formats supported by Apify. The Actor does not include reviewer names, avatars, or profile URLs in this output contract.

### Pricing

This Actor uses pay-per-event pricing. You are charged once for each review successfully collected and included in a delivered Dataset item through the `review-extracted` event. The second column shows the exact unit price; the third is the equivalent cost for 1,000 reviews for comparison only.

| Apify plan | Price per review | Equivalent per 1,000 reviews |
| --- | ---: | ---: |
| Free | $0.00060 | $0.60 |
| Bronze | $0.00055 | $0.55 |
| Silver | $0.00050 | $0.50 |
| Gold | $0.00045 | $0.45 |
| Platinum | $0.00045 | $0.45 |
| Diamond | $0.00045 | $0.45 |

Actor starts, business-level metadata, empty results, blocked results, failed results, and reviews that are not successfully delivered do not create a review charge. Check the Actor's **Pricing** tab for the active configuration before running it.

### Related Actors

| Actor | Best for |
|---|---|
| [Google Maps Reviews Scraper & Sentiment Analyzer](https://apify.com/datascraperes/google-maps-review-analyzer) | Adding multilingual positive, neutral, and negative labels after extracting review records. |
| [Google Maps Business Scraper | $1 per 1,000](https://apify.com/datascraperes/actor-google-maps) | Discovering business listing URLs by location and category before sending selected businesses here. |

### Limits and data quality

- Each run accepts 1 to 50 different Google Maps business URLs. `maxReviews` is optional: provide any positive integer or omit it to collect all reviews available through Google's review pages.
- Businesses are processed sequentially and each completed result is written independently, so one unresolved or blocked listing does not erase other business results.
- Review rows are deduplicated by the source review ID when Google exposes one. `collected` is the number returned in this result, not a promise that it equals the business's total review count.
- Google can expose fewer rows, stop providing a next cursor, change response structures, or temporarily restrict a request. Inspect the collection status and collected counts instead of treating a short result as proof that no other reviews exist.
- The current endpoint can apply its own ranking for non-`recent` selections; the requested sort remains visible in `collection.sort`.
- Review text, dates, timestamps, ratings, review URLs, and owner replies may be unavailable for individual rows. Missing values are returned as `null`; coverage ratios are calculated from the records collected in that item.
- Business metadata and rating distributions depend on what Google exposes for the resolved listing and can be `null` or empty.
- This Actor uses direct HTTPS requests and does not use browser automation or a generative language model.

### Frequently asked questions

#### Do I need to provide a Google Place ID?

No. A normal public Google Maps business listing URL is enough. The Actor attempts to resolve the available business identifier. A URL that does not identify one unique listing can return an `ambiguous` or `not_found` status.

#### Are review texts included?

Yes. `reviews[].text` contains the text exposed by Google Maps, or `null` when a review has no available text. The Actor does not translate or summarize the text.

#### Can I process several businesses in one run?

Yes. Add one URL per entry in `urls`, up to 50 different businesses. The Dataset receives one independent result per URL in input order.

#### Why did I receive fewer reviews than requested?

Google Maps may expose fewer rows in the selected order, end the cursor chain, return a partial response, temporarily restrict collection, or the run's spending limit may cap a pay-per-event extraction. Review `collection.status`, `collection.requested`, `collection.collected`, and `collection.uniqueCollected` to understand the result returned by the run. When `collection.requested` is `null`, the run was configured to collect all available reviews.

#### Does the Actor return reviewer profiles?

No. The public output is limited to review content, identifiers, dates, ratings, review links, owner replies, and business metadata. Reviewer names, avatars, and profile URLs are omitted from this Actor's contract.

### Responsible use

Use this Actor only for lawful purposes and in accordance with applicable laws, privacy obligations, database rights, and the terms governing Google Maps data. You are responsible for determining whether collecting, storing, analyzing, and redistributing review content is permitted for your use case.

Review text can contain personal information written by third parties. Protect exported Datasets, minimize retention, avoid excessive collection, and honor applicable deletion or opt-out requests.

### Support

If a run returns an unexpected status or output, open an issue in the Actor's **Issues** tab with the run ID, a sanitized input URL, `collection.status`, and the observed behavior. Do not post API tokens, cookies, credentials, or private review content.

# Actor input Schema

## `urls` (type: `array`):

Each line must contain one complete HTTPS Google Maps business listing URL. Standard /maps/place/ links, maps.app.goo.gl short links, and goo.gl/maps links are accepted. Add one line for a single business or up to 50 different lines for batch processing. Duplicate URLs are rejected.

## `maxReviews` (type: `integer`):

Optional positive integer. Leave this field empty to collect all reviews available for each business.

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

Order requested for the Google Maps review collection.

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

Two-letter or regional language code used in Google Maps requests.

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

Two-letter country code used to localize Google Maps requests.

## Actor input object example

```json
{
  "urls": [
    "https://www.google.com/maps/place/?q=place_id:ChIJ--511_65pBIR4Tl2-D4grUw"
  ],
  "maxReviews": 5,
  "sort": "recent",
  "language": "es",
  "country": "ES"
}
```

# Actor output Schema

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

One result with business metadata, collection status, quality coverage, and normalized review records.

# 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 = {
    "urls": [
        "https://www.google.com/maps/place/?q=place_id:ChIJ--511_65pBIR4Tl2-D4grUw"
    ],
    "maxReviews": 5,
    "sort": "recent",
    "language": "es",
    "country": "ES"
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/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 = {
    "urls": ["https://www.google.com/maps/place/?q=place_id:ChIJ--511_65pBIR4Tl2-D4grUw"],
    "maxReviews": 5,
    "sort": "recent",
    "language": "es",
    "country": "ES",
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/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 '{
  "urls": [
    "https://www.google.com/maps/place/?q=place_id:ChIJ--511_65pBIR4Tl2-D4grUw"
  ],
  "maxReviews": 5,
  "sort": "recent",
  "language": "es",
  "country": "ES"
}' |
apify call datascraperes/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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