# App Reviews Scraper - App Store & Google Play + Reports (`skydata/app-reviews-scraper`) Actor

App Store and Google Play reviews in one run, plus a ready report per app: rating trend, rating by app version, top complaints and praise with quotes, developer reply rate, competitor comparison, new-review alerts and a shareable HTML report.

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

## Pricing

from $0.20 / 1,000 reviews

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 Reviews Scraper do?

**App Reviews Scraper** gets reviews from the **App Store and Google Play in one run** and turns them into a **ready report for every app**:

- 📈 **Rating trend by month**: is the app getting better or worse?
- 🧩 **Rating by app version**: find the update that made users angry
- 😡 **Top complaints** and 😍 **most praised** topics, found automatically, each with real example quotes
- 💬 **Developer reply rate** and typical reply time (Google Play)
- ⚖️ **Side-by-side comparison** of your app and your competitors
- 🔔 **What changed since last run**: new reviews, new negative reviews, rating changes. Schedule it and get alerts
- 🌍 **Many countries**: App Store reviews from every country you choose
- 📄 **Shareable HTML report** for your team or client
- 📋 **Every review as data**: stars, title, text, date, app version, helpful votes, developer reply, link

Enter store links, IDs or just **app names** (we find them in both stores).

**💸 You only pay for apps that have reviews.** Apps that can't be found or have no reviews are free.

### 👥 Who is it for?

- **Product managers and app developers**: see what users hate after each release
- **App marketers / ASO**: track ratings and complaints of your app and competitors
- **Agencies**: monthly app review reports for clients
- **Support teams**: catch new 1★ reviews early and check reply rates
- **Investors and analysts**: compare app sentiment across competitors

### 🚀 How to use it

1. Add apps: `https://apps.apple.com/us/app/duolingo-language-lessons/id570060128`, `com.duolingo`, or just `Duolingo`.
2. Choose countries and how many reviews per app.
3. Click **Start**. Open **Shareable HTML report** in the Output tab, or download the reviews as Excel, CSV or JSON.
4. For alerts: turn on **Monitor changes** and add a schedule.

💡 Want a head start? Open the **Example tasks** tab for ready-made setups (one click to run), e.g. common research jobs with the inputs already filled in.

### 📥 Input example

```json
{
  "apps": ["Duolingo", "Babbel", "com.memrise.android.memrisecompanion"],
  "countries": ["us", "gb"],
  "maxReviewsPerApp": 500,
  "days": 90,
  "monitorChanges": true
}
```

### 📤 Output

One **report** per app:

```json
{
  "type": "report",
  "label": "Duolingo: Learn Languages (Google Play)",
  "storeRating": 4.7,
  "avgRatingOfReviews": 3.9,
  "negativePercent": 21.4,
  "stars": { "1": 80, "2": 27, "3": 40, "4": 61, "5": 292 },
  "byMonth": [{ "month": "2026-10", "reviews": 300, "avgRating": 3.8, "negativePercent": 23.0 }],
  "byVersion": [{ "version": "6.103.6", "reviews": 120, "avgRating": 3.2, "negativePercent": 31.7 }],
  "topComplaints": [{ "theme": "too many ads", "reviews": 22, "sharePercent": 20.6, "examples": ["… too many ads after every lesson …"] }],
  "topPraise": [{ "theme": "learn spanish", "reviews": 31, "sharePercent": 8.8, "examples": ["…"] }],
  "replyRatePercent": 12.0,
  "insights": ["Recent reviews (3.9★) are clearly worse than the store rating (4.7★): sentiment is dropping.", "Version 6.103.6 is rated worst: 3.2★ over 120 reviews."],
  "changes": { "since": "2026-10-26", "newReviews": 140, "newNegativeReviews": 31, "notable": true }
}
```

Every **review** is a row (`"type": "review"`) with `rating`, `title`, `text`, `date`, `version`, `country`, `helpfulVotes`, `replyText` and `replyDate`. With 2+ apps you also get a **comparison** row. Use the **App reports**, **Reviews** and **Side-by-side comparison** views to see each type alone.

