# Google Play Reviews Scraper — Full History, Replies & Filters (`steadyscrape/google-play-reviews-scraper`) Actor

Scrape all Google Play Store reviews of any Android app: rating, text, date, likes, app version, developer replies and quality criteria. Filter by stars, date, language and country, or monitor apps for new reviews only. No login, no API key.

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

## Pricing

$0.05 / 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

### What does Google Play Reviews Scraper do?

**Google Play Reviews Scraper** extracts reviews of any **Android app on the Google Play Store** — no Google account, no API key and no developer access needed. Paste package names or Play Store links and get a clean dataset with each review's **star rating, text, date, helpful votes, app version, the developer's reply** and the **app quality criteria** reviewers answered.

Unlike the official Google Play Developer API — which only returns the **last 7 days** of reviews and only for apps you own — this Actor reads the **full public review history of any app**, the same reviews anyone can see on the Play Store. No headless browser, so it is **fast and cheap**.

### Why use it?

- 📉 **Find what users hate** — pull every 1- and 2-star review of your app or a competitor's and spot the recurring complaints.
- 🔎 **Competitor research** — see what people praise and miss in competing apps before you build a feature.
- 💬 **Support & reply tracking** — check which reviews got a developer reply and how fast.
- 🚀 **Release monitoring** — group reviews by app version to see if an update broke something.
- 🤖 **AI & analytics pipelines** — feed reviews into sentiment analysis, topic clustering, LLMs or dashboards.

### Features

- ✅ **Full history** — pages through all reviews, not just the latest ones.
- ✅ **Developer replies** — reply text, author and date.
- ✅ **Star filter** — only 1-star, only 5-star, or any combination.
- ✅ **Date range** — only reviews between two dates; with *Newest* order paging stops as soon as older reviews start.
- ✅ **Language & country** — read the store of any country, preferring reviews in a given language.
- ✅ **Monitoring mode** — "Only new reviews since the last run" remembers where you left off, so scheduled runs never charge twice for the same review.
- ✅ **Many apps per run** — an app that doesn't exist is reported and skipped, and costs nothing.
- ✅ **Respects your budget** — stops exactly when your maximum cost per run is reached.

### How to scrape Google Play reviews

1. Click **Try for free**.
2. Add one or more apps: `com.duolingo` or `https://play.google.com/store/apps/details?id=com.duolingo`.
3. Optionally choose the order, star ratings, date range, language and country.
4. Click **Start** and download your data as JSON, CSV, Excel or HTML, or get it through the Apify API.

To **monitor** apps, turn on **Only new reviews since the last run** and add a [schedule](https://docs.apify.com/platform/schedules) (for example daily).

### Input example

```json
{
    "apps": ["com.duolingo", "https://play.google.com/store/apps/details?id=com.booking"],
    "maxReviewsPerApp": 1000,
    "sort": "newest",
    "language": "en",
    "country": "us",
    "stars": [1, 2],
    "dateFrom": "2026-01-01",
    "onlyNewReviews": false
}
```

### Output example

Each review is one item in the dataset:

```json
{
    "appId": "com.booking",
    "reviewId": "767e58c2-f7a9-41a3-a00c-d735ccc22292",
    "url": "https://play.google.com/store/apps/details?id=com.booking&reviewId=767e58c2-f7a9-41a3-a00c-d735ccc22292",
    "userName": "Faye Breckon",
    "userImage": "https://play-lh.googleusercontent.com/a/…",
    "rating": 1,
    "text": "im pressing update app and nothings happening",
    "date": "2026-09-14T18:36:33.651Z",
    "thumbsUp": 0,
    "appVersion": null,
    "developerReply": {
        "author": "Booking.com Hotels & Vacation Rentals",
        "text": "Hello, we are sorry to hear that your experience was not satisfactory. …",
        "date": "2026-09-14T20:44:18.789Z"
    },
    "criteria": [
        { "name": "vaf_app_quality_ads_frequency", "value": 2 },
        { "name": "vaf_app_quality_usability", "value": 2 }
    ],
    "language": "en",
    "country": "us",
    "scrapedAt": "2026-09-16T15:02:11.204Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `appId`, `reviewId`, `url` | Package name, review id and a link to the review on the Play Store |
| `rating` | Stars, 1 to 5 |
| `text` | Review text |
| `date` | When the review was written or last edited, ISO 8601 in UTC |
| `thumbsUp` | How many people marked the review as helpful |
| `appVersion` | App version the reviewer had installed (`null` when Google Play doesn't show it) |
| `developerReply` | `author`, `text` and `date` of the developer's answer, or `null` |
| `criteria` | App quality questions the reviewer answered (ads, usability, performance…), as returned by Google Play |
| `userName`, `userImage` | Public name and avatar of the reviewer |
| `language`, `country` | The language and country requested for this review |

### How much does it cost?

You pay only for the reviews you get — see the pricing tab for the current price per review. Apps that don't exist cost nothing, and the Actor stops as soon as it reaches the maximum cost you set for the run.

### Limitations

- Google Play only shows **reviews with text**; star-only ratings are not included (they aren't public).
- The **language** setting is a preference: when an app has few reviews in that language, Google Play fills in with reviews in other languages.
- With **Most relevant** or **Highest rating** order, date filters are applied but paging can't stop early, so runs over apps with huge histories take longer. Use **Newest** for date ranges.
- The average rating and total review count of the app are not included.

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

This Actor only reads reviews that are publicly visible on the Google Play Store, without logging in. Reviews contain the reviewers' public names and avatars, which can be personal data protected by GDPR and similar laws. Make sure you have a legitimate reason to collect them, and consult a lawyer if unsure. Read more in Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Feedback

Found an app that doesn't work or need another field? Open an issue in the **Issues** tab — they are answered quickly.

# Actor input Schema

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

Android apps to scrape. Use the package name (<code>com.duolingo</code>) or the Play Store link (<code>https://play.google.com/store/apps/details?id=com.duolingo</code>).

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

The run stops for an app when this many reviews are saved or the app has no more reviews.

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

Order in which Google Play returns reviews. Date filters stop paging early only with <b>Newest</b>.

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

Language of the reviews to prefer, e.g. <code>en</code>, <code>es</code>, <code>pt-BR</code>. Google Play mixes in other languages when there are few reviews in this one.

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

Two-letter country code of the Play Store to read, e.g. <code>us</code>, <code>gb</code>, <code>br</code>.

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

For example <code>\[1, 2]</code> to get only negative reviews. Leave empty for all ratings. With several ratings, reviews are collected one rating at a time.

## `dateFrom` (type: `string`):

Only reviews written on or after this date (UTC). Format YYYY-MM-DD or a full ISO timestamp.

## `dateTo` (type: `string`):

Only reviews written on or before this date (UTC). A plain date includes the whole day.

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

For scheduled monitoring: each run returns only reviews newer than the newest one returned by your previous run for the same app, language and country, so you never pay twice for the same review. Always uses the Newest order.

## Actor input object example

```json
{
  "apps": [
    "com.duolingo"
  ],
  "maxReviewsPerApp": 50,
  "sort": "newest",
  "language": "en",
  "country": "us",
  "onlyNewReviews": false
}
```

# Actor output Schema

## `reviews` (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.duolingo"
    ],
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/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.duolingo"],
    "maxReviewsPerApp": 50,
}

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

```

## MCP server setup

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