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

Every review Google Play serves for any Android app, in any country and language: stars, text, app version, helpful votes, developer reply and date, one row per review. Or one summary row per app and country with Google's star histogram, installs and review velocity. No login, no key, no proxies.

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

## Pricing

from $0.70 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Play Reviews Scraper — Ratings, Versions & Countries

**What are Android users saying about this app right now, in this country — and is the developer answering?**

Every review Google Play serves for an app, newest first or most helpful first, one row per review: stars, text, the app version it was written against, helpful votes, the developer's reply and both dates. Read the same app from several countries in their own languages in one run. Or flip the switch and get one summary row per app and country — Google's own average rating, rating count and one-to-five star histogram, installs, the version on sale, and how the recent reviews split, how fast they come in and how often the developer replies.

**Built as the twin of our [App Store Reviews Scraper](https://apify.com/tidyfeed/app-store-reviews-scraper).** Both use the same column names for everything the two stores have in common, so iOS and Android reviews land in one sheet without a mapping step.

No API key. No login. No proxies.

***

### Two modes

**Reviews — one row per review.** The default. Give it a package name or a Play Store link and a list of countries, and get the reviews as a table you can filter by stars, version, date or whether the developer replied.

**Summary — one row per app and country.** Give it twenty apps — yours, your competitors' — and get twenty rows you can sort: Google rating and count, the all-time star histogram Google publishes, installs, recent average, reviews per day, developer reply rate, days since the last update.

***

### What you get

#### Reviews mode

**The review** — `rating` (1–5), `body`, `version` (the app version the reviewer had), `author`, `helpfulVotes`, `reviewId`, `reviewUrl`

**The developer's side** — `developerReply`, `developerRepliedAt` (empty when there is none)

**When** — `reviewedAt`, `daysSinceReview`

**Which app, which store** — `appId`, `appName`, `developer`, `country`, `language`, `appUrl`

`title` is present but always empty: Google Play reviews have no title. It is kept so the columns line up with the App Store actor.

#### Summary mode

**Google's figures** — `averageRating`, `ratingCount`, `reviewCountTotal`, `histogram5` … `histogram1` (all ratings ever, as shown on the store page), `installs` and `minInstalls`, `currentVersion`, `updatedAt`, `daysSinceUpdate`, `releasedAt`, `price`, `currency`, `free`, `genre`, `contentRating`, `summary`

**Computed from the newest reviews** — `reviewsRead`, `recentAverageRating`, `stars5` … `stars1`, `reviewsLast30d`, `reviewsPerDay30d`, `developerReplyPercent`, `latestReviewAt`, `oldestReviewReadAt`

**How complete** — `status`

***

### Typical uses

- **Watch your own app after a release.** Reviews mode, `daysBack: 7`, on a schedule. Filter to the new version number and read what changed.
- **Compare the competition.** Summary mode on the apps in your category: who is rated best, whose recent reviews are slipping below their all-time histogram, who answers reviews and who has gone quiet.
- **See the same app through different markets.** `countries: ["us", "br", "in", "de", "kr"]` — each store in its own language; the complaints differ by market more often than teams expect.
- **iOS and Android in one table.** Run this and the App Store Reviews Scraper on the same app and stack the two datasets; the columns match.
- **Feed support and product.** Sort low-star rows by `helpfulVotes` and you have the complaints other users agree with — and whether anyone replied.

***

### Input

| Field | What it does |
|---|---|
| `apps` | Play Store links or package names. `https://play.google.com/store/apps/details?id=com.whatsapp` or `com.whatsapp`. |
| `countries` | Two-letter country codes (`us`, `gb`, `de`, `jp`, `kr`…). Each app is read from every country listed, in that country's main language. Leave empty to use the country in each link, or the US store for bare package names. |
| `language` | Optional two-letter language to use for every country instead. |
| `mode` | `reviews` (default) or `summary`. |
| `sortBy` | `newest` (default) or `helpful`. |
| `daysBack` | `0` for no date filter; `7` or `30` for a tracking window. |
| `maxReviewsPerApp` | Cap per app per country, default 100. Google Play goes back years, so raise it deliberately. |

***

### What it costs

**$1.00 per 1,000 reviews** in reviews mode, **$10.00 per 1,000 app summaries** in summary mode, plus $0.005 per run. Apify's Starter, Scale and Business plans get 10%, 20% and 30% off.

You pay for rows delivered. An app with no reviews in a store, a package name that does not exist, or a date window that matches nothing costs nothing. Reading the same app from five countries is five sets of rows.

For scale: 1,000 reviews of one app is $1.00; a summary of 50 competitor apps is $0.50.

***

### How it works

Google Play serves an app's page and its reviews to anyone, in batches of about 150, with a cursor to the next batch. This actor reads those responses through the open-source `google-play-scraper` library — no browser, no proxies, no account. That is why it is fast (100 reviews in about a second) and cheap.

Reviews are walked batch by batch until the cap, the date window or the end of the list is reached. Review and reply timestamps are normalised to UTC. Each country is read in its own main language unless you set one; the language decides which reviews Google serves and how the app's own page text comes back.

***

### Honest limits

- **The language decides the review set.** Google Play serves reviews per country *and* language. `kr` reads Korean-language reviews by default; set `language: "en"` to read the English ones left in the same store. Neither set is "all reviews".
- **Google's histogram and rating count cover all ratings ever**, including star-only ratings with no text. `recentAverageRating` and `stars5`…`stars1` are computed from the written reviews this actor read. They usually differ, and the gap is the point.
- **The 30-day figures in summary mode are only reported when they are complete.** If the reviews read stop short of 30 days back because of your cap, `reviewsLast30d` and `reviewsPerDay30d` are left empty rather than reported as a floor, and `status` says so.
- **`installs` is Google's rounded band** — "10,000,000,000+" — and `minInstalls` is that band as a number. Google does not publish exact installs.
- **Review order is Google's.** "Newest" is by the review's last edit, so an edited old review can appear near the top.
- **Reviews Google hides** (spam-filtered, or from users who chose not to show them) are not served and are not here.
- **Google's newest-first feed lags.** The most recent days are often thin — a big app showed 5 reviews for the last week and 300 for the month — because reviews surface in the feed some days after they are written. A weekly schedule catches up on its own.
- **`currentVersion` reads `VARY`** for apps that ship different builds per device ("Varies with device"). That is Google's value, not a missing one.
- **Google Play quietly serves a default store for a country code it does not run one for**, so only real ISO country codes are accepted; anything else is skipped with a warning rather than mislabelled.

***

### Scheduling

Reviews keep coming. Schedule reviews mode with `daysBack: 7` on your apps and each run adds the week's reviews with the developer's replies at that moment; schedule summary mode weekly on your category and you have a dated record of ratings, histograms, installs and reply rates over time.

***

### Legal

This actor reads only data that Google Play serves publicly for each app, at addresses it serves to anyone. Reviews are public statements their authors chose to publish under a display name. It requires no login and bypasses no access control. You remain responsible for how you use the exported data.

***

Questions, or an app that behaves oddly? Open an issue on the actor — issues are read and answered.

# Actor input Schema

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

Google Play links or package names. https://play.google.com/store/apps/details?id=com.whatsapp and com.whatsapp both work. The country in a link (gl=) is used when the Countries field below is left empty.

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

Two-letter country codes: us, gb, de, fr, jp, kr, br, in… Each app is read from every country listed, so 2 apps × 3 countries = 6 sets of reviews. The review language follows the country (kr → Korean, de → German) unless you set one below. Leave empty to use the country from each link, or the US store for bare package names.

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

Two-letter language code to use for every country, e.g. en. Leave empty to let each country use its own main language.

## `mode` (type: `string`):

"Reviews" gives one row per review. "Summary" gives one row per app and country: Google's average rating, rating count and 1-to-5 star histogram, installs, the version on sale, and the rating split, velocity and developer-reply rate of the most recent reviews.

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

Newest first is the one to use for tracking; most helpful surfaces the reviews other users voted up.

## `daysBack` (type: `integer`):

Leave at 0 for no date filter. Set 7 or 30 to track what came in since the last run. Works with newest-first order.

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

Upper limit for each app in each country. Google Play pages in batches of about 150 and goes back years for big apps, so the cap is what keeps a run short.

## Actor input object example

```json
{
  "apps": [
    "com.whatsapp",
    "https://play.google.com/store/apps/details?id=com.duolingo&gl=GB",
    "com.spotify.music"
  ],
  "countries": [
    "us",
    "gb",
    "de",
    "jp",
    "kr"
  ],
  "language": "",
  "mode": "reviews",
  "sortBy": "newest",
  "daysBack": 0,
  "maxReviewsPerApp": 100
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

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

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

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

```

## MCP server setup

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