# App Store & Google Play Reviews Scraper (`adhistory/app-store-google-play-reviews-scraper`) Actor

Get App Store and Google Play reviews in one run, in one format: rating, title, text, date, app version, helpful votes and developer replies. Many countries at once, plus a per-app summary with rating trends and top complaints. $0.10 per 1,000 reviews.

- **URL**: https://apify.com/adhistory/app-store-google-play-reviews-scraper.md
- **Developed by:** [Brandon Ob](https://apify.com/adhistory) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.07 / 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.
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 & Google Play Reviews Scraper

This app store reviews scraper gets reviews from the **Apple App Store and Google Play in one run, in one format**. Paste app links, IDs or package names, pick the countries, and get every review as a row: stars, title, text, date, app version, helpful votes and the developer's reply. Each run also saves a free **per-app summary** with the average rating, star distribution, last-30-days trend, rating by app version and the words that come up most in 1–2 star reviews. It costs **$0.10 per 1,000 reviews**.

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

- Collects **App Store and Google Play reviews** for any number of apps, mixed in one list.
- Accepts App Store URLs or IDs, Google Play URLs or package names, or an **app name** (searched in the App Store; the top result is used).
- Collects reviews **per country**, for as many countries as you list (`us`, `gb`, `de`, `br`, …).
- Sorts by **newest** or **most relevant/helpful**, and filters by **star rating** (for example 1–2 stars only).
- Returns the **same fields for both stores**, so iOS and Android reviews sit side by side in one table.
- Saves a free **per-app summary** (`APP_SUMMARY`): average rating, star distribution, last 30 days vs older, rating by version and top complaint words.
- Uses only the stores' public data: no login, API key or cookies.

### Use cases

- **Product teams:** see what users complain about after each release, on iOS and Android side by side.
- **App store optimization (ASO):** track ratings by country and version, and find the words users use about your app.
- **Competitor research:** pull a competitor's 1–2 star reviews to see where their app falls short.
- **Support and community teams:** export Google Play reviews with developer replies to find the ones still unanswered.
- **Market research and investors:** compare ratings and sentiment trends across apps in a category.
- **Review monitoring:** schedule a daily run with "Newest first" and a small limit to keep a running history.

### How to use it

1. Open the Actor in Apify Console and paste app links, IDs, package names or app names into **Apps**, one per line.
2. Add the **countries** you want (default `us`).
3. Optional: set the maximum reviews per app and country, the sort order, a star filter and the Google Play language.
4. Click **Start**, then open the **Reviews** view or download the dataset. Open the key-value store for `APP_SUMMARY`.
5. To monitor reviews, save the input as a task and run it on a schedule, or call the Actor from the API.

### Input

| Field | What it does |
|---|---|
| `apps` | App Store URLs or IDs, Google Play URLs or package names, or app names. One per line. |
| `searchTerms` | Optional app names to look up in the App Store (top match used). |
| `countries` | Two-letter country codes; reviews are collected per country (default `us`). |
| `maxReviewsPerApp` | Maximum reviews per app and country (default 200). |
| `sort` | `newest` (default) or `relevant`. |
| `language` | Language of Google Play reviews (default `en`). App Store reviews follow the country. |
| `minRating`, `maxRating` | Keep only reviews within this star range (default 1–5). |
| `includeSummary` | Save the per-app summary as `APP_SUMMARY` (on by default; free). |

Example input:

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "countries": ["us", "gb"],
  "maxReviewsPerApp": 200,
  "sort": "newest",
  "minRating": 1,
  "maxRating": 2,
  "language": "en",
  "includeSummary": true
}
```

### Output

One row per review, with the same fields for both stores:

```json
{
  "store": "googleplay",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "country": "us",
  "reviewId": "90ac3882-…",
  "userName": "A Google user",
  "rating": 1,
  "title": null,
  "text": "Too many ads between songs.",
  "date": "2026-11-03T20:45:28Z",
  "appVersion": "9.1.94.1929",
  "thumbsUp": 1,
  "voteCount": null,
  "developerReply": "Thanks for leaving a review…",
  "replyDate": "2026-11-03T21:02:10Z",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=90ac3882-…"
}
```

Some fields exist in only one store: `title` and `voteCount` are App Store only; `developerReply` and `replyDate` are Google Play only.

The free per-app summary is saved in the run's key-value store as `APP_SUMMARY`, one entry per app and store:

```json
{
  "store": "appstore",
  "appName": "Spotify: Music and Podcasts",
  "countries": ["gb", "us"],
  "reviewCount": 400,
  "averageRating": 3.7,
  "ratingDistribution": {"1": 80, "2": 24, "3": 56, "4": 16, "5": 224},
  "last30DaysAverage": 3.6,
  "olderAverage": 4.1,
  "byVersion": [{"version": "9.1.94", "reviews": 310, "averageRating": 3.6}],
  "topComplaintKeywords": [{"word": "ads", "reviews": 41}, {"word": "shuffle", "reviews": 19}]
}
```

The dataset can be downloaded as JSON, CSV, Excel, XML or HTML, or read through the API.

### Pricing

Pay per event: **$0.10 per 1,000 reviews** saved. The summary and using both stores cost nothing extra, and reviews removed by the star filter are not charged. You can set a spending limit per run and the run stops when it is reached.

Discounts apply automatically on paid Apify plans: 10% off on Starter, 20% on Scale and 30% on Business.

Example: 500 reviews in each of 4 countries for 2 apps (4,000 reviews) cost about **$0.40**.

### Integrations and API

Run it and get the reviews back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/adhistory~app-store-google-play-reviews-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"apps": ["324684580", "com.spotify.music"], "countries": ["us"], "maxReviewsPerApp": 100}'
```

