# Google Play Reviews Scraper: Device, Star Filter & Replies (`luzivanlt/google-play-reviews-scraper`) Actor

Google Play reviews with the device each was written on, a star filter and the developer's reply. $0.10 per 1,000 reviews. Phone, tablet, TV, watch, car. Stars, text, date, app version.

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

## Pricing

from $0.07 / 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: Device, Star Filter & Replies

Get the reviews of an Android app on Google Play with the device each one was
written on (phone, tablet, desktop, TV, watch or car), the reviewer's account
id, the stars, text, date, app version, helpful votes and the developer's
reply. Filter by star rating, and choose the language, the country and the
order. No Google account, login or cookies needed.

Tested daily. Latest checks: 6,000 reviews of three apps in about 3 minutes;
one app's whole Vietnamese review list, 1,172 reviews, read to its end.

### What does this Actor do?

You give it links to Google Play app pages (or just package names like
`com.duolingo`). For each app it reads the written reviews in the language
and country you choose, newest first (or by relevance or rating), and saves
one row per review until it reaches your limit or the end of the list.

Each review comes with:

- the star rating and the review text
- the exact date and time it was written
- the device it was written on: phone, tablet, desktop, TV, watch, car or XR
  headset
- the reviewer's display name, account id and profile picture
- the app version the reviewer was using
- how many people found it helpful
- the developer's reply and its date, if there is one

### Why use it?

- **Know what users say.** Track complaints and praise on your own app, or a
  competitor's, in every language you ship in.
- **Catch problems after a release.** Filter on 1- and 2-star reviews, sort by
  newest and run it daily: the app version on each review shows which release
  broke something, and the device shows whether it is the phone, tablet or
  desktop build.
- **Check your support.** See which reviews got a developer reply, and when.
- **Use the data anywhere.** Download as JSON, CSV or Excel, or send it to
  your own tools through Apify's API and integrations.

### How to use it

1. Paste one or more app links into **App links**.
2. Set the **Language** and **Country** of the reviews you want.
3. Optionally, set **Max reviews per app**, the **Order** and a **Star rating**.
4. Click **Start**. When the run ends, open the **Output** tab to view the
   reviews or download them.

Run it with no input to see a sample: up to 50 US reviews each of Duolingo and
Spotify, charged as usual.

#### Apps that work

Any app page on Google Play:
`https://play.google.com/store/apps/details?id=com.duolingo`. Extra
parameters in the link (`&hl=de&gl=DE`) are fine but ignored: the **Language**
and **Country** fields decide which reviews are read. A package name on its
own (`com.duolingo`) works too. Search, developer and category pages are not
supported, and neither are games' or apps' reviews on other app stores.

### Input

| Field                                        | What it does                                                  | Default  |
| -------------------------------------------- | ------------------------------------------------------------- | -------- |
| **App links** (`startUrls`)                  | The apps to read. Required.                                   | —        |
| **Language** (`language`)                    | The reviews' language: `en`, `de`, `vi`, `pt-BR`, …           | `en`     |
| **Country** (`country`)                      | The Google Play country: `us`, `gb`, `de`, `vn`, …            | `us`     |
| **Max reviews per app** (`maxReviewsPerApp`) | Stop reading an app after this many reviews, from 1 to 10,000 | `100`    |
| **Order** (`sortBy`)                         | `newest`, `relevance` or `rating`                             | `newest` |
| **Star rating** (`starRating`)               | `all`, or `1` to `5` for only reviews with that many stars    | `all`    |

Example input:

```json
{
  "startUrls": [{ "url": "https://play.google.com/store/apps/details?id=com.duolingo" }],
  "language": "en",
  "country": "us",
  "maxReviewsPerApp": 500,
  "sortBy": "newest",
  "starRating": "all"
}
```

### Output

One row per review. An example, with made-up values:

```json
{
  "review_id": "9a1c2b3d-0000-4000-8000-000000000001",
  "app_id": "com.duolingo",
  "app_url": "https://play.google.com/store/apps/details?id=com.duolingo",
  "language": "en",
  "country": "us",
  "reviewer_name": "Jane Doe",
  "reviewer_id": "100000000000000000001",
  "reviewer_avatar": "https://play-lh.googleusercontent.com/…",
  "rating": 4,
  "review_title": null,
  "review_text": "Great for daily practice, but the hearts system is annoying.",
  "review_date": "2026-10-12T06:25:53Z",
  "thumbs_up": 12,
  "app_version": "6.12.3",
  "device": "phone",
  "review_criteria": [{ "criteria": "vaf_example_easy_to_use", "answer": 1, "stars": null }],
  "developer_reply": "Thanks for the feedback! We're always improving.",
  "developer_reply_author": "Example Apps Ltd",
  "developer_reply_date": "2026-10-13T09:00:00Z"
}
```

