# Google Play Reviews Scraper: Reviews, Ratings, Dev Replies (`oski/google-play-reviews-scraper`) Actor

Export Google Play reviews for any Android app: star rating, full text, reviewer, app version, date, thumbs up and the developer's reply. Multi-country, deep pagination into thousands of reviews per app, no login and no API key.

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

## Pricing

from $0.19 / 1,000 review scrapeds

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

Pull **Google Play Store reviews** for any Android app into clean structured data: star rating, full text, author, the app version reviewed, date, thumbs-up count and the **developer's reply**. **No login, no API key.** It pages deep, so thousands of reviews per app is a normal run, and 1,000 reviews cost about $0.20.

> **Need the iPhone side too?** Run the same apps through the [App Store Reviews Scraper](https://apify.com/oski/app-store-reviews-scraper). Same pricing and the same one-row-per-review layout, so you can track an app's reviews on both stores from one place.

### What you can use it for

- **Product managers** seeing which app version triggered a wave of one-star reviews, using `app_version` on every row.
- **Support and community teams** checking which reviews the developer answered, and how fast, from `reply_content` and `replied_at`.
- **App founders** mining a competitor's reviews for the features users keep asking for.
- **Agencies** building monthly review and sentiment reports for app clients.
- **Builders and researchers** collecting labelled review text for sentiment or topic models.

### How to use it

1. Under **Apps**, type the app's name, such as `Instagram`. A pasted Google Play link or the package name (`com.instagram.android`) works too.
2. Under **Countries**, list the stores to read, such as `United States` or `UK`, and pick a **Review language**.
3. Leave **Max reviews per app** at 1,000 (or change it) and click **Start**.
4. When it finishes, open the **Output** tab and download as CSV, Excel or JSON.

While it runs, the status line at the top of the run page shows progress (for example "App 1 of 2: Instagram. 400 reviews so far."). When it finishes, the same line says what was found and explains anything that was skipped, so you never have to read the log.

### How much does it cost?

You pay a $0.002 start fee per run, then $0.0002 per review returned. You only pay for reviews you actually get, and a review found twice across countries is only returned and charged once.

| Reviews | Maths | Cost |
|---|---|---|
| 100 | $0.002 + 100 x $0.0002 | about $0.02 |
| 1,000 | $0.002 + 1,000 x $0.0002 | about $0.20 |
| 10,000 | $0.002 + 10,000 x $0.0002 | about $2.00 |

A typical 1,000-review export for one app costs about $0.20, so there is little reason to stop at 100.

### Input

| Field | What it does |
|---|---|
| `appIds` | Apps to scrape: the app's name (`Instagram`), its Google Play link, or its package name (`com.instagram.android`). |
| `countries` | Which country stores to read: names or codes (`United Kingdom`, `UK`, `US`). Defaults to the US. |
| `language` | Language of the reviews to fetch, picked from a list. English by default. |
| `maxReviewsPerApp` | How many reviews per app in total across countries (default 1,000; can be many thousands). You pay per review. |
| `sortBy` | `newest`, `rating` or `relevance`. |
| `proxyConfiguration` | Advanced. Routes requests through Apify Proxy (datacenter by default) to keep large runs healthy. |

A realistic job, 1,000 of the newest English reviews for each of two apps:

```json
{
  "appIds": ["com.instagram.android", "https://play.google.com/store/apps/details?id=com.spotify.music"],
  "countries": ["us", "gb"],
  "language": "en",
  "maxReviewsPerApp": 1000,
  "sortBy": "newest"
}
```

### Output

One record per review:

```json
{
  "app_id": "com.spotify.music",
  "app_name": "Spotify: Music and Podcasts",
  "developer": "Spotify AB",
  "app_category": "Music & Audio",
  "country": "us",
  "language": "en",
  "review_id": "128cf271-ec96-4120-bb04-38cf1b91466f",
  "user_name": "Assembly 1",
  "score": 5,
  "content": "Given me access to so much more music...",
  "thumbs_up": 12,
  "app_version": "9.1.64.1676",
  "at": "2026-07-24T12:09:50",
  "reply_content": "Thanks for the love! ...",
  "replied_at": "2026-07-25T08:00:00",
  "user_image": "https://play-lh.googleusercontent.com/...",
  "scraped_at": "2026-07-25T12:00:00+00:00"
}
```

`reply_content` and `replied_at` are `null` when the developer has not replied. `app_version` is the version the reviewer was using, when Google shows it.

### Tips for bigger runs

- **Raise the cap.** Google Play pages through an app's reviews with a continuation token, about 150 at a time, until it runs out or hits your cap. Set 5,000 or 10,000 for a popular app and let it run.
- **Countries are filled in the order you list them.** The per-app cap is spent on the first country before moving to the next.
- **Duplicates are removed per app**, so reviews that appear in more than one country are only returned and charged once.
- **One language per run.** To cover German and French reviews as well, start a second run with `language` set to `de` or `fr`.
- **Several apps in one run** share one start fee. Ten apps at 2,000 reviews each is 20,000 reviews for about $4.
- **Use `newest` for monitoring** and `relevance` to see the reviews Google shows visitors first.

### Scheduling and integrations

Schedule the actor in Apify (daily or weekly with `newest`) to catch new reviews and developer replies, then send each run's results to Google Sheets, a webhook, Make or Zapier using Apify's integrations. You can also call it from your own code:

```bash
curl -X POST "https://api.apify.com/v2/acts/oski~google-play-reviews-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"appIds": ["com.spotify.music"], "countries": ["gb"], "maxReviewsPerApp": 1000}'
```

### If something looks wrong

The status line at the end of every run explains anything that was skipped or came back empty. The common messages:

| Message | What to do |
|---|---|
| Input problem: ... | Something in the input needs changing, and the message says what. The run stopped before anything was charged. |
| No Google Play app matches "..." | The name did not match an app. Paste the app's Google Play link instead. |
| ... returned no reviews in language 'xx' | Few people review that app in that language. Try English or another country. |
| Skipped countries: ... | The country was not recognised. Check the spelling or use a two-letter code. |

Still stuck? Open an issue on the actor page with the run link and it gets looked at quickly.

### FAQ

**Is it legal to scrape Google Play reviews?**
The actor only reads reviews Google shows publicly on the Play Store. You are responsible for how you use the data, including respecting privacy law such as GDPR when you store or publish reviewer names or images.

**Do I need a Google account, login or API key?**
No. There is nothing to sign in to.

**Why did I get fewer reviews than I asked for?**
The app may have fewer reviews in that language and country than your cap. Try another language, add countries, or check the package name. Invalid package names are skipped and named in the run log.

**How do I find the package name?**
It is the `id=` value in the Play Store URL, for example `com.spotify.music`. You can also paste the full URL.

**How fresh is the data?**
Live. Every run reads Google Play at the moment it runs, so there is no cached copy to go stale.

**What if it breaks?**
Open an issue on the actor page and it gets looked at quickly. The actor is built on the maintained open-source `google-play-scraper` library, which tracks Google's changes to its internal protocol.

### Other scrapers from Oski

- [App Store Reviews Scraper](https://apify.com/oski/app-store-reviews-scraper): the iPhone reviews for the same apps, across 60+ country stores.
- [Telegram Channel Scraper](https://apify.com/oski/telegram-channel-scraper): posts, views and links from public Telegram channels.
- [Google Ads Transparency Scraper](https://apify.com/oski/google-ads-transparency-scraper): the ads an app's publisher is running on Google.
- [Facebook Ad Library Scraper](https://apify.com/oski/facebook-ad-library-scraper): the same for Meta ads.
- [Website Contact Finder](https://apify.com/oski/website-contact-finder): emails, phones and socials from a developer's website.

# Actor input Schema

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

The Android apps to get reviews for, one per line. Type the app's name (Instagram), paste its Google Play link, or use its package name (com.instagram.android).

## `countries` (type: `array`):

Which country's Google Play store to read, one per line. Names or codes both work: United Kingdom, UK, gb, US. Reviews differ by country, so adding countries adds reviews.

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

Google Play shows reviews written in this language. English by default.

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

How many reviews to collect per app in total across the chosen countries. Google Play allows deep pagination, so this can be in the thousands. You are charged per review returned: about $0.20 for 1,000 reviews.

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

Order reviews are pulled in.

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

Optional. Routes requests through Apify Proxy to keep large runs healthy. Datacenter by default.

## Actor input object example

```json
{
  "appIds": [
    "Instagram",
    "https://play.google.com/store/apps/details?id=com.spotify.music",
    "com.instagram.android"
  ],
  "countries": [
    "United States",
    "United Kingdom",
    "CA"
  ],
  "language": "en",
  "maxReviewsPerApp": 1000,
  "sortBy": "newest",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per review: app, country, score, text, reviewer, app version, date, thumbs up and developer reply.

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

Every field for each review, as raw JSON.

# 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": [
        "Instagram"
    ],
    "countries": [
        "United States"
    ],
    "maxReviewsPerApp": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("oski/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": ["Instagram"],
    "countries": ["United States"],
    "maxReviewsPerApp": 1000,
}

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

```

## MCP server setup

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