# Google Play Reviews Scraper: Ratings & Metadata (`kyungminlee/google-play-app-reviews-scraper`) Actor

Newest public reviews and store metadata for any Android app by package ID, no login or Play Console. Apps: title, developer, rating, review count, downloads, content rating, screenshots. Reviews: stars, text, date, app version, developer reply. JSON/CSV, API or scheduled review monitoring.

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

## Pricing

from $0.28 / 1,000 public 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?

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

### What does Google Play Reviews Scraper do?

**Google Play Reviews Scraper** collects the newest public reviews and the public store listing of any Android app from its package ID (for example `com.instagram.android`) — no Google account, Play Console access or browser. Review text is public, but reviewer names and avatars are deliberately not collected and obvious contact details are masked.

App records include `title`, `developer`, `developerUrl`, `rating`, `reviewCountText`, `downloadsText`, `contentRating`, `containsAds`, `summary`, `iconUrl` and `screenshots`; review records include `reviewId`, `score`, `content`, `createdAt`, `thumbsUpCount`, `appVersion`, `developerReply` and `developerRepliedAt`. Export JSON/CSV, call the API, or schedule the Actor to watch your own or a competitor's app for new 1-star reviews.

### Why use Google Play Reviews Scraper?

Package IDs are stable identifiers that make app research much easier to repeat than manually copying a store page. Use the results to monitor a competitor's public listing, compare ratings and download labels across markets, build a watch list, or analyse themes in a bounded sample of published feedback. The Actor separates app-level fields from review-level fields with a `type` value, so one dataset can support both a listing dashboard and a review analysis workflow.

### How to scrape Google Play reviews

For each requested package ID, the Actor requests the public Google Play details page and parses visible metadata. When reviews are requested, it uses Google Play's public page-data request to fetch small review pages and follows its opaque continuation token until it reaches the requested count or there are no more results. Google can rate-limit automated traffic, so Apify Proxy is enabled by default and the Actor rotates proxy sessions on longer runs. Failed apps or review pages are logged and never charged. The page-data format is undocumented and can change; retry later if Google changes it.

### Input

`appIds` is a required list of Android package IDs. `country` selects the two-letter storefront country, while `language` selects the display language. `maxReviewsPerApp` controls the maximum number of newest public review records per successful app; set it to zero when you only need app metadata. Keep the provided proxy configuration enabled for reliable Google traffic.

### Output

The dataset contains two kinds of rows. An `app` row is emitted once for every app whose public page was parsed. A `review` row is emitted for every public review successfully collected. Review rows reference their app through `appId`, `appTitle`, and `appUrl`. The `SUMMARY` key-value record reports successful and failed app/review counts for the run.

### Data fields

App rows can include the package ID, Google Play URL, title, summary and description, developer and developer links, icon and screenshots, rating, visible review-count text, download-count text, content rating, advertising label, country, language, and scrape time. Review rows include an opaque review ID, star score, public review text, review timestamp, helpful-vote count, app version, developer reply and reply time when present. The Actor intentionally excludes reviewer display names and avatars. It also masks obvious email addresses and telephone-number formats found in review text.

### Pricing

This Actor uses pay per event: one `app` event for each successfully saved app record and one `review` event for each successfully saved review record. The exact current prices appear on the Apify Actor page. Your run's maximum charge setting is checked before each event, so a budget limit can stop additional output without charging failed targets. Metadata-only runs incur app events but no review events.

### Tips

Start with one package ID and 20 reviews to confirm the selected country and language. Use a modest review limit when monitoring many apps, then increase it only for apps that need deeper analysis. Treat review text as user-generated public content; do not use it to identify or contact people. Store package IDs rather than mutable marketing URLs in your own workflow. Google may return different visible text by country, language, device context, or over time, so save `scrapedAt` with your analysis.

### FAQ

**Does this scrape private or logged-in data?** No. It reads only public Google Play pages and public review responses without authentication.

**Why are there fewer reviews than requested?** The app may have no more public records, Google may temporarily rate-limit the request, or the run's charge limit may have been reached.

**Can I use an app URL instead of a package ID?** Use the `id` parameter from its Google Play URL, such as `com.instagram.android`; package IDs avoid URL parsing ambiguity.

**Is the output official Google data?** No. This is an unofficial extraction of publicly displayed information and should be validated before making important decisions.

# Actor input Schema

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

Android application package IDs to collect, such as com.instagram.android. Each valid ID produces one public app metadata record.

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

Two-letter country code used for the Google Play storefront, such as US, GB, KR, or DE.

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

Google Play interface language code used for app text and reviews, such as en, ko, or de.

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

Maximum newest public reviews to save for each successful app. Set 0 to collect app metadata only.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Enabled by default because Google can rate-limit data-center traffic; the Actor rotates proxy sessions during longer runs.

## Actor input object example

```json
{
  "appIds": [
    "com.instagram.android"
  ],
  "country": "US",
  "language": "en",
  "maxReviewsPerApp": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "appIds": [
        "com.instagram.android"
    ],
    "country": "US",
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kyungminlee/google-play-app-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.instagram.android"],
    "country": "US",
    "language": "en",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kyungminlee/google-play-app-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.instagram.android"
  ],
  "country": "US",
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kyungminlee/google-play-app-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kyungminlee/google-play-app-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/QncHsTSikYI58Lx3H/builds/XIaQnKvFcJQ3FC9g6/openapi.json