| Field                    | What it holds                                                                                                                                                                                                       |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `review_id`              | Google Play's id for the review                                                                                                                                                                                     |
| `app_id`                 | The app's package name                                                                                                                                                                                              |
| `app_url`                | The app's Google Play page                                                                                                                                                                                          |
| `language`, `country`    | The language and country the review was read in                                                                                                                                                                     |
| `reviewer_name`          | The reviewer's display name                                                                                                                                                                                         |
| `reviewer_id`            | The reviewer's Google account id                                                                                                                                                                                    |
| `reviewer_avatar`        | Link to the reviewer's profile picture                                                                                                                                                                              |
| `rating`                 | Stars, 1 to 5                                                                                                                                                                                                       |
| `review_title`           | The review's title, when it has one (a few games ask for one; usually empty)                                                                                                                                        |
| `review_text`            | The review's text. Rarely empty: a review with stars only                                                                                                                                                           |
| `review_date`            | When it was written, in UTC (`YYYY-MM-DDTHH:MM:SSZ`)                                                                                                                                                                |
| `thumbs_up`              | How many people found the review helpful                                                                                                                                                                            |
| `app_version`            | The app version the reviewer was using. Empty when Google Play does not say                                                                                                                                         |
| `device`                 | The device it was written on: `phone`, `tablet`, `desktop`, `tv`, `watch`, `car` or `xr_headset`. Empty for a device Google Play does not name                                                                      |
| `review_criteria`        | The reviewer's answers to the questions Google Play asks about some apps (a game's gameplay or graphics, say): Google Play's name for each question, the option picked as a number, or the stars given. Often empty |
| `developer_reply`        | The developer's reply, if any                                                                                                                                                                                       |
| `developer_reply_author` | The name the developer's reply is signed with                                                                                                                                                                       |
| `developer_reply_date`   | When the developer replied, in UTC                                                                                                                                                                                  |

Not included: the app's details (title, installs, overall rating).

### How much does it cost?

No surcharges and no paid options; an item that fails is not charged.

You pay for what you get:

- **$0.10 per 1,000 reviews** ($0.0001 a review). Each review is charged once per run.
- No start fee.

So 2,000 reviews of one app cost $0.20. If you set a maximum cost for a run, the Actor stops when it reaches it and keeps every review saved so far.

### How long does a run take?

Expect about 1,500–2,000 reviews a minute. In testing, 6,000 reviews of three
apps took about 3 minutes.

### Good to know

- **Each language is a separate list.** Google Play shows an app's reviews
  per language: reading `en` returns the English reviews only. To cover more
  languages, run once per language.
- **The review count on the app page is larger than what you get.** That
  number counts star ratings too; ratings without text have nothing to read.
- **Language and country.** Tested with English in the US and in Singapore and
  with Vietnamese in Vietnam; other codes are passed to Google Play as they
  are.
- **Up to 10,000 reviews per app.** The largest run tested read 2,000 reviews
  from each of three apps.
- **Check your links first.** A link that is not a Google Play app link, or a
  language or country code that is not one, stops the run before anything is
  read, and the message names it.
- **One app that cannot be read does not stop the run.** The other apps carry
  on, and the run's status lists the apps that could not be read. The run
  fails only when no app could be read.
- **No reviews is not an error.** An app with no written reviews in that
  language saves nothing. Google Play answers a package name that does not
  exist the same way, so a mistyped package name also saves nothing rather
  than failing: check the link opens the app you meant.
- **Running it daily?** Sort by newest and remove repeats by `review_id`.

### More Actors from us

