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

Scrape App Store and Google Play reviews in one run: many apps and countries, one clean dataset. Filter by stars and date, get developer replies. Optional insights report per app: complaint topics, bad versions, trends, feature requests.

- **URL**: https://apify.com/d_nepoch/app-store-google-play-reviews.md
- **Developed by:** [Dmitrii Nepochatykh](https://apify.com/d_nepoch) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.14 / 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.
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?

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 Scraper

**App Store & Google Play Reviews Scraper** downloads app reviews from **Apple App Store and Google Play in one run**. Paste app links or IDs, pick countries, and get one clean dataset with the same fields for both stores — ready for Excel, Google Sheets, dashboards, sentiment analysis or your AI pipeline.

No login, no API keys, no cookies. About **1,000 reviews in 20 seconds**. Turn on **Insights report** to also get a ready-made analysis of every app: complaint topics, versions that hurt the rating, monthly trend and feature requests.

### Try it in one click

The input is prefilled with Spotify on both stores: click **Start** and get 200 US reviews plus an insights report for each store in about 20 seconds, for about $0.14.

Real insights report, Spotify, 600 newest reviews per store from the US and UK (October 2026):

| | Google Play | App Store |
|---|---|---|
| Average rating | 4.01★ | 4.14★ |
| 1–2★ share | 21% | 14% |
| Top complaint topic | Pricing & subscription (76 mentions, avg 2.7★) | Pricing & subscription (94 mentions, avg 3.4★) |
| Second topic | Ads (74 mentions, avg 2.7★) | Ads (79 mentions, avg 3.4★) |
| Updates topic | 13 mentions, avg 1.8★ | 5 mentions, avg 1.4★ |
| Reviews with feature requests | 10 | 18 |

And one row per review, for example:

| Store | Country | Stars | Version | Review (shortened) |
|---|---|---|---|---|
| Google Play | gb | 2 | 9.1.92.3058 | the new widget is worse, taking up more space for no reason… |
| App Store | us | 1 | — | Too much AI too much video content. Just stick to real music… |
| Google Play | us | 1 | — | …a bit too greedy with premium and barely any access to most features |

### What can this app reviews scraper do?

- **Scrape iOS App Store reviews** — rating, title, text, user name, date, developer response.
- **Scrape Google Play Store reviews** — rating, text, app version, thumbs-up count, developer reply.
- **Many apps × many countries** in a single run, deduplicated.
- **Filter** by star rating (e.g. only 1–2★) and by date (`since: "7 days"`).
- **Insights report** per app: what users complain about and what they love, without reading thousands of reviews.

### Who uses app review data?

- **App developers and product managers**: monitor your own app daily and catch bugs right after a release.
- **ASO and marketing teams**: track competitors' ratings, complaints and feature requests across markets.
- **Researchers and data teams**: build sentiment datasets for iOS and Android apps.
- **AI builders**: unified JSON is ready for LLM summarization, clustering and RAG.
- **Localization teams**: see what users say in 30+ countries.

### Why this scraper

| | This Actor | Typical single-store review scrapers |
|---|---|---|
| App Store + Google Play in one run | ✅ | one store only |
| Many apps × many countries per run | ✅ | often one app |
| Same output fields for both stores | ✅ | different formats |
| Star and date filters | ✅ | rarely both |
| Developer replies from both stores | ✅ | sometimes |
| Cross-country duplicates skipped and not charged | ✅ | ❌ |
| Built-in insights report per app | ✅ | ❌ |

### How to scrape App Store and Google Play reviews

1. Click **Try for free**.
2. Paste App Store links (e.g. `https://apps.apple.com/us/app/instagram/id389801252`) or numeric IDs into **App Store apps**, and Google Play links or package names (e.g. `com.spotify.music`) into **Google Play apps**. Use one store or both.
3. Choose **countries**, how many reviews per app, and optional star and date filters.
4. Click **Start**. Download the reviews as JSON, CSV, Excel or HTML, or open the insights report from the **Storage** tab.

### Input

| Field | Example | Notes |
|---|---|---|
| `appStoreApps` | `["https://apps.apple.com/us/app/instagram/id389801252", "324684580"]` | URLs or numeric IDs |
| `googlePlayApps` | `["com.spotify.music"]` | package names or URLs |
| `countries` | `["us", "gb", "de"]` | each app is scraped in each country |
| `language` | `"en"` | Google Play review language |
| `maxReviewsPerApp` | `500` | per app, per country |
| `sort` | `"newest"` | `newest`, `most_relevant`, `most_helpful`, `rating` |
| `ratings` | `["1", "2"]` | keep only these stars |
| `since` | `"7 days"` or `"2026-01-31"` | stops early when sorted by newest |
| `insightsReport` | `true` | adds one insights report per app (see below) |

```json
{
  "appStoreApps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
  "googlePlayApps": ["com.spotify.music"],
  "countries": ["us", "gb"],
  "maxReviewsPerApp": 200,
  "ratings": ["1", "2"],
  "since": "30 days"
}
```

### Output: app reviews dataset

One item per review:

```json
{
  "store": "googleplay",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "country": "us",
  "language": "en",
  "reviewId": "b569895c-e2b2-481d-8ff1-2b8641dd4702",
  "rating": 5,
  "title": null,
  "text": "Great app, I can listen to any song any time",
  "userName": "Jane D.",
  "date": "2026-10-17T09:31:47+00:00",
  "appVersion": "9.1.90.2270",
  "thumbsUp": 0,
  "voteCount": null,
  "voteSum": null,
  "developerReply": null,
  "developerReplyDate": null,
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us&reviewId=...",
  "scrapedAt": "2026-10-18T12:00:00+00:00"
}
```

App Store items have `title`; Google Play items have `thumbsUp` and `appVersion`. Developer replies come from both stores when the developer answered. Export to JSON, CSV, Excel or use the API.

### Insights report: app review analysis without reading every review

With `insightsReport: true` the Actor analyzes the collected reviews of each app (all countries together) and saves:

- **INSIGHTS.html** in the key-value store — a readable report you can open in a browser or share with your team;
- **INSIGHTS** (JSON) — the same numbers for dashboards, spreadsheets or your own AI pipeline.

Each report contains:

| Section | What you get |
|---|---|
| Highlights | 3–5 plain-English findings, e.g. *"Version 9.1.2 rated 2.1 (48 reviews), 1.3 below average"* |
| Ratings | average, 1–5★ distribution, share of negative and positive reviews |
| Topics | crashes & bugs, performance & battery, login & account, ads, pricing & subscription, updates, UI, support, sync & data loss, notifications, privacy, connectivity — mentions, how many are 1–2★, average rating, example reviews |
| Complaint and praise phrases | two-word phrases typical for 1–2★ vs 4–5★ reviews (e.g. "keeps crashing", "free trial") |
| Monthly trend | reviews, average rating and negative share per month |
| Version regressions | app versions rated at least 0.5★ below the app's average (10+ reviews) |
| Feature requests | how many reviews ask for something, with examples |
| Developer replies | reply rate, reply rate to negative reviews, median reply time (Google Play) |

The analysis is rule-based and deterministic: no AI keys, no extra per-review cost, the same input always gives the same report. Topics and phrases are tuned for English reviews; use 200+ reviews per app for meaningful numbers. Tip: add a competitor's app to the same run to compare reports side by side.

### Ready-made setups

Copy the JSON into the **Input → JSON** tab, click **Save as a new task**, then add a **Schedule** and an integration (Slack, email, Google Sheets, webhook) on the task's **Integrations** tab.

**1. Daily alert on new negative reviews** (developers, support). Only new 1–2★ reviews since yesterday, sent to Slack or email. Schedule: daily. Usually a few cents per day.

```json
{
  "appStoreApps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
  "googlePlayApps": ["com.spotify.music"],
  "countries": ["us", "gb"],
  "sort": "newest",
  "since": "1 day",
  "ratings": ["1", "2"],
  "maxReviewsPerApp": 500
}
```

**2. Weekly competitor report** (product and ASO teams). Your app and two competitors, three markets, an insights report per app. Schedule: weekly, export `INSIGHTS.html` from the key-value store.

```json
{
  "googlePlayApps": ["com.spotify.music", "com.soundcloud.android", "deezer.android.app"],
  "countries": ["us", "gb", "de"],
  "since": "7 days",
  "maxReviewsPerApp": 500,
  "insightsReport": true
}
```

**3. Release check** (mobile teams). Run a few days after each release: the report's **version regressions** show whether the new version is rated worse than average.

```json
{
  "googlePlayApps": ["com.spotify.music"],
  "countries": ["us"],
  "since": "14 days",
  "maxReviewsPerApp": 2000,
  "insightsReport": true
}
```

### Use it from AI agents (MCP, Claude, ChatGPT, n8n)

**MCP server.** Add this URL to Claude, Cursor, VS Code or any other MCP client and sign in to Apify when asked:

```
https://mcp.apify.com?tools=d_nepoch/app-store-google-play-reviews
```

```json
{
  "mcpServers": {
    "app-reviews": { "url": "https://mcp.apify.com?tools=d_nepoch/app-store-google-play-reviews" }
  }
}
```

Then just ask, for example: *"What do users complain about in the Duolingo app this month on both stores?"* or *"Get the last 7 days of 1–2 star reviews for com.spotify.music and group them by problem"*. The agent fills app IDs, countries and filters itself; with `insightsReport: true` it can read the ready-made `INSIGHTS` JSON instead of thousands of reviews.

**One HTTP call** (waits for the run and returns the reviews as JSON; for runs longer than 5 minutes use the async `runs` endpoint):

```bash
curl -X POST "https://api.apify.com/v2/acts/d_nepoch~app-store-google-play-reviews/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"googlePlayApps": ["com.spotify.music"], "countries": ["us"], "maxReviewsPerApp": 100}'
```

**Python** (`pip install apify-client`, version 3):

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("d_nepoch/app-store-google-play-reviews").call(
    run_input={"googlePlayApps": ["com.spotify.music"], "since": "7 days", "insightsReport": True},
    max_total_charge_usd=1,  # hard spending cap for this run
)
for review in client.dataset(run.default_dataset_id).iterate_items():
    print(review["rating"], review["text"])
report = client.key_value_store(run.default_key_value_store_id).get_record("INSIGHTS")["value"]  # one report per app
```

**No-code and agent frameworks**: the Apify integrations for n8n, Make, Zapier, LangChain, LlamaIndex and CrewAI call this Actor by the name `d_nepoch/app-store-google-play-reviews` with the same JSON input.

Tips for agents: one row = one review; `store` is `appstore` or `googleplay`; `rating` is 1–5; the insights report is the `INSIGHTS` record (JSON) in the run's key-value store; set `maxTotalChargeUsd` to cap spend.

### How much does it cost to scrape app reviews?

Paid Apify plans get lower prices: Starter −10%, Scale −20%, Business −30% (from **$0.14 per 1,000 reviews**).

You pay only for reviews saved to the dataset (see the **Pricing** tab), plus one small charge per app when the insights report is on. Duplicates are skipped and not charged. Set **Max total charge** in run options to cap your spend — the Actor stops cleanly when the limit is reached. New Apify accounts get free monthly credits, enough to try it on a few apps.

### FAQ

**How many reviews can I get?** Google Play: thousands per app and language. App Store: the reviews Apple shows on its website for each country, newest first — add more countries to collect more.

**Can I get only new reviews every day?** Yes. Schedule the Actor with `sort: "newest"` and `since: "1 day"`; it stops as soon as it reaches older reviews.

**Does it get the app version?** Google Play reviews include `appVersion`. The App Store does not publish the version of a review.

**Is scraping app reviews legal?** The Actor collects only publicly visible reviews. Reviews can contain personal data (user names), so use the data in line with the stores' terms and privacy laws such as GDPR. If unsure, ask a lawyer.

### Limits

- **App Store** reviews come from the same source as the apps.apple.com website, newest first, page by page. Each country has its own reviews.
- **Google Play** returns reviews for the selected language; run again with another `language` to get other languages.
- **No duplicates, no double charges**: Google Play shows the same reviews in many countries, so a review that already appeared for another country is skipped and not charged.

### Other scrapers by this developer

- [App Store & Google Play Scraper](https://apify.com/d_nepoch/app-store-google-play-scraper) — app search ranks (ASO), top charts up to 200 apps and full app details from both stores.
- [AliExpress Product Search Scraper](https://apify.com/d_nepoch/aliexpress-product-search-scraper) — AliExpress prices, sold counts and ratings for any keyword or category.
- [TikTok Shop Product Scraper](https://apify.com/d_nepoch/tiktok-shop-product-scraper) — TikTok Shop products with units sold, stock per variant and rating breakdown.
- [Google Hotels Scraper](https://apify.com/d_nepoch/google-hotels-scraper) — hotel prices for any city and dates, prices from every booking site and a price calendar.
- [Startup Funding Rounds Scraper](https://apify.com/d_nepoch/startup-funding-rounds-scraper) — new startup rounds from SEC Form D, Form C and the news, with filters and only-new monitoring.

### Feedback

Found a bug or need a field? Open an issue on the **Issues** tab — fixes usually ship within a few days.

# Actor input Schema

## `appStoreApps` (type: `array`):

Apple App Store app IDs (e.g. 389801252) or app URLs (e.g. https://apps.apple.com/us/app/instagram/id389801252).

## `googlePlayApps` (type: `array`):

Google Play package names (e.g. com.spotify.music) or app URLs (e.g. https://play.google.com/store/apps/details?id=com.spotify.music).

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

Two-letter country codes (us, gb, de, jp, ...). Each app is scraped in every listed country. App Store reviews are separate per country, so adding countries gives you more reviews.

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

Language code for Google Play reviews (en, de, es, ja, ...). App Store returns reviews in the country's languages.

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

Stop after this many reviews for each app in each country.

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

Newest first is required for the date filter to stop early.

## `ratings` (type: `array`):

Keep only reviews with these ratings, e.g. 1 and 2 for negative reviews. Leave empty for all.

## `since` (type: `string`):

Absolute date (2026-01-31) or relative period (7 days, 4 weeks, 3 months). Works with 'Newest first'.

## `insightsReport` (type: `boolean`):

Also build an insights report for each app: rating distribution and monthly trend, versions rated below average, complaint topics (crashes, ads, pricing, login...), top complaint and praise phrases, feature requests and developer reply rate. Saved as INSIGHTS.html and INSIGHTS (JSON) in the key-value store. Charged once per app. Works best with English reviews and 200+ reviews per app.

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

Datacenter proxies are enough for most runs.

## Actor input object example

```json
{
  "appStoreApps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "googlePlayApps": [
    "com.spotify.music"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "maxReviewsPerApp": 100,
  "sort": "newest",
  "insightsReport": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

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

No description

## `insights` (type: `string`):

No description

## `insightsJson` (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 = {
    "appStoreApps": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "googlePlayApps": [
        "com.spotify.music"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 100,
    "insightsReport": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("d_nepoch/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 = {
    "appStoreApps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
    "googlePlayApps": ["com.spotify.music"],
    "countries": ["us"],
    "maxReviewsPerApp": 100,
    "insightsReport": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("d_nepoch/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 '{
  "appStoreApps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "googlePlayApps": [
    "com.spotify.music"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 100,
  "insightsReport": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call d_nepoch/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,d_nepoch/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/DDHSCwZhlxnq4oHfM/builds/Turc6x8m1vFHmiHAA/openapi.json
