# Google Play Reviews Scraper – Ratings, Text, Replies, No API (`nourishing_courier/google-play-reviews-scraper`) Actor

Google Play Reviews Scraper for any Android app: star rating, full text, date, app version, helpful votes and developer replies, plus app installs and score on every row. Filter by stars, several languages, no API key or login. Built for ASO, product and sentiment analysis.

- **URL**: https://apify.com/nourishing\_courier/google-play-reviews-scraper.md
- **Developed by:** [Ani Björkström](https://apify.com/nourishing_courier) (community)
- **Categories:** E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 review delivereds

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 – Ratings, Text, Replies, No API

**Google Play Reviews Scraper** collects the public reviews of any Android app on the Google Play Store and returns them as clean, flat rows: star rating, full review text, date, app version, helpful votes and the **developer reply**. Paste a package name like `com.whatsapp` or a Play Store URL and run it – no Google Play API, no developer account, no login, no proxy.

- **Native sorting and star filters.** Newest, Most relevant or Rating order and 1–5 star filters are applied by Google Play itself, exactly like the menu on the store page – so "only 1-star reviews" fetches 1-star reviews directly instead of paging through thousands of others.
- **App details on every row.** App name, developer, install count (`10,000,000,000+`), overall score, total ratings and genre are fetched once per app and merged into each review, so a spreadsheet or LLM prompt needs no second lookup.
- **Several languages in one run, pay only for delivered reviews.** Collect English, German, French and Spanish reviews of the same app in one run. Apps that fail produce a free explanatory row, never a silent gap.

***

### What you get

Every review is one flat JSON row (ready for CSV, Excel, Google Sheets, BigQuery or an AI agent):

| Field | Description |
|---|---|
| `appId` | Android package name, e.g. `com.whatsapp` |
| `appName` | App title on Google Play |
| `appDeveloper` | Developer / publisher name |
| `appInstalls`, `appMinInstalls` | Install bucket as shown (`500,000,000+`) and as a number |
| `appRating`, `appRatingsCount` | Overall Play Store score (e.g. 4.62) and total number of ratings |
| `appGenre` | Play Store category, e.g. `Communication`, `Education` |
| `reviewId` | Stable Google Play review ID |
| `userName`, `userImage` | Reviewer display name and avatar URL |
| `rating` | 1–5 stars |
| `text` | Full review text |
| `date` | Review date, ISO 8601 UTC |
| `thumbsUp` | How many people marked the review helpful |
| `appVersion` | App version the reviewer was using |
| `developerReply`, `developerReplyDate` | The developer's public answer and when it was posted |
| `language`, `country` | The Play language (`hl`) and country (`gl`) the review was collected for |
| `url` | Link to the review on Google Play |
| `scrapedAt` | When this run collected the row |
| `error` | Only on problem rows: why an app returned nothing |

Turn app details off with `includeAppDetails: false`.

***

### Input

The only required thing is the app. A run with no input at all scrapes the newest 200 English reviews of WhatsApp, so scheduled and test runs never come back empty.

**Newest 500 reviews of one app**

```json
{
  "appIds": ["com.whatsapp"],
  "maxReviewsPerApp": 500
}
```

**Only negative reviews with text, from Play Store URLs**

```json
{
  "appIds": [
    "https://play.google.com/store/apps/details?id=com.spotify.music",
    "https://play.google.com/store/apps/details?id=com.duolingo"
  ],
  "minRating": 1,
  "maxRating": 2,
  "onlyWithText": true,
  "maxReviewsPerApp": 300
}
```

**Same app in several languages, UK store, most relevant first**

```json
{
  "appIds": ["org.telegram.messenger"],
  "languages": ["en", "de", "fr", "es"],
  "country": "gb",
  "sortBy": "relevant",
  "maxReviewsPerApp": 200
}
```

| Option | Default | What it does |
|---|---|---|
| `appIds` | `["com.whatsapp"]` | Package names or Google Play URLs, one per line |
| `maxReviewsPerApp` | `200` | Cap per app and language, up to 20,000. Google Play serves the full review history |
| `language` | `en` | Review language code (`en`, `de`, `es`, `fr`, `sv`, `pt-BR`…) |
| `languages` | – | Optional list; when filled it replaces `language` and each app is collected in every listed language |
| `country` | `us` | Two-letter Play country (`gl`) |
| `sortBy` | `newest` | `newest`, `relevant` (Play's default "Most relevant") or `rating`. Applied natively by Google Play |
| `minRating`, `maxRating` | `1`, `5` | Star range. Narrow ranges use Google Play's own per-star filter |
| `onlyWithText` | `false` | Skip star-only ratings with no text |
| `includeAppDetails` | `true` | Merge app name, developer, installs, score, ratings count and genre into each row |
| `concurrency` | `4` | Apps fetched in parallel (1–10) |
| `proxyConfiguration` | off | Not needed at normal volumes |

For a star range such as 1–2 the Google Play Reviews Scraper fetches each star natively and merges them (by date for `newest`, by helpful votes for `relevant`).

***

### Output example

```json
{
  "appId": "com.whatsapp",
  "appName": "WhatsApp Messenger",
  "appDeveloper": "WhatsApp LLC",
  "appRating": 4.62,
  "appRatingsCount": 244790058,
  "appInstalls": "10,000,000,000+",
  "appMinInstalls": 10000000000,
  "appGenre": "Communication",
  "reviewId": "d40bb75a-d1a5-44b3-863d-c8624445efe9",
  "userName": "Jonathan Spencer",
  "userImage": "https://play-lh.googleusercontent.com/a-/ALV-UjUsH3fQ...",
  "rating": 1,
  "text": "Whenever I try to link it to another device the account is placed under review...",
  "date": "2026-08-28T20:40:15+00:00",
  "thumbsUp": 13,
  "appVersion": "2.26.33.74",
  "developerReply": null,
  "developerReplyDate": null,
  "language": "en",
  "country": "us",
  "url": "https://play.google.com/store/apps/details?id=com.whatsapp&reviewId=d40bb75a-d1a5-44b3-863d-c8624445efe9",
  "scrapedAt": "2026-09-30T18:19:33+00:00"
}
```

If an app cannot be scraped – a mistyped package name, an iOS id pasted by mistake, or filters that match nothing – you get one row with an `error` field that says exactly why. Those rows are never charged.

***

### Use cases for a Google Play Reviews Scraper

- **Product managers and UX teams** – pull the newest 1–2 star Google Play reviews after every release and route them to Slack, Jira or Linear before the rating drops.
- **ASO and app marketing agencies** – mine Play Store review language for keywords and feature requests, and benchmark a client against competitors with install count and score on every row.
- **Customer support leads** – find negative reviews that still have no `developerReply` and answer them first.
- **AI, RAG and sentiment-analysis builders** – feed thousands of flat, labelled rows (stars + text + version + date) into GPT, Claude or a classifier; the schema is MCP- and agent-friendly.
- **Market researchers and investors** – track review volume and sentiment for a basket of Android apps over time.
- **Localisation teams** – compare what German, French and Spanish users say about the same app in one run.

***

### Pricing

The Google Play Reviews Scraper is pay per result: **$0.50 per 1,000 reviews** delivered to the dataset, with platform usage included. There is no start fee and no monthly rental. Error rows and reviews removed by your filters are never charged. A 200-review run costs $0.10.

***

### Integrations

**Python (`apify-client`)**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("nourishing_courier/google-play-reviews-scraper").call(run_input={
    "appIds": ["com.whatsapp", "com.spotify.music"],
    "maxReviewsPerApp": 300,
    "minRating": 1,
    "maxRating": 2,
})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review.get("appName"), review.get("rating"), (review.get("text") or "")[:80])
```

**JavaScript / Node.js**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('nourishing_courier/google-play-reviews-scraper').call({
    appIds: ['https://play.google.com/store/apps/details?id=com.duolingo'],
    languages: ['en', 'de'],
    maxReviewsPerApp: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'Google Play reviews');
```

**curl (synchronous, returns the reviews directly)**

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

**n8n, Make and Zapier** – add the Apify node or module, pick this actor, paste one of the inputs above and map the rows into Google Sheets, Airtable, Notion, HubSpot or Slack. Schedule it daily with `sortBy: "newest"` for review monitoring. **MCP / AI agents** – expose the Google Play Reviews Scraper through the Apify MCP server and an agent can call it as a tool ("get the latest 1-star reviews of com.whatsapp"). Datasets also export as JSON, CSV, Excel, XML and RSS.

***

### Other app review scrapers by the same author

- **iOS:** [App Store Reviews Scraper](https://apify.com/nourishing_courier/app-store-reviews-scraper) – iPhone and iPad reviews from many countries in one run.
- **Both stores:** [App Store & Google Play Reviews Scraper](https://apify.com/nourishing_courier/app-reviews-scraper) – iOS and Android reviews in one unified schema, one run.

***

### Limits, fair use and legality

This Google Play Reviews Scraper reads the same public endpoint the Play Store website uses to show reviews, one page of up to 150 at a time, with bounded retries and backoff. It does not log in, bypass paywalls or touch private data. Google Play shows each review in the language it was written in, so pick `language`/`languages` to match the audience you want. Very old apps can have millions of reviews – use `maxReviewsPerApp` to cap the run. Reviews are public user content; use them in line with Google's terms and privacy law such as the GDPR, and do not try to re-identify reviewers. This actor is not affiliated with or endorsed by Google.

***

### FAQ

#### How do I scrape Google Play reviews without the API?

Paste the package name (the `id=` part of the Play Store URL, e.g. `com.whatsapp`) into `appIds` and start the run. The Google Play Reviews Scraper needs no Google Play Developer API access, no service account and no login.

#### How many Google Play reviews can I get per app?

Google Play serves the full history, so you can collect up to 20,000 reviews per app and language in one run, and more by listing several `languages`. A few thousand reviews take well under a minute.

#### Can I get only 1-star or negative reviews?

Yes. Set `minRating: 1` and `maxRating: 1` (or `2` for 1–2 stars). The star filter is applied by Google Play itself, so you get exactly those reviews quickly, and you only pay for what is delivered.

#### Does it include developer replies?

Yes. `developerReply` and `developerReplyDate` are filled whenever the developer has publicly answered a review – handy for support-response audits.

#### Can I sort by newest or most relevant?

Yes, natively: `newest`, `relevant` (the Play Store's default "Most relevant" order) and `rating` are passed to Google Play just like the sort menu on the store page.

#### Can I scrape reviews in other languages or countries?

Set `language` (e.g. `de`) or list several in `languages`, and set `country` (e.g. `gb`, `in`, `br`). Each row records the language and country it was collected for.

#### Does it work with n8n, Make or Zapier?

Yes. Use the official Apify integration in any of them to run the Google Play Reviews Scraper, pass the JSON input, and map the flat rows straight into your spreadsheet, CRM or database.

#### Can I export Google Play reviews to CSV or Excel?

Yes. Every Google Play Reviews Scraper dataset downloads as CSV, Excel, JSON or XML from the Output tab or the API (`format=csv`).

#### Does it also scrape the Apple App Store?

This actor is dedicated to Google Play. For iOS use the [App Store Reviews Scraper](https://apify.com/nourishing_courier/app-store-reviews-scraper), or the [combined actor](https://apify.com/nourishing_courier/app-reviews-scraper) for both stores in one run.

#### Why did I get an `error` row?

Usually a mistyped package name, an App Store id pasted into the Google Play field, or filters that matched no review. The `error` text explains which, and error rows are free.

# Actor input Schema

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

Android package names (com.whatsapp) or Google Play URLs (https://play.google.com/store/apps/details?id=com.whatsapp). One app per line.

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

Cap per app and language. Google Play returns the full review history, newest first, so this can go up to 20,000.

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

Language code of the reviews to collect, e.g. en, de, es, fr, sv, pt-BR. Google Play keeps reviews per language.

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

Optional. Collect each app in several languages in one run, e.g. en, de, fr, es. When filled, this replaces the single language above; the review cap applies per language.

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

Two-letter Google Play country code (gl), e.g. us, gb, de, in. Affects the app details and which reviews Play considers local.

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

Applied natively by Google Play, exactly like the sort menu on the store page. 'Newest' for monitoring, 'Most relevant' for Play's default helpfulness-weighted order, 'Rating' for highest stars first.

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

Keep only reviews at or above this many stars. Narrower star ranges use Google Play's own star filter, so min 1 / max 1 fetches 1-star reviews directly instead of paging past the rest.

## `maxRating` (type: `integer`):

Keep only reviews at or below this many stars.

## `onlyWithText` (type: `boolean`):

Skip star-only ratings that carry no written feedback.

## `includeAppDetails` (type: `boolean`):

Fetch the app's name, developer, install count, overall score, ratings count and genre once per app and add them as appName, appDeveloper, appInstalls, appRating, appRatingsCount, appGenre on each review. Costs nothing extra.

## `concurrency` (type: `integer`):

How many apps to fetch at once. Lower this if Google Play starts rate limiting you.

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

Optional. Google Play does not need a proxy at normal volumes; turn one on only for very large batches that start hitting rate limits.

## Actor input object example

```json
{
  "appIds": [
    "com.whatsapp"
  ],
  "maxReviewsPerApp": 200,
  "language": "en",
  "country": "us",
  "sortBy": "newest",
  "minRating": 1,
  "maxRating": 5,
  "onlyWithText": false,
  "includeAppDetails": true,
  "concurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

Every review with its rating, text, date, version, helpful votes and developer reply.

## `reviewsCsv` (type: `string`):

The same records as a spreadsheet-ready CSV file.

## `consoleView` (type: `string`):

Open the run's dataset in Apify Console.

# 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.whatsapp"
    ]
};

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

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

```

## MCP server setup

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