# Google Maps Reviews Insights: ratings, trends, top terms (`ucchiii/reviews-insights`) Actor

Turn Google Maps reviews scraper output into per-place insights: star distribution, rating trend, owner response rate and speed, top positive and negative terms, photo share. No personal data in the output. $5 per 1,000 places.

- **URL**: https://apify.com/ucchiii/reviews-insights.md
- **Developed by:** [Actor Factory](https://apify.com/ucchiii) (community)
- **Categories:** Automation, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 places

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 Maps Reviews Insights — ratings, trends and top terms per place

**For local-SEO agencies, multi-location brands and market researchers who scrape Google Maps reviews.** You have
**thousands of rows nobody has time to read**. This Actor turns the output of a reviews scraper
(e.g. `compass/Google-Maps-Reviews-Scraper`) into **one insight row per place** — no scraping, no proxies, no LLM, fully
rule-based and reproducible. **$5 per 1,000 places.**

For each place you get:

- **Rating**: review count, average stars, distribution (1–5 stars)
- **Momentum**: reviews in the last 30 days, average stars over the last 90 days, a **trend** (count and average stars per month or per N months)
- **Owner engagement**: owner response rate and average days to respond
- **What people say**: top **positive** terms (4–5 star reviews) and top **negative** terms (1–2 star reviews), single words and two-word phrases, English stop words removed (add your own)
- **Photos**: share of reviews with photos, and the latest review date

**Privacy by design:** reviewer names, IDs and profile URLs are never written to the output, and neither is the review text — only aggregates.

One place = one output row; reading reviews is free. Leave `datasetIds` empty for a free demo on fictional data.

### Use cases

- Monthly reputation report per location for a multi-location brand
- Compare competitors' ratings, response rates and recurring complaints
- Spot places whose recent rating is dropping

### Input

```json
{
  "datasetIds": ["<dataset ID of your reviews scraper run>"],
  "periodMonths": 1,
  "topTerms": 20,
  "stopwords": ["mybrand"]
}
```

### Output (one row per place)

```json
{
  "placeId": "demo-cafe", "placeName": "Sample Coffee Roasters (fictional)", "url": "https://www.example.com/demo-cafe",
  "reviewsCount": 6, "avgStars": 3.5, "starsDistribution": {"1": 1, "2": 1, "3": 0, "4": 2, "5": 2},
  "last30DaysCount": 3, "last90DaysAvgStars": 3.33,
  "trend": [{"period": "2026-06", "count": 1, "avgStars": 1.0}],
  "ownerResponseRate": 0.667, "avgOwnerResponseDays": 2.8,
  "topPositiveTerms": [{"term": "great coffee", "count": 2}], "topNegativeTerms": [{"term": "slow service", "count": 2}],
  "withPhotosShare": 0.333, "latestReviewAt": "2026-10-15T00:00:00+00:00"
}
```

Run statistics (`reviewsRead`, `reviewsSkipped`, `places`, `written`) are saved in the key-value store as `STATS`.

### Notes

- Works on datasets you already own; it does not access Google. You are responsible for how the underlying data was collected and used.
- Term analysis is simple (lowercase, basic plural folding) and tuned for English text. Translated text (`textTranslated`) is used when the original is empty. Terms appearing in fewer than 2 reviews are omitted.
- Reviews without a place ID are grouped by URL or place name; reviews without a star rating count toward totals but not rating averages.

### More tools from the same developer

- [Google Maps Leads Cleaner](https://apify.com/ucchiii/maps-leads-cleaner) — dedupe Google Maps scraper results, format phones (E.164), CRM-ready leads
- [Google Maps Market Analyzer](https://apify.com/ucchiii/maps-market-analyzer) — market and competitor tables from Google Maps scraper datasets
- [Google Sheets Export](https://apify.com/ucchiii/google-sheets-export) — export an Apify dataset to Google Sheets
- [Dataset Merge & Dedup](https://apify.com/ucchiii/dataset-dedup-merge) — merge Apify datasets and remove duplicates by the fields you choose

# Actor input Schema

## `datasetIds` (type: `array`):

Dataset IDs (the 'defaultDatasetId' of a finished run of the source Actor, e.g. 'WkzbQMuFYuamGv3YF'). Datasets from your Google Maps reviews scraper runs (e.g. compass/Google-Maps-Reviews-Scraper). Reviews are grouped by place. Leave empty to run a free demo on fictional sample data (not charged).

## `periodMonths` (type: `integer`):

Length of each trend bucket in months. 1 = monthly count and average rating, 3 = quarterly. Allowed range 1 to 12 (default 1).

## `topTerms` (type: `integer`):

How many top positive and top negative words or two-word phrases to return for each place. Allowed range 0 to 100 (default 20); 0 returns no term lists.

## `stopwords` (type: `array`):

Additional words to ignore in term analysis, such as the place name or brand (lowercase, e.g. \['starbucks', 'cafe']). Common English stop words are always ignored.

## Actor input object example

```json
{
  "periodMonths": 1,
  "topTerms": 20
}
```

# Actor output Schema

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

One item per place: placeName, reviewsCount, avgStars, last30DaysCount, last90DaysAvgStars, ownerResponseRate, avgOwnerResponseDays, withPhotosShare, latestReviewAt (plus star distribution, rating trend and top terms).

## `stats` (type: `string`):

Record STATS: run counts (reviews read, places analyzed).

# 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("ucchiii/reviews-insights").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("ucchiii/reviews-insights").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 ucchiii/reviews-insights --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ucchiii/reviews-insights"
        }
    }
}
```

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/KOSmhq2IFcnKqXlhH/builds/ECSwUiE4jckYSPVz3/openapi.json
