# App Reviews Monitor: App Store & Google Play (`offerastudio/app-store-reviews-monitor`) Actor

App Store and Google Play reviews in one schema, many countries per run. Monitor mode returns only reviews not seen before. Free summary per app: average rating, rating distribution, reviews by version, share of 1-2 star reviews. No proxy or login.

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

## Pricing

from $0.50 / 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

### What does App Store & Google Play Reviews Monitor do?

**App Store & Google Play Reviews Monitor** collects the reviews of mobile apps from **both stores in one schema**, for **many countries in one run**, and in **monitor mode** returns only the reviews **you have not seen before**. Every app and country also gets a **free summary row** with the numbers a product or support team looks at first.

- 🍎 **App Store**: Apple's public customer-reviews feed (the most recent reviews, up to about **500 per app and country**, the most Apple serves).
- 🤖 **Google Play**: the public web endpoints the open-source `google-play-scraper` package uses, no login, no proxy. Can go much deeper than 500 reviews, and includes **developer replies**.
- 🔔 **Monitor mode**: `isNew` reviews only, per app, country and language. Schedule it daily and send new 1-2 star reviews to Slack or your helpdesk.
- 📊 **Free summary row per app and country**: store rating and rating count, average rating of the reviews read, rating distribution, reviews by app version and the share of 1-2 star reviews.
- 🌍 **Countries**: any two-letter store country (`us`, `gb`, `de`, `jp` ...), many at once.

### Who is it for?

- **Product and engineering teams**: see what users say after each release (reviews by version).
- **Customer support**: get only the new complaints, every day.
- **Competitor and market research**: compare ratings and complaint shares of competing apps in several countries.
- **App marketers and ASO**: read reviews in each market's language and spot localisation or price complaints.

### How to use it

1. Paste your apps into **Apps**, one per line: an App Store id or URL, a Google Play package id or URL, or an app name (searched in the App Store). Prefix with `appstore:` or `play:` to force a store.
2. Choose the **Countries** (default `us`) and, for Google Play, the **Languages** (default `en`).
3. Set **Max reviews per app and country**, and optionally a **minimum/maximum rating** (for example maximum 2 to see only complaints).
4. Click **Start**. The **Reviews** tab shows the reviews, the **App summary** tab one row per app and country.

**Daily monitor.** Set mode to *Monitor*, give it a **Monitor name** and add a schedule. The first run has nothing to compare with, so every review it reads counts as new. Later runs return only reviews that were not returned before. Because the App Store feed holds the latest 500 reviews, run it at least as often as 500 reviews can arrive.

### Input example

```json
{
    "apps": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128", "play:com.duolingo", "Spotify"],
    "countries": ["us", "gb", "de"],
    "languages": ["en", "de"],
    "maxReviewsPerApp": 200,
    "maxRating": 2,
    "mode": "monitor",
    "monitorName": "complaints-watch"
}
```

### Output example

One row per review (real reviews from 6 October 2026, author name replaced here):

```json
{
    "type": "review",
    "store": "googleplay",
    "appId": "com.google.android.apps.maps",
    "appName": "Google Maps",
    "country": "us",
    "language": "en",
    "reviewId": "65489907-0c58-4bd2-b289-90282c4d69f0",
    "rating": 1,
    "title": null,
    "text": "Total garbage POS that no longer works Don't tell me to \"email support and tell them what's wrong\" App went to trash no longer navigating right, and that's all.",
    "author": "(name as published)",
    "date": "2026-10-06T16:16:34.973Z",
    "appVersion": "26.40.00.989295350",
    "helpfulVotes": 1,
    "developerReply": { "text": "Hi there. I'd love to learn more about this issue and help! Please create a post in our Google Maps forum ...", "date": "2026-10-06T18:33:01.862Z" },
    "reviewUrl": "https://play.google.com/store/apps/details?id=com.google.android.apps.maps&reviewId=65489907-0c58-4bd2-b289-90282c4d69f0",
    "isNew": true,
    "appUrl": "https://play.google.com/store/apps/details?id=com.google.android.apps.maps",
    "input": "play:com.google.android.apps.maps",
    "checkedAt": "2026-10-07T16:31:54.614Z",
    "monitorName": "my-watch"
}
```

And one free summary row per app and country (real run, 7 October 2026):

```json
{
    "type": "summary",
    "store": "appstore",
    "appId": "570060128",
    "appName": "Duolingo: Language Lessons",
    "country": "us",
    "storeRating": 4.72,
    "storeRatingCount": 5490834,
    "reviewsAnalyzed": 50,
    "averageRating": 3.54,
    "ratingDistribution": { "1": 11, "2": 3, "3": 8, "4": 4, "5": 24 },
    "lowRatingShare": 0.28,
    "reviewsByVersion": [{ "version": "7.142.0", "count": 49, "averageRating": 3.51 }, { "version": "7.101.1", "count": 1, "averageRating": 5 }],
    "newReviews": 0,
    "summary": "Duolingo: Language Lessons (App Store, us): 50 reviews read; average 3.54 stars, 28% are 1-2 stars; the store shows 4.72 from 5,490,834 ratings."
}
```

