# Google Play Reviews Scraper – Apps, Search & Top Charts (`openharvest/google-play-scraper`) Actor

Google Play reviews scraper: extract Google Play Store app reviews, app details, keyword search results, developer apps and top charts (free, paid, grossing) for any country and language. Fast HTTP-only, no browser, pay only per result.

- **URL**: https://apify.com/openharvest/google-play-scraper.md
- **Developed by:** [Enes Bulanık](https://apify.com/openharvest) (community)
- **Categories:** Marketing, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 app results

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 – Apps, Search & Top Charts

Google Play reviews scraper: extract Google Play Store app reviews, app details, keyword search results, developer apps and top charts (free, paid, grossing) for any country and language. Fast HTTP-only, no browser, pay only per result.

It talks to the same internal endpoints the Play Store website uses (no headless browser), so runs are **fast, cheap and stable**. Example: 6,000 reviews in about 20 seconds, a 200-app top chart in a single request.

- ✅ 5 modes in one Actor: `appDetails`, `reviews`, `search`, `developer`, `topCharts`
- ✅ Any country (`gl`) and language (`hl`): prices, charts and reviews are localized
- ✅ Thousands of reviews per app with automatic pagination, sorting (newest / relevance / rating) and star-rating filter
- ✅ Automatic retries with exponential backoff, polite concurrency, null-safe parsing
- ✅ Clean, flat JSON / CSV / Excel output
- ✅ Pay only for results: **$1 per 1,000 apps**, **$0.25 per 1,000 reviews**

### What can you use the Google Play Scraper for?

- **App Store Optimization (ASO):** track ratings, installs, rankings, descriptions and update frequency of your app and your competitors.
- **Review & sentiment analysis:** export thousands of reviews to find bugs, feature requests and complaints. Feed them into an LLM or BI tool.
- **Market research:** find every app for a keyword (e.g. `vpn`, `habit tracker`) and compare pricing, downloads and ratings.
- **Top charts monitoring:** schedule daily runs of Top free / Top paid / Top grossing per category and country.
- **Lead generation:** list all apps of a developer, with developer website and support email (publicly listed on Google Play).
- **Academic research and data journalism** on mobile app ecosystems.

### How to use it

1. Click **Try for free**.
2. Pick **What to scrape** (mode).
3. Fill in the field for that mode (app IDs, keywords, developers, or chart + category).
4. Optionally set country, language and limits.
5. Click **Start** and download your data as JSON, CSV, Excel or via API.

#### Modes and their inputs

| Mode | Required input | What you get |
|---|---|---|
| `appDetails` | `appIds` (package names or Play URLs) | Full app details. Optionally reviews too (`includeReviews`). |
| `reviews` | `appIds` | Up to `maxReviews` reviews per app. Sort and star filter available. |
| `search` | `searchTerms` | Apps matching each keyword (rank included). |
| `developer` | `developerIds` (name, numeric ID or URL) | All apps published by the developer. |
| `topCharts` | `collection` + `category` | Top free / paid / grossing chart (up to 200 apps). |

Tip: in `search`, `developer` and `topCharts` modes, enable **Fetch full app details** (`fullDetails`) to get the complete data set (description, ratings count, histogram, release date, version, developer contacts...) for each app.

### Input example

```json
{
    "mode": "reviews",
    "appIds": [
        "com.spotify.music",
        "https://play.google.com/store/apps/details?id=com.whatsapp"
    ],
    "maxReviews": 500,
    "reviewsSort": "newest",
    "reviewsRating": "all",
    "country": "us",
    "language": "en"
}
```

More examples:

```json
{ "mode": "search", "searchTerms": ["vpn", "photo editor"], "maxItems": 30, "country": "gb" }
```

```json
{ "mode": "topCharts", "collection": "TOP_GROSSING", "category": "GAME", "maxItems": 100, "country": "de", "language": "de" }
```

```json
{ "mode": "developer", "developerIds": ["Spotify AB", "5700313618786177705"], "maxItems": 200 }
```

### Output example

Every item has a `type` field: `"app"` or `"review"`. Real output from the default input (shortened):

**App item**

```json
{
  "type": "app",
  "appId": "com.spotify.music",
  "title": "Spotify: Music and Podcasts",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us",
  "summary": "Listen to songs, play podcasts, create playlists and discover music you'll love",
  "description": "With the Spotify music and podcast app, you can play millions of songs, albums and original podcasts for free...",
  "developer": "Spotify AB",
  "developerId": "Spotify AB",
  "developerInternalId": "6523013212965523194",
  "developerEmail": "support@spotify.com",
  "developerWebsite": "https://www.spotify.com",
  "privacyPolicy": "https://www.spotify.com/legal/privacy-policy/",
  "score": 4.347,
  "scoreText": "4.3",
  "ratings": 36444453,
  "reviews": 1855424,
  "histogram": { "1": 3715877, "2": 1064404, "3": 1312654, "4": 3101163, "5": 27250333 },
  "installs": "1,000,000,000+",
  "minInstalls": 1000000000,
  "maxInstalls": 3153222022,
  "price": 0,
  "currency": "USD",
  "priceText": "Free",
  "free": true,
  "offersIAP": true,
  "IAPRange": "$4.99 - $203.88 per item",
  "adSupported": true,
  "genre": "Music & Audio",
  "genreId": "MUSIC_AND_AUDIO",
  "icon": "https://play-lh.googleusercontent.com/IzQgYCcnCFCD08GR-3bdtcT8xzOvrNkC84avGT5CwTX2VIqmTmKKJcP_Cd4JoBOdmCMlTndlOzV6hrthg2fOWA",
  "screenshots": ["https://play-lh.googleusercontent.com/c1jnjL-9CIFlwlTMX3xNyeo8aEH39sNuC5zpTHhfW8keGxQE3TBMRX9Rm3VqM3E03Cyl9AqtnxuKvxJpcW0WCA"],
  "contentRating": "Teen",
  "released": "May 27, 2014",
  "releasedTimestamp": "2014-05-27T13:12:17.000Z",
  "updated": "2026-10-05T08:34:41.000Z",
  "version": "Varies with device",
  "androidVersion": "Varies with device",
  "chartPosition": "#1 top free music & audio",
  "scrapedAt": "2026-10-07T18:08:06.302Z"
}
```

**Review item**

```json
{
  "type": "review",
  "reviewId": "7f9bb7f2-aa3c-4e2b-97cc-347993d8768a",
  "appId": "com.spotify.music",
  "userName": "Clarissa Anderson",
  "score": 3,
  "text": "takes forever to load when I first open the app.",
  "date": "2026-10-06T18:06:55.056Z",
  "thumbsUp": 0,
  "replyText": "Hi. Thanks for sharing your experience. Have you tried a quick reinstall? ...",
  "replyDate": "2026-10-06T18:22:53.189Z",
  "appVersion": "9.1.88.2204",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=7f9bb7f2-aa3c-4e2b-97cc-347993d8768a",
  "scrapedAt": "2026-10-07T18:08:06.761Z"
}
```

List modes add context fields: `rank` and `searchTerm` (search), `developerQuery` (developer), `collection` and `category` (top charts). The **Output** tab has two ready-made table views: **Apps** and **Reviews**. A `RUN_SUMMARY` record in the key-value store lists counts and any app IDs or developers that were not found.

### Pricing

This Actor uses **pay-per-event** pricing. You pay only for results that land in your dataset:

| Event | Price | Per 1,000 |
|---|---|---|
| `app-result`: one app pushed to the dataset (any mode) | $0.001 | **$1.00** |
| `review-result`: one review pushed to the dataset | $0.00025 | **$0.25** |

Examples:

- 1 app + 20 reviews (default input) ≈ **$0.006**
- 10,000 reviews ≈ **$2.50**
- Top 200 free apps in 5 countries (1,000 apps) ≈ **$1.00**

Platform usage (compute) is included. If you set a **maximum cost per run**, the Actor stops cleanly as soon as that limit is reached and keeps everything scraped up to that point.

### FAQ

**How many reviews can I get?**
As many as Google Play serves for that country/language. For popular apps that is tens of thousands. Reviews are fetched 150 per request with automatic pagination.

**Why does search return only ~30 apps per keyword?**
Google Play itself shows a limited number of results per keyword. Use several more specific keywords (e.g. `vpn free`, `vpn fast`, `vpn proxy`) to cover a niche. Duplicates are easy to remove by `appId`.

**Why are some fields missing for apps from search, developer or chart lists?**
List pages carry fewer fields than the app detail page. Turn on **Fetch full app details** to get every field. The price per app stays the same.

**Can I scrape another country or language?**
Yes. Set `country` (e.g. `de`, `tr`, `in`, `br`) and `language` (e.g. `de`, `tr`, `pt-BR`). Prices, charts, availability and reviews follow the selected store.

**Do I need a proxy?**
Usually not. The Actor works without one by default. For very large or frequent runs, enable Apify Proxy in the input. Each retry then uses a fresh IP.

**What does "Varies with device" mean in `version`?**
Some apps (Spotify, WhatsApp...) ship different builds per device, and Google Play shows no single version number for them.

**Can I integrate it with my tools?**
Yes. Use the Apify API, webhooks, or integrations (Make, Zapier, Google Sheets, Slack, Airbyte, LangChain, MCP...). You can also schedule runs to monitor charts or reviews every day.

### Is it legal to scrape Google Play?

This Actor only extracts **publicly available data** that anyone can see on play.google.com without logging in. It does not access private accounts. To limit personal data, **reviewer profile pictures are not collected**. Only the public display name is kept with each review. Reviews may still contain personal data, so make sure your use complies with GDPR/CCPA and other applicable laws, and with Google's terms. If you are unsure, consult a lawyer. Read more in Apify's blog post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Support

Found a bug or need a feature (e.g. data safety section, permissions, similar apps)? Open an issue in the **Issues** tab.

# Actor input Schema

## `mode` (type: `string`):

<b>App details</b> â€“ full details for app IDs/URLs (optionally with reviews).<br><b>Reviews</b> â€“ user reviews for app IDs/URLs.<br><b>Search</b> â€“ apps matching keywords.<br><b>Developer</b> â€“ all apps of a developer.<br><b>Top charts</b> â€“ top free / paid / grossing apps in a category.

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

Used by <b>App details</b> and <b>Reviews</b> modes. Enter package names (e.g. <code>com.spotify.music</code>) or full URLs like <code>https://play.google.com/store/apps/details?id=com.spotify.music</code>.

## `includeReviews` (type: `boolean`):

In <b>App details</b> mode, also scrape up to <i>Max reviews per app</i> reviews for every app.

## `searchTerms` (type: `array`):

Used by <b>Search</b> mode. One keyword per line, e.g. <code>vpn</code>, <code>photo editor</code>. Google Play returns up to ~30â€“50 apps per keyword, so add more specific keywords to get more apps.

## `searchPrice` (type: `string`):

Used by <b>Search</b> mode. Restrict results to free or paid apps.

## `developerIds` (type: `array`):

Used by <b>Developer</b> mode. Developer name exactly as shown on Google Play (e.g. <code>Spotify AB</code>), numeric developer ID (e.g. <code>5700313618786177705</code>) or developer page URL.

## `collection` (type: `string`):

Used by <b>Top charts</b> mode.

## `category` (type: `string`):

Used by <b>Top charts</b> mode. <code>APPLICATION</code> = all apps, <code>GAME</code> = all games.

## `maxItems` (type: `integer`):

Maximum number of app results per search keyword, per developer, or for the top chart (Google Play top charts contain up to 200 apps).

## `maxReviews` (type: `integer`):

Maximum number of reviews per app (Reviews mode, or App details mode with reviews enabled). Popular apps have tens of thousands of reviews available.

## `fullDetails` (type: `boolean`):

For <b>Search</b>, <b>Developer</b> and <b>Top charts</b>: open every app's detail page to get the full data set (description, installs, ratings count, histogram, release/update dates, version, developer contacts...). Slower, same price per app.

## `reviewsSort` (type: `string`):

Order in which reviews are scraped.

## `reviewsRating` (type: `string`):

Only scrape reviews with this star rating.

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

Two-letter ISO country code of the Play Store to scrape, e.g. <code>us</code>, <code>gb</code>, <code>de</code>, <code>tr</code>, <code>in</code>. Affects prices, availability, charts and reviews.

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

Language code for texts and reviews, e.g. <code>en</code>, <code>de</code>, <code>tr</code>, <code>pt-BR</code>.

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

Optional. Google Play usually works without a proxy. Enable Apify Proxy if you scrape at very high volume or see blocking.

## Actor input object example

```json
{
  "mode": "appDetails",
  "appIds": [
    "com.spotify.music",
    "https://play.google.com/store/apps/details?id=com.whatsapp"
  ],
  "includeReviews": true,
  "searchTerms": [
    "vpn",
    "habit tracker"
  ],
  "searchPrice": "all",
  "developerIds": [
    "Spotify AB",
    "https://play.google.com/store/apps/dev?id=5700313618786177705"
  ],
  "collection": "TOP_FREE",
  "category": "APPLICATION",
  "maxItems": 50,
  "maxReviews": 20,
  "fullDetails": false,
  "reviewsSort": "newest",
  "reviewsRating": "all",
  "country": "us",
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped items in the default dataset (JSON, CSV, Excel and more via the dataset export).

## `files` (type: `string`):

Records saved in the default key-value store, e.g. the run summary.

# 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 = {
    "mode": "appDetails",
    "appIds": [
        "com.spotify.music"
    ],
    "includeReviews": true,
    "maxItems": 50,
    "maxReviews": 20,
    "country": "us",
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("openharvest/google-play-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 = {
    "mode": "appDetails",
    "appIds": ["com.spotify.music"],
    "includeReviews": True,
    "maxItems": 50,
    "maxReviews": 20,
    "country": "us",
    "language": "en",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("openharvest/google-play-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 '{
  "mode": "appDetails",
  "appIds": [
    "com.spotify.music"
  ],
  "includeReviews": true,
  "maxItems": 50,
  "maxReviews": 20,
  "country": "us",
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call openharvest/google-play-scraper --silent --output-dataset

```

## MCP server setup

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