# Google Maps Reviews Scraper (`rastriq/gmaps-reviews-tracker`) Actor

Scrape reviews from any Google Maps place — restaurants, hotels, shops, landmarks. Get review text, star rating, author, date and language. Sort by newest, relevant, highest or lowest. Filter by date for daily monitoring. 50+ reviews/second, from $0.20 per 1,000 reviews.

- **URL**: https://apify.com/rastriq/gmaps-reviews-tracker.md
- **Developed by:** [Rastriq — Structured data from the world](https://apify.com/rastriq) (community)
- **Categories:** Marketing, Lead generation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$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.

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

Extract reviews from any Google Maps place — restaurants, hotels, shops, landmarks, or any business. Get the full review text, star rating, author name, date, language, and unique review ID.

### Why this scraper?

- **50+ reviews/second** — extract 1,000 reviews in under 30 seconds
- **$0.20 per 1,000 reviews** — one of the cheapest on the Store
- **Lightweight** — runs on 256 MB, no heavy infrastructure
- **Reliable** — pure API calls, no flaky page rendering or captchas

### What data do you get?

Each review includes:

| Field | Description |
|-------|-------------|
| `review_id` | Unique Google review identifier |
| `rating` | Star rating (1–5) |
| `author` | Reviewer display name |
| `user_id` | Google contributor numeric ID |
| `text` | Full review text (null for rating-only reviews) |
| `date_iso` | ISO 8601 timestamp (UTC) |
| `date_relative` | Relative date ("2 weeks ago") |
| `language` | Detected language code (en, es, fr…) |
| `place_url` | Source Google Maps URL |

### How to use

1. **Paste one or more place identifiers** — Google Maps URLs, Place IDs (`ChIJ...`), or CID URLs
2. **Set the number of reviews** — start with 10 for testing, then scale up
3. **Choose sort order** — newest, most relevant, highest, or lowest rating
4. **Click Start**

#### Supported input formats

- **Google Maps URL** — `https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2922926,17z`
- **Place ID** — `ChIJLU7jZClu5kcR4PcOOO6p3I0` (from Google Maps API or Places search)
- **CID URL** — `https://maps.google.com/?cid=11223344556677889900`
- **Short URL** — `https://goo.gl/maps/...` (resolved automatically)

You can mix formats in the same run.

#### Filtering by date

Set "Only reviews newer than" to a date and the scraper will stop collecting once it reaches reviews older than that date. Ideal for daily monitoring — run on a schedule and only collect new reviews since your last run.

#### Sorting options

All sorting is done **server-side by Google**, so you get the exact results you'd see in the Maps interface:

- **Newest first** — most recent reviews, ideal for monitoring
- **Most relevant** — Google's default ranking
- **Highest rating** — 5-star reviews first
- **Lowest rating** — 1-star reviews first, great for complaint analysis

### Input example

```json
{
  "placeUrls": [
    { "url": "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2922926,17z" }
  ],
  "maxReviewsPerPlace": 500,
  "sort": "newest"
}
````

### Output example

```json
{
  "review_id": "ChdDSUhNMGOgS0VoRTRsdXRzVG9...",
  "rating": 5,
  "author": "Maria Garcia",
  "user_id": "117234567890123456789",
  "text": "Amazing experience! The views from the top are breathtaking.",
  "timestamp": 1718900000,
  "date_iso": "2025-06-20T15:30:00+00:00",
  "date_relative": "a month ago",
  "language": "en",
  "place_url": "https://www.google.com/maps/place/Eiffel+Tower/..."
}
```

### Performance

Tested on real places with thousands of reviews:

| Reviews | Time | Speed | Memory |
|---------|------|-------|--------|
| 500 | 15s | 33 rev/s | 57 MB |
| 1,000 | 26s | 39 rev/s | 64 MB |

### Integrations

Export results in JSON, CSV, or Excel. Connect to Google Sheets, Slack, email, or any webhook via [Apify integrations](https://docs.apify.com/platform/integrations).

Schedule runs to monitor new reviews automatically — daily, hourly, or on any cron schedule.

### Limitations

- Reviews are extracted as Google returns them. Rating-only reviews (no text) will have `text: null`.
- The `language` field is Google's auto-detection and may be null for very short reviews.
- Google Maps URLs must include the place identifier. Short URLs (goo.gl) are resolved automatically.

### Need to find places first?

Use [Google Maps Scraper — Places](https://apify.com/rastriq/gmaps-discover-enrich) to discover businesses by search term and location. It returns names, addresses, phones, websites, ratings, review histograms and more. Then feed the URLs into this Reviews Scraper to get the full review text for each place.

# Actor input Schema

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

Google Maps URLs of the places to scrape. Copy the full URL from your browser address bar.

## `placeIdentifiers` (type: `string`):

Alternative to URLs above. Paste Place IDs or CIDs, one per line.<br><br><b>Place ID</b>: <code>ChIJLU7jZClu5kcR4PcOOO6p3I0</code><br><b>CID</b>: <code>11223344556677889900</code><br><b>CID URL</b>: <code>https://maps.google.com/?cid=...</code><br><br>You can use this field together with Place URLs above — all will be merged.

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

Maximum number of reviews to extract from each place. Set to <code>0</code> to extract <b>all available reviews</b>.<br><br>Start with a low number (10–50) for testing. A typical place has 100–5,000 reviews; landmarks can have 50,000+.

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

Server-side sort order applied before extraction.<br><br><b>Newest</b> — most recent reviews first (best for monitoring)<br><b>Most relevant</b> — Google's default ranking<br><b>Highest rating</b> — 5-star reviews first<br><b>Lowest rating</b> — 1-star reviews first (great for sentiment analysis)

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

Only extract reviews published after this date. Sort is automatically set to <b>Newest first</b> when a date filter is active.<br><br>Useful for monitoring: run daily and only collect new reviews since your last run.

## Actor input object example

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2922926,17z"
  ],
  "maxReviewsPerPlace": 10,
  "sort": "newest"
}
```

# Actor output Schema

## `reviews` (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/Eiffel+Tower/@48.8583701,2.2922926,17z"
    ],
    "maxReviewsPerPlace": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("rastriq/gmaps-reviews-tracker").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/Eiffel+Tower/@48.8583701,2.2922926,17z"],
    "maxReviewsPerPlace": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("rastriq/gmaps-reviews-tracker").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 '{
  "placeUrls": [
    "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2922926,17z"
  ],
  "maxReviewsPerPlace": 10
}' |
apify call rastriq/gmaps-reviews-tracker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Reviews Scraper",
        "description": "Scrape reviews from any Google Maps place — restaurants, hotels, shops, landmarks. Get review text, star rating, author, date and language. Sort by newest, relevant, highest or lowest. Filter by date for daily monitoring. 50+ reviews/second, from $0.20 per 1,000 reviews.",
        "version": "0.1",
        "x-build-id": "oKClMSEhnb1ym1rC2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rastriq~gmaps-reviews-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rastriq-gmaps-reviews-tracker",
                "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/rastriq~gmaps-reviews-tracker/runs": {
            "post": {
                "operationId": "runs-sync-rastriq-gmaps-reviews-tracker",
                "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/rastriq~gmaps-reviews-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-rastriq-gmaps-reviews-tracker",
                "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",
                "properties": {
                    "placeUrls": {
                        "title": "Place URLs",
                        "type": "array",
                        "description": "Google Maps URLs of the places to scrape. Copy the full URL from your browser address bar.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "placeIdentifiers": {
                        "title": "Place IDs or CIDs",
                        "type": "string",
                        "description": "Alternative to URLs above. Paste Place IDs or CIDs, one per line.<br><br><b>Place ID</b>: <code>ChIJLU7jZClu5kcR4PcOOO6p3I0</code><br><b>CID</b>: <code>11223344556677889900</code><br><b>CID URL</b>: <code>https://maps.google.com/?cid=...</code><br><br>You can use this field together with Place URLs above — all will be merged."
                    },
                    "maxReviewsPerPlace": {
                        "title": "Max reviews per place",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum number of reviews to extract from each place. Set to <code>0</code> to extract <b>all available reviews</b>.<br><br>Start with a low number (10–50) for testing. A typical place has 100–5,000 reviews; landmarks can have 50,000+.",
                        "default": 200
                    },
                    "sort": {
                        "title": "Sort reviews by",
                        "enum": [
                            "newest",
                            "relevant",
                            "highest",
                            "lowest"
                        ],
                        "type": "string",
                        "description": "Server-side sort order applied before extraction.<br><br><b>Newest</b> — most recent reviews first (best for monitoring)<br><b>Most relevant</b> — Google's default ranking<br><b>Highest rating</b> — 5-star reviews first<br><b>Lowest rating</b> — 1-star reviews first (great for sentiment analysis)",
                        "default": "newest"
                    },
                    "reviewsNewerThan": {
                        "title": "Only reviews newer than",
                        "type": "string",
                        "description": "Only extract reviews published after this date. Sort is automatically set to <b>Newest first</b> when a date filter is active.<br><br>Useful for monitoring: run daily and only collect new reviews since your last run."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
