# Google Play Reviews Scraper: Replies, Versions, Any Country (`deriverge/google-play-reviews-scraper`) Actor

\[$1.50 / 1K] Google Play reviews with the star rating, text, app version, date, helpful votes and the developer reply. Any country and language, sorted by newest, most helpful or rating, filtered by stars, date and reply. Only new reviews since your last run.

- **URL**: https://apify.com/deriverge/google-play-reviews-scraper.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 review returneds

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 Scraper

### What does App Reviews Scraper do?

**Google Play Reviews Scraper** returns reviews from **Google Play**, in any country and language, in one table. Every row has the star rating, the review text, the app version it was written for, the date, the helpful votes and the developer reply where the store publishes one. Give it any mix of App Store links and Google Play package names and get one schema back.

No browser, no proxies, no API key. Both stores publish the data the actor reads.

### Every storefront, not just the American one

The App Store publishes at most 500 reviews per storefront and sort order. A tool that reads only the US storefront shows you a fraction of what your users wrote. This actor reads every storefront you name, `us`, `gb`, `de`, `jp`, any of the 175, and writes the storefront into every row so you know where a complaint came from. Google Play is read per country and language the same way.

### The support queue, filtered

- **`maxRating: 2`** gives you the complaints only.
- **`withDeveloperReply: "without"`** gives you the complaints nobody answered yet.
- **`reviewedAfter`** cuts the archive off at a date.
- **`sort: "mostRecent"`** is what a monitor needs; **`mostHelpful`** is what the store shows first.

Reviews removed by a filter are never charged.

### Only what is new

Turn on `newOnly`, give the run a watch name or save it as a task, and schedule it daily. Every run compares against the previous snapshot and returns only reviews that appeared since, plus reviews that received a developer reply in the meantime. You pay for the new rows and nothing else. Comparison itself costs nothing.

