# Google Play Reviews Scraper - Ratings, Text & Dev Replies (`eliai/google-play-reviews-scraper`) Actor

Scrape Google Play Store app reviews: star rating, review text, thumbs-up, app version, date and the developer's reply, one row per review. Bulk apps, sort newest/relevant, filter by stars, language, country, keywords. No API key. $0.0005 per review.

- **URL**: https://apify.com/eliai/google-play-reviews-scraper.md
- **Developed by:** [Broke to Built](https://apify.com/eliai) (community)
- **Categories:** Social media, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 scraped 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 — star rating, review text, version and developer replies

Scrape **Google Play Store app reviews** for any Android app: star rating, full review text, thumbs-up count, the app version the reviewer used, review date, and the **developer's reply** with its date. One row per review, up to 50 apps per run, sorted newest / most relevant / by rating, with **star-rating, language, country and keyword filters**. Every row also carries the app's title, developer, average score, ratings count and installs. **No API key, no login, no proxy.** $0.0005 per review.

### Real output (run `N28aKUESiafcsoL5w`, 10 reviews)

Input: `{"apps":["com.duolingo","https://play.google.com/store/apps/details?id=com.spotify.music","com.nonexistent.b2b.promise"],"maxReviewsPerApp":5,"starRating":1}`

| app | stars | version | date | thumbs up | review |
|---|---|---|---|---|---|
| Duolingo: Language Lessons | 1 | 6.97.2 | 2026-09-23 | 0 | Doesn't respect my faith & keeps giving me contradectory questions… |
| Duolingo: Language Lessons | 1 | 6.94.4 | 2026-08-29 | 8 | the worst of all language learning apps I've used… |
| Spotify: Music and Podcasts | 1 | 9.1.84.2231 | 2026-09-23 | 1 | Annoying adds that you can only be rid of if you pay… |
| Spotify: Music and Podcasts | 1 | 9.1.84.2231 | 2026-09-23 | 0 | Shuffle settings will turn themselves on or off… |

`com.nonexistent.b2b.promise` does not exist, so it came back as one uncharged `ok:false` record saying so.

```json
{
  "ok": true,
  "appId": "com.duolingo",
  "appTitle": "Duolingo: Language Lessons",
  "appDeveloper": "Duolingo",
  "appScore": 4.731423,
  "appRatingsCount": 49102383,
  "appInstalls": "500,000,000+",
  "reviewId": "96f262fb-90eb-4a5c-b810-36c11bcc8956",
  "userName": "Abdelrahman Mostafa",
  "rating": 1,
  "title": null,
  "text": "Doesn't respect my faith & keeps giving me contradectory questions to faith like Do you drink wine I report then they followed with the same question won't change my rating until they fix it",
  "thumbsUp": 0,
  "appVersion": "6.97.2",
  "date": "2026-09-23T20:39:06.237Z",
  "replyText": null,
  "replyDate": null,
  "url": "https://play.google.com/store/apps/details?id=com.duolingo&reviewId=96f262fb-90eb-4a5c-b810-36c11bcc8956",
  "language": "en",
  "country": "us"
}
```

### What people use it for

- **Complaint mining**: `starRating: 1` plus `keywords: ["crash","refund","login"]` gives the bugs and churn reasons users actually write.
- **Competitor research**: pull a rival app's 1- and 2-star reviews to see what their users want and do not get.
- **Release monitoring**: sort newest and group by `appVersion` to see whether the last update helped or hurt.
- **Support and reply tracking**: `replyText` / `replyDate` show which reviews a developer answered and how fast.
- **Sentiment datasets**: export thousands of labelled (star-rated) reviews to CSV or JSON for analysis or model training.

### Input

| field | what it does |
|---|---|
| `app` | One app: a package name (`com.spotify.music`) or its Play Store URL. Default `com.spotify.music`. |
| `apps` | Up to 50 apps in one run. When you pass `apps`, the single `app` field is ignored. |
| `maxReviewsPerApp` | Cap on review rows per app. Default 100, max 20,000. |
| `sort` | `newest` (default), `relevance` or `rating`. |
| `starRating` | 1–5 to keep only reviews with that many stars. 0 = all. |
| `keywords` | Keep reviews whose text contains any of these words. |
| `language` / `country` | Two-letter codes, e.g. `en` / `us`, `de` / `de`, `pt` / `br`. |
| `includeAppInfo` | Adds app title, developer, score, ratings count and installs to each row. Default on. |

### Pricing

**$0.0005 per review row** (pay-per-event `review-scraped`). 1,000 reviews cost $0.50. Unknown apps and filters that match nothing produce one `ok:false` record and are **not charged**.

### How it works and limits

It reads the same public review feed the Play Store web page loads, 150 reviews per request, and pages through with Google's continuation token. No browser, no account.

- The star filter is applied by Google Play itself, so a 1-star pull does not page through thousands of 5-star reviews first.
- Review `title` is always `null`: Google Play reviews have no title field.
- Order is Google's. For very large apps, Google's "newest" feed for a given language/country can skip ahead in time; use `language` and `country` to target the audience you care about.
- Reviews the Play Store does not show publicly (for example, text-less ratings) are not returned.

### FAQ

**Do I need a Google Play developer account or API key?** No. These are the public reviews anyone can read on the app's page.

**Where do I find the package name?** In the app's Play Store URL after `id=`, e.g. `play.google.com/store/apps/details?id=com.duolingo`. You can also paste the whole URL.

**Can I get reviews in other languages?** Yes. Set `language` (e.g. `es`) and `country` (e.g. `mx`).

### Changelog

- **0.1** (2026-09-24): first release. One row per review, bulk apps, server-side star filter, developer replies, app info on every row.

# Actor input Schema

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

A Google Play package name (e.g. com.spotify.music) or the app's play.google.com/store/apps/details?id=... URL.

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

Several apps in one run, up to 50. Package names or Play URLs.

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

Cap on review rows per app. You are charged per review returned.

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

Order Google Play returns reviews in.

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

1-5 to keep only reviews with that many stars. 0 = all ratings.

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

Keep only reviews whose text contains ANY of these words (case-insensitive), e.g. crash, refund. Empty = all reviews.

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

Two-letter review language code, e.g. en, de, es, pt.

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

Two-letter Play Store country code, e.g. us, gb, de, in.

## `includeAppInfo` (type: `boolean`):

Adds the app's title, developer, average score, ratings count and installs to every review row.

## Actor input object example

```json
{
  "app": "com.spotify.music",
  "apps": [],
  "maxReviewsPerApp": 100,
  "sort": "newest",
  "starRating": 0,
  "keywords": [],
  "language": "en",
  "country": "us",
  "includeAppInfo": true
}
```

# Actor output Schema

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

Every review row this run produced, as JSON.

## `resultsCsv` (type: `string`):

The same rows as a spreadsheet-ready CSV.

# 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 = {
    "app": "com.spotify.music",
    "apps": [],
    "maxReviewsPerApp": 100,
    "keywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("eliai/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 = {
    "app": "com.spotify.music",
    "apps": [],
    "maxReviewsPerApp": 100,
    "keywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("eliai/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 '{
  "app": "com.spotify.music",
  "apps": [],
  "maxReviewsPerApp": 100,
  "keywords": []
}' |
apify call eliai/google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

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