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

Free Google Play Store reviews scraper. App metadata + reviews (rating, body, version, thumbs-up, developer reply, dates). Sweep multiple countries x languages for the global picture. Google's web JSON endpoints; no API key, no auth.

- **URL**: https://apify.com/transparent_locket/google-play-reviews-scraper.md
- **Developed by:** [casper smartwater](https://apify.com/transparent_locket) (community)
- **Categories:** Developer tools, E-commerce, AI
- **Stats:** 4 total users, 0 monthly users, 83.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 — Free, No API Key

**Pull app reviews + metadata from the Google Play Store for any Android app, across any country, in any language.** No Google API key. No service account. No auth.

### ✨ Why this Actor

- **Free** — competing Play Store scrapers on Apify charge $15-30/mo. This one is $0.
- **No API key** — Google's official Play Console API requires a Service Account + developer access to the app. This Actor works for **any** public app.
- **Multi-country, multi-language** — most scrapers do one locale at a time. This one sweeps `countries × languages` so you get the full global picture in one run.
- **Includes developer replies** — track how quickly devs respond to reviews and what they say.

### 🚀 Quick start

**Scrape recent Spotify reviews across 3 countries:**

```json
{
  "appId": "com.spotify.music",
  "countries": ["us", "gb", "in"],
  "languages": ["en"],
  "sort": "newest",
  "maxReviews": 200
}
```

**Scrape Notion reviews in English + Spanish:**

```json
{
  "appId": "notion.id",
  "countries": ["us", "mx", "es"],
  "languages": ["en", "es"],
  "maxReviews": 500
}
```

**Just get app metadata (no reviews):**

```json
{
  "appId": "com.spotify.music",
  "countries": ["us"],
  "maxReviews": 0,
  "includeAppMeta": true
}
```

### 📦 Output schema

Each run produces:

- **1 app_meta row** (`_kind: "app_meta"`) — app-level data
- **N review rows** (`_kind: "review"`) — one per review

#### App metadata row

| Field | Type | Notes |
|---|---|---|
| `id` | str | Package name (input) |
| `name` | str | App title |
| `developer`, `developer_id` | str | Studio / publisher |
| `score`, `ratings` | float, int | Lifetime average + total rating count |
| `reviews_count` | int | Total reviews written |
| `installs`, `real_installs` | str, int | "1B+" display + precise install count |
| `price`, `free` | float, bool | |
| `genre`, `genre_id` | str | Play Store category |
| `content_rating` | str | "Everyone" / "Teen" / "Mature 17+" / "Adults Only 18+" |
| `released`, `updated` | str/int | Release date + last-update timestamp |
| `current_version`, `size` | str | |
| `icon`, `url` | str | Logo + Play Store URL |
| `description` | str | Full app description |

#### Review row

| Field | Type | Notes |
|---|---|---|
| `id` | str | Stable Google review ID |
| `country`, `lang` | str | The sweep that produced this row |
| `user_name`, `user_image` | str | Reviewer |
| `content` | str | Review body |
| `rating` | int | 1-5 |
| `thumbs_up` | int | Helpfulness votes |
| `review_created_version` | str | App version at time of review |
| `at` | iso8601 | When review was posted |
| `reply_content`, `reply_at` | str, iso8601 | Developer response (if any) |

### 🎯 Use cases

- **Competitor intelligence** — track competitor app rating trends + spot feature complaints
- **Product launch monitoring** — sweep daily after a release, catch regressions fast
- **Sentiment analysis** — feed reviews into an LLM, surface top complaint themes
- **Investor research** — install counts + rating velocity = real revenue signal
- **Localization QA** — pull reviews per language, see what users in each market complain about
- **Customer support backlog** — pipe reviews into your support ticketing tool
- **App Store SEO** — see which keywords appear most often in 5-star vs 1-star reviews
- **Acquisition due diligence** — pull every review for an app you're acquiring; reviewer sentiment + dev-response speed reveal a lot

### ⚙️ Input parameters

| Parameter | Type | Default | Notes |
|---|---|---|---|
| `appId` | str | — | **Required.** Android package name. e.g. `com.spotify.music`. Visible in the Play URL as `?id=<package>` |
| `countries` | array<str> | `["us","gb","ca","au","in","de","fr","jp","br","mx"]` | ISO 2-letter codes |
| `languages` | array<str> | `["en"]` | ISO 639-1 codes. Each (country × language) pair = one sweep |
| `sort` | str | `newest` | `newest` / `rating` / `helpfulness` |
| `maxReviews` | int | 200 | Per (country × language) combo. Total = countries × languages × maxReviews |
| `includeAppMeta` | bool | true | Prepend the app_meta row |

### 🛠️ How it works

This Actor uses [`google-play-scraper`](https://pypi.org/project/google-play-scraper/), which hits the same undocumented JSON endpoints the Play Store web client uses. No HTML parsing, no anti-bot fragility — same calls Google's own frontend makes.

### ⚠️ Tips & caveats

- **Use multiple countries** — Google personalises results per locale. Different countries reveal different reviews.
- **Pagination tokens expire** — fetching 10,000+ reviews from one (country × language) sometimes drops the tail. If you need the full archive, run nightly with `sort: newest` and dedupe by `id` over time.
- **Some countries return fewer reviews** than the Play Store shows in the UI — this is a Google-side rate limit, not a scraper bug.
- **The `at` timestamp is in UTC.**

### 🔗 Related Actors

- **[iOS App Store Metadata](https://apify.com/transparent_locket/ios-app-store-reviews-scraper)** — for the Apple side of the same app
- **[Reddit Subreddit + Search](https://apify.com/transparent_locket/reddit-subreddit-search-scraper)** — search `r/<app-name>` for organic discussion
- **[YouTube Channel + Video Scraper](https://apify.com/transparent_locket/youtube-channel-video-scraper)** — for video reviews of the same app

### 💬 Support

Bugs or custom request? Email **caspersmartwater@gmail.com**.

⭐ Star this Actor if it saves you time.

# Actor input Schema

## `appId` (type: `string`):

Android package name from the Play URL. e.g. 'com.spotify.music', 'com.zhiliaoapp.musically' (TikTok).

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

ISO 2-letter country codes to sweep. Reviews are localised per country.

## `languages` (type: `array`):

ISO 639-1 language codes. Each (country x language) pair is a separate sweep.

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

newest = freshest first. rating = by score. helpfulness = Google's relevance ordering.

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

Cap per (country x language) sweep. Total = countries x languages x maxReviews.

## `includeAppMeta` (type: `boolean`):

Prepend an \_kind='app_meta' row with title, developer, installs, score, etc.

## Actor input object example

```json
{
  "countries": [
    "us",
    "gb",
    "ca",
    "au",
    "in",
    "de",
    "fr",
    "jp",
    "br",
    "mx"
  ],
  "languages": [
    "en"
  ],
  "sort": "newest",
  "maxReviews": 200,
  "includeAppMeta": true
}
```

# 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 = {};

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

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

```

## MCP server setup

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