# Google Play Reviews Scraper (`locaihost/google-play-reviews`) Actor

Scrape Google Play reviews for any app, country and language: star rating, text, date, app version, thumbs-up count and developer reply. Filter by stars, date, keyword or app version; only new reviews for schedules. No login. $0.10 per 1,000 reviews.

- **URL**: https://apify.com/locaihost/google-play-reviews.md
- **Developed by:** [locaihost data](https://apify.com/locaihost) (community)
- **Categories:** Marketing, SEO tools, Developer tools
- **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

Get Google Play reviews for any Android app, in any country and language, as clean JSON, CSV or Excel rows: star rating, text, date, the app version the reviewer had, thumbs-up count, and the developer's reply with its date. Filter by stars, date, keyword or app version, and pay only for the reviews you keep. No login, no API key.

What people use it for:

- Product feedback: every 1 and 2 star review since your last release, with the app version, for your bug tracker.
- Support audits: which complaints the developer answered and how fast. Each review row carries the reply text and date when there is one.
- Competitor research: what users like and dislike about another app, by country and language.
- Review monitoring: a daily run with **Only new reviews** returns just the reviews posted since the last run.

### Quick start

Paste this into the **JSON** tab of the input and click **Start**:

```json
{"apps": ["com.duolingo"], "maxReviewsPerApp": 10}
```

You get the 10 newest US English reviews of Duolingo, usually in under 15 seconds.

More examples:

```json
{"apps": ["https://play.google.com/store/apps/details?id=com.spotify.music", "com.duolingo"], "maxReviewsPerApp": 2000}
```

```json
{"apps": ["com.spotify.music"], "reviewRatings": ["1", "2"], "reviewSort": "helpful", "maxReviewsPerApp": 500}
```

```json
{"apps": ["com.duolingo"], "countries": ["de"], "language": "de", "reviewsSince": "30 days", "maxReviewsPerApp": 5000}
```

```json
{"apps": ["com.duolingo"], "onlyNew": true, "maxReviewsPerApp": 500}
```

The last one is the review-monitoring setup: schedule it daily and each run returns only reviews it hasn't returned before.

### Output

One **review** row per review, plus a free **not-found** row for an app that doesn't exist or has no reviews for your settings, saying why.

| Field | What it is |
|---|---|
| `rating` | Stars, 1 to 5 |
| `text` | The review |
| `date` | When it was posted (UTC) |
| `version` | The app version the reviewer had, when Google Play shows it |
| `helpfulCount` | Thumbs-up ("helpful") count |
| `developerReply`, `developerReplyDate` | The developer's public reply and when it was posted |
| `appId`, `appUrl`, `country`, `language` | Which app, store country and review language |
| `reviewId`, `sort`, `scrapedAt` | Review id, the order it was read in, when |
| `userName` | Only with **Include reviewer display names** on |

A real row from a run on 2026-11-03 (Spotify, 1 and 2 stars, most helpful first):

```json
{
  "type": "review",
  "store": "google",
  "appId": "com.spotify.music",
  "reviewId": "581243b4-a27c-4bb8-98dd-05e8cb92f0b4",
  "rating": 1,
  "text": "I have the free version right now because I can not afford premium. I will get the ad saying \"listen for 30 minutes of ad free music\" then it literally plays 1 3-4 minute song before I get another 2 minute set of ads. …",
  "date": "2025-04-19T18:47:04.000Z",
  "version": "9.0.34.593",
  "helpfulCount": 2461,
  "developerReply": "Hi there, thanks for your feedback. No worries, we'll pass this along to the Ads team. To get the 30-minute ad-free music, be sure to keep the video ad in focus. …",
  "developerReplyDate": "2025-04-19T19:25:05.000Z",
  "userName": null,
  "sort": "helpful",
  "country": "us",
  "language": "en",
  "appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=US",
  "scrapedAt": "2026-11-03T15:02:40.964Z"
}
```

### Pricing

You pay per review returned. There is no charge for Apify platform usage on top.

| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Review | $0.10 per 1,000 | $0.075 per 1,000 | $0.055 per 1,000 |

Plus $0.00005 per run start. **Apify's free $5 monthly credit covers about 50,000 reviews.** Free-plan runs stop at 500 rows each; any paid Apify plan removes the cap.

**What's free:** apps that don't exist, apps with no reviews for your settings (each comes back as a free row saying why), reviews left out by the date, keyword or version filters, and reviews skipped by **Only new reviews**. To cap a run's spend, set **Maximum cost per run** in the run options, or **Max rows** in the input.

### Input

| Field | What it does |
|---|---|
| Google Play apps | Store links or package names (`com.duolingo`). |
| Countries | Two-letter codes (us, gb, de, in ...). |
| Language | Language of the reviews (en, de, pt-BR ...). |
| Review order | Newest first, or most helpful first. |
| Max reviews per app | Per app and country. Default 100, up to 50,000. |
| Only these star ratings | For example 1 and 2 for complaints only. |
| Reviews published on or after | A date (2026-09-01) or a period (30 days). With newest first, the run stops reading at the first older review. |
| Reviews mentioning | Keywords or phrases in the text. |
| App versions | Only reviews written on these versions (5.2 matches 5.2.1). |
| Only new reviews | Skip reviews this input already returned. |
| Max rows | Stop after this many reviews in total. |

### Limits

- Reviews come in the language you choose (default `en`); reviews written in other languages are not in that list. Run again with another language for those.
- Very deep review history: thousands of reviews in, Google Play sometimes stops answering for an app. The run keeps what it already has for that app, says so, and still ends successfully; run it again later for more.
- Google Play reviews have no title. Not every review shows an app version.
- Google Play only. App Store links or numeric ids pasted here are skipped and not charged; use locaihost/app-store-reviews for those.

### FAQ

**How do I find an app's package name?** Paste the store link, such as `https://play.google.com/store/apps/details?id=com.duolingo`, or just the part after `id=` (`com.duolingo`).

**Can I use it through the API or from an AI agent?** Yes. Call the Actor through the Apify API with the same JSON input as the examples above, or through Apify's MCP server from any MCP client.

**Is it legal to scrape Google Play reviews?** The Actor reads what any visitor to Google Play can see, without logging in. Google Play's terms restrict automated collection, so check them against your use. Reviews come without the reviewer's name unless you turn on **Include reviewer display names**, which adds only the public display name; account ids, profile pictures and contact details are never collected. You are responsible for how you use the results, including the store's terms and the data-protection law that applies to you.

### More from locaihost data

- [App Store Reviews Scraper](https://apify.com/locaihost/app-store-reviews): the same for the Apple App Store.
- [App Store and Google Play Scraper](https://apify.com/locaihost/app-stores): app details, search, top charts, developer apps and reviews from both stores.

Did it help? A short rating on the Store helps other people find it.

If something breaks or you need a field we don't return, open an issue on the **Issues** tab. We answer issues within 24 hours.

*locaihost data*

# Changelog

This Actor's version history is a separate document: https://apify.com/locaihost/google-play-reviews/changelog.md

# Actor input Schema

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

Google Play links or package names (https://play.google.com/store/apps/details?id=com.duolingo or com.duolingo). App Store apps are skipped (use App Store Reviews for those).

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

Two-letter Google Play countries, such as us, gb, de, jp, in, br. Each country is read separately.

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

Language of the reviews (en, de, pt-BR ...). Google Play shows reviews written in this language.

## `reviewSort` (type: `string`):

Newest first, or most helpful first.

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

Per app and country. Default 100, up to 50,000.

## `reviewRatings` (type: `array`):

Leave empty for all ratings. Pick 1 and 2 to collect complaints only.

## `reviewsSince` (type: `string`):

Optional. Only reviews from this date on, like 2026-09-01, or a period back from today like 30 days. With newest-first order the run stops reading an app at the first older review, so it reads only the pages it needs. Older reviews are not charged.

## `reviewKeywords` (type: `array`):

Optional. Only reviews whose title or text contains one of these words or phrases, ignoring case, e.g. crash, refund, subscription. Other reviews are left out and not charged.

## `appVersions` (type: `array`):

Optional. Only reviews written on these app versions, as the store shows them. 5.2 matches 5.2 and 5.2.1. Reviews that show no version are left out. Not charged when left out.

## `includeReviewerNames` (type: `boolean`):

Off by default. On adds the public display name the store shows. Emails, account ids and profile pictures are never collected.

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

Skip reviews this same input already returned in an earlier run. Turn on for scheduled review monitoring: you pay only for new reviews.

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

Stop after this many reviews in total. 0 means no limit.

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

Reviews, always, in this Actor.

## Actor input object example

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.duolingo",
    "com.spotify.music"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "reviewSort": "newest",
  "maxReviewsPerApp": 10,
  "reviewKeywords": [
    "crash",
    "refund"
  ],
  "appVersions": [
    "5.2"
  ],
  "includeReviewerNames": false,
  "onlyNew": false,
  "maxItems": 0,
  "mode": "reviews"
}
```

# Actor output Schema

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

One row per review: rating, text, date, app version, thumbs-up count, developer reply.

## `full` (type: `string`):

Every field of every row, including free not-found rows.

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

Counts, free rows by reason, reviews left out by filters, anything that failed, and cost.

# 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.duolingo"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/google-play-reviews").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.duolingo"],
    "countries": ["us"],
    "maxReviewsPerApp": 10,
}

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

```

## MCP server setup

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

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/CmjLlVc2YFbbSyqvx/builds/FfRGzDn2DjVvJd0oO/openapi.json
