# Google Play Reviews Scraper: Developer Replies & App Details (`stratumics/google-play-reviews-scraper`) Actor

Get Google Play reviews with star ratings, text, app versions, thumbs-up counts, developer replies and feature ratings in any language, plus app details with installs and star histogram.

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

## Pricing

from $0.08 / 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** collects Google Play Store reviews for any Android app in any language: star rating, full text, date, app version, thumbs-up count, the **developer's reply** and the feature ratings reviewers give (battery, ads, stability and more). It adds an app details record with installs, the average rating, the number of ratings and written reviews, and the star histogram, so it works as a **Google Play reviews API** with no Google account and no API key.

It reads public reviews only and never logs in.

### What does Google Play Reviews Scraper do?

Give it Google Play links (`https://play.google.com/store/apps/details?id=com.instagram.android`) or package names (`com.instagram.android`) and it returns one clean record per review:

- **Reviews**: star rating, full text with line breaks, exact date in UTC, the reviewer's public name, the app version they used and the thumbs-up count.
- **Developer replies**: the reply text and its date, when the developer answered.
- **Feature ratings**: the extra scores Google asks some reviewers for, such as battery use, ads, stability or game features.
- **Any language**: Google Play groups reviews by language, so you pick languages (en, de, es, pt, zh-TW, ...) and each app is read once per language.
- **Sorting and filters**: newest first, most relevant first or highest rating first, only some star ratings (for example 1 and 2 stars for complaints), and a date cut-off.
- **App details**: one record per app with the name, developer, installs (the rounded label and Google's more exact figure), average rating, ratings and review counts, star histogram, price, category, current version, last update, release date and age rating.

### Why use this Google Play reviews scraper?

- **Fast.** 200 reviews per request and several apps in parallel. 1,200 reviews each from two apps took 7 seconds on Apify, and Google never throttled the test runs.
- **Checked against the store.** In testing, 10 of 10 randomly picked reviews matched the review's own page on Google Play on rating, date and text, to the millisecond.
- **Developer replies and feature ratings included.** See how a competitor answers complaints and which features users rate low.
- **Monitoring mode.** Turn on "Only new reviews" and schedule the run. Each run returns only reviews you have not received yet, remembered per app and language, so you do not pay twice for the same review (an edited review comes back once, with its new text). Google publishes many reviews a day or more after they are written; the monitor looks back three days for late arrivals, so they are not lost.
- **Date ranges that stop early.** With "Only reviews newer than" and newest-first sorting, reading stops at the first older review, so you only pay for what is in range.
- **No duplicate languages.** Google returns the same reviews for pt, pt-BR and pt-PT (and es and es-419, en and en-US); the scraper reads them once instead of charging you three times.
- **You pay for results only.** Reviews you filter out, apps that do not exist and errors are never charged.

On top of that you get the Apify platform: scheduled runs, an API, webhooks, run history, and exports to JSON, CSV, Excel and more.

### What data can you extract from Google Play?

| Field | What it holds | Example |
|---|---|---|
| `appId`, `appName` | The app the review belongs to | `org.telegram.messenger`, `Telegram` |
| `language` | Language the reviews were read in | `en` |
| `reviewId`, `url` | Google's review id and a link that opens the review | `86221f19-...` |
| `rating` | Stars from 1 to 5 | `1` |
| `text` | Full review text | `Hello, I'm trying to verify my number ...` |
| `date` | Posted or last edited, ISO 8601 in UTC | `2026-10-16T20:09:09.780Z` |
| `version` | App version the reviewer used, when Google records it | `13.0.3` |
| `thumbsUp` | Thumbs-up votes | `13` |
| `developerReply` | Reply text and date, or null | `{ "text": "We're sorry ...", "date": "..." }` |
| `criteria` | Feature ratings | `[{ "name": "vaf_app_quality_ads_presence", "rating": 1 }]` |
| `installs`, `realInstalls` (app records) | Install label and Google's exact figure | `1,000,000,000+`, `3012776829` |
| `histogram`, `ratingsCount`, `reviewsCount` (app records) | Star counts, ratings, written reviews | `{ "1": 3978178, ... }` |

Every record has a `type` field: `review` or `app`. The full list of fields, with descriptions, is on the Dataset tab of the output.

### How to scrape Google Play reviews

1. Open Google Play Reviews Scraper in Apify Console and click **Try for free**.
2. In **Apps**, paste Google Play links or package names, one per line.
3. Optionally enter **Review languages** (en, de, es, ...). Leave it empty to use the `hl=` language of each link, or English.
4. Set **Max reviews per app and language**. The default is 200. Set 0 to collect only the app details records.
5. Optionally pick a sort order, star ratings, a date cut-off, or turn on monitoring.
6. Click **Start**. When the run finishes, download the data as JSON, CSV or Excel, or read it through the API.

### How much does it cost to scrape Google Play reviews?

The scraper uses pay-per-event pricing, so you pay for what you get and nothing else:

| Event | Price |
|---|---|
| Review saved | $0.10 per 1,000 ($0.0001 each) |
| App details record saved | $0.002 each |

Each run also has a start fee of $0.0005, and larger Apify plans pay less per review automatically: $0.09 per 1,000 on Scale and $0.08 on Business. The **Pricing** tab always shows the current prices.

Worked examples:

- **1,000 reviews of one app in one language, with its app details record**, cost 1,000 × $0.0001 + $0.002 = **about $0.10**.
- **The 10,000 newest English reviews of 4 competitor apps** (40,000 reviews, 4 app records) cost **about $4.01**.
- **A daily monitor** of 5 apps in English that finds 300 new reviews a day costs about $0.03 a day without app records, or **about $0.92 a month** with the run start fees.

Set **Maximum cost per run** in the run options to cap your spend. The scraper stops cleanly at that amount and keeps everything collected so far; in monitoring mode, the next run picks up reviews that were left, as long as they are not more than three days older than the newest one delivered.

### Input

See the **Input** tab for every option. A typical input:

```json
{
    "apps": ["https://play.google.com/store/apps/details?id=org.telegram.messenger", "com.whatsapp"],
    "languages": ["en", "de"],
    "country": "us",
    "maxReviewsPerApp": 1000,
    "sort": "newest",
    "stars": ["1", "2"],
    "newerThan": "30 days",
    "includeAppDetails": true
}
```

- **Review languages**: codes such as `en`, `de`, `pt-BR` or `zh-TW`. Regional codes are read as the base language (pt-BR as pt), except Chinese, where zh-CN and zh-TW have different reviews.
- **Store country**: sets the price, currency and availability in the app details record. It does not change the reviews: Google returns the same English reviews in the US, the UK and India.
- **Star ratings**: one star is filtered by Google itself; several stars are filtered by the scraper, which reads more reviews to find enough matches.
- **Monitoring**: turn on **Only new reviews** and give each schedule its own **Monitor name**. The memory is a key-value store in your account named `google-play-reviews-monitor-<name>`.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Two reviews and an app record from a real run (reviewer names replaced):

```json
[
    {
        "type": "review",
        "platform": "googlePlay",
        "appId": "org.telegram.messenger",
        "appName": "Telegram",
        "country": "us",
        "language": "en",
        "reviewId": "86221f19-9794-4e69-ba90-a79d073042cf",
        "userName": "Reviewer One",
        "rating": 1,
        "text": "Hello, I'm trying to verify my number on telegram but not receiving verification code. Please help me fix this problem. Thanks",
        "version": "13.0.3",
        "date": "2026-10-16T20:09:09.780Z",
        "thumbsUp": 1,
        "developerReply": {
            "text": "We're sorry to hear that. Please verify that your mobile plan includes active SMS coverage. Confirm Google Play Services are enabled on your device and disable any active VPN. If issues persist, contact sms@telegram.org with your phone number in international format as the email subject.",
            "date": "2026-10-16T21:02:48.047Z"
        },
        "criteria": [],
        "url": "https://play.google.com/store/apps/details?id=org.telegram.messenger&reviewId=86221f19-9794-4e69-ba90-a79d073042cf",
        "scrapedAt": "2026-10-18T02:01:05.576Z"
    },
    {
        "type": "review",
        "platform": "googlePlay",
        "appId": "com.instagram.android",
        "appName": "Instagram",
        "country": "us",
        "language": "en",
        "reviewId": "54ebd622-ee18-4a04-a82a-28005e606b55",
        "userName": "Reviewer Two",
        "rating": 1,
        "text": "I hate the forced advertisement that I must watch before scrolling my feed! I'm deleting the app. It feels like a cheap mobile clicker, that is made only for earning money via adds",
        "version": "451.0.0.53.80",
        "date": "2026-10-14T00:48:48.345Z",
        "thumbsUp": 13,
        "developerReply": null,
        "criteria": [
            { "name": "vaf_app_quality_usability", "rating": 2 },
            { "name": "vaf_phase1_2_step_verification", "rating": 1 },
            { "name": "vaf_app_quality_ads_presence", "rating": 1 }
        ],
        "url": "https://play.google.com/store/apps/details?id=com.instagram.android&reviewId=54ebd622-ee18-4a04-a82a-28005e606b55",
        "scrapedAt": "2026-10-18T02:01:06.471Z"
    },
    {
        "type": "app",
        "platform": "googlePlay",
        "appId": "org.telegram.messenger",
        "appName": "Telegram",
        "country": "us",
        "language": "en",
        "developer": "Telegram FZ-LLC",
        "developerId": "7766252821327259628",
        "rating": 3.8088691,
        "ratingsCount": 17318757,
        "reviewsCount": 186211,
        "histogram": { "1": 3978178, "2": 611152, "3": 845192, "4": 1192228, "5": 10691933 },
        "price": 0,
        "currency": "USD",
        "priceText": "Free",
        "genre": "Communication",
        "version": null,
        "updated": "2026-10-16T04:13:23.447Z",
        "released": "2013-09-07T02:49:43.538Z",
        "size": null,
        "installs": "1,000,000,000+",
        "minInstalls": 1000000000,
        "realInstalls": 3012776829,
        "contentRating": "Mature 17+",
        "url": "https://play.google.com/store/apps/details?id=org.telegram.messenger&hl=en&gl=us",
        "scrapedAt": "2026-10-18T02:01:04.977Z"
    }
]
```

Each run also saves a **SUMMARY** record in its key-value store with the status, review count, pages read, the reason reading stopped, and any problem for every app and language.

### Tips for scraping Google Play reviews

- **Want complaints only?** Pick 1 and 2 stars. You pay only for the reviews that match.
- **Following a release?** Sort by newest with "Only reviews newer than" set to the release date, and look at the `version` field.
- **Several markets?** Add languages, not countries: German reviews come with `de`, wherever the reviewer lives.
- **Only need ratings and installs?** Set the review limit to 0 and keep app details on.
- **Feature ratings** use Google's own names, such as `vaf_app_quality_battery_heat`; most reviews have none.

### Integrations and API

- **API**: start runs and read results over HTTP from any language. See the **API** tab for ready-made requests.
- **JavaScript**:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('stratumics/google-play-reviews-scraper').call({
    apps: ['com.whatsapp'],
    languages: ['en'],
    maxReviewsPerApp: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((item) => item.type === 'review' && item.developerReply).length);
```

- **Python**:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("stratumics/google-play-reviews-scraper").call(
    run_input={"apps": ["com.whatsapp"], "languages": ["en", "es"], "maxReviewsPerApp": 500, "stars": ["1"]}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["type"] == "review":
        print(item["language"], item["rating"], item["date"], (item["text"] or "")[:60])
```

- **No-code tools**: connect runs to Zapier, Make, n8n, Google Sheets, Slack or your own webhook from the **Integrations** tab, for example to post every new 1-star review of your app into a team channel.
- **AI agents**: add the Actor to any agent or chat app that supports the Model Context Protocol through the Apify MCP server at `https://mcp.apify.com?tools=stratumics/google-play-reviews-scraper`, then ask in plain words, such as "get this week's 1-star reviews of this app and list the top complaints".

### FAQ

#### How many reviews can I get for one app?

Google Play has no fixed limit, so you can read the full history of an app in a language, up to 100,000 reviews per app and language per run.

#### Why does choosing a country not change the reviews?

Google Play groups reviews by language. In testing, the newest English reviews of the same apps were identical for the US, the UK and India. The country only changes the price, currency and availability in the app details record.

#### Why are the newest reviews a day or more old?

Google shows reviews on Google Play some time after they are written, often about a day and for some very large apps several days. The scraper returns what Google shows. Monitoring mode looks three days back on every run, so reviews that appear late are still delivered once.

#### Why is `version` empty on some reviews and in some app records?

Google does not record the app version for every review. In app records, the version is empty when it "varies with device", as it does for many large apps.

#### Why is `size` always empty?

Google Play no longer shows the download size on the web. The field is kept so Google Play and App Store records have the same columns.

#### Is it legal to scrape Google Play reviews?

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

The only personal data in the output is the public name each reviewer shows with the review; no profile pictures, profile links or other details are collected. Google Play is a trademark of Google LLC, and this tool is not affiliated with or endorsed by Google.

#### Something looks wrong. Where do I report it?

Open an issue on the **Issues** tab with the run link and the app. Most problems can be reproduced and fixed quickly.

### Other tools from this developer

### Other tools from Stratum ICS

- [App Store Reviews Scraper](https://apify.com/stratumics/app-store-reviews-scraper): Get Apple App Store reviews with star ratings, titles, text, app versions, helpful votes and developer replies, well past Apple's 500-review limit, for any country, plus app ratings.
- [Google Maps Scraper](https://apify.com/stratumics/google-maps-scraper): Get the businesses on Google Maps for any search and area: name, address, phone, website, rating, review count, opening hours, plus emails and social profiles.
- [Google News Scraper](https://apify.com/stratumics/google-news-scraper): Get Google News articles with real publisher URLs (not Google redirects), source, date, image, author and optional full text.
- [Google Trends Scraper](https://apify.com/stratumics/google-trends-scraper): Get Google Trends data as JSON, CSV or Excel: interest over time, interest by region and city, related queries, and trending searches by country.
- [LinkedIn Jobs Scraper](https://apify.com/stratumics/linkedin-jobs-scraper): Scrape LinkedIn jobs with full descriptions, salary ranges, seniority, job type and applicant counts.
- [Telegram Channel Scraper](https://apify.com/stratumics/telegram-channel-scraper): Get messages from public Telegram channels with views, dates, media, reactions, polls and forwards, plus channel info with exact subscriber counts.
- [Website Contact Scraper](https://apify.com/stratumics/website-contact-scraper): Turn a list of websites into one row per company with verified emails, formatted phone numbers, social profiles (LinkedIn, Facebook, Instagram, X), address and contact page.
- [YouTube Scraper](https://apify.com/stratumics/youtube-scraper): Get YouTube videos from searches, channels, playlists and links with exact views, likes, comment counts, dates and tags, plus channel profiles and comments.

# Actor input Schema

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

Google Play apps to scrape. Paste links (https://play.google.com/store/apps/details?id=com.instagram.android) or package names (com.instagram.android, the id= part of the link). One per line.

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

Language codes such as en, de, es, pt or zh-TW. Google Play groups reviews by language (the same English reviews show up in the US, the UK and India), so each app is read once per language. Leave empty to use the hl= language of each app link, or English.

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

Two-letter country code such as us, gb or in. It sets the price, currency and availability shown in the app details record; it does not change which reviews you get. Leave empty to use the gl= country of each app link, or the United States.

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

The most reviews to collect for each app in each language. Google Play has no fixed limit, so this can go into the tens of thousands for popular apps. Set 0 to collect only the app details record.

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

Order in which reviews are read. Newest first is the only order that the date cut-off and monitoring can stop on.

## `stars` (type: `array`):

Keep only reviews with these star ratings, for example 1 and 2 for complaints. Leave empty for all ratings. You only pay for reviews that match.

## `newerThan` (type: `string`):

Keep reviews posted (or last edited) on or after this date. Use a date (2026-10-01), an ISO date-time in UTC (2026-10-01T12:00:00Z), or a relative value such as "30 days" or "12 hours". With newest first, reading stops at the first older review, so you only pay for what is in the range. Leave empty for no limit.

## `onlyNewReviews` (type: `boolean`):

Remember the reviews delivered for each app and language and, on later runs, return only reviews you have not received yet. The first run returns the newest reviews up to your limit. Run it on a schedule to follow apps; it always reads newest first.

## `monitorName` (type: `string`):

Name of the memory used by monitoring mode, kept in a key-value store of your account. Runs with the same name share it, so use one name per schedule. Letters, digits and hyphens only.

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

Add one record per app with the name, developer, average rating, number of ratings and written reviews, star histogram, price, category, current version, last update, release date and installs.

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

Google Play answers without a proxy, so none is used by default. If Google starts throttling, the scraper switches to Apify datacenter proxy by itself. Choose a proxy here to use it for every request.

## Actor input object example

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.instagram.android",
    "com.whatsapp"
  ],
  "languages": [
    "en",
    "de",
    "es"
  ],
  "country": "gb",
  "maxReviewsPerApp": 20,
  "sort": "newest",
  "stars": [],
  "newerThan": "",
  "onlyNewReviews": false,
  "monitorName": "default",
  "includeAppDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One record per review and one per app, told apart by the type field.

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

Status, review count and any problem for each app and language.

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

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

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

```

## MCP server setup

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