# Google Play Scraper: Reviews, App Details & Search (`winterlock/google-play-scraper`) Actor

Scrape Google Play reviews, app details, search results, featured apps and developer catalogues in any country. Monitor mode returns only reviews posted since your last run. No login or API key.

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

## Pricing

from $4.00 / 1,000 app details, search result or chart entries

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 Scraper: Reviews, App Details & Search

Collect Google Play data for any Android app in any country, straight from the public store. No Google account, API key or browser needed.

One Actor, five jobs:

| Mode | What you get |
|---|---|
| **Reviews** | Star rating, full text, app version, date, helpful votes, reviewer name and the developer's reply |
| **App details** | Name, developer, rating and rating count, installs, price, category, content rating, icon and description |
| **Search results** | The apps the Play Store returns for any keyword, in ranking order |
| **Featured & promoted apps** | The apps Play is promoting, store-wide or for one category |
| **Developer's apps** | Everything a publisher has on the store |

### Why use this one

- **Monitor mode for reviews.** Turn on *Only new reviews since the last run* and schedule the Actor daily. It remembers the newest review for every app and country, returns only what's new, and you pay only for new reviews.
- **Built to survive Google's redesigns.** App facts come from the schema.org data Google publishes for search engines, and listings are read from ordinary store links. Most Play scrapers parse Google's obfuscated internal arrays, which break every time the front end changes.
- **Every country.** Reviews, ratings, pricing and charts differ by storefront. Add as many country codes as you need in one run.
- **Complaint mining.** Set *Maximum star rating* to 2 to collect only 1- and 2-star reviews, with developer replies included.
- **Pairs with the App Store.** The output uses the same field names as our App Store Scraper, so iOS and Android reviews drop into one table.

### How to use it

1. Choose **What to scrape**.
2. Add **Apps** (for Reviews and App details), **Search terms**, **Developers** (a name such as `Spotify AB`, a numeric ID or a developer link), or a **Category** (for Featured apps).
3. Add **Countries** (`us`, `gb`, `de`, `in`…) and a **Language**.
4. Click **Start**, then download results as JSON, CSV, Excel or HTML, or fetch them through the Apify API.

Apps can be given in either form:

```
https://play.google.com/store/apps/details?id=com.spotify.music
com.spotify.music
```

#### Example input: daily review monitor

```json
{
  "mode": "reviews",
  "apps": ["com.spotify.music"],
  "countries": ["us", "gb", "de"],
  "onlyNewReviews": true,
  "maxReviewsPerAppPerCountry": 500
}
```

#### Example input: top free finance apps in India

```json
{
  "mode": "featured",
  "categories": ["FINANCE"],
  "countries": ["in"],
  "maxResultsPerSearch": 50
}
```

Useful category IDs: `GAME`, `PRODUCTIVITY`, `FINANCE`, `SOCIAL`, `SHOPPING`, `HEALTH_AND_FITNESS`, `MUSIC_AND_AUDIO`, `PHOTOGRAPHY`, `EDUCATION`, `BUSINESS`, `TOOLS`, `TRAVEL_AND_LOCAL`.

### Output

Each item has a `type` field: `review` or `app`. The dataset has ready-made **Reviews** and **Apps** table views.

**Review**

```json
{
  "type": "review",
  "reviewId": "6877ac29-46d8-4b82-b84f-1a970ad1308e",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "country": "us",
  "rating": 2,
  "text": "Playlists keep reshuffling after the latest update…",
  "appVersion": "9.0.12.567",
  "date": "2026-10-14T18:30:53Z",
  "thumbsUp": 41,
  "replyText": "Hi there, please reach out to our support team…",
  "replyDate": "2026-10-15T09:12:00Z",
  "author": "Elisa T."
}
```

**App**

```json
{
  "type": "app",
  "appId": "com.spotify.music",
  "name": "Spotify: Music and Podcasts",
  "developer": "Spotify AB",
  "rating": 4.348,
  "ratingCount": 36494316,
  "installs": "1,000,000,000+",
  "minInstalls": 1000000000,
  "realInstalls": 3164200596,
  "price": 0,
  "currency": "USD",
  "genre": "MUSIC_AND_AUDIO",
  "contentRating": "Teen",
  "country": "us",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
}
```

### What Featured apps gives you, and what Play no longer publishes

Play retired its per-chart pages. Checked against the live store in October 2026:

- `/store/apps/top` is an **editorial** page — "Innovation Corner", "Editors'
  Choice apps", "Events happening now". There are no rank numbers on it.
- A category page does have a **Top charts** rail, but the page delivers only its
  tabs ("Top free", "Top paid", "Top grossing") and the rank numbers 1-9. The apps
  themselves arrive from a client-side request, so they are not in the page.

So this mode returns the apps Play is **promoting** in a storefront, in page
order (`position`). That is genuinely useful for watching what Google pushes in
each country, but it is not a popularity ranking and nothing here pretends it is.
True Top free / paid / grossing charts need Play's internal chart endpoint, which
is a planned addition.

#### Fields that depend on what Play shows

