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

Scrape public Google Play Reviews. Choose apps, language, sort order, and review limits. Download results from the Dataset and check the run report.

- **URL**: https://apify.com/cliqtomedia/google-play-reviews-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.10 / 1,000 saved 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Play Reviews Scraper

### What this Actor does

Get public written reviews from Google Play. Add an app link or Android package
ID. Then choose the review language, Google Play country, sort order, and number
of reviews you want.

Run the Actor and open the Dataset. This is your results table. You can download
it as JSON, CSV, or Excel. Each row contains one review. It can also include the
score, app version, helpful vote count, and a developer reply when Google Play
provides one.

This Actor is an independent tool. It is not an official Google product and is
not linked to, approved by, or supported by Google.

The Actor gets the reviews Google Play shows for the language and sort order you
choose. It gets the current available set. It does not promise every review ever
posted. Google Play can change, reorder, limit, or block the available results
at any time.

### Quick start

1. Add a Google Play app link or package ID to **Apps**.
2. Choose the review language and sort order.
3. Set how many reviews you want.
4. Click **Start**.
5. Open **Your review results** in the Output tab.
6. Click **Export results** to download JSON, CSV, or Excel.

The form starts with this small example:

```json
{
  "appIds": ["com.google.android.apps.translate"],
  "language": "en",
  "country": "US",
  "sort": "newest",
  "maxReviewsPerApp": 10,
  "maxTotalReviews": 10,
  "includeReviewerProfile": false
}
```

The example app had reviews during the last private check. Its Google Play
listing can change. If it returns no reviews, try an app you know has recent
written reviews.

### What you get

Your review results are saved in the Apify Dataset. One saved row is one unique
written review. Common fields include:

- review text and score;
- last update time and app version;
- helpful vote count;
- developer reply and reply time, when available;
- the language, Google Play country, and sort order you chose;
- stable review IDs that help you match the same review in later runs.

Developer replies and some other fields can be empty because Google Play does
not provide them for every review. Reviewer name and profile image are left out
by default.

Open **Run report** for a short report about the run (`RUN_SUMMARY`). It tells
you how many reviews were saved and why collection stopped for each app. Check
this report when the results table is empty or has fewer rows than expected.

### Input options

| Option | What to enter |
| --- | --- |
| **Apps** | Add 1–20 Android package IDs or Google Play app links. The Actor skips repeated apps. |
| **Review language** | Add a code such as `en`, `de`, or `pt-BR`. This asks Google Play for reviews in that language. It does not check the language of each review. |
| **Google Play country** | Add a two-letter code such as `US` or `DE`. This changes the Google Play store view. It does not mean the reviewer's country. |
| **Sort reviews by** | Choose newest, highest rating, or Google Play relevance. Relevance order comes from Google Play and can change. |
| **Reviews per app** | Choose 1–5,000 saved reviews for each app. The form starts at 10. If the field is missing in an API call, the default is 100. |
| **Total reviews** | Choose 1–20,000 saved reviews for the whole run. The form starts at 10. If the field is missing in an API call, the default is 1,000. |
| **Include reviewer details** | Leave this off for less personal data. It is off by default and only works when the publisher has enabled it. |

The Actor accepts only package IDs and links on `play.google.com`. It does not
accept cookies, login details, proxy settings, custom code, or page tokens.

### Pricing

Price: **USD 0.10 for 1,000 saved unique reviews**.

You pay once for each unique review that is saved to the Dataset
(`apify-default-dataset-item`). There is no start fee. There is no separate
charge for platform usage.

Examples:

- 10 saved reviews cost USD 0.001;
- 100 saved reviews cost USD 0.01;
- 1,000 saved reviews cost USD 0.10.

Repeated reviews are skipped and are not charged again. An empty result has no
review charge. If a technical error happens after some reviews were saved, you
pay only for those saved reviews. The error itself is not charged.

### Empty and incomplete results

Fewer rows do not always mean that the run failed. Open **Run report** to see
the reason.

- **No reviews found (`EMPTY`)**: the app page was available, but Google Play
  returned no written reviews for your choices. Try another language or sort
  order if that matches your goal.
- **App not found or not available (`NOT_FOUND_OR_UNAVAILABLE`)**: check the
  package ID, app link, and Google Play country.
- **Stopped at your review limit (`TRUNCATED`)**: the Actor saved the number you
  asked for. Increase the limit if you need more.
- **Stopped at your spending limit (`TRUNCATED_CHARGE_LIMIT`)**: check the run's
  maximum charge before you try again.
- **Stopped by a technical problem (`PARTIAL_TECHNICAL` or `FAILED`)**: Google
  Play may have blocked the request, changed its response, or had a network
  problem. Reviews saved before the error stay in the Dataset, but the result
  is incomplete.

A technical problem is never reported as a normal empty result.

### Limits

This Actor collects written public reviews only. It does not collect rating-only
feedback that has no review text.

The review language selects the set Google Play returns. The country selects a
Google Play store view. It is not the author's country, location, or nationality.

