# Google Play Reviews Scraper — Ratings, Replies & Versions (`genial_candlestand/google-play-reviews-scraper`) Actor

Get Google Play app reviews: star rating, review text, author, date, helpful votes, app version and developer reply. Many apps per run by package name or URL, star and date filters, no login. $0.08 per 1,000 reviews.

- **URL**: https://apify.com/genial_candlestand/google-play-reviews-scraper.md
- **Developed by:** [Flowo](https://apify.com/genial_candlestand) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.06 / 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 Scraper — Ratings, Replies & App Versions

This actor exports public Google Play app reviews as flat rows. Each review has the star `rating`, review `text`, `author`, `publishedAt`, `thumbsUpCount`, the `appVersion` the reviewer had installed, and the developer's reply (`replyText`, `replyPublishedAt`, `replyAuthor`). You can scrape many apps in one run, with no login.

### What does it do?

You give the actor a list of apps (package names such as `com.whatsapp`, or Play Store app URLs). It returns their reviews, newest first by default. You can keep only some star ratings, stop at a start date, pick the review language and cap the number of reviews per app or per run.

It is built for app teams, ASO analysts, support leads, market researchers and data teams who need review data in JSON, CSV or Excel, or through the Apify API.

### How to use

1. Open the actor in Apify Console and add one or more apps to **Apps**.
2. Optionally set **Star ratings**, **Reviews since**, **Review language** and the review caps.
3. Click **Start** and download the dataset as JSON, CSV or Excel when the run finishes.
4. To automate it, call the actor through the Apify API, schedule it, or let an AI agent call it through the Apify MCP server. The `appIds` field takes an array, so one call covers many apps.

### Pricing

Pay per event: **$0.00008 per review** saved to the dataset, which is **$0.08 per 1,000 reviews**. There is no start fee. Apps that are not found, or that have no matching reviews, cost nothing. Higher Apify plans may get lower per-event prices.

Example: 3 apps × 1,000 reviews = 3,000 reviews ≈ $0.24.

### Input

| Field | Meaning |
|---|---|
| `appIds` (required) | Package names or Play Store app URLs with `id=`. |
| `sort` | `newest` (default), `relevance` or `rating`. |
| `ratings` | Only these stars (`"1"`–`"5"`). Empty means all stars. |
| `dateFrom` | Only reviews from this date: `YYYY-MM-DD`, an ISO date-time, or relative such as `7 days`. Needs `sort` = `newest`. |
| `maxReviewsPerApp` | Cap per app (and per selected star). Default 100, max 100000. |
| `maxItems` | Optional cap across the whole run. |
| `language` / `country` | Review language (default `en`) and store country (default `us`). |
| `proxyConfiguration` | Optional; the default Apify proxy is enough. |

Example:

```json
{
  "appIds": ["com.whatsapp", "https://play.google.com/store/apps/details?id=com.robinhood.android"],
  "sort": "newest",
  "ratings": ["1", "2"],
  "dateFrom": "7 days",
  "maxReviewsPerApp": 500
}
```

Entries that are not a valid package name or Play Store URL stop the run with an input error before any request.

### Output

| Field | Description |
|---|---|
| `appId`, `id`, `url` | App package, review id and a link to the review. |
| `rating` | Stars, 1–5. |
| `text`, `author`, `authorImageUrl` | Review text and reviewer. |
| `publishedAt` | When the review was posted or last edited (ISO 8601, UTC). |
| `thumbsUpCount` | Users who marked it helpful. |
| `appVersion` | Installed app version; null if Google Play does not show it. |
| `replyText`, `replyPublishedAt`, `replyAuthor` | Developer reply; null when there is none. |
| `criteria` | Feature ratings as `name=value` pairs separated by `;`; null when none. |
| `language`, `country`, `position`, `scrapedAt` | Requested language and country, rank in Google Play's order, extraction time. |

Real example (shortened):

```json
{
  "id": "764722fb-86a1-4aa4-bc37-67901ba335e7",
  "url": "https://play.google.com/store/apps/details?id=com.robinhood.android&reviewId=764722fb-86a1-4aa4-bc37-67901ba335e7",
  "appId": "com.robinhood.android",
  "rating": 5,
  "text": "The Best of the Best, great for beginners and professionals. ...",
  "author": "Edgar Guzman",
  "publishedAt": "2026-10-22T13:10:02.887Z",
  "thumbsUpCount": 0,
  "appVersion": "2026.41.2",
  "replyText": "Thanks so much for the support! ...",
  "replyPublishedAt": "2026-10-22T12:58:18.286Z",
  "replyAuthor": "Robinhood",
  "criteria": "vaf_app_quality_usability=1;vaf_app_quality_stability=1;vaf_app_quality_visual_appeal=1",
  "language": "en",
  "country": "US",
  "position": 1,
  "scrapedAt": "2026-10-23T13:23:03.974Z"
}
```

The dataset contains only reviews, never error rows.

### Use cases

- **Release monitoring:** schedule a run with `sort: newest` and `dateFrom: "7 days"` to collect every new review of your app. Paging stops at the first older review.
- **Competitor complaints:** list several competitor apps with `ratings: ["1","2"]` to read their negative reviews.
- **Localized reviews:** set `language` to `de`, `ja`, `pt-BR` or `zh-TW` to get reviews written in that language.
- **Sentiment datasets:** export thousands of reviews per app for NLP or ML training.
- **Reply audit:** use `replyText` and `replyPublishedAt` to see which complaints the developer answered and how fast.

### Limitations

- Google Play shows only reviews that have text. Star-only ratings are not available, so counts can differ from the store's total.
- `dateFrom` works only with `sort` = `newest`; other combinations fail with an input error.
- `publishedAt` is the date the review was posted or last edited.
- In tests, `country` did not change which reviews are returned; use `language` for that. It is copied into every row.
- `text`, `appVersion`, reply fields and `criteria` can be null.
- If an app is not found, the log says so and no rows are produced.

### FAQ

**Is it legal to scrape Google Play reviews?**
The actor reads publicly visible reviews without logging in. Reviews include reviewer names and avatars that are public on the page. You are responsible for using the data in line with the law (such as GDPR) and Google's terms. This is not legal advice.

**Do I need an account or API key?**
No.

**How does the rating filter work?**
It is applied by Google Play, one pass per selected star, so `maxReviewsPerApp` applies to each star.

**Can I combine this with iOS reviews?**
Yes, see the Apple App Store actor below.

### Other actors

Related review actors and other public data actors from the same author:

- [Apple App Store Reviews API – iOS Reviews & Ratings](https://apify.com/genial_candlestand/apple-app-store-reviews-api): public App Store reviews across multiple apps and countries.
- [Firefox Add-ons Reviews Parser](https://apify.com/genial_candlestand/firefox-addons-reviews-parser): ratings and reviews of Firefox add-ons.
- [Google Trends Scraper — Interest, Regions & Related Queries](https://apify.com/genial_candlestand/google-trends-scraper): Google Trends timelines, regions and related queries.

# Actor input Schema

## `appIds` (type: `array`):

Google Play apps, one per line: a package name (com.whatsapp) or a Play Store app URL with id= (https://play.google.com/store/apps/details?id=com.whatsapp). Anything else stops the run with an input error before any request.

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

Order in which Google Play returns reviews. 'Newest' is needed for 'Reviews since'. 'Most relevant' is the default order of the Play Store page; 'Rating' is Google Play's own rating order.

## `ratings` (type: `array`):

Only reviews with these star ratings (1–5). Empty = all stars. Each selected star is fetched separately, so 'Max reviews per app' applies to each star.

## `dateFrom` (type: `string`):

Only reviews published at or after this date: YYYY-MM-DD, an ISO date-time, or relative like '7 days'. Requires Sort by = Newest; the run stops as soon as older reviews appear.

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

Stop after this many reviews for each app (for each selected star when Star ratings is set). Apps with fewer reviews return all they have.

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

Optional cap on reviews across all apps in this run. Empty = no cap beyond 'Max reviews per app'.

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

Language of the reviews to get: an ISO 639-1 code (en, de, ja), optionally with a region (pt-BR, zh-TW). This decides which reviews are returned.

## `country` (type: `string`):

Play Store country code (us, de, br). Copied into every review row; in tests it did not change which reviews are returned — use Review language for that.

## `proxyConfiguration` (type: `object`):

Proxy for requests to Google Play. The default Apify datacenter proxy is enough; Google Play did not block in tests.

## Actor input object example

```json
{
  "appIds": [
    "com.whatsapp",
    "https://play.google.com/store/apps/details?id=com.robinhood.android"
  ],
  "sort": "newest",
  "ratings": [],
  "maxReviewsPerApp": 100,
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All reviews in the default dataset

## `overview` (type: `string`):

Reviews with the most useful fields

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

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

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

```

## MCP server setup

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