# App Store & Google Play Reviews Scraper (`cancap/app-reviews-monitor`) Actor

Scrape app reviews from the Apple App Store and Google Play in one run: stars, text, date, app version, developer replies. Monitor mode returns only new reviews since the last run. Filter by stars, keywords and date, across countries and languages. No login or API key.

- **URL**: https://apify.com/cancap/app-reviews-monitor.md
- **Developed by:** [CANCAP](https://apify.com/cancap) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 review returneds

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?

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

## App Reviews Scraper & Monitor: App Store + Google Play

Get **app reviews from the Apple App Store and Google Play in one run**, in one clean format. Turn on **Monitor mode** and every scheduled run returns **only the reviews that are new since the last run**, ready to send to Slack, email, Google Sheets or your support tool.

No coding, no login and no API keys. Paste your app links and click Start.

### What you get for each review

- **Stars** (1-5), **review text** and **title**
- **Date**, **app version** the review was written for
- **Country** (App Store) or **language** (Google Play)
- **Helpful votes**
- **Developer reply** and reply date (Google Play)
- **Reviewer display name** (optional)
- **Review link** (Google Play)
- In Monitor mode: `reviewStatus` = `new` or `updated` (the user edited an older review)

A **summary per app** is saved with every run: app name, overall store rating and rating count, number of reviews returned, average stars and star counts.

### Who uses this

- **Product & support teams**: get every new 1-2 star review within the hour and reply fast.
- **App developers & indie makers**: watch reviews after each release, by app version.
- **ASO & marketing agencies**: track clients' and competitors' apps across countries.
- **Researchers & analysts**: export reviews for sentiment analysis or AI summaries.

### How to use

#### Export reviews

1. Add your apps. App Store: the app URL or numeric ID. Google Play: the app URL or package name.
2. Choose App Store countries and Google Play languages.
3. Set **Max reviews per app** and click **Start**. Export to CSV, Excel or JSON.

#### Monitor new reviews

1. Turn on **Monitor mode**.
2. **Schedule** the Actor (hourly or daily).
3. The first run returns the latest reviews as a baseline. Every later run returns only new and edited reviews.

Example: only new negative reviews for two apps, in three App Store countries:

```json
{
    "apps": ["https://apps.apple.com/us/app/whatsapp-messenger/id310633997", "com.spotify.music"],
    "appStoreCountries": ["us", "gb", "de"],
    "googlePlayLanguages": ["en", "de"],
    "maxReviewsPerApp": 200,
    "onlyNew": true,
    "maxRating": 2
}
```

### Output example

```json
{
    "store": "google_play",
    "appId": "com.example.app",
    "appName": "Example App",
    "country": null,
    "language": "en",
    "reviewId": "b7c1f6f2-0c1d-4c7e-9a43-2f0f2c1a9d10",
    "rating": 2,
    "title": null,
    "text": "Keeps logging me out after the last update.",
    "date": "2026-09-30T14:21:09.000Z",
    "appVersion": "9.1.86",
    "helpfulCount": 14,
    "replyText": "Sorry about that! Please update to the latest version, this is fixed.",
    "replyDate": "2026-10-01T08:02:11.000Z",
    "reviewUrl": "https://play.google.com/store/apps/details?id=com.example.app&reviewId=b7c1f6f2-0c1d-4c7e-9a43-2f0f2c1a9d10",
    "reviewStatus": "new",
    "author": "Alex P.",
    "scrapedAt": "2026-10-01T10:00:00.000Z"
}
```

### Filters

- **Stars**: minimum and maximum (set maximum to 2 for negative reviews only)
- **Keywords**: reviews that mention words such as `crash`, `login`, `refund`
- **Date**: only reviews from the last N days

### Pricing: pay for reviews you receive

- **Review returned**: per review in your results.
- **App checked**: a very small fee per app, per country or language, per run.

In Monitor mode you pay the small checking fee plus only the new reviews, so watching your apps every hour stays cheap. Apps that fail are free. Set a **maximum cost per run** in the run options and the Actor stops cleanly at your limit.

### Good to know

- **App Store limit**: Apple's public feed provides the **500 most recent reviews per country**. Add more countries to collect more. Developer replies are not included in Apple's feed.
- **Google Play**: reviews are returned newest first, per language, without a fixed limit.
- **Late reviews are not missed**: both stores publish reviews with a delay, sometimes out of date order. Monitor mode remembers the IDs of the most recent reviews, so a review that shows up late is still returned as new.
- **Monitor mode and limits**: if more new reviews arrive between two runs than your **Max reviews per app**, the rest are delivered in the next runs while they are still among the 200 most recent reviews. Use a higher limit or run more often for very busy apps.
- **How new reviews are remembered**: a small marker (IDs and dates of the most recent reviews) is saved in your own Apify account, in the key-value store `app-reviews-monitor-state`. Delete it to start again from a fresh baseline.

### Responsible use

This Actor reads only public reviews that the stores show to everyone. It uses no logins and bypasses no protection. Reviewer display names are public but can still be personal data, so turn off **Include reviewer name** if you do not need it and follow the privacy rules that apply to you.

# Actor input Schema

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

One app per line. App Store: paste the app URL (https://apps.apple.com/us/app/name/id310633997) or just the numeric ID. Google Play: paste the app URL or the package name (com.spotify.music). You can mix both stores.

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

Newest reviews first. The limit applies to each app in each country (App Store) or language (Google Play).

## `appStoreCountries` (type: `array`):

Two-letter country codes, e.g. us, gb, de, fr, jp. Apple shows different reviews in each country's store, up to the 500 most recent per country. Add countries to get more reviews.

## `googlePlayLanguages` (type: `array`):

Language codes, e.g. en, es, de, fr, pt-BR, ja. Google Play shows the reviews written in each language.

## `onlyNew` (type: `boolean`):

The first run returns the latest reviews and remembers where it stopped. Every later run returns only new reviews (and reviews that users edited). Schedule the Actor hourly or daily to get a live feed of new reviews.

## `monitorName` (type: `string`):

New reviews are tracked separately for each monitor name. Use different names if you watch the same app in separate schedules.

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

Only return reviews with at least this many stars (1-5).

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

Only return reviews with at most this many stars (1-5). Set to 2 to get only negative reviews.

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

Only return reviews whose title or text contains any of these words, e.g. crash, login, refund. Leave empty for all reviews.

## `maxAgeDays` (type: `integer`):

Skip reviews older than this many days. Leave empty for no date limit.

## `includeAuthor` (type: `boolean`):

Adds the public display name of the reviewer. Turn off if you do not need it.

## `proxyConfiguration` (type: `object`):

Requests go direct first and through Apify Proxy only when needed. The default works for most apps.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
    "com.spotify.music"
  ],
  "maxReviewsPerApp": 50,
  "appStoreCountries": [
    "us"
  ],
  "googlePlayLanguages": [
    "en"
  ],
  "onlyNew": false,
  "monitorName": "default",
  "minRating": 1,
  "maxRating": 5,
  "includeAuthor": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per review from the App Store and Google Play.

## `allFields` (type: `string`):

No description

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

App name, overall store rating, number of reviews returned, average stars and star counts of the returned reviews.

## `failedApps` (type: `string`):

Apps that could not be read, with the reason. Not charged.

# 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",
        "com.spotify.music"
    ],
    "maxReviewsPerApp": 50,
    "appStoreCountries": [
        "us"
    ],
    "googlePlayLanguages": [
        "en"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cancap/app-reviews-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",
        "com.spotify.music",
    ],
    "maxReviewsPerApp": 50,
    "appStoreCountries": ["us"],
    "googlePlayLanguages": ["en"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cancap/app-reviews-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",
    "com.spotify.music"
  ],
  "maxReviewsPerApp": 50,
  "appStoreCountries": [
    "us"
  ],
  "googlePlayLanguages": [
    "en"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cancap/app-reviews-monitor --silent --output-dataset

```

## MCP server setup

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