# 2GIS Reviews Monitor & Alerts (`anoha_56/2gis-reviews-monitor-alerts`) Actor

Stateful 2GIS review monitoring: new negative reviews, unanswered-review SLA, owner replies, rating and review-count changes.

- **URL**: https://apify.com/anoha\_56/2gis-reviews-monitor-alerts.md
- **Developed by:** [Anoha\_56](https://apify.com/anoha_56) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

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

### What is 2GIS Reviews Monitor & Alerts?

**2GIS Reviews Monitor & Alerts is a stateful review monitoring tool for businesses with one or more 2GIS branches.** Instead of exporting the same reviews on every run, it remembers what was already seen and returns only reputation changes that may require attention.

Use it to catch a new 1–3 star review, see when an owner reply is added, detect negative reviews that remain unanswered past your SLA, and track branch rating or review-count changes. The first run can be a quiet baseline, so existing old reviews do not flood your dataset as fresh alerts.

This Actor uses lightweight HTTP requests, does not launch a browser, and does not require a 2GIS login. It works well with Apify Schedules, API calls, Make/Zapier-style workflows, and webhooks.

### What can it monitor?

The Actor can emit these event types:

- `NEW_NEGATIVE_REVIEW` - a newly observed review at or below your configured rating threshold.
- `NEW_REVIEW` - any newly observed review when `emitAllNewReviews` is enabled.
- `OWNER_REPLY_ADDED` - the business added an official reply to a review seen earlier.
- `UNANSWERED_NEGATIVE` - a negative review stayed without an owner reply longer than your configured SLA.
- `REVIEW_UPDATED` - review text or rating changed.
- `RATING_CHANGED` - the branch's aggregate 2GIS rating changed.
- `REVIEW_COUNT_CHANGED` - the branch's aggregate review count changed.

Unchanged reviews are not repeatedly pushed to the dataset.

### How to use the 2GIS review monitor

1. Add one or more 2GIS branch review URLs or numeric branch IDs to **2GIS place URLs or firm IDs**.
2. Keep **Quiet first run** enabled for normal monitoring. The first successful check stores the current state without generating old-review alerts.
3. Choose your negative-review threshold and the number of hours a negative review may remain unanswered.
4. Run the Actor once to create the baseline.
5. Create an Apify Schedule, for example every hour or once per day. Later runs reuse the saved state and return only new changes.
6. Optionally provide a webhook URL. When a run produces alerts, the Actor sends one compact JSON payload containing all events from that run.

Use a different **Monitoring campaign name** (`stateKey`) when you want independent monitoring histories for separate clients, brands, or workflows.

### Example input

```json
{
  "places": [
    "https://2gis.ru/moscow/firm/70000001044357973/tab/reviews",
    "https://2gis.kz/almaty/firm/70000001076772761/tab/reviews"
  ],
  "placeNames": ["Moscow branch", "Almaty branch"],
  "stateKey": "my-brand",
  "quietBaseline": true,
  "recentReviewsPerPlace": 50,
  "negativeMaxRating": 3,
  "unansweredAfterHours": 24,
  "emitAllNewReviews": false,
  "emitAggregateChanges": true
}
```

### Example alert

```json
{
  "eventType": "NEW_NEGATIVE_REVIEW",
  "placeId": "70000001044357973",
  "placeName": "Moscow branch",
  "placeUrl": "https://2gis.ru/moscow/firm/70000001044357973/tab/reviews",
  "rating": 2,
  "text": "The order took too long.",
  "authorName": "Customer",
  "hasOwnerReply": false,
  "observedAt": "2026-09-15T08:03:22.267+00:00"
}
```

The default dataset contains alert events only. A compact run summary is also written to the `OUTPUT` record in the run's default key-value store.

### Pricing

This Actor uses **pay per event** pricing. The primary billable event is a successful **2GIS branch check**.

- Price: **$0.005 per successfully checked branch**.
- Failed branches are not charged by the Actor's custom `branch-check` event.
- A run with 10 branches costs about **$0.05** in Actor event charges.
- Checking 10 branches once per day for 30 days is about **$1.50** in Actor event charges.

The Actor is intentionally priced per branch check rather than per review because monitoring usually needs to inspect recent reviews even when nothing changed. This makes recurring costs predictable.

### Tips for reliable monitoring

Run often enough that `recentReviewsPerPlace` covers the number of reviews a branch can receive between runs. For a normal local business, 50 recent reviews per branch is a practical default. High-volume locations may need a higher value or a more frequent schedule.

Keep `quietBaseline=true` unless you deliberately want all currently visible reviews to be treated as new on the first run. Use `resetState=true` only when you intentionally want to discard the saved campaign state and rebuild the baseline.

### API and integrations

Like every Apify Actor, this monitor can be called from the Apify API, CLI, Python, JavaScript, OpenAPI integrations, and scheduled workflows. Dataset alerts can be consumed programmatically, while the optional webhook is useful when another service should react immediately to new incidents.

### FAQ

#### Does this export every 2GIS review?

No. This Actor is optimized for recurring reputation monitoring. If you need a bulk historical review export, a dedicated raw 2GIS reviews scraper is a better fit.

#### Does it need a browser, proxy, or 2GIS account?

No browser or 2GIS login is required for normal operation. The Actor uses public web review data over HTTP.

#### Is this an official 2GIS product?

No. This Actor is an independent monitoring tool and is not affiliated with or endorsed by 2GIS. You are responsible for using collected public data in accordance with applicable laws and platform terms.

#### Can I monitor several brands or clients independently?

Yes. Give each monitoring campaign a different `stateKey`, or use separate saved Actor tasks.

#### Quiet-run dataset heartbeat

If a run produces no reputation alerts, the Actor writes one `RUN_SUMMARY` row to the default dataset. This keeps scheduled runs observable and satisfies Apify Store health checks without turning old reviews into fake alerts. When real alerts exist, the dataset contains the alert rows only.

# Changelog

This Actor's version history is a separate document: https://apify.com/anoha\_56/2gis-reviews-monitor-alerts/changelog.md

# Actor input Schema

## `places` (type: `array`):

Paste one or more 2GIS branch review URLs or numeric firm IDs.

## `placeNames` (type: `array`):

Optional branch names in the same order as places. Leave empty to use firm IDs.

## `stateKey` (type: `string`):

Persistent-state namespace. Use a different value for independent monitoring campaigns.

## `quietBaseline` (type: `boolean`):

On the first run, save the current reviews as a baseline instead of emitting them as new alerts.

## `recentReviewsPerPlace` (type: `integer`):

How many of the most recent reviews to inspect on each run. 50 is recommended for normal monitoring.

## `negativeMaxRating` (type: `integer`):

Reviews at or below this star rating are treated as negative and can trigger priority alerts.

## `unansweredAfterHours` (type: `integer`):

Emit an unanswered-negative alert after this many hours without an owner reply.

## `emitAllNewReviews` (type: `boolean`):

When enabled, emit every new review. When disabled, new-review alerts focus on negative reviews.

## `emitAggregateChanges` (type: `boolean`):

Emit events when the branch aggregate rating or review count changes between runs.

## `webhookUrl` (type: `string`):

If set, POST one compact JSON payload containing all alerts after a run that produced events.

## `resetState` (type: `boolean`):

Enable once to intentionally discard the saved campaign state and rebuild the baseline.

## Actor input object example

```json
{
  "places": [
    "https://2gis.ru/moscow/firm/70000001044357973/tab/reviews"
  ],
  "placeNames": [],
  "stateKey": "default",
  "quietBaseline": true,
  "recentReviewsPerPlace": 50,
  "negativeMaxRating": 3,
  "unansweredAfterHours": 24,
  "emitAllNewReviews": false,
  "emitAggregateChanges": true,
  "webhookUrl": "",
  "resetState": false
}
```

# Actor output Schema

## `events` (type: `string`):

New negative reviews, owner replies, unanswered-review SLA alerts, review edits, and aggregate rating/count changes.

## `summary` (type: `string`):

Compact JSON summary for the run.

# 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("anoha_56/2gis-reviews-monitor-alerts").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("anoha_56/2gis-reviews-monitor-alerts").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 anoha_56/2gis-reviews-monitor-alerts --silent --output-dataset

```

## MCP server setup

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

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/2a9y8dBrscDkdjzqO/builds/y3yL7IQur0VLEAMi0/openapi.json
