# Google Play Reviews Scraper - Reply & Release Signals (`ntriqpro/google-play-review-signals`) Actor

Collect Google Play app reviews in batches with ratings, developer replies, response delays, unanswered review age, and release context. Public app data with optional reviewer profiles. Structured results for market research and customer feedback monitoring.

- **URL**: https://apify.com/ntriqpro/google-play-review-signals.md
- **Developed by:** [daehwan kim](https://apify.com/ntriqpro) (community)
- **Categories:** Business, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 review scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Play Reviews Scraper - Reply & Release Signals

**Enter Google Play app IDs and get review rows with ratings, developer replies, response timing, and current app context.** Use the results to monitor customer feedback, compare selected apps, and prepare market research without joining review exports to app details yourself.

Each delivered review includes the available app metadata and calculated signals at no extra charge. Choose a language, country, review order, and result limit. The Actor collects public app pages and public review responses; it does not require a Google account.

> **Unofficial.** This Actor is not affiliated with, endorsed by, or sponsored by Google or Google Play. You are responsible for complying with Google Play's terms and applicable privacy law. You are the data controller; ntriqpro acts as a processor on your instructions.

### What you receive

- Review text, rating, publication date, and a stable review ID for deduplication.
- Developer reply text and date when available, plus the time between review and reply.
- The age of unanswered reviews, calculated at collection time.
- App title, update time, current release version, and the reviewer's app version when supplied by the source.
- An explicit reason when the two app versions cannot be compared, and flags for missing, invalid, or inconsistent dates.

Signals describe the available source data. They do not establish why a review was written, whether a reply resolved a problem, or whether an app release caused a rating change.

### Quick start

1. Enter up to 10 app package IDs, such as `com.whatsapp`.
2. Choose your total review limit and review language.
3. Acknowledge the data-use terms, start the Actor, and open its dataset.

```json
{
  "appIds": ["com.whatsapp"],
  "maxResults": 20,
  "reviewsPerApp": 100,
  "lang": "en",
  "country": "us",
  "sort": "newest",
  "includeProfiles": false,
  "disclaimerAck": true
}
```

### Input

| Field | Starting value | Purpose |
|---|---|---|
| `appIds` | `["com.whatsapp"]` | One to 10 Google Play package IDs. Supply IDs, not account credentials. |
| `maxResults` | `20` | Total review limit across all apps, from 1 to 5,000. |
| `reviewsPerApp` | `100` | Maximum reviews per app, from 1 to 5,000, within the total limit. |
| `lang` | `en` | Review language code. |
| `country` | `us` | Store country code. |
| `sort` | `newest` | `newest`, `relevant`, or `rating` (highest rated). |
| `includeProfiles` | `false` | Opt in to public reviewer names and profile image links. |
| `disclaimerAck` | `true` | Required acknowledgement of the data-use terms. |

Free accounts receive at most **25 review rows per run**, even if a higher limit is requested. A notice explains when a limit or source restriction stops collection. The app and total limits bound collection to your selected inputs; this is not an export of Google's entire review database.

### Output

The dataset contains one result row per delivered review. Result rows have `rowType: "review"`. Status rows carry `noticeCode` and explain collection or billing limits; treat these as messages rather than review results.

| Fields | Meaning |
|---|---|
| `appId`, `appTitle`, `reviewId`, `url` | App and review identifiers, title, and source link. |
| `reviewText`, `rating`, `publishedAt` | Review content, rating, and publication time. |
| `reviewVersion`, `currentReleaseVersion` | Version reported for the review and current app listing. |
| `versionMatch`, `versionMatchUnknownReason` | Whether usable versions match, or why this is unknown. |
| `appUpdatedAt`, `releaseAgeDays` | Source update time and age at collection. |
| `developerReplyText`, `developerReplyAt`, `hasDeveloperReply` | Available developer response and response presence. |
| `reviewToReplyDelayHours` | Hours between valid review and reply timestamps; otherwise null. |
| `unansweredAgeHours` | Hours since a review with no developer reply; otherwise null. |
| `dateFlags`, `sourceStatus`, `collectedAt` | Date quality information, source status, and collection time. |
| `authorName`, `avatarUrl` | Public profile fields, only when `includeProfiles` is enabled. |
| `noticeCode`, `message` | Collection notices, separate from review results. |

A null value means the source or calculation cannot establish that value. In particular, Google Play may report that the current version varies by device. In that case `versionMatch` stays null; the Actor does not guess the current version. An unanswered review can still be recent or unrelated to a support request. Reply timing is measured from source timestamps and does not prove support quality.

Dataset exports are available as JSON, CSV, or Excel through Apify. Use `reviewId` to compare repeated, purpose-limited runs; the Actor does not promise cross-run deduplication or complete historical coverage.

### Pricing

There is one **$0.001 collection-start event** after valid input is accepted, plus a charge for every delivered review. A valid collection attempt may incur the start charge even if the source returns no reviews. Invalid inputs are not charged the start event. Notice rows are not charged as reviews. App metadata and calculated signals have no separate fee. Platform usage is included in the configured pay-per-event price.

| Apify billing tier | Price per review | Price for 100 reviews plus start |
|---|---:|---:|
| FREE | $0.00015 | $0.016, rate reference only |
| BRONZE | $0.00013 | $0.014 |
| SILVER | $0.00011 | $0.012 |
| GOLD | $0.00010 | $0.011 |
| PLATINUM | $0.00010 | $0.011 |
| DIAMOND | $0.00010 | $0.011 |

The FREE account limit is 25 reviews, so a full free-account run is at most **$0.00475** in Actor event charges: $0.001 + 25 x $0.00015. Its 100-review figure above only compares unit rates; a free-account run does not deliver 100 reviews. Lower limits or fewer available reviews reduce review charges. Review charges are based on delivered rows, including rows with missing fields or quality flags.

### Coverage and responsible use

Availability depends on the selected app, country, language, ordering, and public source responses. Google Play can change its pages or restrict requests. This Actor identifies itself with an honest bot User-Agent, does not use login credentials, and stops on access restrictions rather than bypassing authentication, captchas, or anti-bot controls. It does not guarantee every review or complete profile data.

Reviewer profile fields are excluded by default. Enabling profiles adds only publicly available name and image-link fields. **Review text and developer replies can still contain personal information even when profiles are off.** Establish a lawful basis, limit collection to your purpose, and manage retention and access to your dataset. Do not use this Actor for harassment, personal-data aggregation for resale, or systematic replication of the entire source database.

This integration uses the MIT-licensed [google-play-scraper](https://github.com/facundoolano/google-play-scraper) engine at a pinned commit. Its original license is preserved in `LICENSE-NOTICE.md`. To report a reproducible issue, use the Actor's Issues tab with the app ID, language, country, and a run ID; do not include credentials or private personal data.

# Actor input Schema

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

Enter up to 10 app package IDs, for example com.whatsapp. Choose specific apps you want to research.

## `maxResults` (type: `integer`):

Total review limit across all selected apps. Free accounts receive at most 25 reviews.

## `reviewsPerApp` (type: `integer`):

Review limit for each app, within the total run limit. Availability depends on the app and selected language.

## `lang` (type: `string`):

Language code, for example en, ko, de, or fr.

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

Two-letter country code, for example us, kr, de, or gb.

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

Choose newest, most relevant, or highest-rated reviews.

## `includeProfiles` (type: `boolean`):

Off by default. Enable only if you have a lawful basis to collect public reviewer names and profile image links. Review text may contain personal information even when this option is off.

## `disclaimerAck` (type: `boolean`):

This unofficial Actor is not affiliated with Google or Google Play. You are responsible for compliance with Google Play terms and applicable law. You act as data controller; ntriqpro processes data on your instructions. Public data only; no access-control bypass.

## `healthCheck` (type: `boolean`):

For scheduled source checks: fail the check when fewer than 10 reviews are returned or collection is partial. Normal runs leave this off.

## Actor input object example

```json
{
  "appIds": [
    "com.whatsapp"
  ],
  "maxResults": 20,
  "reviewsPerApp": 100,
  "lang": "en",
  "country": "us",
  "sort": "newest",
  "disclaimerAck": true
}
```

# Actor output Schema

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

No description

## `downloadCsv` (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.whatsapp"
    ],
    "maxResults": 20,
    "reviewsPerApp": 100,
    "lang": "en",
    "country": "us",
    "sort": "newest",
    "includeProfiles": false,
    "disclaimerAck": true,
    "healthCheck": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("ntriqpro/google-play-review-signals").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"],
    "maxResults": 20,
    "reviewsPerApp": 100,
    "lang": "en",
    "country": "us",
    "sort": "newest",
    "includeProfiles": False,
    "disclaimerAck": True,
    "healthCheck": False,
}

# Run the Actor and wait for it to finish
run = client.actor("ntriqpro/google-play-review-signals").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"
  ],
  "maxResults": 20,
  "reviewsPerApp": 100,
  "lang": "en",
  "country": "us",
  "sort": "newest",
  "includeProfiles": false,
  "disclaimerAck": true,
  "healthCheck": false
}' |
apify call ntriqpro/google-play-review-signals --silent --output-dataset

```

## MCP server setup

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

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/dbxMrbzv8IPBytsLF/builds/UXspnk3t0CeJ2shBg/openapi.json
