# Google Reviews Monitor (`arched_friend/google-reviews-monitor`) Actor

Monitor Google reviews for your business and your competitors. Pull every review with its rating, author and owner reply, filter to complaints only, and get just the new ones on every scheduled run.

- **URL**: https://apify.com/arched\_friend/google-reviews-monitor.md
- **Developed by:** [Peach O](https://apify.com/arched_friend) (community)
- **Categories:** Business, Automation
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 business checkeds

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/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

## Google Reviews Monitor: Know About Every Review

Watch what customers say about your business on Google, and about the competitor down the road. Pull every review with its rating, author and owner reply, then schedule it and get only the reviews that appeared since yesterday.

Built for owners, multi site operators and reputation teams who need to answer a one star review the same day it lands.

### How it works

```mermaid
flowchart LR
    A["Business names<br/>or Maps links"] --> B["Find the listing"]
    B --> C["Open the reviews pane"]
    C --> D["Scroll and expand<br/>every review"]
    D --> E{"Filters<br/>stars, keyword, date"}
    E --> F{"Seen before?"}
    F -->|no| G[("New review rows")]
    F -->|yes| H["Skipped"]
```

Name lookups resolve to the closest matching listing. When you manage several branches with the same name, paste the exact Maps link instead so the right one is checked every time.

### Built for

- **Owners and managers** answering complaints before they spread
- **Multi site operators** comparing branches on rating and complaint volume
- **Reputation agencies** reporting review movement to clients
- **Competitor research** reading exactly what rivals get criticised for

### Input

```json
{
  "businesses": ["Blacklock Manchester", "Tattu Manchester"],
  "maxReviewsPerPlace": 100,
  "sortBy": "newest",
  "onlyNewReviews": true
}
```

| Setting | What it does |
| --- | --- |
| `businesses` | Names to look up. Add the town to pin the right branch |
| `placeUrls` | Exact Maps links when a name is ambiguous |
| `onlyNewReviews` | Return only reviews not seen on a previous run |
| `minRating` / `maxRating` | Narrow to praise or to complaints |
| `searchQuery` | Keep only reviews mentioning a word such as parking |
| `sortBy` | Newest, most relevant, highest or lowest rating |

### Output

```json
{
  "reviewId": "ChdDSUhNMG9nS0VJQ0FnSUR",
  "businessName": "Blacklock Manchester",
  "category": "Steak house",
  "author": "Sarah T",
  "rating": 5,
  "text": "Best chops in the city, booked again for next month",
  "relativeTime": "2 weeks ago",
  "reviewedAt": "2026-08-21T12:00:00.000Z",
  "ownerReply": "Thanks Sarah, see you soon",
  "photoCount": 3,
  "localGuide": true,
  "placeRating": 4.7,
  "googleMapsUrl": "https://www.google.com/maps/place/..."
}
```

Note `relativeTime` sits next to `reviewedAt`. Google never publishes an exact review date, only a phrase like "2 weeks ago", so the timestamp is worked out from that phrase and the original wording is kept so you can see what it was based on.

### Watch complaints across every branch

```json
{
  "businesses": ["Acme Coffee Leeds", "Acme Coffee York", "Acme Coffee Hull"],
  "minRating": 1,
  "maxRating": 2,
  "onlyNewReviews": true
}
```

Schedule that each morning and every run is a short list of new complaints across all three sites, with the owner reply field showing which ones nobody has answered yet.

### Run it as an API

```bash
curl -X POST "https://api.apify.com/v2/acts/arched_friend~google-reviews-monitor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "businesses": ["Blacklock Manchester"],
    "maxReviewsPerPlace": 50,
    "maxRating": 3
  }'
```

### Pricing

You pay $0.02 for each business checked, whatever the review count.

| Watching 20 locations daily | Monthly cost |
| --- | --- |
| Checking each listing by hand | roughly 25 hours |
| Reputation management suites | $100 to $600 per month |
| This Actor | $12 per month |

### Common questions

**Why is the review date approximate?** Google shows reviews as "3 weeks ago" rather than a date. The Actor converts that phrase to a timestamp and keeps the original phrase in `relativeTime` so nothing is hidden from you.

**Will it pick the right branch?** A name plus a town usually resolves correctly. For chains with many nearby sites, use `placeUrls` and there is no guesswork at all.

**Can it tell me which reviews we have not answered?** Yes. Filter the output where `ownerReply` is empty.

### Related products

- **Google Maps Lead Finder** to build the list of businesses in the first place
- **App Store Review Tracker** and **Google Play Review Tracker** for the same monitoring on mobile apps
- **Website Lead Extractor** to pull contact details for any business you find

# Actor input Schema

## `businesses` (type: `array`):

Business names to look up, one per line. Add the town to avoid matching the wrong branch, for example Blacklock Manchester.

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

Optional. Paste exact Google Maps place links when you want no ambiguity about which branch is checked.

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

How many reviews to load for each business.

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

Which reviews Google loads first.

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

Remember review ids across runs and return only what appeared since last time. Turn this on for scheduled monitoring.

## `minRating` (type: `integer`):

Keep only reviews rated at least this high.

## `maxRating` (type: `integer`):

Keep only reviews rated at most this high. Set both to 2 to watch complaints only.

## `searchQuery` (type: `string`):

Keep only reviews mentioning this word, for example parking, rude or wait.

## `since` (type: `string`):

A date such as 2026-08-01. Google gives approximate review dates, so this filter is approximate too.

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

Two letter language code for the Maps interface.

## `countryCode` (type: `string`):

Two letter country code that biases the business lookup, for example us, gb, de.

## `maxConcurrency` (type: `integer`):

How many businesses to load at once. Lower this if you see rate limiting.

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

Defaults to residential, which this Actor needs. Google serves the reviews pane to datacenter addresses inconsistently, so plain datacenter proxies return empty runs.

## Actor input object example

```json
{
  "businesses": [
    "Blacklock Manchester"
  ],
  "maxReviewsPerPlace": 100,
  "sortBy": "newest",
  "onlyNewReviews": false,
  "minRating": 1,
  "maxRating": 5,
  "language": "en",
  "countryCode": "",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

One row per review, with rating, text, author, photo count and any owner reply.

## `runSummary` (type: `string`):

Per business rating breakdown, negative review counts and how many reviews the owner answered.

# 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 = {
    "businesses": [
        "Blacklock Manchester"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arched_friend/google-reviews-monitor").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 = { "businesses": ["Blacklock Manchester"] }

# Run the Actor and wait for it to finish
run = client.actor("arched_friend/google-reviews-monitor").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 '{
  "businesses": [
    "Blacklock Manchester"
  ]
}' |
apify call arched_friend/google-reviews-monitor --silent --output-dataset

```

## MCP server setup

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

```

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/nbH8wpKOpYZ42Zuhz/builds/jj3070x75gGsZTvek/openapi.json