### Input

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "countries": ["us", "gb", "de"],
  "language": "en",
  "sort": "mostRecent",
  "maxReviewsPerApp": 500,
  "maxRating": 3,
  "withDeveloperReply": "without",
  "includeAppDetails": true,
  "newOnly": true,
  "watchKey": "our-apps"
}
```

### Output

```json
{
  "key": "google-play:com.spotify.music:us:001c7e48-9ccd-4923-90dc-3c7ba2563448",
  "type": "review",
  "source": "google-play",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "country": "us",
  "reviewId": "001c7e48-9ccd-4923-90dc-3c7ba2563448",
  "rating": 2,
  "title": null,
  "text": "New update now slammed with more ads than music",
  "author": "Notsheli",
  "version": "9.1.84",
  "createdAt": "2026-09-21T14:49:32.000Z",
  "helpfulVotes": 0,
  "developerReply": { "text": "Hi. We'll pass this on to the ads team.", "repliedAt": "2026-09-22T09:10:00.000Z" },
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us&showAllReviews=true"
}
```

With `includeAppDetails` on, each app also gets one row of type `app`: developer, category, price, average rating, rating count, current version and, on Google Play, the install band.

### What it does not collect

Only the nickname the store shows next to the review. No profile links, no avatars, no account identifiers, nothing about the reviewer beyond what the store already publishes with the text.

### Pricing

| Event | Price |
|---|---|
| Review returned | $0.003, falling to $0.0015 on higher plans |
| App details row, only when requested | $0.005 |
| Reviews removed by a filter, reviews unchanged in new-only mode | **free** |

No start fee. A run that returns nothing costs nothing.

### Frequently asked questions

**How many reviews can I get per app?** Google Play pages through the full history. The App Store publishes 500 per storefront and sort order, so ten storefronts and both sort orders give up to 10,000 distinct reviews for one app.

**Does the App Store row have the developer reply?** No. Apple does not include replies in the public feed, so the field is `null` there and filled on Google Play. The actor never guesses.

**Some storefronts came back empty. Why?** Apple returns an empty feed for a storefront where the app has no reviews in that sort order, and occasionally for a storefront it does not serve to that request. The run summary lists every storefront that came back empty, so you can see it rather than wonder.

**Can I mix both stores in one run?** Yes. The actor recognises each input by its shape and reads the right store; inputs it cannot place are listed in the summary with a reason.

### How to use Google Play Reviews Scraper

1. Open the actor and paste your apps into `apps` in the input form, or use the JSON input from the example above.
2. Click **Start**. The first rows appear in the **Output** tab within seconds; the run summary is in the **Storage** tab under the key `SUMMARY`.
3. Download the results as JSON, CSV or Excel from the Output tab, or read them through the API link shown there.
4. To run it on a schedule, click **Save as a task**, set the input once and add a schedule. Scheduled tasks keep their own change snapshot, so the new-only mode works without any extra setup.

### Integrations

The actor is available in the Apify apps for **Make**, **Zapier**, **n8n** and **Keboola**, where you pick it by name and map the input fields. It is also exposed to AI agents through the Apify MCP server, and callable from any language through the Apify API; the API tab on this page has ready-made snippets for Node.js, Python and curl. Every run can post its results to a webhook when it finishes.

### Support

Questions and problems go into the **Issues** tab of this actor. Each issue is answered by the maintainer, and fixes ship as new builds without any change on your side.

Built and operated by deriverge s.r.o. Same rules as our other actors: unified schema, honest billing, no charge for what you did not get.

The other store is covered by **App Reviews Scraper**, the two-store actor this one is built from.

# Actor input Schema

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

One entry per app: a Google Play link or the package name, for example com.spotify.music. App Store inputs are skipped and listed in the run summary; the two-store actor covers those.

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

Two-letter country codes of the storefronts to read, for example us, gb, de, jp. The App Store publishes at most 500 reviews per storefront and sort order, so more storefronts means more reviews. Leave empty for the US storefront.

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

Two-letter language code Google Play uses for the request, for example en or de. Reviews come back in whatever language they were written.

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

Most recent is what a monitoring task wants. Most helpful is what the store shows first.

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

Cap per app across all storefronts in the run.

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

Keep only reviews with at least this many stars. Filtered reviews are never charged.

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

Keep only reviews with at most this many stars. Set 1 or 2 to read complaints only.

## `reviewedAfter` (type: `string`):

Drop reviews older than this date. Filtered reviews are never charged.

## `withDeveloperReply` (type: `string`):

Reviews without a reply are the support queue. Google Play carries the reply text; the App Store feed does not publish replies.

## `includeAppDetails` (type: `boolean`):

Adds one row per app with the developer, category, price, average rating, rating count and version. Charged as its own event.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only reviews that were not there before, plus reviews that received a developer reply since. Schedule it daily and you have a review alert that bills only for what is new.

## `watchKey` (type: `string`):

Name of the snapshot used by the new-only mode, for example "our-apps". Runs from a saved task get a snapshot automatically even without a name.

## `maxItems` (type: `integer`):

Hard cap on returned rows across all apps in the run.

## Actor input object example

```json
{
  "apps": [
    "com.spotify.music"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "language": "en",
  "sort": "mostRecent",
  "maxReviewsPerApp": 500,
  "withDeveloperReply": "any",
  "includeAppDetails": false,
  "newOnly": false,
  "maxItems": 5000
}
```

# Actor output Schema

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

One row per review with the rating, the text, the app version, the date, the helpful votes and the developer reply, in one schema for both stores.

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

Reviews that appeared and reviews that received a developer reply, compared with the previous snapshot of the same watch name or task.

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

Per-app counts, skipped inputs with reasons, how many reviews each filter dropped, and totals.

# 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"
    ],
    "countries": [
        "us",
        "gb"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/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"],
    "countries": [
        "us",
        "gb",
    ],
}

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

```

## MCP server setup

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