# App Feedback & Reviews: App Sentiment & App Store Optimization (`euroscrape/app-reviews`) Actor

Mobile app reviews: App Store reviews API, iOS reviews API, Google Play reviews API and Android reviews (Play Store reviews) in 175 countries: rating, text, version, date, developer reply; app sentiment, app feedback, App Store optimization (ASO keyword ranks). Alerts on new negative app reviews.

- **URL**: https://apify.com/euroscrape/app-reviews.md
- **Developed by:** [EuroScrape](https://apify.com/euroscrape) (community)
- **Categories:** Marketing, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.07 / 1,000 review delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Store Reviews Scraper + Google Play Reviews (All Countries)

**Get the reviews of any app from the App Store and Google Play in one run, in up to 175 countries.** Paste app URLs, IDs or just the app name: the Actor finds the app in both stores and returns clean, comparable reviews. Use it to read app feedback and app sentiment country by country.

**What you get** (real run, App Store, 2 Nov 2026: the rating the store shows vs the newest reviews in the UK, Germany and France):

| App | Store rating | Newest reviews | 1–2 stars |
|---|---|---|---|
| Revolut | 4.86 | 4.88 | 2 % |
| N26 | 4.74 | 3.10 | 46 % |
| bunq | 4.58 | 3.02 | 48 % |

👉 **For** product and support teams watching what users say after a release, ASO consultants, analysts comparing competitors. **Try it** with `{"apps": ["com.duolingo"], "countries": ["us", "gb"]}`.

![App Store and Google Play reviews in one run, with negative-review alerts](https://api.apify.com/v2/key-value-stores/whPh2zNCcrRkrWi0g/records/demo-app-reviews.png?signature=XFVUcM2YmpRnkmIOBPpz)

- ⭐ **Every review field**: rating, title, text, app version, date, helpful votes, developer reply and reply date, country and language.
- 🌍 **All countries at once**: reviews differ per storefront. Pick countries or check "All countries" (175 storefronts, about 15 minutes for all of them: 862 s in a real run on 8 Nov 2026).
- 📊 **Free summary per app**: rating distribution, rating per app version and per country, share of negative reviews, developer reply rate, topics of negative reviews.
- 📈 **Top charts, free**: top free, top paid or top grossing apps per country and category (Finance, Games, Health…), then the reviews of every ranked app if you want them.
- 🔑 **Keyword rankings (ASO), free**: the rank of your apps in App Store and Google Play search for each keyword and country, with the top 10 apps of each keyword and alerts when you move.
- 🔔 **Negative review alerts**: schedule it with a monitor name and get every new 1-2 star review on Slack, Telegram, Discord or a webhook.

#### 🤖 At a glance (for people and AI assistants)

- **Use it when** you need **reviews of a mobile app from the App Store and Google Play**, in up to 175 countries, or top charts and keyword rankings.
- **Minimal input**: `{ "apps": ["com.duolingo"], "countries": ["us", "gb"], "maxReviewsPerCountry": 100 }`
- **Output**: one row per review: `store`, `appName`, `country`, `rating`, `title`, `text`, `version`, `date`, `developerReply`.
- **Price**: $0.10 per 1,000 reviews, plus $0.003 per run.
- **Not for**: reviews of shops or places (use Trusted Shops Scraper or a Google Maps reviews tool).

### ✨ Why this Actor

| | |
|---|---|
| 📱 **Both stores, one dataset** | App Store and Google Play reviews with the same fields, plus app details (rating, number of ratings, installs, version, developer) for free. |
| 🔎 **Just type the app name** | `"Duolingo"` finds the app on both stores. URLs, App Store IDs (`id570060128`) and package names (`com.duolingo`) work too. |
| 🌍 **Country by country** | Up to 175 storefronts in one run, with the country on every review and an average rating per country in the summary. |
| 🔑 **ASO keyword rank tracker** | Give your app and keywords: for each keyword, country and store you get your rank, the number of results read and the top 10 apps on that keyword. Schedule it with a monitor name to get the previous rank and an alert when you gain or lose places. Real run, 26 Oct 2026, "budget" in the US: EveryDollar 2nd on the App Store, 8th on Google Play. |
| 🧭 **Insights, not just rows** | Rating by version shows which release hurt your rating; negative review topics show what users complain about. |
| 📈 **Start from the top charts** | Top free, top paid and top grossing, per country and category, on both stores (iPhone or iPad charts for the App Store). Chart rows are free; check "Collect their reviews" to read the reviews of every ranked app in the same run. |
| 🔍 **Filter by words and version** | `keywords: ["crash", "login"]` keeps only the reviews that mention them ("crash" also finds "crashes", "crashing"); `appVersions: ["6.2"]` keeps the reviews of one release. `developerReply: "notReplied"` keeps the Google Play reviews nobody answered yet. The Actor reads on until it has your count of matching reviews. |
| 🔔 **Real-time monitoring** | Only new reviews on each scheduled run, and alerts for the bad ones: answer unhappy users before their review hurts your rating. |
| 🔒 **Privacy-friendly** | Reviewer names are not collected unless you ask for them. |

### 🎯 Use cases

- **App teams and customer support**: get new negative reviews in Slack and answer them fast.
- **Product managers**: see how each release changed the rating, and what users complain about.
- **Competitive research**: compare ratings and complaints of competing apps, country by country, or of the whole top 10 of your category.
- **Agencies and ASO specialists**: keyword rank tracking per country, reports for clients, localized review analysis, sentiment datasets for AI models.

### 🚀 Examples

**Duolingo on both stores, 4 countries:**

```json
{ "appNames": ["Duolingo"], "countries": ["us", "gb", "fr", "de"], "maxReviewsPerCountry": 100 }
```

**What users of the top 5 finance apps in Germany complain about** (top free charts of both stores, then their 1-2 star reviews; real run, 26 Oct 2026: PayPal, Revolut, Klarna, Trade Republic and S-pushTAN on the App Store, Google Wallet, S-pushTAN, PayPal, Freecash and Klarna on Google Play):

```json
{ "charts": ["topFree"], "chartCategory": "finance", "chartSize": 5, "countries": ["de"], "maxReviewsPerCountry": 50, "maxRating": 2 }
```

**The charts only, for free** (top grossing games in 3 countries, iPad charts for the App Store):

```json
{ "charts": ["topGrossing"], "chartCategory": "games", "chartSize": 25, "chartDevice": "ipad", "countries": ["us", "jp", "de"], "reviewsFromCharts": false }
```

**ASO: where your app ranks on its keywords, free** (real run, 26 Oct 2026, "budget" in the US: EveryDollar 2nd of 193 App Store results and 8th on Google Play, 2 rows in 2.3 s; add a `monitorName` and schedule it daily to track the moves):

```json
{ "apps": ["id942571931", "com.everydollar.android"], "rankKeywords": ["budget", "budget planner", "expense tracker"], "countries": ["us", "gb"], "skipReviews": true }
```

**Only 1-2 star reviews of your app since the last release:**

```json
{
  "apps": ["com.spotify.music", "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
  "allCountries": true,
  "maxRating": 2,
  "reviewedAfter": "2026-09-15"
}
```

**Only the reviews that talk about crashes, offline mode or battery** (real run, 22 Oct 2026: Spotify in the US, 20 matching reviews, "crash" in 11 and "offline" in 9, the end message counts each word):

```json
{
  "appNames": ["Spotify"],
  "countries": ["us"],
  "maxReviewsPerCountry": 50,
  "keywords": ["crash", "offline", "battery"]
}
```

**Negative reviews of one release series** (`"6."`, `"6.x"` or `"6"` all mean the whole 6 series; `"6.2"` means 6.2, 6.2.1…):

```json
{ "apps": ["com.duolingo"], "stores": ["googleplay"], "maxRating": 2, "appVersions": ["6.101"] }
```

**Complaints still without an answer** (Google Play): on 23 October 2026, 18 of Revolut's 100 latest 1- and 2-star UK reviews had a developer reply; this run returns only the others.

```json
{ "apps": ["com.revolut.revolut"], "stores": ["googleplay"], "countries": ["gb"], "maxRating": 2, "developerReply": "notReplied" }
```

**French-speaking reviews from Canada (Google Play):**

```json
{ "apps": ["com.spotify.music"], "countries": ["ca"], "reviewLanguage": "fr", "maxReviewsPerCountry": 100 }
```

**Slack alert for every new negative review (schedule the Actor every hour):**

```json
{
  "apps": ["com.yourcompany.app", "id1234567890"],
  "countries": ["us", "gb"],
  "monitorName": "my-app",
  "alertMaxRating": 2,
  "slackWebhookUrl": "https://hooks.slack.com/services/…"
}
```

### 📊 Data Report · 2 Nov 2026: the store rating vs the last 300 reviews

One run, four European neobanks on the App Store, the 100 newest reviews in each of the UK, Germany and France (Monzo: 134 in all), compared with the rating the store displays:

| App | Store rating | Last reviews, average | 1–2 stars |
|---|---|---|---|
| Revolut | 4.86 | 4.88 | 2 % |
| Monzo | 4.86 | 4.10 | 22 % |
| N26 | 4.74 | 3.10 | 46 % |
| bunq | 4.58 | 3.02 | 48 % |

The store rating is an all-time average: N26 shows 4.74, yet almost half of its newest reviews give 1 or 2 stars. Each run returns this summary for free, by app version and by country (`includeSummary`).

Reproduce it (then widen the list):

```json
{
  "appNames": [
    "Revolut",
    "N26",
    "bunq",
    "Monzo"
  ],
  "stores": [
    "appstore"
  ],
  "countries": [
    "gb",
    "de",
    "fr"
  ],
  "maxReviewsPerCountry": 100,
  "sortBy": "newest",
  "includeAppDetails": true,
  "includeSummary": true
}
```

More reports like this one, twice a week: [EuroScrape on LinkedIn](https://www.linkedin.com/company/euroscrape).

### 📦 Output

**A Google Play review with a developer reply** (real data, 29 Sept 2026):

```json
{
  "type": "review",
  "store": "Google Play",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "country": "us",
  "language": "en",
  "reviewId": "de82d3cb-4b4a-43e9-9814-906e71b4ffb9",
  "rating": 5,
  "text": "I just updated the app today and its now unusable. It wouldnt connect to the internet, or show my profile or playlists. …",
  "version": "9.1.86.2432",
  "date": "2026-09-29T19:17:03.870Z",
  "helpfulCount": 0,
  "developerReply": "Hi! This should be fixed now. If you're still having issues, we'd recommend reinstalling the app. …",
  "developerReplyDate": "2026-09-30T14:45:32.400Z",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=de82d3cb-…"
}
```

**App details** (free, one per app and store):

```json
{
  "type": "app",
  "store": "Google Play",
  "appName": "Spotify: Music and Podcasts",
  "developer": "Spotify AB",
  "rating": 4.34,
  "ratingsCount": 36405997,
  "reviewsCount": 1854640,
  "installs": "1,000,000,000+",
  "genre": "Music & Audio",
  "histogram": { "1": 3729030, "2": 1069635, "3": 1312824, "4": 3101915, "5": 27192570 }
}
```

**The summary** (free, one per app and store; real data, App Store, 3 countries):

```json
{
  "type": "summary",
  "store": "App Store",
  "appName": "Duolingo: Language Lessons",
  "reviewsCollected": 120,
  "averageRatingOfCollected": 3.7,
  "storeRating": 4.72,
  "ratingDistribution": { "1": 21, "2": 5, "3": 15, "4": 27, "5": 52 },
  "negativeSharePct": 22,
  "byVersion": [{ "version": "7.141.1", "reviews": 120, "averageRating": 3.7 }],
  "byCountry": [
    { "country": "us", "reviews": 40, "averageRating": 3.53 },
    { "country": "fr", "reviews": 40, "averageRating": 3.95 },
    { "country": "de", "reviews": 40, "averageRating": 3.63 }
  ],
  "negativeReviewTopics": [{ "word": "learn", "reviews": 5 }, { "word": "streak", "reviews": 3 }, { "word": "update", "reviews": 3 }, "…"]
}
```

### 💰 Pricing

Pay per event:

| Event | Price |
|---|---|
| Run start | $0.003 |
| Review delivered | $0.0001 (**$0.10 per 1,000 reviews**) |
| App details, summaries, top charts and keyword rankings | free |

Apify subscribers pay less: −10% (Starter), −20% (Scale), −30% (Business). In monitoring mode you only pay for new reviews. Set a **maximum cost per run** in the run options and the Actor stops cleanly when it's reached.

### ❓ FAQ

**Why at most 500 App Store reviews per country?** Apple publishes the 500 most recent (or most helpful) reviews per country. Add more countries to get more reviews. Google Play has no such limit.

**What if Apple's review feed is down?** It sometimes returns empty pages for a while. The Actor retries automatically and, if needed, falls back to the reviews shown on the App Store page (about 20, the ones Apple features). The `source` field tells you which one was used.

**iPad-only and Mac apps?** App names are searched among iPhone, iPad-only and Mac apps, and an exact name wins ("Final Cut Pro" is the Mac app, not "Final Cut Camera"). App Store URLs and IDs work for all three; the app details say which `platform` it is. Apple has no review feed for Mac apps: only the ~10 reviews featured on the Mac App Store page are available per country.

**Are developer replies included for the App Store?** Apple doesn't publish them in its review feed, so `developerReply` is filled for Google Play only.

**What does "language" mean for Google Play?** Google Play returns reviews for a country and a language. The Actor uses the main language of each country (e.g. `de` for Germany), or the one you set in `reviewLanguage`: `fr` gives the French-speaking reviews of Canada or Belgium, `es` the Spanish reviews written in the US. The App Store has no language filter.

**How far does a keyword or version filter read?** On Google Play, up to 20 times your `maxReviewsPerCountry` (at least 600 reviews) per country, until it has enough matching reviews. On the App Store, Apple's 500 latest reviews per country: for a rare word, add countries. The end message counts the matches of each word.

**Where do the top charts come from?** The App Store charts come from Apple's official iTunes RSS feeds (country, category, iPhone or iPad), the Google Play charts from the Play Store lists. Up to 100 apps per chart, country and store; each chart row has the rank, app, developer, price and link, and costs nothing. Reviews of the ranked apps are billed like any review.

**How are keyword ranks measured?** The Actor runs the same search as the store for each keyword and country: on the App Store through Apple's search API (up to 200 results, iPhone and iPad apps), on Google Play through the Play Store search (about 30 results, the first screen). A rank of `null` means the app is not in the results read. Ranks can differ slightly from what one phone shows, as stores personalise a little; tracked daily, the trend is what counts.

**How does monitoring work?** Set a `monitorName` and schedule the Actor. The first run saves the current reviews as a baseline. Each next run returns only new reviews and alerts you about those rated `alertMaxRating` or lower. For keyword rankings, each row gets the `previousRank` and `rankChange`, and you are alerted when an app moves by at least `rankAlertMinChange` places.

**Is it legal?** The Actor reads public store pages and feeds at a moderate pace, and does not collect reviewer names unless you ask for them. You are responsible for how you use the data under the GDPR and the stores' terms.

### 🔌 API, AI agents and integrations

- **API**: one call runs the Actor and returns the results, `POST https://api.apify.com/v2/acts/euroscrape~app-reviews/run-sync-get-dataset-items` (see the API tab for Python, JavaScript and cURL).
- **AI agents (MCP)**: add `https://mcp.apify.com?tools=euroscrape/app-reviews` to Claude, Cursor, VS Code or any MCP client, and the Actor becomes a tool your agent can call.
- **No-code automation**: start runs and pass the results on with Apify's integrations for n8n, Make and Zapier, or with a webhook when a run ends.
- **Exports**: every result set downloads as JSON, CSV, Excel or XML, and can be sent to Google Sheets.
- **Data Reports**: twice a week, EuroScrape turns a run of one of its Actors into a 30-second data report (used-iPhone prices in 18 countries, electricity prices, Ryanair fares…) on [LinkedIn](https://www.linkedin.com/company/euroscrape). Follow the page to see what the data looks like.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a field, a country or a filter? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [Free Keyword Suggestions: Google, App Store & Google Play Autocomplete](https://apify.com/euroscrape/keyword-suggestions-free): ASO keyword research for free: what people type in the App Store and Google Play search, expanded A-Z, per country. Then track your rank on those keywords here with `rankKeywords`.
- [Trusted Shops Scraper: Shop Leads, Ratings, Reviews & Alerts](https://apify.com/euroscrape/trusted-shops-scraper): online shops of 11 European markets with their company, contacts, rating and review volume, plus customer reviews and alerts on negative ones.
- [Google Hotels Scraper: Prices from Every Booking Site](https://apify.com/euroscrape/google-hotels-prices): hotel prices for any destination and dates, with the price on every booking site, rate parity, price calendars and alerts.
- [Google Flights Scraper: Cheapest Dates, Prices & Price History](https://apify.com/euroscrape/google-flights-prices): flight prices for any route and dates, cheapest day to fly, typical price range, CO2 and price-drop alerts.
- [Website Tech Stack Detector: 280+ Technologies, Leads & Signals](https://apify.com/euroscrape/website-intelligence): 280+ technologies, company identity, contacts and sales signals for any website.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search on the top second-hand marketplace of 18 European countries, prices in €, cheapest country and resale margin.
- [EU Public Tenders Scraper: TED, BOAMP & Awards](https://apify.com/euroscrape/eu-public-tenders): open tenders and contract awards from all of Europe (TED) and France (BOAMP, DECP), with winners per lot, values in € and daily alerts.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with view counts, full seller details and instant alerts.
- [French Companies Scraper (SIRENE)](https://apify.com/euroscrape/france-companies): every French company by activity, area and size, with verified websites and emails.
- [UK Companies House Scraper](https://apify.com/euroscrape/uk-companies): UK companies by SIC code and location, with directors, websites and emails.
- [Impressum & Legal Notice Scraper (EU)](https://apify.com/euroscrape/company-identity): legal identity, registry numbers and VAT IDs from any website, registry-verified.
- [Vinted Scraper: 26 Countries, Deals, Alerts & Seller Data](https://apify.com/euroscrape/vinted-scraper): search Vinted across 26 countries, prices with buyer fees, seller ratings, cheapest-country comparison and instant alerts on new listings.
- [EU VAT Number Validator (VIES): Bulk Check, Proof & Alerts](https://apify.com/euroscrape/vat-validator): validate VAT numbers in bulk against the EU's official registry, with consultation proof for tax audits and alerts when a customer's number becomes invalid.
- [France Real Estate Sold Prices (DVF): €/m², Sales & Trends](https://apify.com/euroscrape/france-property-prices): every property sale registered by the French State — real prices, €/m², addresses, GPS, market trends per city and alerts on new sales.
- [France Energy Ratings (DPE): Homes, Energy Sieves & Alerts](https://apify.com/euroscrape/france-energy-ratings): official energy certificates of French homes — class, address, consumption, yearly bill — with the F/G energy sieves of any city and alerts on new certificates.
- [France Building Permits (Sitadel): Projects, Builders & Alerts](https://apify.com/euroscrape/france-building-permits): official register of French building permits — housing programmes and commercial buildings with the developer (name, SIREN), address, size and status, and alerts when works start.
- [Ryanair Low Fare Finder: Cheapest Days, Anywhere & Alerts](https://apify.com/euroscrape/ryanair-low-fares): Ryanair fare calendars months ahead, every destination under your price cap from any airport, and alerts on drops and new deals.
- [EU Electricity Prices (Day-Ahead): All Zones & Cheap Hours](https://apify.com/euroscrape/eu-electricity-prices): tomorrow's spot prices for 40+ European bidding zones, the cheapest 3-hour window of each day, negative-price alerts and years of history.
- [France Fuel Prices: Cheapest Stations Near You & Alerts](https://apify.com/euroscrape/france-fuel-prices): live official prices of all ~10,000 French stations — cheapest Diesel, E10, E85 or LPG around any point, with distances and price-drop alerts.

# Actor input Schema

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

App Store URLs or IDs (e.g. https://apps.apple.com/us/app/instagram/id389801252 or id389801252) and Google Play URLs or package names (e.g. com.spotify.music). Mix both stores freely.

## `appNames` (type: `array`):

Just type the app name (e.g. "Duolingo"): the Actor finds it on the App Store and on Google Play.

## `stores` (type: `array`):

Which stores to search for app names.

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

Reviews differ per country: each country is a separate storefront. All 175 App Store storefronts are listed; Google Play uses the same codes.

## `allCountries` (type: `boolean`):

Collect reviews in all 175 countries above (every App Store storefront). Many requests: allow a few minutes per app.

## `reviewLanguage` (type: `string`):

Optional, Google Play only. Two-letter code of the language the reviews are written in, e.g. "fr" for French-speaking reviews in Canada, "es" for Spanish reviews in the US. Empty: the main language of each country. The App Store has no language filter.

## `maxReviewsPerCountry` (type: `integer`):

The App Store gives at most 500 recent reviews per country; Google Play has no such limit.

## `sortBy` (type: `string`):

Which reviews first.

## `charts` (type: `array`):

Pick one or more charts. They are read in each selected country (30 at most) and in each store selected above.

## `chartCategory` (type: `string`):

Same categories in both stores (e.g. Finance, Games, Health & Fitness).

## `chartSize` (type: `integer`):

How many ranked apps to read per chart and country (1-100).

## `chartDevice` (type: `string`):

App Store only: the iPhone or the iPad charts.

## `reviewsFromCharts` (type: `boolean`):

Also collect the reviews of every ranked app (billed per review, with all the filters below). Uncheck to get the charts only, for free.

## `rankKeywords` (type: `array`):

Search words, e.g. "budget app", "expense tracker". Up to 100 keywords. Leave the apps empty to just see who ranks on each keyword.

## `rankCountries` (type: `array`):

Leave empty to use the review countries above (30 at most).

## `skipReviews` (type: `boolean`):

Skip the reviews: the run returns only the free keyword rank and chart rows (and costs only the run start).

## `rankAlertMinChange` (type: `integer`):

With a monitor name and an alert channel: alert when a tracked app moves by at least this many places on a keyword, or enters or leaves the results.

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

Keep reviews rated at least this (1-5).

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

E.g. 2 = only negative reviews.

## `reviewedAfter` (type: `string`):

Only reviews written after this date (YYYY-MM-DD).

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

Keep only reviews whose title or text contains one of these words (case and accents ignored; "crash" also matches "crashes" and "crashing"). E.g. crash, login, subscription, battery. Empty = all reviews.

## `appVersions` (type: `array`):

Keep only reviews written on these app versions; "6.2" matches 6.2, 6.2.1, 6.2.10. Useful after a release. Reviews without a version (App Store web fallback) are left out when this is set. Empty = all versions.

## `developerReply` (type: `string`):

Google Play only (Apple's review feed does not include developer replies, so App Store reviews are not filtered). "Still without a reply" with a maximum rating of 2 gives the complaints nobody answered yet.

## `includeAppDetails` (type: `boolean`):

One item per app: rating, number of ratings, version, installs, developer, genre.

## `includeSummary` (type: `boolean`):

Rating distribution, rating by version and by country, developer reply rate, topics of negative reviews.

## `includeReviewerNames` (type: `boolean`):

Off by default: reviewer names are personal data and are rarely needed for analysis.

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

Set a name and schedule the Actor (e.g. every hour): each run returns only new reviews, and can alert you on negative ones.

## `alertMaxRating` (type: `integer`):

Monitoring: send an alert for each new review with this rating or lower (e.g. 2 = 1 and 2 stars).

## `telegramBotToken` (type: `string`):

Alerts on Telegram: create a bot with @BotFather and paste its token.

## `telegramChatId` (type: `string`):

Your chat ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `discordWebhookUrl` (type: `string`):

Alerts in a Discord channel: Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Alerts in Slack: create an Incoming Webhook for your channel.

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

Receives one POST per run with the alerted reviews (Make, Zapier, n8n, your helpdesk…).

## `maxNotifications` (type: `integer`):

Maximum number of alert messages per run.

## Actor input object example

```json
{
  "apps": [
    "com.duolingo",
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "stores": [
    "appstore",
    "googleplay"
  ],
  "countries": [
    "us",
    "gb",
    "fr",
    "de"
  ],
  "allCountries": false,
  "maxReviewsPerCountry": 50,
  "sortBy": "newest",
  "charts": [],
  "chartCategory": "all",
  "chartSize": 10,
  "chartDevice": "iphone",
  "reviewsFromCharts": true,
  "rankKeywords": [],
  "rankCountries": [],
  "skipReviews": false,
  "rankAlertMinChange": 5,
  "keywords": [],
  "appVersions": [],
  "developerReply": "any",
  "includeAppDetails": true,
  "includeSummary": true,
  "includeReviewerNames": false,
  "alertMaxRating": 2,
  "maxNotifications": 30
}
```

# Actor output Schema

## `overview` (type: `string`):

All reviews from both stores.

## `negative` (type: `string`):

Ratings, text and developer replies.

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

Counters for this run (items found, output, errors).

# 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": [
        "com.duolingo",
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
    ],
    "countries": [
        "us",
        "gb",
        "fr",
        "de"
    ],
    "maxReviewsPerCountry": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/app-reviews").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": [
        "com.duolingo",
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    ],
    "countries": [
        "us",
        "gb",
        "fr",
        "de",
    ],
    "maxReviewsPerCountry": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/app-reviews").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": [
    "com.duolingo",
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "countries": [
    "us",
    "gb",
    "fr",
    "de"
  ],
  "maxReviewsPerCountry": 50
}' |
apify call euroscrape/app-reviews --silent --output-dataset

```

## MCP server setup

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

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/DuZ9O6WSLe6kiL3JY/builds/14wg7iyzsiFZ6m2av/openapi.json
