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

Scrape app reviews from the Apple App Store and Google Play in one run: rating, title, text, app version, date, likes and developer replies, for any app and country. Filter by stars and date. Optional report per app with complaints and rating trend.

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

## Pricing

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

## App Store & Google Play Reviews Scraper

Scrape **app reviews from the Apple App Store and Google Play** in one run, for any app and any country, with **no login and no API key**:

- **Every review as a row**: stars, title, text, **app version**, date, helpful votes and the **developer's reply**
- **Both stores at once**: type an app name and get its reviews from the App Store and Google Play, or paste store links
- **Any country**: each country store has its own reviews; ask for several in one run
- **About 1,000 App Store reviews per country**, twice the usual 500 (newest and most helpful lists combined), and **as many Google Play reviews as you want**
- **Filters**: star range (only 1 and 2 stars, for example), reviews since a date or from the last N days, newest or most helpful first
- **Optional app report**: rating mix, rating by month, last 30 days against the 30 before, **top complaint and praise themes** with examples, common phrases, lowest-rated app versions, developer reply rate
- **No reviewer names**: reviews are saved without the reviewer's name

### What does this app reviews scraper do?

```
Temu · App Store · US · 750 reviews read
 Store rating 4.66, but the reviews read average 3.52 · 31.5% are 1-2 stars
 Top complaint: payments and orders (50% of negative reviews) · trend declining
```

1. Enter **apps**: names, App Store links or ids, Google Play links or package names.
2. Pick **stores**, **countries**, how many reviews, and optional **filters**.
3. You get **one row per review** and, if you want, **one report per app, store and country**.

```mermaid
flowchart LR
    A[App name<br/>or store link] --> B[App Store<br/>per country]
    A --> C[Google Play<br/>per country]
    B --> D[Reviews<br/>stars, text, version,<br/>date, reply]
    C --> D
    D --> E[App report<br/>themes, trend,<br/>bad versions]
```

### Who is it for?

- **Product managers and app developers**: read what users complain about, by version, after every release
- **App marketers and ASO specialists**: track ratings and review themes for your app and competitors, by country
- **Customer support teams**: find unanswered complaints and measure your reply rate on Google Play
- **Market researchers and investors**: compare user sentiment across apps in a category
- **AI and data teams**: build labelled review datasets (text + stars) for sentiment models

### What data do you get?

**Reviews** (default dataset, one row per review)

| Field | What it tells you |
|---|---|
| `appName`, `appId`, `store`, `country`, `language` | Which app, store and country |
| `rating`, `title`, `text` | Stars (1-5) and what the user wrote |
| `version`, `date` | App version reviewed and when |
| `thumbsUp` | Helpful votes |
| `developerReply`, `developerReplyDate` | The developer's answer (Google Play) |
| `reviewId`, `reviewUrl` | Review id and link |

**App reports** (second dataset, one per app, store and country)

| Field | What it tells you |
|---|---|
| `storeRating`, `storeRatingCount`, `storeRatingBreakdown`, `installs` | The store's own numbers |
| `reviewsAnalyzed`, `averageRatingAnalyzed`, `ratingBreakdownAnalyzed` | The reviews read, and their average |
| `negativeSharePercent`, `positiveSharePercent` | Share of 1-2 star and 4-5 star reviews |
| `ratingByMonth`, `last30DaysAverageRating`, `previous30DaysAverageRating`, `ratingTrend` | Is it getting better or worse |
| `complaintThemes`, `praiseThemes` | Crashes, login, ads, price, refunds, speed, updates, support... with share and an example |
| `topComplaintPhrases`, `topPraisePhrases` | The two-word phrases users repeat |
| `lowestRatedVersions` | App versions with the worst average |
| `developerReplyRatePercent`, `developerReplyMedianHours` | How often and how fast the developer answers (Google Play) |

### Example: 7 October 2026

Spotify, Duolingo, ChatGPT and Temu, both stores, US and UK, up to 2,000 reviews each: **23,722 reviews and 16 reports in 3 minutes 12 seconds.**

| App (US) | Store | Store rating | Average of reviews read | 1-2 stars | Top complaint |
|---|---|---|---|---|---|
| Temu | App Store | 4.66 | 3.52 | 31.5% | Payments and orders (50%) |
| Temu | Google Play | 4.45 | 3.96 | 21.5% | Privacy and scams (21%) |
| Spotify | App Store | 4.77 | 3.75 | 22.9% | Price and subscription (39%) |
| Spotify | Google Play | 4.35 | 3.94 | 23.2% | Price and subscription (32%) |
| ChatGPT | App Store | 4.83 | 3.97 | 22.5% | Crashes and bugs (19%) |
| Duolingo | Google Play | 4.73 | 4.51 | 7.5% | Price and subscription (9%) |

