# Google Play Review Change Monitor and Alerts (`redfoxxie/google-play-review-change-monitor-alerts`) Actor

Monitor selected Android apps for newly posted low-rating Google Play reviews with persistent deduplication, app versions, developer replies, helpful votes, transparent issue labels, and per-app source-health telemetry.

- **URL**: https://apify.com/redfoxxie/google-play-review-change-monitor-alerts.md
- **Developed by:** [João Ferreira](https://apify.com/redfoxxie) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 new app review alerts

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

### Monitor review changes, not another static export

This independent product is not affiliated with, sponsored by, or endorsed by
Google or Google Play. Google Play listings and developer responses remain the
authoritative public source.

This is a limited-permission Actor because its bounded named store retains only
public review IDs needed for deduplication.

Google Play Review Change Monitor and Alerts watches a bounded list of Android
apps and emits only newly observed reviews that match a star-rating ceiling.
It is designed for recurring product-feedback, support, release-quality, and
competitor-monitoring workflows where downloading the same review corpus every
day creates duplicate records and unnecessary cost.

The default free preview checks the live source and returns counts, per-app
source health, and the number of matching reviews that are new to the selected
monitor state. Preview mode does not emit `new_app_review_alert` events and does
not advance deduplication state. This lets a user verify app IDs, coverage, and
expected volume before enabling paid delivery.

### What each alert contains

Every delivered row includes the stable review ID, Android package ID,
storefront country, requested language, rating, public review text, reviewer
display name, publication timestamp, app version, helpful-vote count, developer
reply and reply timestamp, and the public Google Play listing URL. Sentiment is
derived transparently from the rating: one or two stars is negative, three is
mixed, and four or five is positive.

The Actor also adds deterministic keyword labels for common operational themes:
crashes and bugs, billing and subscriptions, login and account trouble,
performance, advertising, and feature requests. These labels are intentionally
simple and auditable. They do not pretend to be an opaque AI diagnosis and add
no model charge.

### Stateful monitoring

Set a stable `monitorId` for each independent workflow. A named key-value store
retains delivered public review IDs, so later scheduled runs suppress duplicates.
Different monitor IDs can watch the same apps with different rating limits or
regions without sharing state. The retained state is bounded to 20,000 IDs.

State advances only for records that the platform confirms were charged and
delivered. If a user-defined charge ceiling stops a run, undelivered reviews are
not marked seen and remain eligible on the next run. The Actor therefore avoids
silently losing alerts at a billing boundary.

### Inputs and practical workflows

Provide one to twenty package IDs, for example
`com.google.android.apps.translate`. Select a two-letter country and language,
fetch between one and 1,000 newest reviews per app, and choose a maximum rating.
The common production setting is three stars, which captures negative and mixed
feedback without charging for routine positive reviews.

Useful recurring tasks include monitoring a new app release for crashes,
tracking whether support has replied to one-star feedback, detecting subscription
complaints, comparing competitor pain points, or forwarding fresh review rows to
Slack, n8n, Zapier, a database, or a product analytics pipeline through Apify
schedules and webhooks.

### Reliability and limitations

Each requested app receives an explicit `ok` or `error` source status in preview
telemetry. A partial failure is visible, and a run fails closed if every app
source fails. Inputs and output volume are bounded to protect runtime and cost.
The source is public Google Play data; deleted reviews, regional differences,
ranking behavior, and source-side pagination can affect what is available.

This version deliberately does not advertise Apple App Store coverage. Apple's
unauthenticated public customer-review feed was returning empty results during
the implementation audit, including for high-volume apps. Apple support will be
added only after a source can be validated without silently representing an
empty or incomplete feed as complete data.

### Pricing

The Actor uses **Pay per event + usage** with **no start fee**. Preview mode is
free of custom events. Paid runs charge **$0.005** for each delivered
`new_app_review_alert`; platform usage is passed through separately to the
runner. Users can cap the maximum charge for a run, and the delivery-safe state
logic honors that boundary.

# Actor input Schema

## `appIds` (type: `array`):

Android package IDs from Google Play, such as com.google.android.apps.translate.
## `country` (type: `string`):

Two-letter Google Play storefront country code.
## `language` (type: `string`):

Two-letter language code used by Google Play when returning reviews.
## `maxReviewsPerApp` (type: `integer`):

Maximum newest reviews fetched from each app during one run.
## `maxStars` (type: `integer`):

Return reviews at or below this star rating; use 3 for negative and mixed feedback.
## `maxAlerts` (type: `integer`):

Hard cap on matching review alerts and possible paid events emitted by one run.
## `monitorId` (type: `string`):

Stable identifier for an independent deduplication history across scheduled runs.
## `previewOnly` (type: `boolean`):

Return a free count and source-health summary without emitting paid alerts or advancing state.

## Actor input object example

```json
{
  "appIds": [
    "com.google.android.apps.translate"
  ],
  "country": "us",
  "language": "en",
  "maxReviewsPerApp": 200,
  "maxStars": 3,
  "maxAlerts": 200,
  "monitorId": "translation-apps",
  "previewOnly": true
}
````

# Actor output Schema

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

New matching review alerts or a free preview summary.

# 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("redfoxxie/google-play-review-change-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("redfoxxie/google-play-review-change-monitor-alerts").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 '{}' |
apify call redfoxxie/google-play-review-change-monitor-alerts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=redfoxxie/google-play-review-change-monitor-alerts",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Play Review Change Monitor and Alerts",
        "description": "Monitor selected Android apps for newly posted low-rating Google Play reviews with persistent deduplication, app versions, developer replies, helpful votes, transparent issue labels, and per-app source-health telemetry.",
        "version": "0.1",
        "x-build-id": "jmdjjyhf4722rqrIF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/redfoxxie~google-play-review-change-monitor-alerts/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-redfoxxie-google-play-review-change-monitor-alerts",
                "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/redfoxxie~google-play-review-change-monitor-alerts/runs": {
            "post": {
                "operationId": "runs-sync-redfoxxie-google-play-review-change-monitor-alerts",
                "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/redfoxxie~google-play-review-change-monitor-alerts/run-sync": {
            "post": {
                "operationId": "run-sync-redfoxxie-google-play-review-change-monitor-alerts",
                "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",
                "required": [
                    "appIds"
                ],
                "properties": {
                    "appIds": {
                        "title": "Google Play app IDs",
                        "minItems": 1,
                        "maxItems": 20,
                        "type": "array",
                        "description": "Android package IDs from Google Play, such as com.google.android.apps.translate.",
                        "items": {
                            "type": "string",
                            "maxLength": 200
                        },
                        "default": [
                            "com.google.android.apps.translate"
                        ]
                    },
                    "country": {
                        "title": "Storefront country",
                        "pattern": "^[A-Za-z]{2}$",
                        "maxLength": 2,
                        "type": "string",
                        "description": "Two-letter Google Play storefront country code.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Review language",
                        "pattern": "^[A-Za-z]{2}$",
                        "maxLength": 2,
                        "type": "string",
                        "description": "Two-letter language code used by Google Play when returning reviews.",
                        "default": "en"
                    },
                    "maxReviewsPerApp": {
                        "title": "Reviews per app",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum newest reviews fetched from each app during one run.",
                        "default": 200
                    },
                    "maxStars": {
                        "title": "Maximum star rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Return reviews at or below this star rating; use 3 for negative and mixed feedback.",
                        "default": 3
                    },
                    "maxAlerts": {
                        "title": "Maximum new alerts",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on matching review alerts and possible paid events emitted by one run.",
                        "default": 200
                    },
                    "monitorId": {
                        "title": "Monitor state ID",
                        "maxLength": 60,
                        "type": "string",
                        "description": "Stable identifier for an independent deduplication history across scheduled runs.",
                        "default": "default"
                    },
                    "previewOnly": {
                        "title": "Free preview",
                        "type": "boolean",
                        "description": "Return a free count and source-health summary without emitting paid alerts or advancing state.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
