Google Play Scraper — Reviews, Ratings & Sentiment Analysis
Pricing
from $5.99 / 1,000 results
Google Play Scraper — Reviews, Ratings & Sentiment Analysis
Google Play Scraper extracts app reviews, ratings, reviewer details, dates, versions, and feedback, with sentiment analysis to identify positive, negative, and neutral opinions. Analyze app performance, user feedback, competitors, and market trends at scale.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Google Play Scraper — Reviews, Ratings & Sentiment Analysis
The Google Play Scraper — Reviews, Ratings & Sentiment Analysis pulls Google Play Store reviews, star ratings and app records for any Android app on the platform, in bulk. It returns full review text, star scores, developer replies and reply latency, plus — optionally — an AI-generated sentiment score, emotion, topic list, spam flag and one-line summary for every review, alongside per-app rating analytics. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. No Google account or API key is needed to scrape; an AI key is only required if sentiment analysis is switched on, and it is always your own key.
What is Google Play Scraper — Reviews, Ratings & Sentiment Analysis?
It is a Google Play data actor built around review collection: give it a list of package IDs or Play Store links (or search keywords to discover apps automatically) and it returns every matching app's user reviews as structured rows, filtered the way you specify. The reviews-focused job is what the name says — the actor also keeps three original app-data modes (app records, keyword search, similar apps) for teams that already depend on them. What sets this actor apart is the built-in sentiment analysis pass: reviews can be classified for sentiment, emotion, topics, category and spam directly in the run, using your own AI provider key, with nothing invented when no key is supplied. No Google account or Play Console login is required for any of the four modes.
Key capabilities:
- ⭐ Bulk review collection — list any number of apps in
appTargets; every one is collected in the same run - 🔀 Review ordering and pagination control — most relevant / newest / by rating, with a configurable page size
- 🧪 Server-side review filtering — star levels, date window, keyword include/exclude, app version, minimum helpful votes, developer-reply-only, de-duplication
- 🤖 Optional AI sentiment and topic classification — 20 selectable models across 7 providers, on your own key
- 📊 Per-app ratings analytics — star mix in percent, ratings-per-1,000-installs, average score and reply rate over the reviews actually collected
- 🌍 83 Google Play storefront countries, since reviews and ratings are storefront-specific
What data can you get with Google Play Scraper — Reviews, Ratings & Sentiment Analysis?
The actor returns four result types, selected with the mode parameter: reviews (with optional AI sentiment), per-app ratings-analytics summaries, app search results, and similar-app records.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
Reviews (type: "review") | id, userName, date, score, text, thumbsUp, version, replyText, replyDate, hasDeveloperReply, replyLatencyDays, criterias, wordCount, url, storefront | Review monitoring, bug/complaint triage, ASO research |
| Sentiment analysis (AI, added to review rows) | sentiment, sentimentScore, emotion, topics, reviewCategory, isSpam, aiSummary, aiLanguage | Triaging thousands of reviews without reading each one |
Ratings analytics (type: "app", summary rows) | ratingDistributionPct, reviewToInstallRatio, reviewsCollected, avgScoreCollected, collectedStarCounts, developerReplyRate, sentimentBreakdown | ASO and competitor rating benchmarking |
App records (type: "app", search / URL / similar-apps modes) | title, installs, score, ratings, price, developer, genre, screenshots, histogram, categories and 40+ more | App metadata research, discovery, catalogue building |
Sentiment analysis
Turning on enableSentimentAnalysis sends each collected review's text to the AI model you selected in aiModel, using your own aiApiKey (or the matching environment variable). The model returns a sentiment label, a −1…1 sentiment score, the dominant emotion, up to 5 topics, a review category (bug report / feature request / praise / complaint / question / spam / other), a spam flag, a one-line summary capped at 300 characters, and the detected language. Every value is validated before it is stored — an out-of-range score is clamped to −1…1, an unrecognised category or sentiment label is dropped rather than guessed, and any review the model does not classify keeps null in every AI field. Nothing about these fields is ever invented when no key is configured.
{"sentiment": "negative","sentimentScore": -0.9,"emotion": "frustration","topics": ["crash", "playlist", "update"],"reviewCategory": "bug_report","isSpam": false,"aiSummary": "App crashes when opening a playlist after the latest update.","aiLanguage": "en"}
Ratings analytics rows
When includeAppSummary is on (default), the reviews mode emits one extra row per app carrying the full app record plus analytics computed over the reviews actually collected in that run: avgScoreCollected, collectedStarCounts, developerReplyRate, and — with AI on — sentimentBreakdown (positive/neutral/negative counts). ratingDistributionPct and reviewToInstallRatio are derived from the app's public histogram and install count, not from the sample, so they stay accurate even on a small run.
How does Google Play Scraper — Reviews, Ratings & Sentiment Analysis differ from the official Google Play API?
Google does publish an official endpoint for app reviews — reviews.list on the Google Play Developer API (Android Publisher API) — but it requires the https://www.googleapis.com/auth/androidpublisher OAuth scope, which Google grants only to a Play Console account that manages the specific app package (verified against Google's current API reference, checked 2026-08-15). In practice that means the official endpoint can return reviews only for apps you publish yourself — never a competitor's app, and never an app you have not registered in Play Console.
| Feature | Google Play Developer API (reviews.list) | This Actor |
|---|---|---|
| Which apps it can read | Only apps you manage in Play Console | Any public app — package ID or Play Store link |
| Setup | Google Play Console account + OAuth/service-account credentials | Apify account, no Google login |
| Apps per call | One packageName per request | Any number of apps in one run (appTargets) |
| App metadata, search, similar apps | Not part of this endpoint | Included (scrapeAppUrls, scrapeAppSearch, scrapeSimilarApps modes) |
| Sentiment / topic classification | Not provided | Optional AI pass, 20 selectable models |
| Star / date / keyword / version filtering | Not provided by the endpoint | Built into the run |
If you already own and manage the app in Play Console and just want its reviews inside your existing publishing workflow, the official endpoint is the right tool. If you need reviews for apps you don't manage — competitors, market research, a whole category — or you want sentiment and topic classification without a separate pipeline, this actor is the fit.
What is the difference between an app-data scrape and a review sentiment analysis?
An app-data scrape describes the app itself — install count, price, developer, genre, screenshots, the aggregate star histogram. A review sentiment analysis works one level down: it reads what individual users actually wrote, and classifies each opinion. The aggregate score on an app's listing tells you that users are unhappy; the review text and its sentiment classification tell you why — a specific crash, a pricing change, a missing feature — which is the input a support or product team can act on.
This actor returns both, as two distinct JSON object types in the same dataset: type: "app" rows carry the metadata and ratings-analytics fields, and type: "review" rows carry the individual review text plus, when AI is on, the sentiment, emotion, topics and reviewCategory fields. Use the app rows to track what the rating is doing over time, and the review rows to find out why.
How to scrape Google Play with Google Play Scraper — Reviews, Ratings & Sentiment Analysis?
- Open the actor on its Apify Store page and go to the Input tab.
- Add your apps to
appTargets— one package ID (com.spotify.music) or Play Store link per line. Leave it empty and add keywords tosearchTermsinstead to let the actor discover apps first. - Set the real query controls that matter for your run:
storefrontCountry,sortReviewsBy,maxReviewsPerApp, and any filters under the review-filters section (starRatings,reviewsPostedAfter,containsKeywords, etc.). - Click Start. Rows appear in the dataset table while the run is still going.
- Download the results as JSON, JSONL, CSV, Excel, XML, HTML or RSS from the Export button, or pull them with the Apify API / client.
{"mode": "scrapeReviews","appTargets": ["com.spotify.music"],"storefrontCountry": "us","maxReviewsPerApp": 100,"sortReviewsBy": "newest"}
How to run multiple queries in one job
appTargets and searchTerms are both arrays — list as many apps or keywords as you want and every one is processed inside the same run, apps handled one after another. maxRecords caps the total rows the whole run stores across all of them, and maxReviewsPerApp caps each app individually on top of that.
⬇️ Input
All parameters are optional — an empty input still runs, provided at least one of appTargets or searchTerms is filled in for the reviews, app-URL and similar-apps modes (searchTerms alone is enough for the keyword-search mode).
| Parameter | Type | Required | Default / Prefill | Description |
|---|---|---|---|---|
mode | string (enum) | No | prefill scrapeReviews | scrapeReviews | scrapeAppUrls | scrapeAppSearch | scrapeSimilarApps. Falls back to scrapeReviews if omitted entirely. |
appTargets | array | No | — | Package IDs and/or Play Store links, one per line. Used by the reviews, app-records and similar-apps modes. |
searchTerms | array | No | prefill ["habit tracker", "budget planner"] | Keywords. Drive the keyword-search mode, and auto-discover apps in the other modes when appTargets is empty. |
storefrontCountry | string (enum, 83 values) | No | prefill us | Which Google Play storefront to read. Reviews, ratings and app records are all storefront-specific. |
maxRecords | integer | No | min 0, prefill 60 | Run-wide ceiling on stored rows (reviews + app summaries). 0/empty = no ceiling. |
maxReviewsPerApp | integer | No | default 0, min 0, prefill 40 | Per-app ceiling on review rows, on top of maxRecords. 0 = no per-app ceiling. |
sortReviewsBy | string (enum) | No | default mostRelevant, prefill newest | mostRelevant | newest | rating. |
reviewsPageSize | integer | No | default 100, min 10, max 199 | Reviews requested per round trip. The actor clamps whatever value is entered into the 10–199 range. |
includeAppSummary | boolean | No | default true | Adds one ratings-analytics row per app. |
resumeFromToken | string | No | — | Continue a previous reviews run (lastCursor value from the key-value store). Applies to the first app in the target list only. |
starRatings | array of "1"–"5" | No | — | Keep only these star levels. Each selected level is collected as its own pass. |
reviewsPostedAfter | string (date) | No | — | Absolute date (2026-01-31) or relative window (30 days, 6 months). |
reviewsPostedBefore | string (date) | No | — | Absolute date or relative window. |
containsKeywords | array | No | — | Keep a review only if its text contains at least one of these (case-insensitive). |
excludeKeywords | array | No | — | Drop a review as soon as its text contains one of these (case-insensitive). |
appVersionFilter | string | No | — | Exact version (9.1.68.1888) or prefix (9.1) to match a release line. |
minThumbsUp | integer | No | default 0, min 0 | Minimum helpful votes. 0 keeps everything. |
onlyWithDeveloperReply | boolean | No | default false | Keep only reviews that carry a developer reply. |
deduplicateReviews | boolean | No | default true | Drop a review already stored earlier in the same run. |
enableSentimentAnalysis | boolean | No | default false | Turn on AI review classification. |
aiModel | string (enum, 20 values) | No | default claude-haiku-4-5 | Provider is inferred from the model name (claude-* = Anthropic, gpt-*/o3-* = OpenAI, gemini-* = Google, grok-* = xAI, deepseek-* = DeepSeek, sonar* = Perplexity, mistral-* = Mistral). |
aiApiKey | string (secret) | No | — | Your own key for the chosen provider. Falls back to the matching environment variable (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, PERPLEXITY_API_KEY, MISTRAL_API_KEY). No key at all = AI columns stay empty. |
aiMaxReviews | integer | No | default 0, min 0, prefill 60 | Cost guard: only the first N collected reviews are classified. 0 = classify every collected review. |
proxyConfiguration | object | No | {"useApifyProxy": true} | Apify Proxy settings used by the automatic route ladder. |
Legacy input keys (still declared, still work): action, scrapeReviews.appId, scrapeReviews.country, scrapeAppSearch.keywords, scrapeAppSearch.country, scrapeAppUrls.urls, scrapeSimilarApps.urls, count, cursor. When both a legacy key and its modern equivalent are supplied, the modern one wins.
Example input
{"mode": "scrapeReviews","appTargets": ["com.spotify.music","https://play.google.com/store/apps/details?id=com.duolingo"],"storefrontCountry": "us","maxRecords": 200,"maxReviewsPerApp": 80,"sortReviewsBy": "newest","reviewsPageSize": 100,"includeAppSummary": true,"starRatings": ["1", "2"],"reviewsPostedAfter": "90 days","containsKeywords": ["crash", "bug"],"excludeKeywords": ["great"],"onlyWithDeveloperReply": false,"deduplicateReviews": true,"enableSentimentAnalysis": true,"aiModel": "claude-haiku-4-5","aiMaxReviews": 50}
⚠️ Common pitfall: resumeFromToken only continues the first app in appTargets, not every app in a multi-app run. For a repeating multi-app monitoring job, use a rolling reviewsPostedAfter window (e.g. "7 days") instead of the resume token.
⬆️ Output
Results are typed, normalized JSON — one dataset row per review or per app record, with a consistent field set for a given type. Export as JSON, JSONL, CSV, Excel, XML, HTML or RSS from the Apify Console, or read the dataset with the API / client. The dataset ships three preset table views — ⭐ Reviews & sentiment (default), 📦 App records & ratings analytics, and 💬 Reviews (original column set) — and every review row is also mirrored, uncharged, into a per-run child dataset named <runId>-reviews.
Scraped results
Review rows (type: "review") carry 32 fields:
| Field | Type | Description |
|---|---|---|
id | string | Review ID. |
appId, parentId | string | The app the review belongs to (parentId mirrors appId). |
userName | string | Reviewer display name (often "A Google user"). |
userImage | string | Reviewer avatar URL. |
date | string | ISO-8601 timestamp the review was posted. |
score | number | Star rating, 1–5. |
scoreText | string | Star rating as a string. |
text | string | Full review text. |
title | null | Google Play does not publish review titles; kept for schema compatibility. |
thumbsUp | number | Helpful votes. |
version | string | null | App version the review was written on. |
replyText, replyDate | string | null | Developer reply text and its timestamp. |
hasDeveloperReply | boolean | Whether a developer reply exists. |
replyLatencyDays | number | null | Days between the review and the reply, when both dates are known. |
criterias | array | Per-review sub-ratings ({"criteria": ..., "rating": ...}); empty for apps that don't expose them. |
textLength, wordCount | number | Character and word count of the review text. |
url | string | Deep link to the review. |
storefront | string | Storefront country the review came from. |
type, isChild | string / boolean | Row labels ("review" / true). |
scrapedAt | string | ISO-8601 collection timestamp. |
sentiment | string | null | AI only: positive | neutral | negative. |
sentimentScore | number | null | AI only: −1…1, rounded to 3 decimals. |
emotion | string | null | AI only: dominant emotion, lowercase. |
topics | array | null | AI only: up to 5 lowercase topics. |
reviewCategory | string | null | AI only: bug_report | feature_request | praise | complaint | question | spam | other. |
isSpam | boolean | null | AI only: spam flag. |
aiSummary | string | null | AI only: one-line summary, capped at 300 characters. |
aiLanguage | string | null | AI only: detected language code. |
Without an AI key, all nine AI fields (sentiment through aiLanguage) are present but null — never guessed or filled in.
App rows (type: "app") carry 57 fields: title, description, descriptionHTML, summary, installs, minInstalls, maxInstalls, score, scoreText, ratings, reviews, histogram, price, free, currency, priceText, available, offersIAP, androidVersion, androidVersionText, androidMaxVersion, developer, developerId, developerEmail, developerWebsite, developerAddress, privacyPolicy, developerInternalID, genre, genreId, categories, icon, headerImage, screenshots, video, videoImage, previewVideo, contentRating, contentRatingDescription, adSupported, released, updated, version, recentChanges, comments, preregister, earlyAccessEnabled, isAvailableInPlayPass, appId, url, ratingDistributionPct, reviewToInstallRatio, type, isChild, parentId, storefront, scrapedAt.
The reviews-mode ratings-summary row (includeAppSummary: true) adds 5 more analytics fields on top of those 57:
| Field | Type | Description |
|---|---|---|
reviewsCollected | number | Reviews stored for this app in this run. |
avgScoreCollected | number | null | Average star score of those reviews. |
collectedStarCounts | object | null | {1: n, 2: n, 3: n, 4: n, 5: n} count of each star level collected. |
developerReplyRate | number | null | Percentage of collected reviews carrying a developer reply. |
sentimentBreakdown | object | null | AI only: {positive, neutral, negative, analyzed} counts. |
[{"type": "review","isChild": true,"appId": "com.spotify.music","parentId": "com.spotify.music","id": "b6e8f0c1-1f3a-4a4e-9d2a-2b1f0f5c9a11","userName": "A Google user","userImage": null,"date": "2026-08-05T09:14:22.113Z","score": 1,"scoreText": "1","text": "App crashes every time I open a playlist since the last update.","title": null,"thumbsUp": 12,"version": "9.1.68.1888","replyText": null,"replyDate": null,"hasDeveloperReply": false,"replyLatencyDays": null,"criterias": [],"textLength": 65,"wordCount": 12,"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=b6e8f0c1-1f3a-4a4e-9d2a-2b1f0f5c9a11","storefront": "us","sentiment": "negative","sentimentScore": -0.9,"emotion": "frustration","topics": ["crash", "playlist", "update"],"reviewCategory": "bug_report","isSpam": false,"aiSummary": "App crashes when opening a playlist after the latest update.","aiLanguage": "en","scrapedAt": "2026-08-06T12:00:00.000Z"},{"type": "review","isChild": true,"appId": "com.spotify.music","parentId": "com.spotify.music","id": "d2a9c7e4-5b6f-4e21-8c0a-71f3b2d9a441","userName": "Jordan M.","userImage": null,"date": "2026-08-04T18:02:10.000Z","score": 5,"scoreText": "5","text": "Great app, love the new playlist folders feature.","title": null,"thumbsUp": 3,"version": "9.1.68.1888","replyText": "Thanks for the kind words!","replyDate": "2026-08-05T08:00:00.000Z","hasDeveloperReply": true,"replyLatencyDays": 0.58,"criterias": [],"textLength": 50,"wordCount": 8,"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=d2a9c7e4-5b6f-4e21-8c0a-71f3b2d9a441","storefront": "us","sentiment": null,"sentimentScore": null,"emotion": null,"topics": null,"reviewCategory": null,"isSpam": null,"aiSummary": null,"aiLanguage": null,"scrapedAt": "2026-08-06T12:00:00.000Z"},{"type": "review","isChild": true,"appId": "com.spotify.music","parentId": "com.spotify.music","id": "9f1c2a3b-6d4e-4a90-b1c2-5e8f0a1b2c3d","userName": "Priya S.","userImage": null,"date": "2026-08-02T11:45:00.000Z","score": 2,"scoreText": "2","text": "Subscription price went up again with no new features to show for it.","title": null,"thumbsUp": 27,"version": "9.1.60.1550","replyText": null,"replyDate": null,"hasDeveloperReply": false,"replyLatencyDays": null,"criterias": [],"textLength": 72,"wordCount": 13,"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=9f1c2a3b-6d4e-4a90-b1c2-5e8f0a1b2c3d","storefront": "us","sentiment": "negative","sentimentScore": -0.6,"emotion": "disappointment","topics": ["subscription", "pricing"],"reviewCategory": "complaint","isSpam": false,"aiSummary": "User is unhappy about a subscription price increase.","aiLanguage": "en","scrapedAt": "2026-08-06T12:00:00.000Z"},{"type": "app","isChild": false,"appId": "com.spotify.music","parentId": null,"title": "Spotify: Music and Podcasts","score": 4.3,"scoreText": "4.3","ratings": 24831902,"reviews": 9812345,"histogram": { "1": 1200000, "2": 500000, "3": 1100000, "4": 3400000, "5": 18600000 },"ratingDistributionPct": { "1": 4.8, "2": 2.0, "3": 4.4, "4": 13.7, "5": 74.9 },"reviewToInstallRatio": 24.83,"reviewsCollected": 3,"avgScoreCollected": 2.67,"collectedStarCounts": { "1": 1, "2": 1, "3": 0, "4": 0, "5": 1 },"developerReplyRate": 33.3,"sentimentBreakdown": { "positive": 0, "neutral": 0, "negative": 2, "analyzed": 2 },"installs": "1,000,000,000+","price": 0,"free": true,"currency": "USD","developer": "Spotify AB","genre": "Music & Audio","contentRating": "Teen","released": "Jul 25, 2011","version": "9.1.68.1888","url": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us","storefront": "us","scrapedAt": "2026-08-06T12:00:00.000Z"}]
How can I use the data extracted with Google Play Scraper — Reviews, Ratings & Sentiment Analysis?
- 📱 Product and mobile teams — filter
starRatings: ["1","2"]withsortReviewsBy: "newest"and anappVersionFilterprefix to catch a crash wave the day a release ships. - 📊 ASO specialists — read
ratingDistributionPct,avgScoreCollectedanddeveloperReplyRateon the summary rows to benchmark an app's rating trend and reply discipline against competitors. - 🤖 AI engineers and LLM developers — an agent issues a run with
appTargetsandenableSentimentAnalysis, receives structured review JSON withsentiment/topics/reviewCategoryalready attached, and passes it straight to the model as grounded context — no separate classification step. - 🎧 Support / CX teams — filter
onlyWithDeveloperReply: trueand checkreplyLatencyDaysto audit how fast (or slowly) the team is answering users.
How do you monitor Google Play sentiment and ratings over time?
Review sentiment isn't a one-time read — the useful signal is the change between runs: a sudden shift in avgScoreCollected, a spike in bug_report-categorized reviews, or sentimentBreakdown.negative climbing after a release. Repeated querying turns single-run snapshots into a trend: run the same appTargets on a schedule, and diff each app's ratings-summary row against the previous run's.
Fields worth diffing between runs: avgScoreCollected, collectedStarCounts, developerReplyRate, sentimentBreakdown, and ratingDistributionPct (drawn from the app's public histogram, so it moves even on runs where you don't re-collect every review). On the review rows themselves, reviewCategory and topics let you track which complaint types are trending up, not just whether the average score moved.
A practical loop: schedule a run across your appTargets with reviewsPostedAfter: "7 days" and sortReviewsBy: "newest" so each run only pulls what's new, store the run's lastCursor output for the first app, and compare the new summary row's fields to the last one — alert when avgScoreCollected drops or sentimentBreakdown.negative rises past what you expect. Set this up with an Apify Schedule on this actor; there is no built-in delta computation, so the comparison itself runs in your own pipeline against the stored dataset rows.
Integrate Google Play Scraper — Reviews, Ratings & Sentiment Analysis and automate your workflow
Google Play Scraper — Reviews, Ratings & Sentiment Analysis works with any language or tool that can send an HTTP request through the Apify API.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("<actor-id>").call(run_input={"mode": "scrapeReviews","appTargets": ["com.spotify.music"],"storefrontCountry": "us","maxReviewsPerApp": 50,"sortReviewsBy": "newest",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("type") == "review":print(item["score"], item["text"][:80])
Scheduled monitoring and delivery
There is no actor-specific webhook or push feature; use the platform's own scheduling and delivery instead. Set up an Apify Schedule to re-run the actor on a cron interval with a rolling reviewsPostedAfter window, and attach an Apify webhook on the run-succeeded event to trigger downstream processing once each run's dataset is ready.
⚖️ Is it legal to scrape Google Play reviews and ratings?
Yes — Google Play Scraper — Reviews, Ratings & Sentiment Analysis reads publicly accessible Play Store listing and review pages, the same pages any visitor's browser can load, without logging in or bypassing access controls. Reviews carry user-generated text and reviewer display names, which can constitute personal data; if you process them for individuals in the EU/UK or California you are acting as the data controller for that processing and should have a lawful basis, retain only what you need, and honour deletion requests (GDPR/CCPA framing applies to the review-author data). App metadata — installs, price, developer info, genre — is business/catalogue data governed by Google's own Terms of Service rather than personal-data law. Scraping for AI training and scraping for operational monitoring carry different risk profiles; consult your legal team for commercial use cases involving bulk data storage.
❓ Frequently asked questions
Which Google Play storefront countries does this scraper support?
83 storefronts, selected with storefrontCountry (default us) — reviews, star ratings and app records are all storefront-specific on Google Play, so the country you pick changes what comes back.
How do I control review order and volume?
sortReviewsBy picks mostRelevant (Play Store default), newest, or rating. reviewsPageSize sets how many reviews are requested per round trip (clamped to 10–199). maxReviewsPerApp and maxRecords cap volume per app and per run.
How does this scraper handle Google Play's anti-bot measures?
It runs requests through a route ladder that starts on the fastest available network path and escalates automatically — first to a shared route, then to a residential route — whenever Google Play returns an unusable response (HTTP 401/403/407/408/429 or 5xx), retrying with a short backoff before escalating further.
Does this scraper include sentiment analysis?
Yes — set enableSentimentAnalysis: true and supply aiApiKey (or the matching environment variable) for the provider behind your chosen aiModel. Each classified review gets sentiment, sentimentScore, emotion, topics, reviewCategory, isSpam, aiSummary and aiLanguage. Without a key, or if the model call fails, those fields stay null on that review.
How many reviews does this scraper return per app?
As many as the store exposes for that app, up to whichever of maxReviewsPerApp or maxRecords is reached first. reviewsPageSize is hard-clamped to 10–199 in the actor regardless of what you enter — there's no way to request a larger single page.
How do I monitor an app's ratings and sentiment over time?
Schedule the actor with reviewsPostedAfter set to a rolling window (e.g. "7 days"), then compare each run's ratings-summary row — avgScoreCollected, collectedStarCounts, developerReplyRate, sentimentBreakdown — against the previous run's. See "How do you monitor Google Play sentiment and ratings over time?" above.
Does this scraper work with Claude, ChatGPT, and AI agent frameworks?
It is not registered as an MCP tool. It is callable as a standard HTTP endpoint through the Apify API by any agent framework, so an agent can trigger a run, poll or wait for the dataset, and use the returned review and sentiment JSON as grounded context before answering.
Can I use this scraper without managing proxies or a Google account?
Yes. proxyConfiguration defaults to Apify Proxy ({"useApifyProxy": true}) and the route ladder escalates on its own; no Google account or Play Console login is needed for any of the four modes. The only credential you might supply is your own AI provider key, and only if sentiment analysis is switched on.
Does resumeFromToken resume every app in a multi-app run?
No — it applies only to the first app in appTargets. For repeating multi-app monitoring, use a rolling reviewsPostedAfter window instead so each scheduled run naturally picks up only what's new for every app.
💬 Your feedback
Found a bug, or missing a field you need in the review or app-record output? Let the Scrapier team know through the Apify Console's actor issue/support link on this actor's page — reports like this go directly into the next update.