# 📱 App Rating Monitor - Track Rating Drops & Bad Reviews (`that_red_bird/app-rating-monitor`) Actor

⚡ Know within hours when your app's rating slips or angry reviews spike. ✅ App Store and Steam ratings, rating counts and review sentiment tracked over time. ✅ Alerts on a rating drop or a negative-review spike, with built-in rating history.

- **URL**: https://apify.com/that\_red\_bird/app-rating-monitor.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** Marketing, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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.

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

## App Rating Monitor

Know within hours when your app's rating slips or angry reviews spike — instead of finding out
from a stakeholder a week later.

### What it tracks per run

- **`rating`** and **`ratingDelta`** — the store rating and how far it moved since last run
- **`ratingCount`** and **`newRatingsSinceLastRun`** — review velocity
- **`sampleAverage`** — the average of the most recent reviews, which moves *before* the
  headline store rating does
- **`negativePercent`** — share of the recent sample that is 1–2 stars
- **`history[]`** — a rolling series so you can chart the rating over time without a database

### What raises an alert

| Condition | Setting |
|---|---|
| Rating fell by at least N stars | `ratingDropAlert` (default 0.2) |
| Negative reviews reached N% of the sample | `negativeSpikePercent` (default 40) |

`sampleAverage` and `negativePercent` are the early-warning pair: a bad release shows up in
recent reviews long before it drags the lifetime store rating down.

### Stores

**Apple App Store** and **Steam**, both through their official public endpoints. Pass App
Store URLs or ids (`id310633997`) and Steam URLs or appids (`440`); the store is detected
automatically, or set it explicitly with `{"app":"440","store":"steam"}`.

### Typical uses

Release monitoring — watch the sample average for 48 hours after every ship · competitor
tracking to spot when a rival ships something users hate · support teams getting ahead of a
complaint wave · investors and analysts tracking product health over time.

### Schedule it

Every few hours during a release window, daily otherwise. An app whose page keeps failing is
flagged after `alertOnErrorAfter` runs — usually meaning it was delisted or region-locked,
which is itself worth knowing.

# Actor input Schema

## `apps` (type: `array`):

App Store URLs or ids (id310633997) and Steam URLs or appids (440). To be explicit: {"app":"440","store":"steam"}.

## `reviewSample` (type: `integer`):

How many recent reviews to read for the sentiment figures. Bigger samples are steadier but slower.

## `ratingDropAlert` (type: `integer`):

Raise an alert when the store rating drops by at least this much since the previous run, expressed in hundredths of a star: 20 = 0.20 stars, 50 = half a star. Apify input schemas only accept whole numbers, hence the unit.

## `negativeSpikePercent` (type: `integer`):

Raise an alert when this percentage or more of the sampled reviews are 1-2 stars.

## `country` (type: `string`):

Two-letter country code for Apple, e.g. us, gb, de.

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

Steam review language filter, e.g. english, all.

## `keepHistory` (type: `integer`):

How many past readings to keep per app so you can chart the rating over time.

## `onlyChanges` (type: `boolean`):

Push only apps whose numbers moved or that raised an alert.

## `alertOnErrorAfter` (type: `integer`):

Flags an app that keeps failing — often delisted or region-locked. 0 disables it.

## `resetBaseline` (type: `boolean`):

Forget stored ratings and start fresh.

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

Hard cap on dataset rows per run. 0 = no cap.

## `concurrency` (type: `integer`):

How many apps to check in parallel.

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

POSTed when a rating drops or negative reviews spike. Slack/Discord/Zapier compatible.

## `stateStoreName` (type: `string`):

Named key-value store holding previous ratings and history.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
    "https://store.steampowered.com/app/440/"
  ],
  "reviewSample": 100,
  "ratingDropAlert": 20,
  "negativeSpikePercent": 40,
  "country": "us",
  "language": "english",
  "keepHistory": 60,
  "onlyChanges": false,
  "alertOnErrorAfter": 3,
  "resetBaseline": false,
  "maxItems": 0,
  "concurrency": 3,
  "stateStoreName": "app-rating-monitor-state"
}
```

# Actor output Schema

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

No description

## `downloadCsv` (type: `string`):

No description

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

No description

## `count` (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 = {
    "apps": [
        "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
        "https://store.steampowered.com/app/440/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/app-rating-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 = { "apps": [
        "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
        "https://store.steampowered.com/app/440/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/app-rating-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 '{
  "apps": [
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
    "https://store.steampowered.com/app/440/"
  ]
}' |
apify call that_red_bird/app-rating-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,that_red_bird/app-rating-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/GVhY6eCMRbYrQO1tI/builds/e1mF16AuWNDY0pbeb/openapi.json
