# App Store & Google Play Reviews Scraper API (`signalscope-data/app-reviews-scraper`) Actor

Scrape App Store & Google Play reviews to JSON/CSV: rating, text, date, app version, country and developer reply. Apple reviews past the 500-review RSS limit (1,500 in one test run). $0.10 per 1,000 reviews, spending cap per run, MCP-ready.

- **URL**: https://apify.com/signalscope-data/app-reviews-scraper.md
- **Developed by:** [Bin](https://apify.com/signalscope-data) (community)
- **Categories:** Developer tools, Automation, Marketing
- **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 Scraper API

Get **App Store and Google Play reviews as JSON, CSV or Excel**: star rating, title, text, date, app version, country, helpful votes and the **developer's reply**, for any app, in one run. Paste app URLs, IDs or just an app name (`Spotify`). Both stores return the same fields.

**Price: $0.10 per 1,000 reviews**, no subscription, no start fee. You set the spending cap (see [Price and budget control](#price-and-budget-control)).

### What you get

| Row `type` | One row per | Main fields | Price |
|---|---|---|---|
| `review` | review | `store`, `appId`, `appTitle`, `country`, `rating`, `title`, `text`, `date`, `appVersion`, `userName`, `thumbsUp`, `developerReply`, `developerReplyDate`, `topics`, `matchedKeywords` | $0.0001 |
| `app` | app × country | `rating`, `ratingsCount`, `histogram` (1–5★), `version`, `releaseNotes`, `updatedAt`, `installs` (Google); App Store adds `versionHistory`, `inAppPurchases` with prices, `privacyLabels`, `chartPosition`, `similarApps` | $0.002 |
| `insights` | app (opt-in, `includeInsights`) | `averageRating`, `ratingDistribution`, `topIssues` (complaint themes with example reviews), `byVersion`, `releaseRegressions`, `byMonth`, `developerReplies` (reply rate, median reply hours) | $0.01 |

Sample review row (real format, text shortened):

```json
{
  "type": "review",
  "store": "apple",
  "appId": "324684580",
  "appTitle": "Spotify: Music and Podcasts",
  "country": "us",
  "rating": 1,
  "title": "Playlist keeps resetting",
  "text": "Since the last update my playlists ...",
  "date": "2026-10-02T22:56:30.000Z",
  "appVersion": "9.0.82",
  "thumbsUp": 3,
  "developerReply": "Hi, sorry about that! Please try ...",
  "developerReplyDate": "2026-10-03T09:12:00.000Z"
}
```

**How many reviews?** Apple's public RSS feed stops at 500 reviews per country. This Actor reads Apple's review pages past that point. Test on 2026-10-12: Instagram, US store, `maxReviewsPerApp: 1500` → **1,500 unique reviews in one run (about 3.7 minutes)**. This uses an unofficial Apple endpoint; if Apple changes it, the run falls back to the newest 500 per country. Apple keeps separate reviews per country, so add `countries` (or `["all"]`) for more.

### Price and budget control

| Event | Price | Example |
|---|---|---|
| Review | $0.10 / 1,000 | 200 newest reviews of one app = $0.02 |
| App details (per app and country) | $2 / 1,000 | 2 apps × 1 country = $0.004 |
| Insights row (only if `includeInsights: true`) | $0.01 | 3 apps + 1 comparison row = $0.04 |

- **`maxReviewsPerApp`** caps reviews per app per country (Google Play: per language). Default 200.
- **Max cost per run**: set it in the run options (Console → Run options, or `maxTotalChargeUsd` in the API). When the cap is reached the Actor stops cleanly and keeps what it has already saved.
- **`onlyNewReviews: true`** on a schedule: reviews already returned in an earlier run are not returned or charged again.
- The prefilled example (Spotify on both stores, US, 200 reviews each) costs about **$0.04** (400 reviews + 2 app rows, test run 2026-10-12).

### Use it from an AI agent (MCP) or the API

**MCP** (Claude, Cursor, VS Code, any MCP client) via the Apify MCP server:

```
https://mcp.apify.com/?tools=signalscope-data/app-reviews-scraper
```

Claude Code: `claude mcp add --transport http apify "https://mcp.apify.com/?tools=signalscope-data/app-reviews-scraper" --header "Authorization: Bearer YOUR_APIFY_TOKEN"`. Then ask, e.g., *"Get the 100 newest 1–2 star reviews of Duolingo on both stores and list the top complaints."*

**REST API** (one call, returns the rows):

```bash
curl -X POST "https://api.apify.com/v2/acts/signalscope-data~app-reviews-scraper/run-sync-get-dataset-items"   -H "Authorization: Bearer YOUR_APIFY_TOKEN" -H "Content-Type: application/json"   -d '{"apps":["com.spotify.music"],"maxReviewsPerApp":50,"includeStorePageDetails":false}'
```

Python / JavaScript clients and Make, Zapier, n8n, Google Sheets and webhook integrations work the same way as for any Apify Actor.

### More features

**Review insights** (`includeInsights: true`): one summary row per app with **rating by app version and release regressions**, **top complaint themes** (crashes, login, billing, ads, the latest update…) with example reviews, top phrases in 1–2★ reviews, rating by month and **developer reply rate / median reply time**. Rule-based, no AI, so the same reviews always give the same result.

**Google Play reviews in every language**: Google Play keeps a separate review list per language, so a run set to English misses reviews written in other languages. Set `languages: ["all"]` (49 languages) or a list like `["en", "de", "es", "ja"]`: one run, deduplicated, every row tagged with `reviewLanguage`. With insights on you also get a **per-language rating breakdown** (e.g. Duolingo: 4.87★ in English but 3.3★ in Japanese, 40% negative).

**Competitor comparison**: put your app and competitors in one run with insights on and get one `comparison` row: rating, negative share, reply rate and latest-version rating side by side, an **issue matrix** (complaint themes per 100 reviews for every app) and each app's relative weaknesses and strengths. Every review also gets **`topics` tags** (billing, crashes, ads, login, missing features…) and you can filter by topic.

**App Store page details** (included in the app row, no extra charge): 1–5 star histogram, **version history** (last ~25 releases with dates and notes, `releasesLast90Days`, `medianDaysBetweenReleases`), **in-app purchases with prices** (e.g. Super Duolingo $9.99 / $83.99), privacy labels, chart position, supported languages, similar apps and more apps by the developer, read from the public apps.apple.com page.

**Monitoring**: turn on "Only new reviews since last run" and schedule it to get a review feed; you only pay for reviews you haven't seen yet.

### Why use it

- 🍎🤖 **Both stores, one schema** — mix App Store and Google Play apps in the same run; every review has the same fields.
- 🔎 **Search by app name** — type `Duolingo` and the Actor finds the app in both stores for you. No need to hunt for IDs.
- 🏷️ **Keyword filter** — only get reviews mentioning `crash`, `refund`, `login`, `subscription`… Each review lists the `matchedKeywords`. Works for any language.
- 🗣️ **All Google Play languages in one run** — `languages: ["all"]` merges 49 languages (tested: Calm → 46 languages with reviews in 19 s), deduplicated, with `reviewLanguage` and per-language ratings (`byLanguage`, `weakestLanguages`) in insights.
- 🌍 **Every App Store country in one run** — set `countries: ["all"]`: the app is checked in 120+ storefronts, countries without ratings are skipped, the biggest markets come first, and `SUMMARY.globalRatings` gives ratings per country plus a **global weighted average**. Apple keeps separate reviews per country, so this is how you see *all* feedback for an app (tested: HabitKit has ratings in 99 countries — 9,247 ratings, of which only 2,446 are from the US).
- 🏷️ **Topic tags on every review** — `topics` (15 rule-based themes: crashes, bugs, login, billing, pricing, ads, speed, recent update, support, sync, notifications, UI, data loss, missing features, privacy) + a `topics` filter, e.g. only feature requests or only billing complaints.
- ⚔️ **Competitor comparison** — 2+ apps with insights → one `comparison` row with an issue matrix and each app's relative weaknesses / strengths.
- 🧠 **Review insights per app** — `includeInsights: true` adds one row per app: star distribution, rating by version + **release regressions** (a version whose average fell 0.5★+ vs the previous one), ranked **complaint themes** in 1–3★ reviews with the most helpful example reviews, top 2-word phrases in 1–2★ reviews, rating by month, reply rate and median reply time. Compare your app and competitors in one run.
- 🆕 **New-reviews-only monitoring** — scheduled runs output just the fresh reviews. Pipe to Slack, email, Google Sheets or your helpdesk.
- 📚 **Past the 500-review limit of Apple's RSS feed**: 1,500 unique reviews for one app in one country in a single run (Instagram US, tested 2026-10-12).
- ↕️ **Sort orders** — newest, most helpful, most favorable, most critical (Apple); newest or most helpful (Google Play).
- ⭐ **Filters** — star range (e.g. only 1–2★ complaints), date since, keywords, **answered / unanswered by the developer**.
- 💬 **Developer replies on both stores** (reply text + date), app version, helpful votes, edited flag (Apple).
- 📊 **App details** — rating, ratings count, star histogram (both stores), installs (Google), current version, release notes, price, genre, last update.
- 🧾 **App Store intelligence** — version history with release dates and cadence, in-app purchase names and prices per country, privacy labels, category chart rank, languages, similar apps (Apple's own "You might also like") — the data ASO and pricing teams usually copy by hand.
- ⚡ No browser and no proxies needed.

### Use cases

- **Release QA** — run after every release with `includeInsights`: did the new version's rating drop vs the last one, and which complaint theme grew?
- **Product & UX teams** — catch bugs and complaints right after a release (e.g. keywords `crash, freeze, bug` + 1–2★ + monitoring).
- **Support & billing teams** — get alerted to every review mentioning `refund`, `charged` or `cancel`, or pull every **unanswered 1–2★ review** as a reply to-do list.
- **Customer-success benchmarking** — see how fast (and how often) competitors reply to their reviews.
- **ASO / app marketing agencies** — track ratings and reviews for clients and competitors.
- **Competitor research** — what users hate about competing apps = your roadmap. The `comparison` row shows it directly: "Headspace gets 2.8× more pricing complaints than Calm".
- **Feature request mining** — `topics: ["missing features"]` returns only reviews asking for something new.
- **AI / sentiment analysis** — build datasets of labelled (star-rated) user feedback.
- **Investors & analysts** — monitor rating trends and release cadence (`releasesLast90Days`, `medianDaysBetweenReleases`).
- **Subscription pricing research** — `inAppPurchases` per country storefront: compare what competitors charge for monthly / yearly plans in the US, Germany, Japan… (`countries: ["us","de","jp"]`, `includeReviews: false`).
- **Competitor discovery** — `similarApps` lists the apps Apple recommends next to yours, with rating and ratings count.

### Input example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "https://play.google.com/store/apps/details?id=com.spotify.music",
    "284882215",
    "com.whatsapp",
    "Duolingo"
  ],
  "countries": ["us", "gb", "de"],
  "maxReviewsPerApp": 200,
  "maxRating": 2,
  "sortBy": "newest",
  "developerReplyFilter": "withoutReply",
  "reviewKeywords": ["crash", "refund", "login"],
  "onlyNewReviews": true
}
```

Accepted app formats: App Store URL, Google Play URL, numeric Apple ID (`324684580` or `id324684580`), Android package name (`com.spotify.music`), or a plain app name (`Spotify`). Names are looked up in the stores listed in `nameSearchStores` (default: both) and the top match is used; a name that doesn't match any app is reported in the run `SUMMARY` instead of scraping a random app.

#### All countries example

Collect the newest 50 reviews from every App Store country where the app has ratings:

```json
{
  "apps": ["https://apps.apple.com/us/app/habit-tracker-habitkit/id6443918070"],
  "countries": ["all"],
  "maxReviewsPerApp": 50,
  "includeAppDetails": true
}
```

`maxReviewsPerApp` applies per country. With `includeAppDetails` you also get one app record per country (rating, ratings count, version in that store). The run `SUMMARY` contains:

```json
"globalRatings": [{
  "store": "apple", "appId": "6443918070", "appTitle": "Habit Tracker - HabitKit",
  "countriesAvailable": 122, "countriesWithRatings": 99,
  "totalRatings": 9247, "weightedAverageRating": 4.8,
  "byCountry": [
    { "country": "us", "ratingsCount": 2446, "rating": 4.84 },
    { "country": "gb", "ratingsCount": 761, "rating": 4.75 },
    { "country": "de", "ratingsCount": 759, "rating": 4.83 }
  ]
}]
```

Google Play reviews are grouped by language rather than country, so for Google apps `"all"` uses the `us` store — combine it with `languages: ["all"]` to get every language.

#### Review insights example

Pull the newest reviews for your app and a competitor and get a ranked complaint list for each:

```json
{
  "apps": ["Duolingo", "com.duolingo"],
  "countries": ["us", "gb"],
  "maxReviewsPerApp": 1500,
  "includeAppDetails": false,
  "includeInsights": true,
  "minVersionReviews": 10
}
```

Real result (October 2026, App Store, 3,000 reviews): average 3.84★; top complaint themes **billing & subscription (140)**, **ads (100)**, pricing & paywall (79), bugs & errors (77), recent update (58); top phrases "super duolingo", "energy system", "change back". On Google Play the same run flagged a **release regression** — version 6.92.5 averaged 4.08★ vs 5.0★ for 6.91.4.

#### Competitor comparison example

```json
{
  "apps": ["Calm", "Headspace"],
  "nameSearchStores": ["apple"],
  "maxReviewsPerApp": 300,
  "includeAppDetails": false,
  "includeInsights": true
}
```

Real result (October 2026, App Store us, newest 300 reviews each): Calm 3.2★ / 42% negative / replies to 46% of reviews (median 69 h) vs Headspace 1.96★ / 71% negative / 0.7% replies, latest version 8.34.0 at 1.4★ with 2 release regressions. Relative weaknesses — **Headspace: usability & UI 14 per 100 reviews vs 5.7, pricing & paywall 10.3 vs 3.7, privacy & permissions 4 vs 0.3**; **Calm: recent update 15 vs 8.3, customer support 13.3 vs 7.7**. Both share the #1 theme billing & subscription (18.7 vs 22.7 per 100).

```json
{
  "type": "comparison",
  "appsCompared": 2,
  "apps": [
    {
      "app": "Headspace: Sleep & Meditation (App Store)",
      "averageRating": 1.96,
      "negativeSharePct": 71.3,
      "replyRatePct": 0.7,
      "latestVersion": { "version": "8.34.0", "averageRating": 1.4 },
      "relativeWeaknesses": [
        { "theme": "usability & UI", "per100Reviews": 14, "peerMedianPer100": 5.67, "mentions": 42 },
        { "theme": "pricing & paywall", "per100Reviews": 10.33, "peerMedianPer100": 3.67, "mentions": 31 }
      ],
      "relativeStrengths": []
    }
  ],
  "issueMatrix": [
    { "theme": "billing & subscription", "Calm (App Store)": 18.67, "Headspace: Sleep & Meditation (App Store)": 22.67 },
    { "theme": "pricing & paywall", "Calm (App Store)": 3.67, "Headspace: Sleep & Meditation (App Store)": 10.33 }
  ],
  "rankings": { "byAverageRating": ["Calm (App Store)", "Headspace: Sleep & Meditation (App Store)"] }
}
```

### Output

Each dataset item has `type: "review"` or `type: "app"` — filter by it when exporting.

Review:

```json
{
  "type": "review",
  "store": "apple",
  "appId": "324684580",
  "appTitle": "Spotify: Music and Podcasts",
  "country": "us",
  "reviewId": "14621592034",
  "rating": 1,
  "title": "Playlist keeps resetting",
  "text": "Since the last update my playlists ...",
  "userName": "musicfan22",
  "date": "2026-10-02T22:56:30.000Z",
  "appVersion": "9.0.82",
  "thumbsUp": 3,
  "totalVotes": 4,
  "isEdited": false,
  "developerReply": "Hi, sorry about that! Please try ...",
  "developerReplyDate": "2026-10-03T09:12:00.000Z",
  "matchedKeywords": ["crash"]
}
```

Insights (one per app, with `includeInsights: true`; shortened):

```json
{
  "type": "insights",
  "store": "apple",
  "appTitle": "Duolingo: Language Lessons",
  "countries": ["us", "gb"],
  "reviewsAnalyzed": 3000,
  "averageRating": 3.84,
  "ratingDistribution": { "1": 499, "2": 165, "3": 275, "4": 431, "5": 1630 },
  "negativeSharePct": 22.1,
  "topIssues": [
    { "theme": "billing & subscription", "mentions": 140, "sharePct": 14.9, "averageRating": 1.61,
      "examples": [{ "rating": 3, "country": "gb", "appVersion": "7.141.1", "thumbsUp": 1, "text": "…I'm cancelling my paid subscription and finding a different language-learning app…" }] }
  ],
  "topPhrases": [{ "phrase": "energy system", "reviews": 11 }],
  "byVersion": [{ "version": "7.142.0", "reviews": 449, "averageRating": 3.72, "negativeSharePct": 23.8 }],
  "releaseRegressions": [],
  "byMonth": [{ "month": "2026-10", "reviews": 899, "averageRating": 3.79, "negativeSharePct": 23.9 }],
  "developerReplies": { "replied": 0, "replyRatePct": 0, "negativeReplyRatePct": 0, "medianReplyHours": null }
}
```

App details:

```json
{
  "type": "app",
  "store": "google",
  "appId": "com.spotify.music",
  "title": "Spotify: Music and Podcasts",
  "rating": 4.35,
  "ratingsCount": 36423676,
  "histogram": { "1": 2500000, "2": 700000, "3": 1500000, "4": 4000000, "5": 27000000 },
  "installs": "1,000,000,000+",
  "version": "VARY",
  "releaseNotes": "...",
  "updatedAt": "2026-09-29T10:00:00.000Z"
}
```

### Pricing

Pay only for results:

- **$0.10 per 1,000 reviews**
- **$2 per 1,000 app-detail records**
- **$0.01 per app insights row** (only with `includeInsights`; the competitor `comparison` row counts as one more)

No subscription. In monitoring mode, already-seen reviews are never charged again.

#### App Store page details example

Input `{"apps": ["570060128"], "countries": ["us", "de", "jp"], "includeReviews": false}` → one app row per country. Real result (October 2026), Duolingo US (abridged):

```json
{
  "type": "app", "store": "apple", "title": "Duolingo: Language Lessons", "rating": 4.72, "ratingsCount": 5492147,
  "histogram": { "1": 139337, "2": 46360, "3": 134684, "4": 556144, "5": 4615622 },
  "versionHistory": [{ "version": "7.142.0", "releasedAt": "2026-09-28T17:42:01.000Z", "releaseNotes": "Our mascot owl, Duo, is trading in his usual diet…" }],
  "releasesLast90Days": 16, "medianDaysBetweenReleases": 5.2,
  "inAppPurchases": [{ "name": "Super Duolingo", "price": "$9.99", "priceValue": 9.99 }, { "name": "Super Duolingo", "price": "$83.99", "priceValue": 83.99 }],
  "inAppPurchasePriceRange": { "min": 0.99, "max": 119.99 },
  "privacyLabels": { "Data Used to Track You": ["Purchases", "Location", "Identifiers", "Usage Data"], "Data Linked to You": ["Purchases", "Financial Info", "Contacts", "Search History"] },
  "chartPosition": { "rank": 1, "chart": "Education" }, "languagesCount": 33,
  "similarApps": [{ "appId": "635966718", "title": "Memrise: Language Learning App", "rating": 4.8, "ratingCount": "217K" }],
  "moreByDeveloper": [{ "appId": "1440502568", "title": "Learn to Read - Duolingo ABC" }]
}
```

The same run in Germany shows Super Duolingo at 89,99 € / 110,99 € (`priceValue` 89.99 / 110.99) and in Japan at ¥9,900 / ¥14,200 — local prices per storefront.

### Notes & limits

- Apple reviews are read per country storefront (Apple keeps separate reviews per country). `appVersion` is filled for the newest 500 Apple reviews; older ones have `null`.
- Google Play has no favorable/critical sort — use `minRating` / `maxRating` instead.
- Google Play reviews depend on **language**, not country — set `language` (e.g. `de`) for German reviews, or `languages` to merge several. `maxReviewsPerApp` applies per language.
- App Store page details are read once per app and country (in `countries: ["all"]` mode only for the biggest country). The version history covers the last ~25 releases that Apple shows. Turn them off with `includeStorePageDetails: false`.
- Only publicly visible data is collected.

### FAQ

**Can I monitor many apps daily?** Yes — create a Schedule in Apify Console with `onlyNewReviews: true` and add a Slack / email / webhook integration.

**Do I need the app ID?** No. Type the app name (e.g. `Notion`) and the Actor resolves it in the App Store and Google Play. For apps with generic names, paste the URL to be exact.

**How do I get only negative reviews about a specific problem?** Set `maxRating: 2` and `reviewKeywords: ["crash", "bug"]`. Keywords match whole words and their endings (`crash` → `crashes`, `crashing`) but not inside other words (`ads` won't match `downloads`).

**How many reviews can I get?** Up to `maxReviewsPerApp` per app and country (Google Play: per language), as many as the store shows. Apple: past the 500-review limit of Apple's RSS feed; tested 1,500 unique reviews for Instagram in the US in one run (2026-10-12). Add more `countries` for more.

**Does it get developer responses for App Store reviews?** Yes — `developerReply` and `developerReplyDate` are filled for both Apple and Google Play.

**How do I find negative reviews nobody has answered?** Set `maxRating: 2`, `developerReplyFilter: "withoutReply"` and (optionally) `onlyNewReviews: true` on a daily schedule.

**Can I get the most helpful or most critical reviews instead of the newest?** Yes — set `sortBy` to `helpful`, `favorable` or `critical`. (Google Play supports `newest` and `helpful`.)

**Can I scrape App Store reviews from all countries at once?** Yes — set `countries` to `["all"]`. The Actor checks 120+ App Store storefronts, skips countries where the app has no ratings, and starts with the biggest markets. You also get each country's rating and ratings count, and a global weighted average rating in the run `SUMMARY`.

**Why does an app have a different rating in each country?** Apple keeps ratings and reviews per storefront. A US-only scrape can miss much of an app's feedback (e.g. HabitKit: 2,446 of its 9,247 ratings are from the US). Use `"all"` to see the full picture.

**Can it summarise reviews — top complaints, rating per version?** Yes — set `includeInsights: true`. You get one row per app with complaint themes ranked by mentions (with example reviews), rating by app version, release regressions, rating by month and developer reply stats. It is rule-based (no AI), so the same reviews always give the same result. Themes are matched in English; for other languages use `topPhrases`.

**Can I compare my app with competitors?** Yes — list all apps, turn on `includeInsights` (comparison is on by default via `compareApps`). Use the same countries, `sortBy` and `maxReviewsPerApp` for every app so the per-100-review numbers are comparable. The same app on both stores also works (iOS vs Android).

**What are `topics`?** Rule-based English tags on every review (same rules as the complaint themes). They are keyword matches, not AI, so a review can carry several topics or none, and game terms like "charge" can occasionally be tagged as billing. Filter with the `topics` input.

**How do I detect a bad release from reviews?** Use `sortBy: "newest"`, a few hundred reviews or more and `includeInsights: true`. `releaseRegressions` lists every version whose average rating dropped 0.5★ or more vs the previous version (each with at least `minVersionReviews` reviews). On Apple, the version is known for the newest 500 reviews per country — add countries for more.

**Can I get an app's version history and release dates?** Yes, for App Store apps — `versionHistory` on the app-details row (last ~25 releases with date and release notes) plus `releasesLast90Days` and `medianDaysBetweenReleases`. With `includeInsights`, `byVersion` and `releaseRegressions` carry each version's `releasedAt`, so you can see how fast a bad release was fixed.

**Can I see in-app purchase prices?** Yes — `inAppPurchases` (name, price as shown, numeric `priceValue`) and `inAppPurchasePriceRange` for App Store apps, per country storefront. Google Play does not publish per-item in-app prices.

**How do I get Google Play reviews in all languages?** Set `languages: ["all"]` (or a list such as `["en", "es", "pt", "de"]`). Google Play keeps a separate review list per language; the Actor reads each one, removes duplicates and tags every review with `reviewLanguage`. `maxReviewsPerApp` is the limit per language, so `10` × 49 languages returns up to 490 reviews.

**Which countries / languages rate my app worst?** For App Store use `countries: ["all"]` (ratings per storefront in `globalRatings`). For Google Play use `languages: ["all"]` with `includeInsights: true`: the insights row has `byLanguage` (reviews, average rating, negative share per language) and `weakestLanguages` (≥20 reviews and at least 0.5★ below the app's overall average) — usually a translation, pricing or local-payment problem.

**Can I export to CSV / Excel / Google Sheets?** Yes — every Apify dataset exports to CSV, Excel, JSON, XML, or connects to Google Sheets, Zapier, Make and webhooks.

**Found a bug or need a field?** Open an issue on the Issues tab.

### More tools from the same developer

- [Chrome, Firefox & VS Code Extensions Tracker](https://apify.com/signalscope-data/extension-marketplaces-tracker) — installs, ratings and rank changes for IDE and browser extensions, with new-release alerts.
- [App Store & Google Play Top Charts & App Rank Tracker](https://apify.com/signalscope-data/app-charts-tracker) — top free/paid/grossing charts in any country, with daily rank changes, breakout apps and dropouts.
- [Company Jobs Scraper](https://apify.com/signalscope-data/ats-jobs-scraper) — every open job from Workday, Greenhouse, Lever, Ashby & more, with new-job alerts.
- [Shopify Products Scraper & Price Change Monitor](https://apify.com/signalscope-data/shopify-store-monitor) — full catalogs plus price-drop / restock alerts.
- [Telegram Channel Scraper & Keyword Monitor](https://apify.com/signalscope-data/telegram-channel-monitor) — public channel posts with keyword alerts.
- [Workday Jobs Scraper](https://apify.com/signalscope-data/workday-jobs-scraper) — any myworkdayjobs.com careers site.
- [Hacker News Who Is Hiring Scraper](https://apify.com/signalscope-data/hn-hiring-parser) — structured jobs from the monthly HN threads.
- [Government Tenders Monitor](https://apify.com/signalscope-data/public-tenders-monitor) — EU TED, UK & Germany public contracts.
- [Salesforce AppExchange Scraper & Listing Monitor](https://apify.com/signalscope-data/appexchange-tracker) — AppExchange apps, ratings and pricing.
- [Atlassian, Zoom & Zendesk Marketplace Apps Tracker](https://apify.com/signalscope-data/saas-marketplaces-tracker) — SaaS marketplace listings and installs.

# Actor input Schema

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

App Store or Google Play URLs, numeric Apple IDs (e.g. 324684580), Android package names (e.g. com.spotify.music) — or just an app name like "Spotify" (the top search match in each store is used). Mix both stores freely.

## `nameSearchStores` (type: `array`):

When an entry in Apps is a plain name (not a URL or ID), look it up in these stores and scrape the top match from each.

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

Two-letter store country codes (us, gb, de, fr, jp, br, in…). Each app is scraped in every country. Use "all" to cover every App Store country at once: the app is looked up in 120+ storefronts, countries without ratings are skipped, the biggest markets come first, and SUMMARY shows ratings per country plus a global weighted average. "maxReviewsPerApp" applies per country. (Google Play reviews are grouped by language, not country — "all" uses "us" for Google.)

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

Maximum reviews to output per app per country. Apple: thousands of reviews deep (not limited to the 500 that Apple's RSS feed exposes). Google Play: no limit.

## `sortBy` (type: `string`):

Order in which reviews are collected. Apple supports all four; Google Play supports newest and most helpful (favorable/critical fall back to newest — combine with min/max star rating instead). 'Only new reviews' and 'Reviews since date' work best with newest.

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

Output individual reviews.

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

One record per app/country with rating, ratings count, star histogram (both stores), installs (Google), version, release notes, price — plus, for App Store apps, version history with release dates, in-app purchase prices, privacy labels, chart position, languages and similar apps (see 'App Store page details').

## `includeStorePageDetails` (type: `boolean`):

For App Store apps, read the public apps.apple.com page once per app/country (one extra request) and add: 1–5 star histogram, version history (last ~25 releases with dates and notes), releasesLast90Days, medianDaysBetweenReleases, in-app purchases with prices, privacy labels, chart position, languages, similar apps and more apps by the developer. With review insights on, release dates are also added to byVersion and release regressions. No extra charge.

## `includeInsights` (type: `boolean`):

Adds one 'insights' row per app computed from the reviews returned in this run: average rating and star distribution, rating by app version with release regressions (versions whose average dropped 0.5+ stars vs the previous version), top complaint themes in 1-3 star reviews (crashes, login, billing, ads, update, support...) with example reviews, top phrases in 1-2 star reviews, rating by month, developer reply rate and median reply time. No AI, fully reproducible. Charged as one app-insights event per app. Use sortBy 'newest' for version data (Apple shows the version on the newest 500 reviews per country).

## `minVersionReviews` (type: `integer`):

Versions with fewer reviews than this are left out of byVersion and release-regression detection (avoids noise from a handful of reviews).

## `compareApps` (type: `boolean`):

With review insights on and 2 or more apps, add one 'comparison' row (and a COMPARISON record): rating, negative share, reply rate and latest-version rating side by side, an issue matrix (complaint themes per 100 reviews for every app) and each app's relative weaknesses / strengths vs the other apps. Charged as one app-insights event.

## `onlyNewReviews` (type: `boolean`):

Remember reviews already returned and output only new ones. Ideal for scheduled monitoring — you only pay for new reviews.

## `stateKey` (type: `string`):

Used with 'Only new reviews'. Use a different name for each separate monitor/schedule.

## `minRating` (type: `integer`):

Skip reviews below this star rating.

## `maxRating` (type: `integer`):

E.g. set max 2 to collect only negative reviews.

## `reviewKeywords` (type: `array`):

Only output reviews whose title or text contains at least one of these words or phrases (case-insensitive), e.g. crash, refund, login, subscription. Matched words are listed in matchedKeywords. Leave empty for all reviews.

## `topics` (type: `array`):

Only output reviews tagged with at least one of these topics (rule-based, English): e.g. 'billing & subscription' + 'pricing & paywall' for monetisation complaints, 'missing features' for feature requests. Every review row has a 'topics' field either way. Leave empty for all reviews.

## `developerReplyFilter` (type: `string`):

Filter by whether the developer has replied (both stores). 'Only unanswered' + max rating 2 = a to-do list of negative reviews your support team still needs to answer.

## `sinceDate` (type: `string`):

Optional, ISO date like 2026-09-01. Older reviews are skipped.

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

Language code for Google Play reviews (en, de, es, ja…). Ignored for reviews when 'Google Play languages' is filled.

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

Google Play shows each language its own set of reviews, so one language sees only part of an app's feedback. List several language codes (e.g. "en", "de", "es", "pt", "ja") or "all" (49 languages) to merge them in one run: reviews are deduplicated, every row gets reviewLanguage, and with insights on you get a per-language rating breakdown (byLanguage, weakestLanguages — localization problems). 'Max reviews per app' applies per language. App Store apps are not affected (use 'Countries' there).

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "https://play.google.com/store/apps/details?id=com.spotify.music"
  ],
  "nameSearchStores": [
    "apple",
    "google"
  ],
  "countries": [
    "us"
  ],
  "maxReviewsPerApp": 200,
  "sortBy": "newest",
  "includeReviews": true,
  "includeAppDetails": true,
  "includeStorePageDetails": true,
  "includeInsights": false,
  "minVersionReviews": 5,
  "compareApps": true,
  "onlyNewReviews": false,
  "stateKey": "default",
  "minRating": 1,
  "maxRating": 5,
  "reviewKeywords": [],
  "topics": [],
  "developerReplyFilter": "all",
  "language": "en",
  "languages": []
}
```

# 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": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
        "https://play.google.com/store/apps/details?id=com.spotify.music"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscope-data/app-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": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
        "https://play.google.com/store/apps/details?id=com.spotify.music",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("signalscope-data/app-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": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "https://play.google.com/store/apps/details?id=com.spotify.music"
  ]
}' |
apify call signalscope-data/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

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