# App Store Reviews Scraper + Google Play Reviews (All Countries) (`euroscrape/app-reviews`) Actor

Reviews from the App Store and Google Play in one run, in up to 58 countries: rating, text, version, date, developer reply, helpful votes, plus app details and a free summary (rating by version and country, topics of negative reviews). Alerts on new negative reviews.

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

## Pricing

from $0.14 / 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 58 countries.** Paste app URLs, IDs or just the app name: the Actor finds the app in both stores and returns clean, comparable reviews.

- ⭐ **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" (58 storefronts).
- 📊 **Free summary per app**: rating distribution, rating per app version and per country, share of negative reviews, developer reply rate, topics of negative reviews.
- 🔔 **Negative review alerts**: schedule it with a monitor name and get every new 1-2 star review on Slack, Telegram, Discord or a webhook.

### ✨ 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 58 storefronts in one run, with the country on every review and an average rating per country in the summary. |
| 🧭 **Insights, not just rows** | Rating by version shows which release hurt your rating; negative review topics show what users complain about. |
| 🔔 **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.
- **Agencies and ASO specialists**: 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 }
```

**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"
}
```

**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/…"
}
```

### 📦 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.0002 (**$0.20 per 1,000 reviews**) |
| App details and summaries | 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.

**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).

**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.

**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.

### ⭐ 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

- [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.

# 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.

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

Collect reviews in all 58 countries above.

## `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.

## `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).

## `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",
  "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/gKfv8lO3uiWpHtdl0/openapi.json