`installs` is the store's install band (`1,000,000,000+`) and `minInstalls` is
that band as a number. `realInstalls` is the exact install count Google embeds in
the listing behind the rounded band, such as 3,164,200,596 for Spotify, and is null
on the rare page that carries only the rounded label. `version` is absent from
most listings now and comes back null; `updatedOn` is normalised to ISO.

### Pricing

Pay only for results:

| Result | Price |
|---|---|
| Review | $1.00 per 1,000 |
| App details, search result or featured entry | $4.00 per 1,000 |

A daily monitor pays only for the new reviews it finds, at $1.00 per 1,000. Set a maximum spend per run in the run options and the Actor stops cleanly when it's reached.

### Limits to know about

- **Reviews** page 100 at a time and very popular apps hold millions, so always set *Max reviews per app per country*.
- **Installs, version and "updated on"** are read with best-effort patterns and can come back empty on some listings. Rating, rating count, price, category and content rating are always present.
- **Search results come from a path Google's `robots.txt` asks crawlers to skip.** Play disallows `/store/search` for crawlers. Every other mode (reviews, app details, featured, developer pages) uses paths the file allows. If your use requires robots.txt compliance, use Featured or Developer's apps for discovery instead of Search.
- **Google rate-limits by IP.** Small runs work without a proxy. For large jobs, or if the log reports blocked requests, turn on Apify Proxy.
- Reviews with no written text are not returned by Google's review feed.

### FAQ

**Do I need a Google account or Play Developer account?** No. Everything comes from the public store, with no sign-in anywhere.

**Can I watch reviews for my own app every day?** Yes. Turn on monitor mode, then create a schedule in Apify Console and connect the dataset to Slack, Google Sheets, Zapier or Make.

**Why did a run return no apps for a search or the featured page?** Google served a page without app links, which usually means that request was rate-limited. Turn on Apify Proxy and try again.

**Is this legal?** The Actor reads publicly available pages and does not log in or bypass any protection. Google's terms restrict automated access, so review them for your use case. Reviews contain public display names, which may count as personal data under GDPR; turn off *Include reviewer names* if you don't need them.

### Feedback

Found a bug or need a field that's missing? Open an issue on the Actor's **Issues** tab.

# Actor input Schema

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

Reviews and app details for apps you name, search results, the apps Play is promoting, or a developer's catalogue.

## `apps` (type: `array`):

For Reviews and App details. Paste Play Store links (https://play.google.com/store/apps/details?id=com.example) or package names (com.example).

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

For Search results. Each term returns apps in Play Store ranking order, with a position field.

## `developers` (type: `array`):

For Developer's apps. The developer name exactly as the store shows it (such as Spotify AB), the numeric developer ID, or a link to the developer's page.

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

Two-letter country codes such as us, gb, de, in, br. Each country has its own reviews, ratings, pricing and charts.

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

Two-letter language code for descriptions and reviews, such as en, es, de, pt.

## `reviewSort` (type: `string`):

Newest is best for monitoring. Most relevant matches what the store shows by default.

## `maxReviewsPerAppPerCountry` (type: `integer`):

Google pages reviews 100 at a time. Popular apps can return many thousands, so set this to control cost.

## `onlyNewReviews` (type: `boolean`):

Remembers the newest review date for each app and country, and on later runs returns only reviews posted after it. Schedule the Actor daily to get a feed of new reviews and pay only for those.

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

Keep only reviews with at least this many stars.

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

Keep only reviews with at most this many stars. Set to 2 to collect only complaints.

## `includeReviewerNames` (type: `boolean`):

Turn off to leave out reviewer display names and avatars.

## `categories` (type: `array`):

For Featured & promoted apps. Play category IDs such as GAME, FINANCE or SOCIAL. Leave empty for the store-wide featured page. One run per category.

## `maxResultsPerSearch` (type: `integer`):

Each app costs one extra request because its facts are read from its own page.

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

Stop the run after saving this many items. Leave empty for no limit.

## `maxConcurrency` (type: `integer`):

Lower this if you see rate-limit retries in the log.

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

Google rate-limits heavy scraping by IP. Turn on Apify Proxy for large jobs or if the log shows blocked requests.

## Actor input object example

```json
{
  "mode": "reviews",
  "apps": [
    "com.spotify.music"
  ],
  "searchTerms": [
    "habit tracker"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "reviewSort": "newest",
  "maxReviewsPerAppPerCountry": 200,
  "onlyNewReviews": false,
  "includeReviewerNames": true,
  "maxResultsPerSearch": 30,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "apps": [
        "com.spotify.music"
    ],
    "searchTerms": [
        "habit tracker"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("winterlock/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 = {
    "apps": ["com.spotify.music"],
    "searchTerms": ["habit tracker"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("winterlock/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 '{
  "apps": [
    "com.spotify.music"
  ],
  "searchTerms": [
    "habit tracker"
  ],
  "countries": [
    "us"
  ]
}' |
apify call winterlock/google-play-scraper --silent --output-dataset

```

## MCP server setup

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