# Google Play Reviews & Ratings Scraper — 72 Languages (`mzansi-dataworks/google-play-reviews-all-countries`) Actor

Get Google Play reviews in every language and each app's star rating, rating histogram, installs and price for every country, in one run. Filter by stars, date or keyword, include developer replies, and monitor only new reviews on a schedule. No reviewer names, no login.

- **URL**: https://apify.com/mzansi-dataworks/google-play-reviews-all-countries.md
- **Developed by:** [Norton Claude](https://apify.com/mzansi-dataworks) (community)
- **Categories:** Developer tools, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 & Ratings Scraper — All Countries and Languages

Get Google Play reviews for any Android app **in every language Play offers, in one run**, plus each app's **average rating, star histogram, installs and price in every country store**. Most review scrapers read one language and one country at a time, so you miss what users in Brazil, Germany or Japan are actually saying. This actor fans out across the languages and countries you pick (or all of them), retries politely when Google pushes back, and still finishes the run if one part fails.

No login, no API key, and no reviewer names (see Privacy below).

### What you can do with it

- **Monitor reviews.** Tick *Only new since my last run*, schedule it daily, and send new reviews to Slack, email or Google Sheets. You only pay for reviews you have not seen before.
- **Find bugs fast.** Keep 1–2 star reviews that mention *crash*, *login* or *payment*.
- **Compare markets.** One run gives you the average rating, the 1–5 star histogram, price and availability for every country.
- **Read every language.** Collect reviews in English, Portuguese, Japanese, Arabic and any other language Google Play lists, all labelled by language.
- **Benchmark competitors.** Add up to 50 apps and pull the same languages and countries for each.
- **Feed AI analysis.** Clean JSON with stars, text, app version, date, helpful votes and the developer's reply, ready for sentiment or topic analysis.

### How Google Play is organised (read this once)

- **Reviews belong to a language list, not to a country.** Google Play shows the same reviews to every country for a given language. Adding more countries does not add more reviews. Adding more **languages** does, because each language has its own list of reviews. That is why this actor fans out over languages for reviews and over countries for ratings.
- **Ratings, histograms and prices belong to a country.** The average rating, the star histogram, the number of written reviews and the price differ by country store, so the rating snapshot is one row per app and country.

### Input

| Field | What it does |
|---|---|
| **Apps** | Package IDs (`com.whatsapp`) or Play Store URLs. Up to 50 apps. The package ID is the part after `id=` in the app's URL. |
| **Review languages** | `en` by default. Codes like `de`, `pt-BR`, `ja`, or `top` (17 most used) or `all` (72). |
| **Countries (rating snapshots)** | `us` by default. Codes like `gb`, `de`, `za`, or `top` (20 biggest markets) or `all` (173). |
| **Include rating snapshot per country** | One row per app and country with rating, histogram, installs, version and price. |
| **Max reviews per app and language** | 100 by default. Google Play lets you go far deeper (tens of thousands for big apps). |
| **Max reviews per app (all languages)** | Optional overall cap per app. |
| **Sort** | Newest, most helpful, or Google's rating order. |
| **Only these star ratings** | For example 1 and 2 for complaints only. |
| **Keywords** | Keep reviews whose text contains any of these words. |
| **Only reviews since** | Drop reviews older than a date. |
| **Include developer replies** | Adds the developer's public reply and its date. |
| **Only new since my last run** | Monitoring mode. Give each monitor its own name. |

The defaults (WhatsApp, English, United States) give you 100 reviews and one rating snapshot the moment you press Start.

Example: complaints about crashes or login for WhatsApp in the 17 biggest languages, with ratings for the 20 biggest markets:

```json
{
  "apps": ["com.whatsapp"],
  "languages": ["top"],
  "countries": ["top"],
  "starFilter": [1, 2],
  "keywords": ["crash", "login"],
  "maxReviewsPerLanguage": 200
}
```

### Output

Review rows (real example, reply shortened):

```json
{
  "type": "review",
  "platform": "google-play",
  "reviewId": "deba4fbc-9b9d-426b-9de9-a654e01f242d",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "language": "en",
  "rating": 1,
  "title": null,
  "text": "genuinely trying to listen to music but ts asking me to try again tomorrow. hell no.",
  "appVersion": "9.1.90.2270",
  "date": "2026-10-16T00:23:43.042Z",
  "helpfulVotes": 0,
  "developerReply": "Hi [name], we hear your concerns and value your feedback. We’re always updating our free experience. ...",
  "developerReplyDate": "2026-10-16T09:56:30.899Z",
  "reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=deba4fbc-9b9d-426b-9de9-a654e01f242d",
  "scrapedAt": "2026-10-17T00:35:44.195Z"
}
```

Rating snapshot rows (`type: "app"`, real example, release notes shortened):

```json
{
  "type": "app",
  "platform": "google-play",
  "appId": "com.whatsapp",
  "appName": "WhatsApp Messenger",
  "bundleId": "com.whatsapp",
  "country": "us",
  "developer": "WhatsApp LLC",
  "primaryGenre": "Communication",
  "price": 0,
  "currency": "USD",
  "free": true,
  "averageRating": 4.621971,
  "ratingCount": 245868316,
  "ratingHistogram": { "1": 10741271, "2": 3411502, "3": 8895522, "4": 21954456, "5": 200865486 },
  "writtenReviewCount": 1949924,
  "installs": "10,000,000,000+",
  "minInstalls": 10000000000,
  "currentVersion": null,
  "currentVersionReleaseDate": "2026-10-13T15:53:15.000Z",
  "releaseNotes": "• You can now choose to share recent group history with new members ...",
  "contentRating": "Everyone",
  "minimumOsVersion": null,
  "offersInAppPurchases": true,
  "available": true,
  "url": "https://play.google.com/store/apps/details?id=com.whatsapp&hl=en&gl=US",
  "scrapedAt": "2026-10-17T00:42:03.904Z"
}
```

`currentVersion` and `minimumOsVersion` are empty for apps whose Play page says "Varies with device" (WhatsApp is one). They are filled in for apps that publish a fixed version.

The dataset has two views: **Reviews** and **Ratings by country**. Export as JSON, CSV, Excel or HTML, or read through the Apify API. Every run also writes a **Run summary** record (see Reliability).

### Pricing

Pay per result. There is no start fee, and Apify platform usage is included:

- **$0.15 per 1,000 reviews** ($0.00015 each)
- **$0.001 per rating snapshot** (one app in one country)

Examples:

- Default run (100 reviews, 1 snapshot): about $0.016.
- 100 recent reviews in each of 5 languages plus snapshots for 20 countries: 500 reviews + 20 snapshots, about $0.095.
- One app in all 72 languages at 500 reviews each, one snapshot: about 34,000 reviews, about $5.20.
- A daily monitor that finds 30 new reviews: under half a cent, plus snapshots if you leave them on.

Set a maximum cost on the run and the actor stops cleanly when it is reached, with exactly the reviews you paid for. The proxy option is off by default; turning it on can add proxy traffic to your Apify bill.

### Speed

Measured on live Google Play:

- Defaults (100 reviews, 1 snapshot): about 1.5 seconds.
- 1,500 reviews across 5 languages plus 20 country snapshots: about 4 seconds.
- 3,400 reviews across 17 languages for 7 countries: about 7 seconds.
- Snapshots for all 173 countries of one app: about 8 seconds.
- About 34,000 reviews across all 72 languages of one app: under a minute.
- Filters take longer because the actor has to read past the reviews you do not want. 1–2 stars with three keywords over the last 20 days for a very busy app took about 45 seconds.

### Reliability

Google Play's public pages are not a contract, so the actor is built to survive hiccups:

- Every request is retried up to 6 times with exponential backoff and jitter. If Google says "slow down", all parts of the run pause together.
- A bounded number of requests run at once (4), so a big run does not hammer Google.
- **One failing language, country or app never kills the run.** The rest is delivered and the run finishes as *partial*.
- The **Run summary** record (key-value store, key `RUN_SUMMARY`) lists what happened: apps that were not found, inputs that were skipped (with the reason), languages or countries that failed after all retries, apps not offered in a country, reviews saved per language, request and retry counts, and whether a spending limit stopped the run.
- If you give it a package ID that does not exist, you get an entry in the summary and everything else still runs.

### Limits

- **Reviews are tied to languages.** If you want to cover a market, add its languages. Country codes only change the rating snapshots.
- **`language` is the Google Play language list a review came from, not a detected language.** A reviewer with an English phone can write in Portuguese and will appear under `en`.
- **Tens of thousands per language, not necessarily everything.** Deep paging worked past 40,000 reviews for the biggest apps in testing, but Google decides how far its list goes. For a full history of a busy app, run regularly with *Only new* and keep the results.
- **Star filter.** One star value is filtered by Google (fast). Several values (for example 1 and 2) and keywords are filtered by the actor after downloading, so the actor reads up to 100 times your per-language cap, and at least 10,000 reviews, looking for matches. Reading is free; you pay only for reviews saved. If matches are rare you may receive fewer than your cap.
- **Only-new** stops reading a language after 25 reviews in a row that you already have, so it works best with *Newest*. A review the reviewer edits keeps its ID and is not delivered again. The memory holds up to 150,000 review IDs per monitor name, shared by all the apps in that monitor.
- **Rating snapshots.** Average rating, histogram, written-review count and price are per country. The total rating count shown on Google Play is global. Small countries share regional rating buckets, so neighbours can show identical numbers. An app that is not offered in a country gets a snapshot only if people there rated it, and it is marked `available: false`.
- **Very large runs.** The default 512 MB of memory handles tens of thousands of reviews. For runs above about 100,000 reviews, raise the run's memory to 1,024 MB or more.
- **Google can change its pages.** If a field disappears, it comes back as `null`; if a whole page type breaks, the failure is listed in the run summary instead of crashing the run.
- Paid apps show the price in the country's currency. The actor does not log in, so it cannot see purchase or device details.

### Privacy

The actor reads public Google Play pages. It does **not** output reviewer names, profile pictures or profile links, and it never stores them.

Developer replies often open with the reviewer's first name ("Hi Alex, ..."). The actor replaces the reviewer's display name in the reply with `[name]`. Review text is delivered exactly as written, so a reviewer who typed their own name or contact details into a review will have them in the text. Treat the text with care under GDPR, POPIA or your local law.

This actor is independent and not affiliated with Google.

### Using it with the App Store Reviews & Ratings Scraper

We also publish the **App Store Reviews & Ratings Scraper — All 174 Countries**, which does the same job for Apple's App Store. The two actors use the same field names for everything they have in common (`type`, `reviewId`, `appId`, `appName`, `rating`, `title`, `text`, `appVersion`, `date`, `helpfulVotes`, `scrapedAt`, and for rating rows `bundleId`, `country`, `developer`, `primaryGenre`, `price`, `currency`, `averageRating`, `ratingCount`, `currentVersion`, `currentVersionReleaseDate`, `releaseNotes`, `contentRating`, `minimumOsVersion`, `url`), so you can put both datasets in one table. Differences to know about:

- App Store reviews are split by **country**; Google Play reviews are split by **language**. Google Play review rows carry `language`, App Store review rows carry `country`.
- Google Play reviews have no title (`title` is always `null`), and have `developerReply`, `developerReplyDate` and `reviewUrl`. The App Store has `totalVotes`.
- Google Play rows have a `platform` column (`google-play`), which is handy when you merge the two.
- `appId` is a number on the App Store and a package name (`com.whatsapp`) on Google Play; `bundleId` is the package name on both.

### FAQ

**Why do I get the same reviews when I add more countries?**
Because Google Play does not split reviews by country. Add more languages for more reviews, and more countries for more rating snapshots.

**Do I need a proxy?**
Normally not. The actor worked without one in our testing, and the proxy option is off by default. Turn it on only if Google starts blocking your runs.

**How do I monitor an app?**
Set *Only new since my last run* to on, choose a monitor name, sort by *Newest*, and put the actor on a schedule. The first run saves what exists (up to your caps); later runs save only reviews that appeared since. Use a different monitor name for each set of apps and languages.

**What happens when I set a maximum cost?**
The actor works out how many more reviews fit in the budget before saving each batch, saves exactly that many, and stops. It never saves more than you pay for.

**Why do ratings here differ slightly from my phone?**
Google shows country-specific ratings and refreshes them continuously. The snapshot is the value at the moment of the run.

**Something is missing or looks wrong.**
Open an issue on the Issues tab with the package ID, the languages and countries, and the run ID.

### Changelog

- 1.0: First release. 72 review languages, 173 country snapshots, star, date and keyword filters, developer replies, only-new monitoring, retries with a per-run failure summary.

# Actor input Schema

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

Google Play package IDs (com.whatsapp) or app page URLs (https://play.google.com/store/apps/details?id=com.whatsapp). Up to 50 apps. The package ID is the part after id= in the app's Play Store URL.

## `languages` (type: `array`):

Languages to collect reviews in: en, de, pt-BR, ja ... Google Play lists reviews by language, so each language you add brings its own reviews (see the README). Use 'top' for the 17 most used languages or 'all' for every language Play offers.

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

Two-letter Play Store country codes such as us, gb, de, za. Each country gives one rating snapshot per app (average stars, star histogram, price, availability), because Google Play shows different ratings and prices per country. Reviews themselves are the same in every country. Use 'top' for the 20 biggest markets or 'all' for every country.

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

Adds one row per app and country with title, developer, average rating, star histogram, installs, version, update date, price, category and content rating. Charged per row ($0.001).

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

Newest first, most helpful first, or Google's rating order. Only-new monitoring works best with Newest.

## `starFilter` (type: `array`):

Keep only reviews with these stars, for example 1 and 2 to collect complaints. Leave empty for all.

## `keywords` (type: `array`):

Keep reviews whose text contains any of these words, for example crash, login, refund. Not case sensitive.

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

Keep reviews written on or after this date (YYYY-MM-DD).

## `maxReviewsPerLanguage` (type: `integer`):

How many reviews to save for each app in each language. Google Play lets you page far deeper than this (tens of thousands for big apps).

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

Optional overall cap per app across all languages. Leave empty for no extra cap.

## `includeDeveloperReplies` (type: `boolean`):

Adds the developer's public reply text and date to each review that has one.

## `onlyNew` (type: `boolean`):

Remembers reviews from earlier runs (in a named key-value store on your account) and outputs only new ones. Use with a schedule to monitor reviews. Reviews you already got are not saved again and not charged again.

## `stateKey` (type: `string`):

Use a different name for each monitor so their memories don't mix.

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

Off by default. Turn on Apify Proxy only if Google Play starts blocking runs; it costs extra proxy traffic.

## Actor input object example

```json
{
  "apps": [
    "com.whatsapp"
  ],
  "languages": [
    "en"
  ],
  "countries": [
    "us"
  ],
  "includeAppDetails": true,
  "sort": "newest",
  "maxReviewsPerLanguage": 100,
  "includeDeveloperReplies": true,
  "onlyNew": false
}
```

# Actor output Schema

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

No description

## `summary` (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.whatsapp"
    ],
    "languages": [
        "en"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mzansi-dataworks/google-play-reviews-all-countries").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.whatsapp"],
    "languages": ["en"],
    "countries": ["us"],
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mzansi-dataworks/google-play-reviews-all-countries"
        }
    }
}
```

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/ZMAnWs9F4DONMb7f7/builds/koeiSXUiBymRpQWDU/openapi.json