Python, with the `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("adhistory/app-store-google-play-reviews-scraper").call(run_input={
    "apps": ["com.spotify.music", "Duolingo"],
    "countries": ["us", "de"],
    "minRating": 1,
    "maxRating": 2,
})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review["store"], review["rating"], review["text"][:80])
summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("APP_SUMMARY")
```

Like every Apify Actor, it also works with Make, Zapier and n8n, with webhooks and schedules, and as a tool for AI agents through the Apify MCP server.

### FAQ

**Why at most 500 reviews per country on the App Store?** Apple's public reviews feed returns the 500 most recent (or most helpful) reviews per app and country. To get more App Store reviews, add more countries: each country has its own 500. Google Play has no such cap.

**Does it need a login, API key or cookies?** No. It uses only the stores' public data.

**Can I monitor reviews over time?** Yes. Schedule the Actor daily with "Newest first" and a small maximum (for example 50) to keep a running history.

**Can I export App Store reviews to CSV or Excel?** Yes. Download the dataset as CSV, JSON or Excel from the run's Output tab.

**Can I scrape reviews of an app I don't own?** Yes. It reads the public reviews anyone can see in the stores.

**Google Play shows reviews in other languages too. Why don't I get them?** Google Play returns reviews in the language you choose. Run again with another `language` (for example `es`) to collect those.

**Am I charged for reviews outside my star filter?** No. You are charged only for the reviews saved to the dataset.

**How is an app name matched?** It is searched in the App Store and the top result is used. Use the URL or ID when you need a specific app.

### Related tools

- [Google Ads Transparency Center Scraper](https://apify.com/adhistory/google-ads-history-actor): see the Google and YouTube ads a competitor app is running.
- [Email List Cleaner & Validator](https://apify.com/adhistory/email-list-cleaner-validator-syntax-mx-disposable): clean a beta-tester or user email list.
- [Broken Link Checker](https://apify.com/adhistory/broken-link-checker): check your app's website and help pages for dead links.
- [Google Sheets Export & Import](https://apify.com/adhistory/google-sheets-export-actor): send reviews straight into a Google Sheet.

Found a bug or need a feature? Open an issue on the Issues tab — I usually reply within a day.

# Actor input Schema

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

One per line. App Store URLs or IDs (e.g. 324684580), Google Play URLs or package names (e.g. com.spotify.music), or an app name to search the App Store.

## `searchTerms` (type: `array`):

Optional. Each name is looked up in the App Store and the top match is used.

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

Two-letter country codes, e.g. us, gb, de, br. Reviews are collected separately for each country.

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

You are charged per review saved. The App Store returns at most 500 reviews per app and country.

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

Which reviews come first.

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

Language of Google Play reviews, e.g. en, es, de, pt. App Store reviews follow the country.

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

Only keep reviews with at least this many stars. Set min and max to 1-2 to collect complaints only.

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

Only keep reviews with at most this many stars.

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

Save a summary per app (average rating, star distribution, last 30 days vs older, by version, top complaint words) to the key-value store as APP_SUMMARY. Free.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 200,
  "sort": "newest",
  "language": "en",
  "minRating": 1,
  "maxRating": 5,
  "includeSummary": true
}
```

# 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/spotify-music-and-podcasts/id324684580",
        "com.spotify.music"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("adhistory/app-store-google-play-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/spotify-music-and-podcasts/id324684580",
        "com.spotify.music",
    ],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("adhistory/app-store-google-play-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/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "countries": [
    "us"
  ]
}' |
apify call adhistory/app-store-google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

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