# Google Play Reviews & App Data Scraper (`fjordlabs/google-play-reviews`) Actor

Scrape Google Play reviews and app details for many apps, countries and languages in one run. Incremental mode returns only reviews newer than a date, for cheap daily monitoring. GDPR-friendly: reviewer names off by default.

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

## Pricing

from $0.25 / 1,000 reviews

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 & App Data Scraper

Scrape **Google Play Store reviews** and **app details** for any number of apps, countries and languages in a single run. Built for **review monitoring**: incremental mode returns only reviews newer than a date and stops paging immediately, so a daily run costs almost nothing.

### What you get

- ⭐ **Reviews:** star rating, review text, likes, app version, date, and the developer's reply with its date.
- 📱 **App details:** title, developer, average rating, rating count, **rating histogram (1–5★)**, installs (exact and range), price, genre, version, last update date, ads and in-app purchases.
- 🌍 **Many markets at once:** combine any countries (`us`, `gb`, `dk`, `de`…) with any languages (`en`, `da`, `de`…).
- 🔎 **Search mode:** give keywords like "budget app" and the Actor finds the top apps for you.
- 🎯 **Exact star filters:** ask for 1–2★ reviews only. Google filters server-side, so you get exactly N matching reviews instead of N reviews of which a few match.
- 🔁 **Incremental monitoring:** `reviewsNewerThan: "1 day"` plus a daily schedule gives you a feed of only new reviews.
- 🛡️ **GDPR-friendly by default:** reviewer names are off unless you enable them, and profile images are never collected.

### Use cases

- Track negative reviews after each release and alert your team (pairs with Slack/Zapier/Make integrations).
- Competitor analysis: compare rating histograms, update frequency and complaints across apps and countries.
- Feed reviews to an LLM for sentiment and topic analysis. Works great from AI agents via the Apify MCP server.
- App-store optimisation (ASO) research across markets.

### Input example

```json
{
  "apps": ["com.spotify.music", "https://play.google.com/store/apps/details?id=com.netflix.mediaclient"],
  "searchTerms": ["habit tracker"],
  "countries": ["us", "gb"],
  "languages": ["en"],
  "maxReviewsPerApp": 500,
  "sort": "newest",
  "maxStars": 2,
  "reviewsNewerThan": "7 days"
}
```

### Output example

```json
{
  "type": "review",
  "appId": "com.spotify.music",
  "country": "us",
  "language": "en",
  "reviewId": "646bd8b5-…",
  "userName": null,
  "score": 2,
  "content": "Casting to my speakers keeps disconnecting since the last update.",
  "thumbsUpCount": 14,
  "appVersion": "9.1.92.3058",
  "at": "2026-10-19T23:14:33",
  "replyContent": "Sorry to hear that! Please try…",
  "repliedAt": "2026-10-20T08:02:11"
}
```

App rows have `"type": "app"`. Filter on `type` in the dataset view or export.

### Pricing

Pay only for what you get:

| Event | Price |
|---|---|
| Actor start | $0.00005 |
| Review | $0.00025 (**$0.25 per 1,000**) |
| App details row | $0.002 |

A daily monitoring run for 5 apps that finds about 50 new reviews costs about **$0.02**.

### Notes

- Some apps aren't available in every country. They're skipped with a warning and the run continues.
- Google Play exposes a limited history per sort order. For very large backfills, combine several star filters and sort orders.
- This Actor only reads publicly available data. You're responsible for using it in line with applicable laws, including GDPR.

# Actor input Schema

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

Google Play app IDs (e.g. com.spotify.music) or full Play Store URLs.

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

Find apps by keyword instead of (or in addition to) listing them. Each term adds the top matching apps.

## `appsPerSearch` (type: `integer`):

How many top apps to take from each search term.

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

Two-letter country codes, e.g. us, gb, dk, de. Each app is scraped once per country/language pair.

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

Two-letter language codes, e.g. en, da, de.

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

Set 0 to fetch app details only.

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

Order in which Google returns reviews. Use 'newest' for monitoring.

## `minStars` (type: `integer`):

Lowest star rating to include.

## `maxStars` (type: `integer`):

Highest star rating to include.

## `reviewsNewerThan` (type: `string`):

ISO date like 2026-10-01, or relative like '7 days'. Requires sort = newest. Stops paging as soon as older reviews appear, so daily monitoring runs cost very little.

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

One extra row per app with rating, installs, version, developer, price and rating histogram.

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

Off by default to minimise personal data (GDPR). Reviewer profile images are never collected.

## Actor input object example

```json
{
  "apps": [
    "com.spotify.music"
  ],
  "appsPerSearch": 5,
  "countries": [
    "us"
  ],
  "languages": [
    "en"
  ],
  "maxReviewsPerApp": 200,
  "sort": "newest",
  "minStars": 1,
  "maxStars": 5,
  "includeAppDetails": true,
  "includeReviewerNames": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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"
    ],
    "countries": [
        "us"
    ],
    "languages": [
        "en"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fjordlabs/google-play-reviews").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"],
    "countries": ["us"],
    "languages": ["en"],
}

# Run the Actor and wait for it to finish
run = client.actor("fjordlabs/google-play-reviews").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"
  ],
  "countries": [
    "us"
  ],
  "languages": [
    "en"
  ]
}' |
apify call fjordlabs/google-play-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fjordlabs/google-play-reviews"
        }
    }
}
```

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/JZMUoIcqrx2bkkCjQ/builds/AR8l9d5PQIOiA8OEV/openapi.json
