# Google Play Reviews Scraper API | Full History, Dev Replies (`happyscrapper/google-play-reviews-scraper`) Actor

Scrape Google Play reviews with no 150 or 500 cap: full history, app version, developer replies, detected language, new reviews only. Clean JSON, stable IDs.

- **URL**: https://apify.com/happyscrapper/google-play-reviews-scraper.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

![Google Play reviews, full history, in one clean format](https://api.apify.com/v2/key-value-stores/BQSjfOQ2i88EMdSPe/records/google-play-reviews-banner.png)

### What is Google Play Reviews Scraper API?

It collects **user reviews from Google Play**, for as many apps and **languages** as you need, **with no cap at 150 or
500**: the full review history of an app is reachable in one run, in one clean JSON format.

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

👉 Paste a Google Play link or package name, press **Start**, and get your first reviews in seconds.

### Why use it

| | This Actor | A typical Google Play review scraper |
|---|---|---|
| 📚 Full history | ✅ 30,000 reviews in about a minute | often stuck at 150 or at page 1 |
| 🔢 App version on each review | ✅ when Google gives it (about 80%) | varies |
| 💬 Developer replies | ✅ text and date | varies |
| 🗣️ Language of the text | ✅ detected, not assumed from the query | query language 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 |
| 🧱 Errors are errors | ✅ a block or a failure is reported, never returned as "0 reviews" | an empty result looks like success |
| 🔒 Authors anonymised by default | ✅ | usually names in clear |
| ⭐ Filter by stars, pay only for kept reviews | ✅ | varies |

**Why there is no country filter.** 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.

**Why errors matter.** When Google slows a scraper down, many tools read the refusal as "no more reviews" and return a
short list as if it were complete. This Actor retries, and if it still can't read a page, it says so in the run status.

### What data do you get?

| Field | Example | Notes |
|---|---|---|
| `store` | `google_play` | always `google_play` here |
| `app_id`, `app_name` | `com.spotify.music`, `Spotify: Music and Podcasts` | |
| `language_requested` | `en` | language queried |
| `language_detected`, `language_confidence` | `en`, `0.99` | from the text itself, empty under 25 letters |
| `rating` | `1` | 1 to 5 stars |
| `text` | | |
| `date` | `2026-09-30T11:15:55Z` | UTC |
| `app_version`, `version_confidence` | `9.1.52`, `exact` | as given by Google |
| `developer_reply`, `developer_reply_date` | | when the developer answered |
| `helpful_count` | `3` | |
| `review_id` | `google_play:com.spotify.music:…` | stable across runs |
| `author_hash` | `a1b2c3d4e5f60718` | stable anonymous ID |
| `author_name` | `null` | only if you turn it on |

The same schema is used by our App Store and two-store Actors, so you can merge the results without any mapping.

#### Real review from a test run

| Stars | Version | Language | Review |
|---|---|---|---|
| ★☆☆☆☆ | 9.1.52 | en | Finally switched to Apple music. Thank you. *(with developer reply)* |

### How to use it

1. **Apps**: one per line. A Google Play URL (`https://play.google.com/store/apps/details?id=com.spotify.music`) or the package name (`com.spotify.music`).
2. **Google Play languages**: pick the languages you want to read.
3. **Max reviews**: per app and language. Raise it as high as you need for the full history.
4. **Filter by stars** (optional): for example 1 to 2 for negative reviews only. Max reviews and billing count kept reviews only.
5. **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": ["com.spotify.music", "https://play.google.com/store/apps/details?id=com.duolingo"],
  "googleLanguages": ["en", "fr", "de"],
  "maxReviewsPerApp": 5000,
  "onlyNewReviews": false
}
```

### Don't have the app list? Find apps first

Fill **Search terms** or **Developers** instead of (or together with) **Apps**, and the Actor finds the Google Play apps first, then collects their reviews:

- **Search terms**: one keyword per line. The top apps of the first page of Google Play search (about 24 results, 5 kept by default), in the country set in **Google Play search country**.
- **Developers**: the developer page URL (`play.google.com/store/apps/developer?id=Spotify+AB`) or the developer exactly as in that address, the name or the number after `dev?id=`. The Actor takes up to 20 apps per developer.

Reviews are collected for every app found, so set **Max reviews per app** too. Google Play search and developer pages are not an official API: if Google changes them, the Actor fails and says so.

### Use cases

- 📦 **Android product managers**: see what a release changed, version by version.
- 🎧 **Support and community teams**: get today's 1 and 2-star reviews and see which ones already have a developer reply.
- 🔎 **ASO and marketing**: read how users talk about you and your competitors, language by language.
- 📊 **Analysts and investors**: years of reviews of an app or a whole category, 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**: large 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.

### Need the App Store too?

- [App Store Reviews Scraper API](https://apify.com/happyscrapper/app-store-reviews-scraper): 175 countries in one run, same schema.
- [App Store & Google Play Reviews Scraper API](https://apify.com/happyscrapper/app-store-google-play-reviews): both stores in one run.
- [App Store & Google Play Scraper](https://apify.com/happyscrapper/app-store-google-play-app-details): app details instead of reviews: update date, release notes, ratings, installs, permissions, price per country.

### FAQ

#### Is it legal to scrape Google Play reviews?

The Actor only reads reviews that Google Play displays 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?

The full history is reachable. 30,000 reviews of Spotify took about a minute in our tests. Set **Max reviews** to the
number you need: you pay only for the reviews returned.

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

Google Play gives the version for most reviews (about 80% in our tests), not all. When Google doesn't give it, the
field stays empty: the Actor never guesses it.

#### 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. That is common on Google Play, where many reviews are very short.

#### I pasted an App Store link and the run failed. Why?

This Actor reads Google Play only. For the App Store, use our App Store Actor, or the two-store Actor for both at once.

#### Something is wrong or missing?

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

#### Is this Actor affiliated with Google?

No. Google Play is a trademark of Google LLC.

# Actor input Schema

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

One app per line: a Google Play URL (play.google.com/store/apps/details?id=...) or the package name (e.g. com.spotify.music).

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

One keyword per line. The Actor finds the top apps for each keyword on the stores this Actor reads (App Store: by country, Google Play: the first page of results, about 24), then collects their reviews. Use it instead of, or together with, the Apps field.

## `maxAppsPerSearch` (type: `integer`):

How many of the top results to keep for each search term and country. Reviews are collected for each of them, so keep it small and set 'Max reviews per app' too.

## `developers` (type: `array`):

One developer per line. App Store: the numeric Apple developer ID (e.g. 324684583) or the developer page URL. Google Play: the developer page URL (play.google.com/store/apps/developer?id=...) or the developer exactly as in that address. The Actor collects the reviews of their apps.

## `maxAppsPerDeveloper` (type: `integer`):

Upper bound of apps taken from each developer.

## `googleSearchCountry` (type: `string`):

Country used for Google Play search and developer pages (two letters, e.g. us, fr, de). Google Play reviews themselves are grouped by language, not by country.

## `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 × language. The full history is reachable: raise it as high as you need.

## `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": [
    "com.spotify.music"
  ],
  "maxAppsPerSearch": 5,
  "maxAppsPerDeveloper": 20,
  "googleSearchCountry": "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": [
        "com.spotify.music"
    ],
    "googleLanguages": [
        "en"
    ],
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("happyscrapper/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": ["com.spotify.music"],
    "googleLanguages": ["en"],
    "maxReviewsPerApp": 50,
}

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

```

## MCP server setup

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