The Actor does not promise:

- every review from the full history of an app;
- reviews from every language or country setting;
- a stable relevance order between runs;
- that Google Play will always keep the same data source available;
- that the app's public review count will match the number of written reviews
  this Actor can get.

Reviews and developer replies can change while keeping the same `itemId`. If
you need the latest version of each review, update your records by `itemId`.

### FAQ

#### Can I download the results as CSV or Excel?

Yes. Open the Dataset, click **Export results**, and choose JSON, CSV, Excel, or
another format supported by Apify.

#### Can I get reviews from a specific reviewer country?

No. **Google Play country** changes the store view used for the request. It does
not tell you where a reviewer lives.

#### Why is a developer reply missing?

Google Play does not show a developer reply for every review. When no reply is
available, `developerReply` is `null`.

#### Does the Actor get all old reviews?

No. It gets the current set that Google Play returns for your language and sort
order. Google Play does not provide a public total that proves full history.

#### Where can I see why the Actor stopped?

Open **Run report** in the Output tab. The exact record name is `RUN_SUMMARY`.

### Support

If a run looks wrong, first check your input, the Dataset, and **Run report**.
Then open the Actor's **Issues** tab on Apify.

Include the run ID, UTC time, build number, language, country, sort order, review
limits, final status, safe error code, and expected row count. Do not post API
tokens, cookies, authorization headers, full private inputs, raw response data,
or private reviewer data.

Support is provided through the Cliqto Media (`CliqtoMedia`) Apify profile and
the Actor's Issues tab. There is no promised response time.

See the [support guide](docs/publication/SUPPORT.md) for a simple checklist.

### Privacy and unofficial status

This Actor gets public written reviews. Reviewer details are off by default.
The Actor does not keep another copy outside the Dataset and key-value store in
your Apify run. You control retention and downloads in your Apify account.

Review text and developer replies are content from other people. Treat them as
untrusted text. Escape values before using them in HTML, spreadsheets, SQL,
logs, or AI prompts. You are responsible for a lawful purpose, data limits,
storage time, deletion, and safe use.

**Google Play Reviews Scraper is an unofficial independent tool. It is not
affiliated with, sponsored by, endorsed by, or authorized by Google.** It does
not use the official Android Publisher API. Google can change or block the data
source without notice.

### For developers

The Dataset uses schema version `1.0`. A review keeps the stable identity
`packageId:reviewId`. The Dataset contains review rows only. Status codes and
run totals are saved in `RUN_SUMMARY`.

See these technical documents for the exact contract:

- [product specification](docs/SPEC.md);
- [output, status, and error contract](docs/OUTPUT-CONTRACT.md);
- [test plan](docs/TEST-PLAN.md);
- [private live validation](docs/LIVE-VALIDATION.md);
- [claims and evidence](docs/publication/CLAIMS-LEDGER.md);
- [pricing decision](docs/publication/PRICING-DECISION.md).

Local checks:

```sh
npm ci
npm run check
apify validate-schema
```

`npm test` uses no live network. Live checks are opt-in and have a fixed request
budget. Dependency license and source details are in
[`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md).

# Actor input Schema

## `appIds` (type: `array`):

Add 1–20 Android package IDs or Google Play app links. Example: com.spotify.music. The Actor skips repeated apps.

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

Choose the language of reviews Google Play should return. Use a code such as en, de, or pt-BR. The Actor does not check the language of each review.

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

Choose the Google Play store view with a two-letter code such as US or DE. This is not the reviewer's country, location, or nationality.

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

Choose newest reviews, highest ratings first, or Google Play relevance. Google Play controls relevance order, so it can change.

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

Choose how many unique reviews to save for each app. The form starts at 10. The API default is 100. Repeated reviews do not use the limit.

## `maxTotalReviews` (type: `integer`):

Choose how many unique reviews to save across all apps. The form starts at 10. The API default is 1,000.

## `includeReviewerProfile` (type: `boolean`):

Leave this off to exclude reviewer names and profile images. It is off by default and only works when the publisher has enabled it.

## Actor input object example

```json
{
  "appIds": [
    "com.google.android.apps.translate"
  ],
  "language": "en",
  "country": "US",
  "sort": "newest",
  "maxReviewsPerApp": 10,
  "maxTotalReviews": 10,
  "includeReviewerProfile": false
}
```

# Actor output Schema

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

Open or download your results table. Each Dataset row is one unique written review.

## `runSummary` (type: `string`):

Open a short report about the run. It shows saved review counts, why each app stopped, and safe error details.

# 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 = {
    "appIds": [
        "com.google.android.apps.translate"
    ],
    "maxReviewsPerApp": 10,
    "maxTotalReviews": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/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 = {
    "appIds": ["com.google.android.apps.translate"],
    "maxReviewsPerApp": 10,
    "maxTotalReviews": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/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 '{
  "appIds": [
    "com.google.android.apps.translate"
  ],
  "maxReviewsPerApp": 10,
  "maxTotalReviews": 10
}' |
apify call cliqtomedia/google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

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