- [AliExpress Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/aliexpress-products-scraper): Every product of an AliExpress search to its last page, with exact sold counts and ratings.
- [Amazon Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/amazon-products-scraper): Every product on Amazon's search pages to the last page, sponsored marked, with monthly sales.
- [App Store Reviews Scraper: All Reviews, Not 500](https://apify.com/luzivanlt/app-store-reviews-scraper): Every written App Store review of an app, not just the newest 500.
- [Facebook Ads Library Scraper: Meta Ads by Keyword or Page](https://apify.com/luzivanlt/facebook-ads-library-scraper): Meta Ad Library ads by keyword, Page or Ad Library link, with text, images, videos and dates.
- [Facebook Comments Scraper: With Replies](https://apify.com/luzivanlt/facebook-comments-scraper): Comments and replies from public Facebook posts, reels and videos, with reactions by type.
- [Facebook Pages Scraper: Contacts, Followers & Ratings](https://apify.com/luzivanlt/facebook-pages-scraper): Facebook Page details from links: exact follower count, phone, email, address, websites.

### Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a
longer run, start it with `POST /v2/acts/…/runs` and read its dataset):

```text
POST https://api.apify.com/v2/acts/luzivanlt~google-play-reviews-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
```

With the sample input as its JSON body:

```json
{
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.duolingo"
    },
    {
      "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
    }
  ],
  "language": "en",
  "country": "us",
  "maxReviewsPerApp": 50,
  "sortBy": "newest",
  "starRating": "all"
}
```

Its inputs, in the order of the input form:

| Input                                    | What it takes                                                                                                                                                                                  | Default    |
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| `startUrls` (App links)                  | Links to Google Play app pages (https://play.google.com/store/apps/details?id=…), or package names such as com.duolingo, e.g. https://play.google.com/store/apps/details?id=com.spotify.music. | —          |
| `language` (Language)                    | The language of the reviews to read, as a code: en, de, vi, pt-BR, … Google Play shows each language's reviews separately, so a run reads one language; run once per language for more.        | `"en"`     |
| `country` (Country)                      | The Google Play country, as a two-letter code: us, gb, de, vn, … It applies to every app in the run, whatever a link says.                                                                     | `"us"`     |
| `maxReviewsPerApp` (Max reviews per app) | Stop reading an app after this many reviews, from 1 to 10,000; default 100 (the form starts at 50).                                                                                            | `100`      |
| `sortBy` (Order)                         | Newest reviews first, Google Play's own relevance order, or by rating.                                                                                                                         | `"newest"` |
| `starRating` (Star rating)               | Only reviews with this many stars, or all reviews: all, 1, 2, 3, 4 or 5; default all.                                                                                                          | `"all"`    |

Apify's MCP server, `https://mcp.apify.com`, lists it as `luzivanlt/google-play-reviews-scraper`. To give an
AI agent this Actor as a tool, add the server to the agent's MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=luzivanlt/google-play-reviews-scraper"
    }
  }
}
```

The client signs in with OAuth, or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }`.

Charged per review delivered; the sample input above costs at most $0.01.

### FAQ

**Do I need a Google account or cookies?**
No. The Actor reads the reviews anyone can see on the app's page.

**Can I get reviews from the Apple App Store?**
Not with this Actor: it reads Google Play only.

**Can I run it from my own code, on a schedule, or with other apps?**
Yes. Like any Apify Actor, you can start it through the Apify API, run it on a
schedule, and connect it to other apps with Apify's integrations and webhooks.

### Is it legal to scrape Google Play?

This Actor reads only reviews that anyone can see without logging in. The
results include reviewers' display names, account ids and profile pictures,
which can be personal data protected by laws such as the GDPR. Only collect personal data
when you have a legitimate reason to, and check Google Play's terms and the
laws that apply to you. If you are unsure, ask a lawyer.

### Support

Found a problem or missing a feature? Open an issue on the **Issues** tab and
include the run's link.

***

This Actor is not affiliated with, endorsed by or sponsored by Google.

# Changelog

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

# Actor input Schema

## `startUrls` (type: `array`):

Links to Google Play app pages (https://play.google.com/store/apps/details?id=…), or package names such as com.duolingo, e.g. https://play.google.com/store/apps/details?id=com.spotify.music. Required. Extra parameters (\&hl=de\&gl=DE) are ignored: Language and Country decide. Search, developer and category pages are refused. An app given twice is read once.

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

The language of the reviews to read, as a code: en, de, vi, pt-BR, … Google Play shows each language's reviews separately, so a run reads one language; run once per language for more. Default en. e.g. vi for Vietnamese reviews. pt_BR is read as pt-BR.

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

The Google Play country, as a two-letter code: us, gb, de, vn, … It applies to every app in the run, whatever a link says. Default us. e.g. vn with the language vi. Tested in the US, Singapore and Vietnam; other codes are passed to Google Play as they are.

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

Stop reading an app after this many reviews, from 1 to 10,000; default 100 (the form starts at 50). Each review is charged once per run ($0.10 per 1,000 reviews), so this caps each app's cost. Example: 2,000 reviews of one app cost at most $0.20.

## `sortBy` (type: `string`):

Newest reviews first, Google Play's own relevance order, or by rating. With Max reviews per app, the order decides which reviews are kept. e.g. newest (the default). Running it daily? Sort by newest and remove repeats by review_id.

## `starRating` (type: `string`):

Only reviews with this many stars, or all reviews: all, 1, 2, 3, 4 or 5; default all. It applies to every app in the run. e.g. 1 for one-star reviews only. No reviews is not an error: an app with none to read saves nothing.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.duolingo"
    },
    {
      "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
    }
  ],
  "language": "en",
  "country": "us",
  "maxReviewsPerApp": 50,
  "sortBy": "newest",
  "starRating": "all"
}
```

# Actor output Schema

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

Every review the run saved, one row per review.

## `allFields` (type: `string`):

The same rows with every field.

# 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 = {
    "startUrls": [
        {
            "url": "https://play.google.com/store/apps/details?id=com.duolingo"
        },
        {
            "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
        }
    ],
    "language": "en",
    "country": "us",
    "maxReviewsPerApp": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/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 = {
    "startUrls": [
        { "url": "https://play.google.com/store/apps/details?id=com.duolingo" },
        { "url": "https://play.google.com/store/apps/details?id=com.spotify.music" },
    ],
    "language": "en",
    "country": "us",
    "maxReviewsPerApp": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/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 '{
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.duolingo"
    },
    {
      "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
    }
  ],
  "language": "en",
  "country": "us",
  "maxReviewsPerApp": 50
}' |
apify call luzivanlt/google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

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