# Google Play Review Scraper \[FAST] | Multi-App Ratings & Replies (`apizy/google-play-reviews-scraper`) Actor

Scrape Google Play reviews from up to 100 apps in one run. Get ratings, review text, helpful votes, and developer replies. Filter by stars, language, country, or date. Pay only for reviews delivered at $0.0001 per review ($0.10 per 1,000). Zero delivered reviews means zero review charges.

- **URL**: https://apify.com/apizy/google-play-reviews-scraper.md
- **Developed by:** [Apizy](https://apify.com/apizy) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

Turn Google Play reviews into clean, structured data in seconds. Enter a Play Store URL or Android package ID to collect ratings, review text, dates, reviewer details, helpful votes, and developer replies. Scrape one app or compare up to 100 apps in one run, without a browser, Google account, or API key.

Use the results to spot recurring complaints, understand what customers like, compare competitors, and track feedback after a release. Each delivered review is one row in the Dataset, ready for spreadsheets, dashboards, and automation tools.

### What does Google Play Reviews Scraper do?

The Actor collects public **written reviews** from Google Play. Each row can include:

- Rating, full review text, title when available, and review date
- Public reviewer name and avatar URL
- Helpful vote count and app version when available
- Developer reply and reply date when available
- App package ID, app URL, review URL, requested language and country, and scrape time

Choose newest reviews, highest-rated reviews, or Google's most helpful order. Narrow the results to a specific star rating, or use a date cutoff to collect recent feedback. The requested maximum is **per app**: two apps with `maxReviews: 100` can produce up to 200 rows.

#### What can you use it for?

- Find bugs and feature requests in your own app's reviews.
- Compare customer feedback across competing Android apps to see what users like, dislike, and wish they had.
- Watch reactions after an app update or marketing campaign.
- Analyze one-star reviews to prioritize support, bug fixes, and product improvements.
- Spot unmet needs in competitors' reviews when researching your next app idea.
- Use real review excerpts to validate a vibe-coded MVP or give an AI coding assistant context for user stories and feature specs.
- Send review data to Make, n8n, Zapier, spreadsheets, or your own analysis pipeline.

### How to use

1. Open the Actor and enter your input.
2. Enter one Play Store URL or package ID in **App URL or package ID**, or add up to 100 entries under **Apps**.
3. Optionally choose the review language, store country, sort order, maximum reviews per app, star rating, or date cutoff.
4. Click **Run**.
5. Open the **Dataset** tab to preview or download review rows. Open **Output** for the run summary and per-app results.

You can enter `com.whatsapp` or `https://play.google.com/store/apps/details?id=com.whatsapp`. Use **either** `app` **or** `apps` in JSON input; do not provide both.

### Input examples

#### One app: newest reviews

```json
{
  "app": "com.whatsapp",
  "maxReviews": 100,
  "sortBy": "newest"
}
```

#### Compare multiple apps

```json
{
  "apps": [
    "com.whatsapp",
    "https://play.google.com/store/apps/details?id=org.videolan.vlc"
  ],
  "language": "en",
  "country": "us",
  "maxReviews": 100
}
```

This requests up to **100 reviews for each app**, or 200 rows total. Duplicate package IDs or URLs for the same app are processed once.

#### Recent one-star reviews

```json
{
  "app": "com.whatsapp",
  "sortBy": "newest",
  "starRating": 1,
  "sinceDate": "2026-10-01",
  "maxReviews": 500
}
```

This requests written one-star reviews dated **October 1, 2026 or later**. `sinceDate` includes the entire date from midnight UTC and requires `sortBy: "newest"`. If fewer than 500 matching reviews are available, the Actor returns only those it finds.

#### Input fields

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `app` | string | None | One Play Store app URL or Android package ID. Required when `apps` is omitted. |
| `apps` | array of strings | None | 1–100 Play Store URLs or package IDs. Required when `app` is omitted. |
| `language` | string | `"en"` | Language requested from Google Play, such as `"en"`, `"id"`, or `"pt-BR"`. Does not translate text. |
| `country` | string | `"us"` | Two-letter Play Store country code, such as `"us"` or `"id"`. Does not guarantee reviewer location. |
| `sortBy` | string | `"newest"` | `"newest"`, `"rating"` (highest first), or `"helpful"` (Google's helpfulness order). |
| `maxReviews` | integer | `100` | Maximum review rows **per app**, from 1 to 10,000. |
| `starRating` | integer | None | Filter to reviews with a rating from 1 to 5 stars. Omit for all ratings. |
| `sinceDate` | string | None | Inclusive UTC cutoff in `YYYY-MM-DD` format. Only works with `sortBy: "newest"`. |

#### Choose a review workflow

| Goal | Input to use | Result |
| --- | --- | --- |
| Read recent feedback | `sortBy: "newest"` | Newest written reviews first |
| Investigate low ratings | `starRating: 1` or `2` | Reviews with that exact star rating |
| Check feedback since a release | `sortBy: "newest"` + `sinceDate` | Reviews on or after the selected UTC date |
| Find praise | `sortBy: "rating"` | Highest-rated reviews first |
| See prominent feedback | `sortBy: "helpful"` | Google's most helpful order |
| Compare apps | `apps: [...]` | One Dataset with an `appId` on every review |

These are input combinations, not a separate `mode` field. `sinceDate` filters the current run; the Actor does not remember reviews from previous runs.

### Output

Every review is saved as **one item in the default Dataset**. The run summary is saved separately in the default Key-Value Store as `OUTPUT`. The summary does not contain the review rows.

**Example Dataset item** (illustrative values):

```json
{
  "reviewId": "2783d30a-5541-44f4-99db-64ea1fc3b42d",
  "appId": "com.whatsapp",
  "appUrl": "https://play.google.com/store/apps/details?id=com.whatsapp",
  "reviewUrl": "https://play.google.com/store/apps/details?id=com.whatsapp&reviewId=2783d30a-5541-44f4-99db-64ea1fc3b42d",
  "rating": 4,
  "title": null,
  "text": "Easy to use, but I would like more notification controls.",
  "date": "2026-10-13T04:38:58.853Z",
  "reviewerName": "A Google user",
  "reviewerAvatarUrl": null,
  "thumbsUp": 3,
  "appVersion": "2.26.39.79",
  "developerReplyText": null,
  "developerReplyDate": null,
  "language": "en",
  "country": "us",
  "scrapedAt": "2026-10-14T04:51:42.645Z"
}
```

| Dataset field | Description |
| --- | --- |
| `reviewId` | Google Play review ID |
| `appId`, `appUrl`, `reviewUrl` | App identity and links back to Google Play |
| `rating`, `title`, `text` | Star rating and review content |
| `date` | Review timestamp returned by Google Play; edits may change it |
| `reviewerName`, `reviewerAvatarUrl` | Public reviewer details |
| `thumbsUp` | Helpful vote count, when available |
| `appVersion` | App version associated with the review, when available |
| `developerReplyText`, `developerReplyDate` | Developer response, when available |
| `language`, `country` | Requested review language and store country |
| `scrapedAt` | Timestamp when the Actor saved the review |

Optional values are `null` when Google Play does not provide them.

**Example `OUTPUT` summary** for a two-app run:

```json
{
  "summary": {
    "appId": null,
    "appUrl": null,
    "appIds": ["com.whatsapp", "org.videolan.vlc"],
    "language": "en",
    "country": "us",
    "sortBy": "newest",
    "maxReviews": 5,
    "starRating": null,
    "sinceDate": null,
    "successCount": 10,
    "chargedCount": 10,
    "failedCount": 0,
    "skippedCount": 0,
    "duplicateCount": 0,
    "pagesFetched": 2,
    "stopReason": "completed",
    "apps": [
      {
        "appId": "com.whatsapp",
        "appUrl": "https://play.google.com/store/apps/details?id=com.whatsapp",
        "status": "succeeded",
        "successCount": 5,
        "duplicateCount": 0,
        "pagesFetched": 1,
        "stopReason": "max_reviews",
        "error": null
      },
      {
        "appId": "org.videolan.vlc",
        "appUrl": "https://play.google.com/store/apps/details?id=org.videolan.vlc",
        "status": "succeeded",
        "successCount": 5,
        "duplicateCount": 0,
        "pagesFetched": 1,
        "stopReason": "max_reviews",
        "error": null
      }
    ],
    "startedAt": "2026-10-14T11:01:26.007Z",
    "finishedAt": "2026-10-14T11:01:27.138Z",
    "totalDurationSeconds": 1
  }
}
```

`successCount` is the number of review rows saved. `failedCount` counts **apps**, not reviews. `chargedCount` counts review events charged for delivered rows. For a single app, `summary.appId` and `summary.appUrl` contain that app instead of `null`.

| Stop reason | Meaning |
| --- | --- |
| `max_reviews` | The requested limit was reached for an app; it does not mean the app has no more reviews. |
| `since_date` | The next review was older than the requested date. |
| `source_exhausted` | Google Play returned no further review page. |
| `no_reviews` | No written reviews were returned for that app and filters. |
| `completed` | All apps in a multi-app run finished. |
| `partial_failure` | At least one app failed; results from other apps were kept. |
| `all_failed` | Every app failed; the run is marked failed and still writes a summary. |
| `spending_limit` | The run reached its Pay Per Event charge limit; later apps may be skipped. |

### Pricing

Pay **$0.0001 per review delivered** to the Dataset ($0.10 per 1,000 reviews). Review charges apply only to successfully saved rows. Failed or empty results have no review charge; if a run ends after delivering some reviews, only those delivered reviews count.

| Delivered reviews | Review charges |
| ---: | ---: |
| 0 | $0 |
| 100 | $0.01 |
| 1,000 | $0.10 |
| 10,000 | $1.00 |

The table shows review charges only. Check the [Pricing tab](https://apify.com/apizy/google-play-reviews-scraper/pricing) for the complete current price before running the Actor.

### Notes

- Google Play chooses which written reviews are available for the requested language and country. The returned text is not translated, and individual reviews may use another language.
- Star-only ratings without written review text are not available as review rows. A Play Store rating count can therefore be much larger than the number of reviews returned.
- `country` chooses a storefront, not the reviewer's confirmed location.
- `sinceDate` filters reviews before saving them and stops paging when it reaches an older review in newest-first order. Google Play controls its review ordering and may change it.
- Apps in a batch are processed sequentially. If one app cannot be fetched, the Actor continues with the others; `OUTPUT.summary.apps` records each result.
- For a large batch, choose a run timeout long enough for all apps and review pages to finish.

### More Actors You Might Like

Built by the same Apizy team and backed by our transparent pricing philosophy: no hidden result charges, no wasted review credits, and no review charge for failed or empty results.

| Actor | What it helps you collect |
| --- | --- |
| [YouTube Comment Scraper](https://apify.com/apizy/youtube-comment-scraper) | Comments, authors, likes, and replies from YouTube videos |
| [YouTube Channel Scraper V2](https://apify.com/apizy/youtube-channel-scraper-v2) | Subscribers, engagement, email, and social links from channels |
| [YouTube Video Scraper](https://apify.com/apizy/youtube-video-scraper) | Video titles, views, durations, thumbnails, and publish dates |
| [YouTube Transcript Scraper](https://apify.com/apizy/youtube-transcript-scraper) | Video transcripts with optional timestamps |

### Get in Touch

Have a question or need a custom scraping workflow? Email **apizy.studio@gmail.com**.

# Actor input Schema

## `app` (type: `string`):

One Google Play URL or package ID, for example com.whatsapp. Use either this field or Apps.

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

Up to 100 Google Play URLs or package IDs. Use either this field or App URL or package ID.

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

Google Play language code such as en, id, de, or pt-BR. This does not translate review text.

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

Two-letter country code for the Google Play storefront, such as us or id.

## `sortBy` (type: `string`):

Newest, highest rating, or Google's most helpful order.

## `maxReviews` (type: `integer`):

Maximum number of review rows returned per app.

## `starRating` (type: `integer`):

Optional: only fetch reviews with this rating (1 to 5). Leave empty for all ratings.

## `sinceDate` (type: `string`):

Optional inclusive UTC date (YYYY-MM-DD). Requires Newest first; older reviews are not saved or charged.

## Actor input object example

```json
{
  "language": "en",
  "country": "us",
  "sortBy": "newest",
  "maxReviews": 100
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset containing one item per review.

## `output` (type: `string`):

Input, total counts, per-app results, duration, and stop reason for this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("apizy/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("apizy/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 '{}' |
apify call apizy/google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

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