### 💰 Pricing

Pay per event: an **app report** per app with reviews, and a **review** per review row (turn off "Include every review" to get only the reports). Apps not found or without reviews are never charged. Platform usage is included. See the **Pricing** tab.

### 🤖 Use it with AI agents

Works as a tool for AI agents (Claude, ChatGPT, Cursor and others) through the [Apify MCP server](https://mcp.apify.com), and with Zapier, Make, n8n and the Apify API.

### 🧰 More from SkyData Tools

- 📈 **[Google Trends Scraper](https://apify.com/skydata/google-trends-scraper)**: many keywords × many countries, insights, ONE scale for 50+ keywords, what's-new monitoring
- 🔍 **[Google Ads Transparency Scraper](https://apify.com/skydata/google-ads-transparency-scraper)**: competitor ad reports, likely winning ads, countries, alerts
- 🎬 **[YouTube Transcript Scraper](https://apify.com/skydata/youtube-transcript-scraper)**: channels, playlists and search, AI-ready chunks, phrase search
- 📇 **[Website Contact & Company Info Scraper](https://apify.com/skydata/website-contact-company-scraper)**: emails, phones, social profiles and tech stack from any list of websites

### ❓ FAQ

**Why at most 500 App Store reviews per country?** Apple only shows the newest 500 reviews per country to the public. Add more countries to get more reviews.

**Are complaint themes AI?** They are found statistically: words and phrases that appear much more in 1-2★ reviews than in the others. This is fast, cheap and works best for English reviews.

**Is this allowed?** The Actor reads public reviews that both stores show to everyone, without logging in.

**Something missing or broken?** Open an issue. We answer within 12 hours.

# Changelog

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

# Actor input Schema

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

App Store links or IDs (id570060128), Google Play links or package names (com.duolingo), or app names (searched in both stores). One per line.

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

2-letter country codes. App Store reviews are per country (Apple shows up to 500 newest reviews per country), so add more countries for more reviews. Google Play uses the first country.

## `googlePlayLanguage` (type: `string`):

Google Play shows reviews written in this language (en, es, de, ar ...).

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

Newest reviews first.

## `days` (type: `integer`):

0 = no date limit.

## `includeReviews` (type: `boolean`):

Turn off to get only the reports (cheaper).

## `nameSearchStores` (type: `array`):

Only used for app names, not links.

## `monitorChanges` (type: `boolean`):

Remember each app between runs and report new reviews, new negative reviews and rating changes. Schedule it (for example daily) to get alerts.

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

Keeps separate memories for different app lists.

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

Apify datacenter proxy (included in the price). Switches to residential automatically if a store keeps refusing.

## `fallbackToResidential` (type: `boolean`):

Included in the price.

## `pacingMs` (type: `integer`):

Average pause between requests.

## `maxAttempts` (type: `integer`):

Retries with a new IP when a store refuses.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "com.duolingo"
  ],
  "countries": [
    "us"
  ],
  "googlePlayLanguage": "en",
  "maxReviewsPerApp": 200,
  "days": 0,
  "includeReviews": true,
  "nameSearchStores": [
    "appstore",
    "googleplay"
  ],
  "monitorChanges": false,
  "monitorName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "fallbackToResidential": true,
  "pacingMs": 400,
  "maxAttempts": 6
}
```

# Actor output Schema

## `html` (type: `string`):

Open in the browser and share.

## `reports` (type: `string`):

One row per app with insights.

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

One row per review.

## `all` (type: `string`):

Reports, reviews and comparison (field 'type').

## `changes` (type: `string`):

Only with monitoring.

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

What was 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/duolingo-language-lessons/id570060128",
        "com.duolingo"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 200,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("skydata/app-reviews-scraper").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",
        "com.duolingo",
    ],
    "countries": ["us"],
    "maxReviewsPerApp": 200,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("skydata/app-reviews-scraper").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",
    "com.duolingo"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call skydata/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

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/zQ8Nhxn5MsU6xe2rd/builds/Y53VosOVu1HdIx8J5/openapi.json
