# Google Maps Review Sentiment Scraper (`googleapi/google-maps-review-sentiment-scraper`) Actor

Collect rich public Google Maps reviews with reviewer and place context, then add transparent heuristic sentiment, theme, and urgency labels.

- **URL**: https://apify.com/googleapi/google-maps-review-sentiment-scraper.md
- **Developed by:** [Google API](https://apify.com/googleapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

Collect public Google Maps reviews and associate them with their business listings. Each dataset record contains one review, available business and reviewer context, and a sentiment summary based on the review text and rating.

Sentiment, themes, and urgency are heuristic estimates produced by the Actor; they are not labels supplied by Google. Use them as a starting point for analysis, not as definitive assessments.

### How to use

1. Provide public Maps place URLs in `startUrls`, or searches in `queries` with an optional location.
2. Set the total review limit, the maximum reviews per business, and how many businesses to inspect.
3. Run the Actor and view or export the review records in the dataset.

Example:

```json
{
  "queries": ["coffee shops"],
  "location": "Seattle, WA",
  "maxItems": 25,
  "maxReviews": 20,
  "maxDetailItems": 5,
  "maxPages": 4
}
```

### Input

| Input | Description | Default |
|---|---|---:|
| `startUrls` | Public Maps place or search URLs. Place URLs collect reviews for that listing; search URLs first discover places. | — |
| `queries` | Google Maps search phrases. | — |
| `location` | Location appended to each search phrase. | — |
| `maxItems` | Maximum review records across the run. | 25 |
| `maxReviews` | Maximum reviews collected per place. | 100 |
| `maxDetailItems` | Maximum place profiles to inspect for each search. | 10 |
| `maxPages` | Bound on review-feed scrolling. | 8 |
| `page` | Starting review page. Only `1` is supported because Maps does not provide stable numbered review pages. | 1 |
| `useBrowser` | Use a rendered Maps page to read review cards. Disabling it may return fewer or no reviews. | `true` |
| `proxyConfiguration` | Optional Apify Proxy configuration. | — |

You can combine Maps URLs and searches. `maxItems` is the overall output cap; `maxReviews` applies separately to each place.

### Output

Each dataset row represents one public review. Depending on what Maps displays, it can contain:

- **Review content:** full review text, `reviewTextHtml`, language, rating, and the date wording shown by Maps.
- **Business details:** place name and URL, category, address, coordinates, phone, website, price range, aggregate rating, review count, and other visible profile information.
- **Reviewer and visit details:** public reviewer name or profile, contribution labels, visit details, and public review photos or videos.
- **Business response:** owner response text and date when visible.
- **Analysis:** sentiment, themes, and urgency estimates.

Relative dates remain in their original wording. An ISO date is included only when Maps supplies an explicit calendar date. Public reviewer information and review text are part of this Actor’s output; handle them according to your privacy obligations.

Example dataset item:

```json
{
  "reviewId": "review_123",
  "placeId": "ChIJ000000000000",
  "placeName": "Example Cafe",
  "reviewerName": "Maps contributor",
  "reviewText": "Friendly service and excellent coffee.",
  "reviewDateText": "2 weeks ago",
  "reviewDateIso": null,
  "reviewRating": 5,
  "sentiment": {
    "label": "positive",
    "score": 0.45,
    "confidence": 0.6
  },
  "themes": ["service", "value"],
  "urgency": "low"
}
```

Run summary information is available with the run output in Apify.

### Limits and responsible use

Google Maps may show a limited number of reviews or restrict a page. Results vary by business and search. More places and reviews increase run time. The Actor does not sign in or bypass access checks.

Use review and reviewer information responsibly, follow applicable privacy requirements and Google Maps terms. This Actor is not affiliated with Google.

# Actor input Schema

## `startUrls` (type: `array`):

Public Google Maps search or place URLs. Place URLs collect reviews for that listing; search URLs discover place listings first.

## `queries` (type: `array`):

Search Google Maps for matching places, then collect public reviews from discovered listings.

## `location` (type: `string`):

Optional location phrase appended to each search query.

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

Global maximum of business review records to emit across all supplied places.

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

Maximum review cards to collect from each place page.

## `maxDetailItems` (type: `integer`):

Maximum number of place detail pages to open for each search URL or query.

## `page` (type: `integer`):

Google Maps does not expose stable numbered review pages; only page 1 is supported. Use maxPages to bound review-feed scrolling.

## `maxPages` (type: `integer`):

Bounds feed scrolling used to load additional reviews.

## `proxyConfiguration` (type: `object`):

Optional Apify proxy settings. No proxy is used unless configured.

## `requestTimeoutSecs` (type: `integer`):

Bounded timeout for each page navigation.

## `browserWaitMs` (type: `integer`):

Maximum time to wait for rendered review cards after navigation; the actor returns early when cards are ready.

## `requestDelayMs` (type: `integer`):

Delay between public page navigations.

## `maxRequestRetries` (type: `integer`):

Maximum retries for retryable navigation or static-request errors.

## `useBrowser` (type: `boolean`):

Use Chromium to read rendered Maps review cards. Turning this off uses static HTML and can return fewer or no reviews.

## Actor input object example

```json
{
  "maxItems": 25,
  "maxReviews": 100,
  "maxDetailItems": 10,
  "page": 1,
  "maxPages": 8,
  "requestTimeoutSecs": 45,
  "browserWaitMs": 8000,
  "requestDelayMs": 500,
  "maxRequestRetries": 1,
  "useBrowser": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("googleapi/google-maps-review-sentiment-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("googleapi/google-maps-review-sentiment-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 '{}' |
apify call googleapi/google-maps-review-sentiment-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,googleapi/google-maps-review-sentiment-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/aTIfaLqmgFwH70D4T/builds/TMSVJ7IsmFxDVjtKE/openapi.json
