# Negative Review Alert Monitor (`signaltools/negative-review-alert-monitor`) Actor

Fetch recent public Apple App Store reviews and emit structured review, sentiment, and topic rows for app teams, agencies, and investors.

- **URL**: https://apify.com/signaltools/negative-review-alert-monitor.md
- **Developed by:** [Stephen Coulson](https://apify.com/signaltools) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 2 total users, 0 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/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

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

### What does Negative Review Alert Monitor do?

**Negative Review Alert Monitor** extracts recent public Apple App Store reviews and turns them into clean, structured review intelligence. Give it one or more app IDs and it returns review text, ratings, dates, public reviewer display names, sentiment buckets, and topic tags.

Use it to monitor your own app, competitors, launches, pricing complaints, bug reports, feature requests, and support issues. It runs on Apify, so you can schedule it, call it by API, download CSV/Excel/JSON, or connect the dataset to Google Sheets, Slack, Zapier, Make, and other tools.

### Why use Negative Review Alert Monitor?

App Store reviews are high-signal customer feedback. They show what users love, what is broken, and what competitors are being praised or criticised for.

This Actor helps you:

- track new reviews for your app or competitors;
- spot negative reviews and bug complaints quickly;
- tag reviews by topics such as `price`, `bug`, `login`, `support`, or `subscription`;
- build product, support, marketing, or investor monitoring workflows;
- export structured review data without writing custom Apple RSS parsing code.

It uses public Apple RSS JSON endpoints. No login, cookies, proxies, or private user enrichment are required.

### How to use Negative Review Alert Monitor

1. Open the Actor on Apify.
2. Add one or more Apple App Store app IDs.
3. Choose the country code, for example `us` or `gb`.
4. Add topic keywords you want tagged in review text.
5. Optionally filter by rating range.
6. Run the Actor.
7. Download the dataset in JSON, CSV, Excel, HTML, or XML, or connect it to an Apify integration.

### Input

Example input:

```json
{
  "apps": [
    { "name": "ChatGPT", "appId": "6448311069", "country": "us" }
  ],
  "keywords": ["price", "bug", "crash", "support", "slow", "feature", "subscription", "login"],
  "maxReviewsPerApp": 50,
  "minRating": 1,
  "maxRating": 5
}
````

#### Input fields

| Field | Description |
|---|---|
| `apps` | List of App Store apps to monitor. |
| `appId` | Numeric Apple App Store app ID. |
| `country` | Two-letter App Store country code, e.g. `us`, `gb`, `de`. |
| `keywords` | Topic words to tag inside review titles and text. |
| `maxReviewsPerApp` | Maximum recent reviews to fetch per app. |
| `minRating` | Minimum star rating to emit. |
| `maxRating` | Maximum star rating to emit. |

### Output

The Actor outputs one row per review.

```json
{
  "source": "apple_app_store",
  "app_id": "6448311069",
  "app_name": "ChatGPT",
  "country": "us",
  "review_id": "f8b9de16643744ece7771b2d",
  "review_title": "Excellent",
  "review_text": "Excellent - helpful and enjoyable",
  "rating": 5,
  "reviewer_name_public": "19 yrs w bbt",
  "review_date": "2026-07-02T14:04:44-07:00",
  "sentiment_bucket": "positive",
  "topics": ["feature"],
  "detected_at": "2026-07-04T01:35:50Z",
  "source_url": "https://itunes.apple.com/us/rss/customerreviews/id=6448311069/sortby=mostrecent/json"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Meaning |
|---|---|
| `app_id` | Apple App Store app ID. |
| `app_name` | App name supplied in input. |
| `country` | App Store country. |
| `review_title` | Review title. |
| `review_text` | Public review body. |
| `rating` | Star rating from 1 to 5. |
| `reviewer_name_public` | Public App Store reviewer display name. |
| `review_date` | Review timestamp from Apple RSS. |
| `sentiment_bucket` | Simple sentiment label: positive, negative, or mixed/neutral. |
| `topics` | Input keywords found in review title/text. |
| `source_url` | Apple RSS JSON source URL. |

### Pricing and cost estimation

This Actor is lightweight. It calls public Apple RSS JSON endpoints and does not use browser automation or proxies.

Costs depend mainly on:

- number of apps monitored;
- number of reviews per app;
- run frequency.

Start with a small app list, then schedule recurring runs once the output shape is right.

### Tips and advanced options

- Set `maxRating` to `2` to monitor only unhappy users.
- Add competitor app IDs to track launch reactions and product weaknesses.
- Use topic keywords like `pricing`, `subscription`, `login`, `support`, `crash`, and `slow`.
- Schedule daily or weekly runs and connect output to Slack or Google Sheets via Apify integrations.

### FAQ, disclaimers, and support

**Does this access private App Store data?** No. It only reads public Apple RSS review feeds.

**Does it support Google Play?** Not yet. Request it in the Issues tab if useful.

**Is this a true delta monitor?** The Actor emits recent reviews with stable IDs and timestamps. For recurring workflows, compare current results with prior datasets or scheduled-run history.

**Is this legal?** This Actor reads public review feeds. You are responsible for using the data in accordance with applicable laws, Apple terms, and privacy obligations.

For bugs, feature requests, or custom versions, use the Issues tab on Apify.

# Actor input Schema

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

Apps to monitor. App IDs are Apple App Store numeric IDs.

## `keywords` (type: `array`):

Keywords to tag inside review text.

## `maxReviewsPerApp` (type: `integer`):

Maximum recent reviews to fetch per app.

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

Minimum star rating to emit.

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

Maximum star rating to emit. Default 2 focuses output on negative-review alerts.

## `alertOnly` (type: `boolean`):

When enabled, emit only rows with medium/high alert priority.

## `onlyNewAlerts` (type: `boolean`):

When delta mode is enabled, emit only newly discovered alerts and suppress existing/removed rows.

## `enableDelta` (type: `boolean`):

Compare the current scan with the previous snapshot for the same input and tag rows as new, existing, or removed.

## `emitRemoved` (type: `boolean`):

When delta mode is enabled, emit reviews that existed in the previous snapshot but are no longer in the recent-review feed.

## `persistSnapshot` (type: `boolean`):

Save this run as the baseline for future delta detection.

## Actor input object example

```json
{
  "apps": [
    {
      "name": "ChatGPT",
      "appId": "6448311069",
      "country": "us"
    }
  ],
  "keywords": [
    "price",
    "bug",
    "crash",
    "support",
    "slow",
    "feature",
    "subscription",
    "login"
  ],
  "maxReviewsPerApp": 50,
  "minRating": 1,
  "maxRating": 2,
  "alertOnly": true,
  "onlyNewAlerts": false,
  "enableDelta": true,
  "emitRemoved": true,
  "persistSnapshot": true
}
```

# Actor output Schema

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

Structured public review rows with app, country, rating, sentiment, topics, review text, reviewer display name, and source URL.

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

Aggregate run status, counts, per-app summaries, and top negative reviews.

# 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": [
        {
            "name": "ChatGPT",
            "appId": "6448311069",
            "country": "us"
        }
    ],
    "keywords": [
        "price",
        "bug",
        "crash",
        "support",
        "slow",
        "feature",
        "subscription",
        "login"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signaltools/negative-review-alert-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": [{
            "name": "ChatGPT",
            "appId": "6448311069",
            "country": "us",
        }],
    "keywords": [
        "price",
        "bug",
        "crash",
        "support",
        "slow",
        "feature",
        "subscription",
        "login",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("signaltools/negative-review-alert-monitor").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 '{
  "apps": [
    {
      "name": "ChatGPT",
      "appId": "6448311069",
      "country": "us"
    }
  ],
  "keywords": [
    "price",
    "bug",
    "crash",
    "support",
    "slow",
    "feature",
    "subscription",
    "login"
  ]
}' |
apify call signaltools/negative-review-alert-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Negative Review Alert Monitor",
        "description": "Fetch recent public Apple App Store reviews and emit structured review, sentiment, and topic rows for app teams, agencies, and investors.",
        "version": "0.1",
        "x-build-id": "qmbACRPPK8BIaZqpz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/signaltools~negative-review-alert-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-signaltools-negative-review-alert-monitor",
                "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/signaltools~negative-review-alert-monitor/runs": {
            "post": {
                "operationId": "runs-sync-signaltools-negative-review-alert-monitor",
                "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/signaltools~negative-review-alert-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-signaltools-negative-review-alert-monitor",
                "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": [
                    "apps"
                ],
                "properties": {
                    "apps": {
                        "title": "Apps",
                        "type": "array",
                        "description": "Apps to monitor. App IDs are Apple App Store numeric IDs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "appId"
                            ],
                            "properties": {
                                "name": {
                                    "type": "string",
                                    "title": "App name",
                                    "description": "Optional app name for easier output reading."
                                },
                                "appId": {
                                    "type": "string",
                                    "title": "App ID",
                                    "description": "Apple App Store numeric app ID."
                                },
                                "country": {
                                    "type": "string",
                                    "title": "Country",
                                    "description": "Two-letter App Store country code, e.g. us or gb."
                                }
                            }
                        }
                    },
                    "keywords": {
                        "title": "Topic keywords",
                        "type": "array",
                        "description": "Keywords to tag inside review text.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum recent reviews to fetch per app.",
                        "default": 50
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Minimum star rating to emit.",
                        "default": 1
                    },
                    "maxRating": {
                        "title": "Maximum alert rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Maximum star rating to emit. Default 2 focuses output on negative-review alerts.",
                        "default": 2
                    },
                    "alertOnly": {
                        "title": "Only emit attention-worthy reviews",
                        "type": "boolean",
                        "description": "When enabled, emit only rows with medium/high alert priority.",
                        "default": true
                    },
                    "onlyNewAlerts": {
                        "title": "Only emit new alerts",
                        "type": "boolean",
                        "description": "When delta mode is enabled, emit only newly discovered alerts and suppress existing/removed rows.",
                        "default": false
                    },
                    "enableDelta": {
                        "title": "Detect changes from previous run",
                        "type": "boolean",
                        "description": "Compare the current scan with the previous snapshot for the same input and tag rows as new, existing, or removed.",
                        "default": true
                    },
                    "emitRemoved": {
                        "title": "Emit removed reviews",
                        "type": "boolean",
                        "description": "When delta mode is enabled, emit reviews that existed in the previous snapshot but are no longer in the recent-review feed.",
                        "default": true
                    },
                    "persistSnapshot": {
                        "title": "Persist snapshot for future runs",
                        "type": "boolean",
                        "description": "Save this run as the baseline for future delta detection.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
