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

Scrapes user reviews from Google Play Store apps (play.google.com) including review text, star rating, author, date, replies and optional sentiment tagging, with app name, developer and overall rating attached to every review.

- **URL**: https://apify.com/confidential\_gnat/google-play-reviews-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.17 / 1,000 results

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 Store Reviews Scraper

**Scrape user reviews from Google Play Store apps (play.google.com)** by app URL, search URL, or package name. This **Google Play reviews scraper** extracts the review text, star rating, author, publish date, thumbs-up count, app version and any **developer reply**, and attaches the app name, developer, category and overall store rating to every review. Optionally tag every review with its **sentiment** (positive, negative or neutral). Export to JSON, CSV or Excel, or pull the results straight into your code through the **Apify API**.

**Target website:** [play.google.com](https://play.google.com)

### ✨ Features of this Google Play reviews scraper

- **Full review extraction** — review text, star rating, author name and avatar, publish date, thumbs-up count and the app version reviewed
- **Developer replies** — captures the developer's response to a review, with its own author and timestamp
- **App metadata on every row** — app name, developer, category, overall rating and total rating count
- **Search URL support** — paste a Google Play search URL and scrape reviews for every app it returns, capped by `maxAppsPerSearch`
- **Keyword-free input** — paste an app URL, a search URL, or just the package name, whichever you have
- **Optional sentiment analysis** — tag each review as positive, negative or neutral with one input toggle
- **Rating filter** — keep only reviews at or above a star rating
- **Sort control** — collect newest reviews, most relevant reviews, or sort by rating
- **Country and language selection** — review availability differs by store front
- **Pagination support** — walks through review pages until your limit is reached
- **Proxy support** — optional, and switched off by default
- **Incremental re-runs** — name a cache project and scheduled runs skip reviews already collected in a previous run, returning only what's new
- **No browser required** — runs on plain HTTP requests, which makes it fast and cheap

### 🚀 How to scrape Google Play reviews in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Enter one or more app package names (like `com.spotify.music`), app URLs, or a search URL.
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing

This actor uses **pay-per-result** billing based on the compute units a run consumes.

- New Apify accounts include **$5 of free monthly credit**.
- It runs on plain HTTP requests rather than a headless browser, so it costs significantly less to run than browser-based review scrapers.
- Proxies are disabled by default, which keeps runs at their cheapest.

### 🔧 Input configuration

| Field                | Type    | Required | Default                    | Description                                                                          |
| --------------------- | ------- | -------- | -------------------------- | -------------------------------------------------------------------------------------- |
| `appIds`             | array   | —        | `["com.spotify.music"]`    | Android package names, one per entry. Each app is scraped independently.             |
| `startUrls`          | array   | —        | —                          | Google Play app URLs or search URLs. Can be used instead of, or alongside, package names. |
| `maxItems`           | integer | —        | `50`                       | Maximum reviews to scrape **per app**. Applies the same way whether the app came from a package name, an app URL, or a search URL. Set to `0` for no limit. |
| `maxAppsPerSearch`   | integer | —        | `5`                        | Maximum number of apps to scrape from each search URL's results page. Doesn't apply to app URLs or package names. |
| `sentimentAnalysis`  | boolean | —        | `false`                    | Tag each review with its sentiment (`positive`, `negative`, `neutral`). Off by default. |
| `sort`               | string  | —        | `newest`                   | `newest`, `most_relevant` or `rating`.                                               |
| `minRating`          | integer | —        | —                          | Keep only reviews with at least this many stars (1–5).                               |
| `language`           | string  | —        | `en`                       | Language code for reviews and app details.                                           |
| `country`            | string  | —        | `US`                       | Two-letter country code for the store front.                                         |
| `cacheProjectName`   | string  | —        | —                          | Name a project to remember scraped reviews across runs so repeat runs skip data already collected. |
| `proxyConfiguration` | object  | —        | `{"useApifyProxy": false}` | Proxy settings. Off by default.                                                      |

**Supported input types:**

- Package name — `com.spotify.music`
- App URL — `https://play.google.com/store/apps/details?id=com.spotify.music`
- App URL with store front — `https://play.google.com/store/apps/details?id=com.spotify.music&hl=de&gl=DE`
- Search URL — `https://play.google.com/store/search?q=ai+voice&c=apps` — scrapes reviews for every app on the results page, up to `maxAppsPerSearch`

### 📦 Google Play reviews scraper output data

Each result is a JSON object with the keys `packageName`, `appName`, `developer`, `category`, `appRating`, `appRatingCount`, `appUrl`, `reviewId`, `author`, `avatar`, `rating`, `text`, `publishedAt`, `thumbsUp`, `appVersion` and `developerReply`. When `sentimentAnalysis` is enabled, every item also gets a `sentiment` field (`positive`, `negative` or `neutral`). The dataset ships with two views: **Overview**, a compact table of app name, rating, author, review text and date; and **Full review details**, which adds the review ID, developer, app rating, thumbs-up count, app version and the full developer reply.

**Sample output:**

```json
[
    {
        "packageName": "com.spotify.music",
        "appName": "Spotify: Music and Podcasts",
        "developer": "Spotify AB",
        "category": "MUSIC_AND_AUDIO",
        "appRating": "4.345688819885254",
        "appRatingCount": "36282777",
        "appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=US",
        "reviewId": "265d9d6f-c2da-4644-a32b-ecb2779ff7c2",
        "author": "Pushpraj Yadav",
        "avatar": "https://play-lh.googleusercontent.com/a-/ALV-UjXw6kFk6gFKNG_L7QOGbJOnoCQDLnovbQPE7GsEZCxQmzG773PT",
        "rating": 5,
        "text": "It's like a friend to me, it takes away loneliness, thanks.",
        "publishedAt": "2026-09-10T20:34:28.000Z",
        "thumbsUp": 0,
        "appVersion": "9.1.80.2221",
        "developerReply": null
    },
    {
        "packageName": "com.spotify.music",
        "appName": "Spotify: Music and Podcasts",
        "developer": "Spotify AB",
        "category": "MUSIC_AND_AUDIO",
        "appRating": "4.345688819885254",
        "appRatingCount": "36282777",
        "appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=US",
        "reviewId": "c1c04774-9b7f-4dc9-b03a-a23f1c1e6848",
        "author": "Sofia aranda",
        "avatar": "https://play-lh.googleusercontent.com/a-/ALV-UjVAjQPqy-kMqsGRsMiAYTi1t0i2gRMKLL5gqDCS0tRUQ26FZkc",
        "rating": 4,
        "text": "I like the app just that wayyy to many ads and when you play a Playlist it plays other songs then the one on your Playlist",
        "publishedAt": "2026-09-10T20:33:25.000Z",
        "thumbsUp": 0,
        "appVersion": "9.1.80.2221",
        "developerReply": {
            "author": "Spotify AB",
            "text": "Hey! We hear you and we'll pass your feedback along to the Ads team. If you’re on our free service, Smart Shuffle is on by default and adds songs to keep your queue fresh. For ad-free listening and full control, check out our Premium plans at spotify.com/premium. If you've never had Premium before, you should be eligible for our trial.",
            "repliedAt": "2026-09-11T18:31:11.000Z"
        },
        "sentiment": "negative"
    }
]
```

`sentiment` only appears when `sentimentAnalysis` is set to `true` in the input.

### 🐍 How to scrape Google Play reviews with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("<username>/google-play-reviews-scraper").call(run_input={
    "appIds": ["com.spotify.music"],
    "maxItems": 50,
    "sort": "newest",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('<username>/google-play-reviews-scraper').call({
    appIds: ['com.spotify.music'],
    maxItems: 50,
    sort: 'newest',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~google-play-reviews-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"appIds": ["com.spotify.music"], "maxItems": 50, "sort": "newest"}'
```

### 💡 What you can use Google Play review data for

- **App store optimization (ASO)** — find the words real users use to describe your app
- **Competitor monitoring** — track rival apps' ratings and complaints over time
- **Bug and crash discovery** — surface issues tied to a specific app version
- **Sentiment tracking** — enable `sentimentAnalysis` to see how positive/negative sentiment moves after each release, no extra processing needed
- **Support quality auditing** — see which reviews got a developer reply and how fast
- **Feature request mining** — collect what users repeatedly ask for
- **Category and keyword research** — scrape a Google Play search URL to compare reviews across every competing app in a niche

Product managers, mobile developers, ASO specialists, QA teams and market researchers use this data across mobile apps, gaming, fintech and e-commerce.

### ⚠️ Limitations & known issues

- **Review availability varies by country** — the same app can return different reviews for different `country` values, because Google serves reviews per store front.
- **Very large apps** — popular apps have millions of reviews; Google stops serving further pages well before the full history is reachable, so set a realistic `maxItems`.
- **App version is not always present** — Google omits it for some reviews, in which case the field is `null`.
- **Rate limiting** — scraping many apps at high volume may be throttled; enable proxies if you hit limits.

### ❓ Frequently asked questions

#### Can I scrape Google Play reviews legally?

This actor only collects data that is already publicly visible on the Google Play Store — no login, paywall, or private content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn* as precedent). Reviews contain user-generated content and display names, so if you store or republish them you are responsible for complying with Google's Terms of Service and privacy laws such as GDPR and CCPA.

#### How many reviews can I scrape from one app?

`maxItems` limits results **per app**, so three apps with `maxItems: 500` returns up to 1,500 reviews. Google stops serving further pages after a few thousand reviews for most apps, so extremely large numbers will finish early rather than error.

#### Does this scraper get developer replies?

Yes. When a developer has replied to a review, the `developerReply` object carries the reply text, the developer name and the reply timestamp. Reviews without a reply have `null`.

#### Can I get sentiment analysis on the reviews?

Yes. Turn on the `sentimentAnalysis` input and every review is returned with a `sentiment` field set to `positive`, `negative` or `neutral` — no separate tool or manual labeling needed. It's off by default so runs stay at their cheapest unless you need it.

#### Can I scrape reviews from a Google Play search instead of one app at a time?

Yes. Paste a Google Play search URL (e.g. `https://play.google.com/store/search?q=fitness+tracker&c=apps`) into `startUrls` and the actor scrapes reviews for every app on that results page, up to the `maxAppsPerSearch` limit — useful for pulling reviews across a whole category or keyword in one run.

#### Do I need a proxy to scrape play.google.com?

No. Google Play responds reliably without one, which is why proxies are off by default. Enable them if you scrape many apps in a single run and start seeing throttling.

#### How do I scrape Google Play reviews with Python?

Install `apify-client`, then call the actor with your package names and iterate the dataset — see the Python example above. Each review comes back as flat JSON, ready for pandas or a database.

#### Can I run this Google Play reviews scraper on a schedule?

Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run it daily or hourly, and set `cacheProjectName` so each run returns only reviews you have not already collected — ideal for monitoring a release.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

### 🔗 Other actors you may find useful

- [Google News AI Scraper](https://apify.com/confidential_gnat/google-news-ai-scraper) — search Google News by keyword, optionally extract full article text and AI-generated summaries, with built-in cross-run deduplication.
- [Google Patents Scraper](https://apify.com/confidential_gnat/google-patents-scraper) — scrapes patent listings and details from Google Patents.
- [UniAcco Student Accommodation Scraper](https://apify.com/confidential_gnat/uniacco-property-scraper) — scrapes student accommodation listings from UniAcco, including price range, address, amenities, rating and reviews.
- [HousingAnywhere Property Scraper](https://apify.com/confidential_gnat/housinganywhere-property-scraper) — scrapes rental listings from HousingAnywhere, including price, city, coordinates, room count, floor area, house rules, facilities and images.
- [Woolworths Products Scraper](https://apify.com/confidential_gnat/woolworths-products-scraper) — scrapes Woolworths Australia grocery products: name, brand, price, unit price, package size, availability, ingredients, allergens and nutrition.

### 💬 Support & Contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/google-play-reviews-scraper/issues/open)

You can also find more of my actors on the page [Actor Flow ](https://apify.com/confidential_gnat).

# Actor input Schema

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

Android package names to scrape reviews for, one per entry — for example com.spotify.music. Each app is scraped independently and the Max reviews limit applies to each one separately.

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

Google Play app URLs (e.g. https://play.google.com/store/apps/details?id=com.spotify.music) or search URLs (e.g. https://play.google.com/store/search?q=ai+voice\&c=apps). A search URL scrapes up to 'Max apps per search' apps found on the results page, each getting its own Max reviews budget. You can mix these with package names.

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

Maximum number of reviews to scrape per app. Set to 0 for no limit — note that popular apps have millions of reviews.

## `maxAppsPerSearch` (type: `integer`):

Maximum number of apps to scrape from each search URL's results page. Set to 0 for no limit. Does not apply to app URLs or package names.

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

Which reviews to collect first. 'Newest' is best for monitoring, 'Most relevant' mirrors what users see on the store page.

## `minRating` (type: `integer`):

Only keep reviews with at least this many stars. Leave empty to keep all reviews.

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

Language code for reviews and app details, for example en, de, es. Google returns reviews written in this language first.

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

Two-letter country code for the store front, for example US, GB, DE. Review availability varies by country.

## `sentimentAnalysis` (type: `boolean`):

Tag each review with its sentiment (positive, negative, neutral). Adds a 'sentiment' field to each item. Off by default.

## `cacheProjectName` (type: `string`):

Optional. Name a project to remember which reviews have already been scraped across runs, so scheduled runs only return new reviews. Leave empty to scrape everything every time.

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

Proxy settings. Google Play is reachable without a proxy, so proxies are disabled by default to keep runs cheap. Enable them if you scrape many apps at high volume.

## Actor input object example

```json
{
  "appIds": [
    "com.spotify.music"
  ],
  "startUrls": [],
  "maxItems": 3,
  "maxAppsPerSearch": 1,
  "sort": "newest",
  "language": "en",
  "country": "US",
  "sentimentAnalysis": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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.spotify.music"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/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.spotify.music"] }

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/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.spotify.music"
  ]
}' |
apify call confidential_gnat/google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

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