# Google Play Reviews Scraper: Ratings, Replies & App Data (`green_trousers/google-play-reviews`) Actor

Scrape Google Play reviews with star ratings, developer replies, app version and thumbs-up, plus app details: installs, rating histogram, price, genre and developer contact. Paste Play Store URLs, package IDs or app names; filter by stars, date and country. Fast, no browser, $0.08 per 1,000 reviews.

- **URL**: https://apify.com/green_trousers/google-play-reviews.md
- **Developed by:** [Omar Prime](https://apify.com/green_trousers) (community)
- **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.

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: Ratings, Replies & App Data

**Get every Google Play review for any Android app, with star rating, developer reply, app version and thumbs-up count, plus the app's key stats, in clean JSON, CSV or Excel.** Paste Play Store links, package IDs or just app names. 1,000 reviews take a few seconds and cost **$0.08**.

### What you get

- **Reviews:** review text, stars (1 to 5), reviewer name, date, thumbs-up count, the app version the review was written on, and the developer's reply with its date.
- **App details (optional):** installs, average score, total ratings, the 1-to-5 star histogram, price and currency, genre, content rating, developer name, **developer email and website**, release date, last update, current version and "what's new" text.
- **Any app, any market:** 2-letter language and country codes (en/us, de/de, pt/br, ja/jp ...). Query several countries in one run; a review that shows up in several is returned once.
- **Filters that save money:** star range (complaints only? set 1 to 2), "since" date, newest / most relevant / rating sort, and a per-app cap. You only pay for reviews that pass your filters.

### Why this one

- **Cheapest per review.** $0.08 per 1,000 reviews, below the popular Google Play review scrapers ($0.10 to $0.15 per 1,000).
- **Fast and reliable.** No browser and no proxies needed: it reads the same data the Play Store website loads, 150 reviews per request, with polite pacing and automatic retries when Google throttles.
- **Incremental monitoring built in.** With Newest sort and a since-date like `1 day`, the run stops paging as soon as it reaches older reviews. A daily schedule costs cents.
- **Developer replies included.** See how (and how fast) a competitor answers complaints.
- **Names work too.** Type `duolingo` and it finds `com.duolingo` for you.

### Use cases

- **App Store Optimization (ASO):** mine the words real users use, track rating trends and the star histogram after each release.
- **Competitor analysis:** compare complaints, feature requests and reply rates across rival apps.
- **Sentiment analysis and AI pipelines:** feed clean review text into an LLM, a classifier or a vector database for RAG; every row has a stable `review_id` for de-duplication.
- **Product and support teams:** catch bugs by app version, route 1-star reviews to Slack, measure reply coverage.
- **Market research and lead generation:** collect installs, genres and developer contact emails for any list of apps.

### Input

| Field | What it does | Default |
|---|---|---|
| `apps` | Play Store URLs, package IDs (`com.spotify.music`) or app names | `["com.spotify.music"]` |
| `maxReviewsPerApp` | Max reviews per app after filters (0 = app details only) | 200 |
| `sort` | `newest`, `relevant` or `rating` | `newest` |
| `language` | Review language code | `en` |
| `countries` | One or more country codes | `["us"]` |
| `minRating` / `maxRating` | Star range to keep | 1 / 5 |
| `sinceDate` | `YYYY-MM-DD` or relative (`7 days`) | none |
| `includeAppDetails` | Add one `app` row per app | `true` |

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.spotify.music",
    "com.duolingo",
    "notion"
  ],
  "maxReviewsPerApp": 1000,
  "sort": "newest",
  "language": "en",
  "countries": ["us", "gb"],
  "minRating": 1,
  "maxRating": 5,
  "sinceDate": "30 days",
  "includeAppDetails": true
}
```

### Output

Every row has a `type` field: `"review"` or `"app"`. Reviews and app details live in the same dataset so one API call gets everything; filter on `type` (or pick the **Reviews** / **App details** view in the Console) when you want just one kind.

**Review row**

```json
{
  "type": "review",
  "app_id": "com.spotify.music",
  "app_name": "Spotify: Music and Podcasts",
  "review_id": "98d7e073-abb8-41a0-9de3-a07480b4195f",
  "user_name": "Nestory Fillipus",
  "rating": 1,
  "text": "Too many ad's and no offline music to play even after you were playing online.",
  "thumbs_up": 0,
  "app_version": "9.1.92.3058",
  "date": "2026-10-21T18:30:09.254Z",
  "reply_text": "Hey! We hear you and we'll pass your feedback along to the Ads team...",
  "reply_date": "2026-10-21T19:30:35.932Z",
  "language": "en",
  "country": "us",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=98d7e073-abb8-41a0-9de3-a07480b4195f"
}
```

**App row** (one per app, when `includeAppDetails` is on)

```json
{
  "type": "app",
  "app_id": "com.duolingo",
  "app_name": "Duolingo: Learn Languages",
  "installs": "500,000,000+",
  "min_installs": 500000000,
  "score": 4.746,
  "ratings_count": 51204950,
  "reviews_count": 966605,
  "histogram": { "1": 948962, "2": 342610, "3": 1164031, "4": 5869638, "5": 42879675 },
  "price": 0,
  "currency": "USD",
  "free": true,
  "offers_in_app_purchases": true,
  "genre": "Education",
  "content_rating": "Everyone",
  "developer": "Duolingo",
  "developer_email": "super-support@duolingo.com",
  "developer_website": "https://www.duolingo.com/help/support-request",
  "released": "May 29, 2013",
  "updated": "2026-10-20T17:46:10.000Z",
  "version": null,
  "recent_changes": "Our mascot owl, Duo, is trading in his usual diet of mice for bugs this week...",
  "language": "en",
  "country": "us",
  "url": "https://play.google.com/store/apps/details?id=com.duolingo&hl=en&gl=us"
}
```

`version: null` means the developer ships different versions per device ("Varies with device"). A `SUMMARY` record in the key-value store lists each input, the app it resolved to, how many reviews it returned, or why it failed.

### Pricing

Pay only for what you get:

| Event | Price | Example |
|---|---|---|
| Review | $0.00008 per review | 1,000 reviews = **$0.08** |
| App details | $0.001 per app | 10 apps = $0.01 |

Apps that aren't found cost nothing. A daily monitoring run of 5 apps with ~50 new reviews each costs about 2 cents. Set a spending limit on the run and the Actor stops cleanly when it is reached.

### FAQ

**How many reviews can I get?**
As many as Google Play serves for that language, which is usually tens of thousands for popular apps. Set `maxReviewsPerApp` as high as you need.

**Why did I get fewer reviews than the app's review count?**
Google Play only lists reviews with text in the selected language; star-only ratings and other languages are not included. Try another `language` code to get more.

**Do countries give different reviews?**
Mostly reviews are grouped by language, so `us` and `gb` overlap heavily. Duplicates are removed and you aren't charged twice.

**Can I get only negative reviews?**
Yes: `minRating: 1`, `maxRating: 2`. Single-star values and the 1-3 / 4-5 ranges are filtered by Google itself, so even rare ratings come back fast.

**How do I monitor new reviews every day?**
Schedule the Actor with `sort: "newest"` and `sinceDate: "1 day"`, then connect a webhook, Slack, Google Sheets or Make/Zapier integration.

**Does it need proxies or a login?**
No. It reads public Play Store data over plain HTTP with polite pacing and retries.

**Is scraping Google Play reviews legal?**
The reviews are public. You are responsible for how you use personal data such as reviewer names; aggregate or anonymize it when you can, and follow the laws that apply to you (for example GDPR).

**Is there an App Store (iOS) version?**
This Actor covers Google Play. Reach out through the Issues tab if you need iOS too.

# Actor input Schema

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

Play Store URLs (https://play.google.com/store/apps/details?id=com.spotify.music), package IDs (com.spotify.music) or app names ("duolingo" is resolved to the top Google Play search result).

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

Upper limit of reviews returned per app (after filters, across all countries). 0 = app details only.

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

Order Google Play returns reviews in. Use Newest with a since-date for incremental monitoring.

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

Two-letter language code of the reviews (en, de, fr, es, pt, ja, ...). Google Play groups reviews by language.

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

Two-letter country codes (us, gb, ca, in, ...). Each country is queried; a review that appears in several is returned once.

## `minRating` (type: `integer`):

Keep reviews with at least this many stars (1-5).

## `maxRating` (type: `integer`):

Keep reviews with at most this many stars (1-5). Set min 1 / max 2 for complaints only.

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

Only reviews posted on or after this date (YYYY-MM-DD or relative like "7 days"). With Newest sort, the run stops paging as soon as it reaches older reviews, so daily monitoring runs are fast and cheap.

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

Adds one row per app (type "app") with installs, score, ratings count, star histogram, price, genre, developer email and website, last update and version.

## Actor input object example

```json
{
  "apps": [
    "com.spotify.music"
  ],
  "maxReviewsPerApp": 200,
  "sort": "newest",
  "language": "en",
  "countries": [
    "us"
  ],
  "minRating": 1,
  "maxRating": 5,
  "includeAppDetails": true
}
```

# 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.spotify.music"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("green_trousers/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.spotify.music"] }

# Run the Actor and wait for it to finish
run = client.actor("green_trousers/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.spotify.music"
  ]
}' |
apify call green_trousers/google-play-reviews --silent --output-dataset

```

## MCP server setup

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