The numbers in the summary row are about the **reviews the run read** (after your rating filter), not about all ratings: the store's own rating is in `storeRating` and `storeRatingCount`.

#### Errors are free

Rows with `type: "error"` are never charged: `invalid-input` (not an app id, URL or valid country), `app-not-found` (the store has no such app in that country), `rate-limited` (the store kept asking to slow down) and `fetch-failed`.

### How much does it cost?

Pay per event: **$0.0005 per review returned** (`review-returned`), so 1,000 reviews cost $0.50. **Free**: summary rows, apps not found and error rows. In monitor mode you only pay for new reviews. Use **Max reviews per app and country** or Apify's "maximum cost per run" to cap spend.

### Limitations

- **The App Store feed holds about 500 of the most recent reviews per app and country**, and has no per-review link, no developer replies and no rating filter (the Actor filters on its side, reading up to 10 pages). Reviews are the latest ones the feed serves, not the full history.
- **Google Play uses unofficial web endpoints** (the same the open-source `google-play-scraper` package uses). They work today without a proxy or login, but Google can change or block them at any time; if that happens the rows say `fetch-failed` or `rate-limited` and nothing is charged. Names, ratings and counts on the app page are read best-effort from the page; the reviews themselves do not depend on that.
- **App names** are only searched in the App Store (first match of Apple's search). For Google Play give the package id (the `id=` in the Play URL).
- **Reviews are text as published**, in the language the author wrote them. Author names are public display names; use them only as the store's terms and your local law allow.
- **Monitor mode remembers the last 20,000 review ids per app, country and language.** Reviews that were new but not returned because a limit was reached are returned next time.
- A change of the **app list** changes the default snapshot store; set a **Monitor name** to keep history when you edit the list.

### FAQ

#### Why do I get fewer reviews than I asked for on the App Store?

Apple serves at most about 500 recent reviews per app and country, and some apps have fewer in a given country.

#### Which Google Play language and country do I need?

Reviews are filtered by language (`hl`); the country is the store region (`gl`). Use `languages: ["en", "de"]` to get English and German reviews, `countries: ["us", "de"]` for both regions. Each combination is one read.

#### Can I get only complaints?

Yes: set **Maximum rating** to 2 (or 3).

#### Does the first monitor run return every review?

Yes: nothing was saved yet, so everything it reads is new. From the next run only reviews not returned before come back.

#### Does it use a proxy or log in?

No proxy and no login for either store.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a field or a source that does not work well? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/app-store-reviews-monitor/changelog.md

# Actor input Schema

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

App Store id (`284882215`), App Store URL, app name to search (App Store only: `Duolingo`), Google Play package id (`com.duolingo`) or Google Play URL. Prefix an entry with `appstore:` or `play:` to force the store. Up to 200.

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

Two-letter store countries, e.g. us, gb, de, fr, jp. Each app is read once per country. For Google Play the country is the store region.

## `languages` (type: `array`):

Review languages for Google Play (hl), e.g. en, de, es. Each app, country and language is one read. The App Store has one feed per country and ignores this.

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

The App Store serves at most about 500 of the most recent reviews per country; Google Play can go much deeper.

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

Keep reviews with at least this many stars.

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

Keep reviews with at most this many stars, e.g. 2 to see complaints.

## `mode` (type: `string`):

In monitor mode the Actor remembers the reviews it returned, per app and country, and returns only new ones next time. The first run has nothing to compare with, so every review counts as new.

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

Name of the snapshot store (letters, digits, spaces, - and \_). Runs with the same name share what was seen. Leave empty to derive it from the app list.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "play:com.duolingo",
    "Spotify"
  ],
  "countries": [
    "us"
  ],
  "languages": [
    "en"
  ],
  "maxReviewsPerApp": 50,
  "mode": "all"
}
```

# Actor output Schema

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

No description

## `summary` (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/duolingo-language-lessons/id570060128",
        "play:com.duolingo",
        "Spotify"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/app-store-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/duolingo-language-lessons/id570060128",
        "play:com.duolingo",
        "Spotify",
    ],
    "countries": ["us"],
    "maxReviewsPerApp": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/app-store-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/duolingo-language-lessons/id570060128",
    "play:com.duolingo",
    "Spotify"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 50
}' |
apify call offerastudio/app-store-reviews-monitor --silent --output-dataset

```

## MCP server setup

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