# App Store & Google Play Reviews + Platform Gap (`steadywren/app-store-google-play-reviews-scraper`) Actor

App Store and Google Play reviews scraper: iOS and Android reviews of the same app in one run, one row shape, at $0.10 per 1,000, plus a pair report ($0.004 each): auto-paired store listings, rating gap, complaint topics per platform, release lag between iOS and Android.

- **URL**: https://apify.com/steadywren/app-store-google-play-reviews-scraper.md
- **Developed by:** [Steadywren](https://apify.com/steadywren) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 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

## App Store & Google Play Reviews + Platform Gap

App Store and Google Play reviews of the same app in one run and one row shape: give one app name or store link,
get iOS and Android reviews plus a pair report that shows which platform is weaker and why. $0.10 per 1,000 reviews.

![App Store & Google Play Reviews + Platform Gap - example output](https://steadywren.com/assets/screens/app-store-google-play-reviews-scraper.png)

### What you get

- **Reviews of both stores, one shape**: `store` (`appStore` / `googlePlay`), rating, title (App Store only), text,
  version, date, helpful votes, developer reply (Google Play only), complaint topics, `pairId`. Reviewer names are
  never collected.
- **Auto cross-store pairing**: type `Spotify` (or paste an App Store link or a Google Play package) - the Actor
  finds the same app on the other store by itself, scoring developer name, title and identical bundle id / package
  among the top 8 search results. Every pair comes with a `confidence` (`high` / `medium` / `low`) and the reason;
  low-confidence pairs are never compared silently. In our 2026-11-03 re-check on 30 top-chart US apps, all 30
  paired `high` and correct.
- **Platform Gap Report** (one per app, in its own **Pair reports** table of the Output tab): store rating, recent
  rating (newest reviews), share of 1-2 star reviews and reviews per day on each platform; the gaps;
  `weakerPlatform`; complaint topics (`crash`, `bugs`, `login`, `billing`, `ads`, `performance`, `ui`,
  `feature_request`) as a share of the negative reviews on each platform, flagged `appStoreOnly`, `googlePlayOnly`,
  `muchWorseOnAppStore` or `muchWorseOnGooglePlay` when the difference is real (at least 30 negative reviews per
  side and 5 points apart). In a 2026-11-03 check of 27 pairs, 15 had at least one flagged topic, and for 12 the
  recent-rating gap pointed the other way than the lifetime store rating.
- **Release parity**: current version and release date on each platform, whether they are the same release, and the
  lag in days. With *Track history*, every version's first-seen date is kept per platform, so the average
  iOS -> Android lag builds up over daily runs. Rating by version per platform is in the report too.
- **Pairing record**: the `PAIRS` record lists every input with the two apps it was paired with, the confidence and
  the reason - also for inputs that were not compared.

### Sample output

#### Pair report

```json
{
    "type": "pair",
    "pairId": "324684580_com.spotify.music",
    "input": "Spotify",
    "pair": {
        "appStore": { "appId": "324684580", "appName": "Spotify: Music and Podcasts", "developer": "Spotify" },
        "googlePlay": { "appId": "com.spotify.music", "appName": "Spotify: Music and Podcasts", "developer": "Spotify AB" },
        "confidence": "high",
        "reason": "developer 100%, title 100%"
    },
    "appStore": { "storeRating": 4.77, "ratingCount": 42904321, "reviewsAnalyzed": 200, "recentRating": 4.09, "negativeShare": 0.18, "reviewsPerDay": 291.5 },
    "googlePlay": { "storeRating": 4.35, "ratingCount": 36582436, "reviewsAnalyzed": 200, "recentRating": 3.8, "negativeShare": 0.26, "reviewsPerDay": 575.4 },
    "storeRatingGap": 0.42,
    "recentRatingGap": 0.29,
    "negativeShareGap": -0.08,
    "weakerPlatform": "googlePlay",
    "topicGaps": [
        { "topic": "performance", "appStoreShare": 0.22, "googlePlayShare": 0.02, "difference": 0.2, "flag": "muchWorseOnAppStore" },
        { "topic": "ads", "appStoreShare": 0.19, "googlePlayShare": 0.31, "difference": -0.12, "flag": "muchWorseOnGooglePlay" },
        { "topic": "billing", "appStoreShare": 0.08, "googlePlayShare": 0.14, "difference": -0.06, "flag": "muchWorseOnGooglePlay" }
    ],
    "releaseParity": {
        "appStore": { "version": "9.1.94", "releasedAt": "2026-10-23T17:59:53Z" },
        "googlePlay": { "version": "9.1.94.1929", "versionSource": "reviews", "updatedAt": "2026-11-02T11:59:56.000Z" },
        "sameVersion": true,
        "lagDays": 9.8,
        "newerOn": "googlePlay",
        "history": null
    },
    "messages": []
}
```

Reading it (run of 2026-11-03, 200 newest reviews per store): Spotify is rated higher on iOS, and Android is the
weaker platform now too - a quarter of its newest reviews are 1-2 stars. But the reasons differ: iOS users complain
about performance (22% of negative reviews vs 2%), Android users about ads and billing.

#### Review

One real App Store review from the run of 2026-11-05 (trimmed; every review row also has `reviewId`, `url`, `voteSum`, `replyDate` and `isNew`):

```json
{
    "type": "review",
    "store": "appStore",
    "pairId": "324684580_com.spotify.music",
    "appId": "324684580",
    "appName": "Spotify: Music and Podcasts",
    "country": "us",
    "rating": 1,
    "title": "Glitches",
    "text": "It doesn’t play songs in my queue when I add them and it doesn’t work with my cross fade anymore. What’s going on????",
    "version": "9.1.94",
    "date": "2026-11-03T08:37:26-07:00",
    "thumbsUp": null,
    "replyText": null,
    "topics": [
        "bugs"
    ],
    "scrapedAt": "2026-11-05T04:00:32.700Z"
}
```

### How much does it cost?

**$0.10 per 1,000 reviews.** Example: one app with 500 newest reviews on each store plus its pair report =
1,000 x $0.0001 + $0.004 = about $0.10 per run.

- $0.004 per pair report (one report compares two apps); switch it off with **Pair report**.
- No Actor start fee. Platform compute is included.
- **Max reviews per app and store** caps your cost.

### How to use

1. Enter app names, App Store URLs/ids or Google Play URLs/packages in **Apps** (or exact pairs in **Explicit pairs**).
2. Set **Max reviews per app and store** and the **Country**.
3. Click **Start**, then download JSON, CSV or Excel from the Output tab (reviews and **Pair reports** tables).

Main filters: country, language, max reviews per store, minimum pair confidence, only new reviews.

Use it to:

- **Find your weaker platform**: one run on your app shows whether iOS or Android users are less happy right now,
  and why.
- **Spot platform-specific bugs**: `appStoreOnly` / `googlePlayOnly` topics point at issues of one build (crashes
  on Android only, login on iOS only).
- **Plan releases**: release parity and the history tell you how long Android lags behind iOS (or the other way
  round), per competitor too.
- **Research competitors**: put your competitors in **Apps** and compare their gaps with yours.

### Use with AI assistants (MCP)

Connect this Actor to Claude, ChatGPT or any MCP client: `https://mcp.apify.com?tools=steadywren/app-store-google-play-reviews-scraper`

Try:

- "Compare the iOS and Android reviews of Duolingo and tell me which platform is weaker and why."
- "For Spotify, Strava and Calm: which complaint topics are much worse on Android than on iOS?"

### How it compares

Checked against the Store descriptions of the 10 cross-store review Actors in Apify Store on 2026-11-03.

| | This Actor | Other App Store + Google Play review scrapers in Apify Store |
|---|---|---|
| Auto-pair the iOS and Android listing of the same app (one input, confidence score) | yes | no |
| Platform Gap Report (rating, recent rating, negative share, complaint topics per platform) | yes | no |
| Release parity (version and release date per platform, lag in days, history across runs) | yes | no |
| Price per 1,000 reviews | $0.10, no start fee | $0.15 to $4, some with a start fee |

### Monitor daily

Turn on **Track history between runs** and schedule the Actor daily: new reviews are marked `isNew`, and every
version's first-seen date per platform builds the release history (average iOS -> Android lag). With
**Only new reviews**, each run outputs just the reviews earlier runs have not returned; the pair report is still
delivered. History lives in the key-value store `app-pair-history` in your account.

### FAQ

**Is it legal?** The Actor collects publicly available data only, without login and without personal data of
private individuals. Check the site's terms for your use case.

**What if a store changes or a run fails?** The run fails with a clear error instead of returning empty results
(also when key report fields are empty in most results), and you are not charged for results it did not deliver.
When one store's reviews fail to load, no half-empty pair report is charged. A run where no store knows any of the
names finishes green with a message. Each run's summary (results, retries, errors) is in the Storage tab ->
Key-value store -> `RUN_SUMMARY`, next to the `PAIRS` record.

**Do I need proxies? Are there limits?** No proxy is needed for either store (off by default). Apple's public review
feed serves the newest 500 reviews per app and country, so the App Store side stops at 500; Google Play has no such
cap. For big apps 500 reviews is a few days, which is what the recent rating is about.

**How fresh is the data?** Live at run time: the newest reviews and the current store pages.

**What does `confidence` mean?** `high`: the same bundle id and package with a similar developer or title, or the
same developer with the same title. `medium`: the same developer and brand name, the same full title from a
differently named developer (developers often use another company name on one store), or the same id only. `low`:
anything weaker - such pairs get no comparison unless you lower **Minimum pair confidence**. `explicit`: you gave
the pair. The `reason` field shows the scores.

**A pair is wrong or low - what now?** Pass it explicitly in **Explicit pairs**:
`{ "appStore": "<App Store URL or id>", "googlePlay": "<Google Play URL or package>" }`. Explicit pairs skip the
search. For a low-confidence pair no pair report is charged; the reviews of the app you named are still delivered,
and `PAIRS` explains why the other store was not compared.

**Why do the version numbers differ between the stores?** Many apps number their Android and iOS builds differently
(e.g. Copilot 2.115 on iOS, 16.0 on Android). `sameVersion` also counts build suffixes as the same release
("9.1.94" vs "9.1.94.1929"); `lagDays` compares the release dates, which works for every app.

**Where does the Android version come from?** From the Google Play page when it shows one (`versionSource: "page"`);
for most big apps Google shows "Varies with device", then the newest version named in the reviews is used
(`versionSource: "reviews"`).

**Why is the recent rating much lower than the store rating?** Store ratings include years of in-app rating prompts
(mostly 5 stars); written reviews come mostly from unhappy users. Compare recent ratings across platforms, not with
the store rating.

**How are topics found?** By keywords in English, German, French, Spanish and Ukrainian, among 1-2 star reviews.
Reviews in other languages get no topics but count in the ratings.

### More from Steadywren

- [App Store Reviews Scraper & Release Health](https://apify.com/steadywren/apple-app-store-reviews-scraper) - iOS reviews with rating by version, prices by country and chart ranks.
- [Google Play Reviews Scraper & Release Health](https://apify.com/steadywren/google-play-reviews-scraper) - Android reviews with developer reply rate, installs per day and filters.
- [Shopify App Store Scraper & App Intelligence](https://apify.com/steadywren/shopify-app-store-scraper) - Shopify app reviews with churn signal, reply rate and category ranks.
- [Steam Reviews Scraper & Patch Impact Report](https://apify.com/steadywren/steam-reviews-scraper) - Steam game reviews with patch impact and sentiment history.
- [All Steadywren Actors](https://apify.com/steadywren) - small tools, steady results. Custom builds: [steadywren.com](https://steadywren.com).

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| `apps` | array | - (prefill: Spotify) | App names, App Store URLs/ids or Google Play URLs/packages. Each becomes one iOS + Android pair: the Actor finds the same app on the other store by itself. Empty input: Spotify. |
| `pairs` | array | - | Pairs you know already, e.g. `[{"appStore": "1232780281", "googlePlay": "notion.id"}]` - no search, no confidence check. |
| `country` | string | `us` | Two-letter country code for both stores (App Store storefront and Google Play gl). |
| `language` | string | `en` | Google Play language (hl), e.g. en, de, fr. |
| `maxReviewsPerApp` | integer | 100 | Newest reviews to fetch on EACH store (1 to 5,000). The App Store serves at most 500 per app and country. |
| `includeReviews` | boolean | `true` | One result per review of both stores in one row shape (store, rating, text, version, date, topics). Turn off to get only the pair reports. |
| `includeReport` | boolean | `true` | One result per pair: store and recent rating per platform and the gap, negative share, complaint topics per platform with flags, release lag between iOS and Android, rating by version. |
| `minPairConfidence` | string | `medium` | Pairs below this confidence get no comparison (only the reviews of the app you named). "high": same bundle id and package with a similar developer or title, or the same developer and title; "medium": same developer and brand name, same full title, or same id only. Options: high, medium, low. |
| `trackHistory` | boolean | `false` | Remember reviews and versions per pair in a key-value store "app-pair-history" in your account: marks new reviews and builds the release history (average iOS -> Android lag). |
| `onlyNew` | boolean | `false` | Output only reviews that earlier runs have not returned (turns history on). Use with a daily schedule. |
| `proxyConfiguration` | object | off | Not needed for either store; leave off unless a store starts limiting your requests. |

Search keywords: app store google play reviews, app reviews scraper, ios android app reviews, app store reviews, google play reviews

# Actor input Schema

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

App names, App Store URLs/ids or Google Play URLs/packages. Each becomes one iOS + Android pair: the Actor finds the same app on the other store by itself. Empty input: Spotify.

## `pairs` (type: `array`):

Pairs you know already, e.g. \[{"appStore": "1232780281", "googlePlay": "notion.id"}] - no search, no confidence check.

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

Two-letter country code for both stores (App Store storefront and Google Play gl).

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

Google Play language (hl), e.g. en, de, fr.

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

Newest reviews to fetch on EACH store. The App Store serves at most 500 per app and country.

## `includeReviews` (type: `boolean`):

One result per review of both stores in one row shape (store, rating, text, version, date, topics). Turn off to get only the pair reports.

## `includeReport` (type: `boolean`):

One result per pair: store and recent rating per platform and the gap, negative share, complaint topics per platform with flags, release lag between iOS and Android, rating by version.

## `minPairConfidence` (type: `string`):

Pairs below this confidence get no comparison (only the reviews of the app you named). "high": same bundle id and package with a similar developer or title, or the same developer and title; "medium": same developer and brand name, same full title, or same id only.

## `trackHistory` (type: `boolean`):

Remember reviews and versions per pair in a key-value store "app-pair-history" in your account: marks new reviews and builds the release history (average iOS -> Android lag).

## `onlyNew` (type: `boolean`):

Output only reviews that earlier runs have not returned (turns history on). Use with a daily schedule.

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

Not needed for either store; leave off unless a store starts limiting your requests.

## Actor input object example

```json
{
  "apps": [
    "Spotify"
  ],
  "country": "us",
  "language": "en",
  "maxReviewsPerApp": 100,
  "includeReviews": true,
  "includeReport": true,
  "minPairConfidence": "medium",
  "trackHistory": false,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per review of either store (type "review", field "store") as JSON. Add ?format=csv or ?format=xlsx for other formats.

## `reports` (type: `string`):

One item per iOS + Android pair (type "pair"): Platform Gap Report and release parity, in its own dataset. Add ?format=csv or ?format=xlsx for other formats.

## `pairs` (type: `string`):

Every input with the App Store and Google Play app it was paired with, the confidence and the reason.

## `runSummary` (type: `string`):

Results, retries and failed requests per error category, and why the run failed if it did.

# 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": [
        "Spotify"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadywren/app-store-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 = {
    "apps": ["Spotify"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("steadywren/app-store-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 '{
  "apps": [
    "Spotify"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call steadywren/app-store-google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

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