- **Written reviews are harsher than star ratings**: every app's reviews average below its store rating, by up to 1.1 stars (Temu 3.52 against 4.66 on the App Store), because unhappy users write more.
- **Volume differs hugely**: 2,000 Google Play reviews cover the last **7 hours** for ChatGPT, 3 days for Spotify and 19 days for Duolingo.
- **Spotify answers 12%** of its Google Play reviews; Duolingo, ChatGPT and Temu almost none.

### Pricing

**$0.00015 per review** ($0.15 per 1,000) and **$0.01 per app report**.

- 1,000 reviews of one app: **$0.15**, or **$0.16** with the report
- The run above (23,722 reviews, 16 reports): **$3.72**

Turn off **App report** to pay for reviews only.

### Good to know

- **App Store limit**: Apple publishes about 500 reviews per list and country. This scraper reads both the newest and the most helpful list, which barely overlap, so you get **about 1,000 per country**; the most helpful ones can be years old. Add more countries for more reviews.
- **Google Play** has no such limit; 100,000 reviews per app and country is the cap here.
- **Filters**: star filters on Google Play are applied by Google when you pick one star value; otherwise more reviews are read and trimmed, so the count you asked for is still reached where possible.
- **Themes** use English keyword lists, so reports work best for English reviews. Reviews themselves come in any language.
- **Same app twice** (by name and by link) is read once.
- **No personal data**: reviewer names and avatars are not collected.
- Data comes from the stores' **public review pages and feeds**. **Not affiliated with Apple or Google.**

### Input

| Field | Meaning |
|---|---|
| **Apps** | Names, App Store links or ids, Google Play links or package names |
| **Stores** | App Store, Google Play or both (for apps given by name) |
| **Countries** | Two-letter codes, default `us` |
| **Reviews per app, store and country** | 1 to 100,000 (default 500) |
| **Order** | Newest, most helpful, or by rating (Google Play) |
| **Lowest / highest star rating** | 1 to 5 |
| **Reviews since** / **from the last N days** | Date filters |
| **Google Play language** | Default `en` |
| **App report** | On by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** with "from the last 1 day" and stars 1 to 2 for a feed of new complaints about your app or your competitors.

# Actor input Schema

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

One per line: an App Store link or id, a Google Play link or package name (com.spotify.music), or an app name (Spotify). A name is looked up in both stores.

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

Which stores to read for apps given by name.

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

Two-letter country codes (us, gb, de, in, br...). Each country has its own reviews. The App Store gives up to about 1,000 reviews per country.

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

Most reviews to save for each app in each store and country.

## `sort` (type: `string`):

Newest first, most helpful first, or (Google Play only) by rating. The App Store reads both its newest and most helpful lists either way.

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

1 to 5. Set lowest 1 and highest 2 to get only complaints.

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

1 to 5.

## `reviewsSince` (type: `string`):

Only reviews on or after this date (YYYY-MM-DD). Leave empty for all.

## `reviewsFromLastDays` (type: `integer`):

Used when 'Reviews since' is empty. Handy for scheduled runs (7 = last week).

## `language` (type: `string`):

Two-letter language code for Google Play reviews (en, de, es, fr...). The App Store returns reviews in the country's languages.

## `includeReports` (type: `boolean`):

One report per app, store and country: rating mix, rating by month, last 30 days vs the 30 before, complaint and praise themes, common phrases, lowest-rated versions, developer reply rate.

## Actor input object example

```json
{
  "apps": [
    "Spotify",
    "https://play.google.com/store/apps/details?id=com.duolingo"
  ],
  "stores": [
    "appStore",
    "googlePlay"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 500,
  "sort": "newest",
  "minRating": 1,
  "maxRating": 5,
  "language": "en",
  "includeReports": true
}
```

# Actor output Schema

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

One row per review: stars, title, text, app version, date, helpful votes, developer reply.

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

Rating mix, rating by month, trend, complaint and praise themes, lowest-rated versions, reply rate.

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

What was matched and read.

# 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": [
        "Spotify",
        "https://play.google.com/store/apps/details?id=com.duolingo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/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": [
        "Spotify",
        "https://play.google.com/store/apps/details?id=com.duolingo",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/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": [
    "Spotify",
    "https://play.google.com/store/apps/details?id=com.duolingo"
  ]
}' |
apify call precious_bathmat/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/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/4jEgeKPXjPeIDzj4t/builds/zkHv4VZlQhd0Wgenv/openapi.json
