# App Store & Google Play Reviews Scraper API | Multi-Country (`happyscrapper/app-store-google-play-reviews`) Actor

Scrape App Store and Google Play reviews in one run: many countries, app version, detected language, developer replies, new reviews only. One clean JSON schema.

- **URL**: https://apify.com/happyscrapper/app-store-google-play-reviews.md
- **Developed by:** [Happy Scrapper](https://apify.com/happyscrapper) (community)
- **Categories:** Developer tools, Automation, AI
- **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.
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 in one clean format](https://api.apify.com/v2/key-value-stores/BQSjfOQ2i88EMdSPe/records/app-store-google-play-reviews-banner.png)

### What is App Store & Google Play Reviews Scraper API?

It collects **user reviews from the Apple App Store and Google Play in a single run**, for as many apps, countries and
languages as you need, and returns them in **one clean format for both stores**.

Every review comes with the **app version** it was written on, the **language it is actually written in**, the
**developer reply** on Google Play, and an **anonymised author**. Schedule it, and it returns **only the reviews
published since the last run**.

👉 Paste an App Store link and a Google Play package, press **Start**, and get your first reviews in seconds.

### Why use it

| | This Actor | A typical review scraper |
|---|---|---|
| 🍏 + 🤖 Both stores | ✅ one run, one schema | one Actor per store, two formats |
| 🌍 Many countries per run | ✅ merged and de-duplicated | one country per run |
| 📄 Apple depth | ✅ up to 1,000 reviews per country | often stops at 450 or 500 |
| 🔢 App version on each review | ✅ both stores | varies |
| 💬 Developer replies | ✅ Google Play (App Store: coming soon) | varies |
| 🗣️ Language of the text | ✅ detected, not guessed from the country | country only |
| 🔁 Only new reviews since the last run | ✅ built in | rarely built in |
| 🆔 Stable review IDs across runs | ✅ safe to de-duplicate and join | not guaranteed |
| 🔒 Authors anonymised by default | ✅ | usually names in clear |
| ⭐ Filter by stars, pay only for kept reviews | ✅ | varies |

**Why Apple depth matters.** Apple's public feed sometimes serves an empty page from its cache. Many scrapers read it as
"no more reviews" and stop at 450 or 500. This Actor detects it and asks for a fresh page. Measured on Spotify across 5
countries: **4,995 reviews in about 30 seconds**.

**Why there is no country filter on Google Play.** Google Play serves the same reviews for a given language, whatever
the country. Asking for France and the US in French returns the same list. So you pick **languages**, and you don't pay
twice for the same reviews.

### What data do you get?

| Field | Example | Notes |
|---|---|---|
| `store` | `apple` | `apple` or `google_play` |
| `app_id`, `app_name` | `324684580`, `Spotify: Music and Podcasts` | |
| `country` | `jp` | App Store only |
| `language_requested` | `en` | Google Play only |
| `language_detected`, `language_confidence` | `ja`, `0.99` | from the text itself, empty under 25 letters |
| `rating` | `1` | 1 to 5 stars |
| `title`, `text` | | title on App Store only |
| `date` | `2026-09-30T11:15:55Z` | UTC |
| `app_version`, `version_confidence` | `9.1.86`, `exact` | as given by the store |
| `developer_reply`, `developer_reply_date` | | Google Play |
| `helpful_count` | `3` | |
| `review_id` | `apple:324684580:13470918234` | stable across runs |
| `author_hash` | `a1b2c3d4e5f60718` | stable anonymous ID |
| `author_name` | `null` | only if you turn it on |

#### Real reviews from a test run

| Store | Where | Stars | Version | Language | Review |
|---|---|---|---|---|---|
| App Store | Japan | ★☆☆☆☆ | 9.1.86 | ja | プレイリスト作成して再生すると聞いたこともないアーティストのおすすめから再生される。 |
| App Store | Brazil | ★★★★★ | 9.1.86 | pt | Nao tem como viver nesse mundo sem musica, dito isso, me salvou da depressao! |
| App Store | Germany | ★☆☆☆☆ | 9.1.86 | **en** | Can't stream anymore… unbelievable |
| Google Play | English | ★☆☆☆☆ | 9.1.52 | en | Finally switched to Apple music. Thank you. *(with developer reply)* |

Notice the German storefront review written in English: that is why the language comes from the text, not from the country.

### How to use it

1. **Apps**: one per line. An App Store or Google Play URL, an Apple numeric ID (`324684580`) or an Android package (`com.spotify.music`). Mix both stores freely.
2. **App Store countries**: pick as many as you need, out of 175.
3. **Google Play languages**: pick the languages you want to read.
4. **Max reviews**: per app and country (App Store) or per app and language (Google Play).
5. **Filter by stars** (optional): for example 1 to 2 for negative reviews only. Max reviews and billing count kept reviews only.
6. **Scheduled tracking** (optional): turn on **Only new reviews since the last run**, give it a **tracking name**, and schedule the Actor daily or weekly.

#### Input example

```json
{
  "apps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580", "com.spotify.music"],
  "appleCountries": ["us", "gb", "fr", "de"],
  "googleLanguages": ["en", "fr", "de"],
  "maxReviewsPerApp": 1000,
  "onlyNewReviews": false
}
```

### Use cases

- 📦 **Product managers**: see what a release changed, version by version, on both platforms at once.
- 🔎 **ASO and marketing**: read how users talk about you and your competitors, country by country, in their own words.
- 🎧 **Support and community teams**: get today's 1 and 2-star reviews and see which ones have a developer reply (Google Play).
- 📊 **Analysts and investors**: compare apps of a category across markets with the same fields.
- 🤖 **Data pipelines and AI agents**: a stable schema, stable IDs and new reviews only, ready to feed a database or a model.
- 🎓 **Researchers**: multilingual labelled text (stars as labels), with authors anonymised.

### Pricing

**$0.30 per 1,000 reviews** on the free plan, lower on paid Apify plans, down to **$0.15 per 1,000 reviews**. A run that
finds no new review only costs the Actor start. The $5 of monthly credit on Apify's free plan covers **about 16,000
reviews a month**. Set a maximum cost per run in the run options if you want a hard cap.

### Integrations

Run it from the [Apify API](https://docs.apify.com/api/v2), schedule it, send results to Google Sheets, Slack, Zapier,
Make or a webhook, or call it from an AI agent through the Apify MCP server. Export to JSON, CSV, Excel or HTML.

### FAQ

#### Is it legal to scrape app reviews?

The Actor only reads reviews that the stores display publicly, at a moderate pace. Reviewer names are personal data:
they are **replaced by an anonymous hash by default**, and you should only turn names on if you have a legal basis to
process them. You remain responsible for how you use the data. If in doubt, ask a lawyer.

#### How many reviews can I get?

- **App Store**: up to about 1,000 per app and country per run (Apple's public feed gives 500 most recent and 500 most helpful). Schedule it with **Only new reviews** to build a longer history over time.
- **Google Play**: the full history is reachable. 30,000 reviews took under a minute in our tests.

#### Why is `language_detected` sometimes empty?

When a review has fewer than 25 letters ("Great app 👍"), the language can't be told reliably, so the field stays empty
rather than wrong. On a 10,000-review test, that was about a third of the reviews, mostly very short Google Play ones.

#### Why is `app_version` sometimes empty?

Google Play gives the version for most reviews (about 80% in our tests), not all. On the App Store, the public feed gives it for every review.

#### Something is wrong or missing?

Open an issue on this page. Every report is read.

#### Is this Actor affiliated with Apple or Google?

No. App Store is a trademark of Apple Inc. Google Play is a trademark of Google LLC.

# Actor input Schema

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

One app per line: an App Store or Google Play URL, an Apple numeric ID (e.g. 324684580) or an Android package name (e.g. com.spotify.music). Mix both stores freely.

## `appleCountries` (type: `array`):

Apple keeps separate reviews per country storefront. Pick every country you need: results are merged and de-duplicated in one run.

## `googleLanguages` (type: `array`):

Google Play groups reviews by language, not by country: asking for France and the US in French returns the same reviews. Pick languages instead.

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

Upper bound for each app × country (Apple) or app × language (Google Play).

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

Keep only reviews with at least this many stars. Max reviews and billing count kept reviews only.

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

Keep only reviews with at most this many stars. Example: 1 to 2 for negative reviews only.

## `onlyNewReviews` (type: `boolean`):

For scheduled runs: return (and bill) only reviews published after the newest one collected by the previous run with the same tracking name. Uses the most recent sort only.

## `trackingName` (type: `string`):

Keeps separate memories for separate schedules (e.g. one per client or per app portfolio).

## `includeAuthorName` (type: `boolean`):

Off by default: authors are replaced by a stable anonymous hash. Turn on only if you have a legal basis to process reviewers' names.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "appleCountries": [
    "us"
  ],
  "googleLanguages": [
    "en"
  ],
  "maxReviewsPerApp": 50,
  "minRating": 1,
  "maxRating": 5,
  "onlyNewReviews": false,
  "trackingName": "default",
  "includeAuthorName": false
}
```

# Actor output Schema

## `reviews` (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"
    ],
    "appleCountries": [
        "us"
    ],
    "googleLanguages": [
        "en"
    ],
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("happyscrapper/app-store-google-play-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": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
        "com.spotify.music",
    ],
    "appleCountries": ["us"],
    "googleLanguages": ["en"],
    "maxReviewsPerApp": 50,
}

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

```

## MCP server setup

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