# App Store and Google Play Reviews Scraper (`pistachio_implementation/app-store-google-play-reviews`) Actor

Pull public reviews from the Apple App Store and Google Play in one clean, identical schema. Paste app IDs or store links, pick a country and sort, get ratings, text, versions, dates and developer replies. No login, reviewer names removed by default.

- **URL**: https://apify.com/pistachio\_implementation/app-store-google-play-reviews.md
- **Developed by:** [Hay Equipos](https://apify.com/pistachio_implementation) (community)
- **Categories:** Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.40 / 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.

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

## App Store and Google Play Reviews Scraper

Pull public app reviews from the **Apple App Store** and **Google Play** in one run, in one identical table. Paste app IDs or store links, choose a country and a sort order, and get star ratings, review text, app versions, dates, helpful votes and developer replies, ready for a spreadsheet, a dashboard or an AI summary.

### What it does

- Reads both stores in the same run and returns the **same columns for both**, so you can compare your iOS and Android ratings side by side without cleaning anything.
- Accepts whatever you have: a numeric App Store ID, an App Store link, a Google Play package name, or a Google Play link.
- Works per country. Apple keeps separate reviews for each country store, so you can check the US, the UK and Germany separately.
- Sort by newest, most helpful, or (Google Play only) by rating.
- **Privacy first.** Reviewer names are removed by default. The product is the review, not the person.
- No login, no account, no API key. It reads only public endpoints: Apple's public customer reviews feed and lookup API, and Google Play's public store pages.

### Who it is for

App developers and product teams watching feedback after a release, agencies reporting on client apps, and analysts comparing competitor apps.

### Input example

```json
{
    "apps": [
        "310633997",
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
        "com.whatsapp",
        "https://play.google.com/store/apps/details?id=com.duolingo"
    ],
    "country": "us",
    "language": "en",
    "maxReviewsPerApp": 200,
    "sort": "newest",
    "includeReviewerNames": false
}
```

| Field | What it means |
|---|---|
| apps | App Store IDs or links, Google Play package names or links. Mix freely. |
| country | Two letter store country, for example us, gb, de. Default us. |
| language | Google Play review language, for example en or es. Default en. |
| maxReviewsPerApp | Stop after this many reviews for each app. Default 100. |
| sort | newest, helpful, or rating (rating works on Google Play only). |
| includeReviewerNames | Off by default. Turn on only if you have a lawful reason to process display names. |

### Output example

Every review is one row with the same fields for both stores.

```json
{
    "store": "google",
    "appId": "com.duolingo",
    "appName": "Duolingo: Language Lessons",
    "country": "us",
    "language": "en",
    "reviewId": "4c72acbb-b78d-4b58-89e4-41c225769108",
    "rating": 5,
    "title": null,
    "text": "Duolingo please make Tagalog learning for English speakers.",
    "appVersion": null,
    "reviewedAt": "2026-08-30T03:46:37.435Z",
    "helpfulVotes": 0,
    "totalVotes": null,
    "developerReply": null,
    "developerRepliedAt": null,
    "reviewUrl": "https://play.google.com/store/apps/details?id=com.duolingo&reviewId=4c72acbb-b78d-4b58-89e4-41c225769108",
    "scrapedAt": "2026-09-27T05:32:31.033Z"
}
```

```json
{
    "store": "apple",
    "appId": "310633997",
    "appName": "WhatsApp Messenger",
    "country": "us",
    "language": null,
    "reviewId": "14592590740",
    "rating": 5,
    "title": "Awesome",
    "text": "Awesome",
    "appVersion": "26.37.76",
    "reviewedAt": "2026-09-25T17:55:50.000Z",
    "helpfulVotes": 0,
    "totalVotes": 0,
    "developerReply": null,
    "developerRepliedAt": null,
    "reviewUrl": "https://apps.apple.com/us/app/id310633997?see-all=reviews",
    "scrapedAt": "2026-09-27T05:32:26.504Z"
}
```

A run summary (reviews per app and any error per app) is saved in the default key value store under the key `SUMMARY`.

### Pricing

Pay per result: **$0.40 per 1,000 reviews**. You pay only for reviews saved to your dataset. Apps that fail or return nothing cost nothing beyond the small platform start cost.

### Limits

- **Apple keeps about 500 reviews per country and sort order** in its public feed (10 pages of 50). For more history on an iOS app, run several countries or combine newest and most helpful.
- Apple's feed does not include developer replies or the review's own link, so those fields are empty for App Store rows. Google Play rows include developer replies.
- Google Play returns reviews in the language you choose. Run again with another language to get more.
- Ratings summaries (total ratings, average score) are not included. This actor is for the reviews themselves.

### FAQ

**Do I need an Apple or Google account?** No. Nothing is logged in and no key is needed.

**Can I mix App Store and Google Play apps in one run?** Yes. Each line is recognised automatically.

**Why are reviewer names missing?** They are removed by default to keep personal data out of your dataset. You can turn them on with `includeReviewerNames` if you have a lawful reason.

**How do I monitor new reviews every day?** Save your input as a task and add a schedule in Apify. Use sort `newest` and a modest `maxReviewsPerApp`, then remove duplicates by `reviewId` in your sheet or database.

**Something is broken or missing.** Open an issue on the actor's Issues tab. Issues are answered quickly.

This actor is not affiliated with, endorsed by, or sponsored by Apple or Google. App Store is a trademark of Apple Inc. Google Play is a trademark of Google LLC.

# Actor input Schema

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

One app per line. Apple: the numeric App Store ID (310633997) or the App Store link (https://apps.apple.com/us/app/whatsapp-messenger/id310633997). Google Play: the package name (com.whatsapp) or the Play Store link (https://play.google.com/store/apps/details?id=com.whatsapp). Both stores can be mixed in one run.

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

Two letter country code of the store to read, for example us, gb, de, br. Apple keeps separate reviews per country.

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

Two letter language code for Google Play reviews, for example en, es, de. Apple ignores this and returns the reviews written in the chosen country.

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

Stop after this many reviews for each app. Apple's public feed serves at most about 500 reviews per country and sort order.

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

Newest first, most helpful first, or by rating (Google Play only; Apple falls back to newest).

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

Off by default. Reviews are returned without the reviewer's name. Turn on only if you have a lawful reason to process display names.

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

How many apps to read at the same time. Kept low on purpose to be polite to the stores.

## Actor input object example

```json
{
  "apps": [
    "310633997",
    "com.whatsapp"
  ],
  "country": "us",
  "language": "en",
  "maxReviewsPerApp": 100,
  "sort": "newest",
  "includeReviewerNames": false,
  "maxConcurrency": 2
}
```

# Actor output Schema

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

All rows the run saved to the default dataset.

## `summary` (type: `string`):

The SUMMARY record: counts and problems for the whole run.

# 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": [
        "310633997",
        "com.whatsapp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pistachio_implementation/app-store-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": [
        "310633997",
        "com.whatsapp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pistachio_implementation/app-store-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": [
    "310633997",
    "com.whatsapp"
  ]
}' |
apify call pistachio_implementation/app-store-google-play-reviews --silent --output-dataset

```

## MCP server setup

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