# App Store Review Monitor — New iOS Reviews & Ratings Feed (`oneshotventure/app-review-watch`) Actor

Get new App Store reviews for any iOS app since your last run, yours or a competitor's. Rating, title, text, author and app version as clean JSON from Apple's official RSS feed. Filter by star rating, watch several apps and countries per run, and schedule it daily to catch bad reviews early.

- **URL**: https://apify.com/oneshotventure/app-review-watch.md
- **Developed by:** [Nick](https://apify.com/oneshotventure) (community)
- **Categories:** Developer tools, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.40 / 1,000 results

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

## App Store Review Monitor — New iOS Reviews & Ratings Feed

Get **new App Store reviews since your last run** for any iOS app — yours or a competitor's. Rating,
title, text, author and app version, straight from Apple's official RSS review feeds. Schedule it
daily and the bad ones reach you the same day.

### What does this Actor do?

You give it App Store IDs (or just paste App Store URLs) and the countries you care about. It reads
Apple's official public review feed for each app-and-country pair and emits one row per review.

The part that matters is the watermark. Apple's feed always shows the most recent reviews, so a naive
run re-sends the same reviews every time. This Actor remembers **the highest review ID it has already
emitted, separately for every app-and-country pair**, and stops walking pages the moment it reaches
familiar ground. Watching one app in five countries gives you five independent cursors, so a busy
market never buries a quiet one.

It also handles the truncation case honestly: if more new reviews arrive than your `maxResults`, the
watermark advances only as far as the last review actually emitted — the backlog is picked up on the
next run rather than skipped.

**It does not support Google Play**, because Google does not publish an official public review feed
and this Actor only reads official sources.

### Who is it for?

- **Indie developers and small app teams** who need to know about a one-star review today, not at the
  end of the month.
- **Product managers** tracking sentiment across releases, using the `appVersion` on each review.
- **Support teams** who want new complaints routed into their queue automatically.
- **Competitive analysts** watching what users say about rival apps.
- **AI agent builders** who want a review-feed tool with a stable output schema.

### Use cases

- Get notified when someone leaves a bad review on my app.
- Track new App Store reviews automatically and export them to a spreadsheet.
- Monitor a competitor's app ratings and complaints.
- Alert on one- and two-star reviews only, and post them to Slack.
- Watch how reviews change after a release by grouping on `appVersion`.
- Download App Store reviews as CSV.

### What you get

One row per review. Any value Apple does not publish is `null` — the field is always present.

| Field | Type | Description |
|---|---|---|
| `appId` | string | Numeric App Store ID of the app |
| `country` | string | Two-letter country code of the storefront this review came from |
| `reviewId` | string | Apple's review ID — unique, and what the watermark tracks |
| `rating` | integer | Star rating, 1–5 |
| `title` | string | Review title |
| `text` | string | Review body |
| `author` | string | Reviewer's display nickname as Apple publishes it |
| `appVersion` | string | App version the review was left against |
| `reviewDate` | string | ISO 8601 timestamp Apple records for the review |
| `newSinceLastRun` | boolean | Whether this review is newer than the saved watermark |
| `retrievedAt` | string | ISO 8601 timestamp of when this row was fetched |

#### Sample output record

```json
{
  "appId": "284882215",
  "country": "us",
  "reviewId": "14453582535",
  "rating": 1,
  "title": "Help",
  "text": "I'm really starting to hate this app since the last update…",
  "author": "Kkgas",
  "appVersion": "575.0.0",
  "reviewDate": "2026-08-21T05:42:40.000Z",
  "newSinceLastRun": true,
  "retrievedAt": "2026-08-21T05:45:12.882Z"
}
```

### How to use it

#### Watch only the bad reviews

```json
{
  "appIds": ["284882215"],
  "countries": ["us"],
  "minRating": 1,
  "maxRating": 2,
  "maxResults": 20
}
```

#### Several apps, several countries

Every combination of app and country gets its own independent watermark.

```json
{
  "appIds": ["284882215", "https://apps.apple.com/us/app/id310633997"],
  "countries": ["us", "gb", "de"],
  "maxResults": 100
}
```

`appIds` accepts numeric App Store IDs or full App Store URLs — paste whichever you have.

### Input parameters

| Input | Type | Description |
|---|---|---|
| `appIds` | array | Numeric App Store IDs or full App Store URLs |
| `countries` | array | Two-letter ISO country codes for the Apple RSS storefronts. Default: `["us"]` |
| `minRating` | integer | Only emit reviews at or above this rating (1–5) |
| `maxRating` | integer | Only emit reviews at or below this rating (1–5) |
| `maxResults` | integer | Maximum matching reviews per app and country (1–200). Default: `20` |

### How monitoring works (first run and scheduling)

The first run establishes a baseline and returns reviews from the current Apple RSS window. To get
only-new records on every subsequent run, **schedule this Actor as a saved Task** so runs share the
same storage — the watermark lives in the task's key-value store. A fresh unsaved run starts a fresh
baseline.

The watermark is saved only when every app-and-country pair succeeded, so a transient failure on one
storefront does not advance the cursor and lose reviews.

### Honest limitations

- **Apple's RSS feed is capped at roughly the latest 500 reviews**, across up to 10 pages per
  storefront. Reviews older than that window are not available from this source, so this is a
  monitoring tool rather than a historical review exporter.
- **No Google Play.** Google publishes no official public review feed, and this Actor only reads
  official sources.
- **No aggregate rating or rating count.** You get the individual reviews Apple publishes in the
  feed; the app's overall star average and total rating count are not in that feed and are not
  returned. "Alert when my rating drops" has to be computed from the reviews you collect.
- **No developer responses.** Apple's public review feed does not include them.
- **Rating filters apply after fetching**, so a run with a narrow `minRating`/`maxRating` may read
  several pages to fill `maxResults`.
- **Apple's storefronts are per-country.** A review left in the UK store appears only under `gb`.

### Reliability

Per-app diagnostics are written to the `RUN_SUMMARY` key-value record — never into your dataset.
Failures carry structured reason codes and prevent the watermark from advancing.

Every record carries `retrievedAt` and Apple's own `reviewId`, so you can check any row against the
source yourself.

Maintained against Apple's public feed. If the feed format changes, report it through the Issues tab
and it gets fixed.

### Integrations

Connect this Actor to Make, Zapier, n8n, Slack, Google Sheets, Airtable or any HTTP endpoint through
Apify integrations. A daily Task can post every new one-star review into a support channel, or fire a
webhook so a downstream triage job starts the moment a review lands. Datasets export as JSON, CSV,
Excel, XML, RSS or HTML.

### API usage

```bash
curl -X POST "https://api.apify.com/v2/acts/oneshotventure~app-review-watch/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"appIds": ["284882215"], "countries": ["us"], "minRating": 1, "maxRating": 2, "maxResults": 20}'
```

Python, JavaScript, PHP and CLI clients are documented under
[Apify API clients](https://docs.apify.com/api/client).

### Use with AI agents (MCP)

This Actor is callable from any MCP-compatible client — Claude, Cursor, VS Code or your own agent —
through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). The input schema is
fully described and every record uses one stable, flat JSON shape, so an agent can call it and read
the result without a parsing step. Because it reads Apple's official public feed rather than a
rendered page, the answer an agent gets is the same one the source publishes — which makes it a
natural input for a summarize-and-triage workflow.

### Frequently asked questions

#### How do I get alerts for new App Store reviews?

Set your `appIds`, save the Actor as a Task, schedule it daily, and connect the Task to Slack, email
or a webhook through Apify integrations. Each run returns only the reviews that arrived since the
last one.

#### Can I monitor a competitor's app?

Yes. Any public App Store ID works — you do not need to own the app. Paste the App Store URL if you
do not know the numeric ID.

#### Does this work for Google Play?

No. Google does not publish an official public review feed, and this Actor only reads official
sources. It is iOS App Store only.

#### How far back can I get reviews?

Roughly the latest 500 per storefront, which is the limit of Apple's RSS feed. This is a monitoring
tool, not a full historical export.

#### Can I get only one- and two-star reviews?

Yes — set `minRating: 1` and `maxRating: 2`. The filter is applied to each review before it is
emitted.

#### Does it return the app's overall star rating?

No. Apple's review feed carries individual reviews, not the aggregate score, so the overall rating and
total rating count are not returned.

#### Why did my first run return a batch of older reviews?

The first run has no watermark, so it establishes a baseline from the current feed window. Save it as
a Task and schedule it; from the second run on you get only what is new.

#### Can I watch several countries at once?

Yes, and each app-and-country pair keeps its own watermark, so a high-volume storefront never
suppresses a quiet one.

### Related actors

- [Hacker News Monitor](https://apify.com/oneshotventure/hn-trends) — keyword mentions and trend
  tracking on Hacker News.
- [US Building Permits API](https://apify.com/oneshotventure/permits-search) — recently issued
  building permits across 10 US cities.
- [US Product Recalls Monitor](https://apify.com/oneshotventure/recalls-monitor) — new CPSC and FDA
  product recalls.

### Disclaimer

Unofficial independent tool. Not affiliated with or endorsed by Apple Inc. Data is retrieved from
Apple's public RSS feeds.

# Actor input Schema

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

Numeric App Store IDs or full App Store URLs.

## `countries` (type: `array`):

Two-letter ISO country codes for Apple RSS feeds.

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

Only emit reviews at or above this rating (1-5).

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

Only emit reviews at or below this rating (1-5).

## `maxResults` (type: `integer`):

Maximum matching reviews per app and country (1-200).

## Actor input object example

```json
{
  "appIds": [
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "maxResults": 20
}
```

# Actor output Schema

## `records` (type: `string`):

New App Store reviews in the default dataset.

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

Per-app review retrieval results in RUN\_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 = {
    "appIds": [
        "284882215"
    ],
    "countries": [
        "us"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("oneshotventure/app-review-watch").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 = {
    "appIds": ["284882215"],
    "countries": ["us"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("oneshotventure/app-review-watch").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 '{
  "appIds": [
    "284882215"
  ],
  "countries": [
    "us"
  ],
  "maxResults": 20
}' |
apify call oneshotventure/app-review-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oneshotventure/app-review-watch"
        }
    }
}

```

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/ymOOQhdMQeVBW30KY/builds/uiktlnXQo7I3OQcpn/openapi.json
