Google Play Scraper — Reviews, Ratings & Sentiment Analysis avatar

Google Play Scraper — Reviews, Ratings & Sentiment Analysis

Pricing

from $5.99 / 1,000 results

Go to Apify Store
Google Play Scraper — Reviews, Ratings & Sentiment Analysis

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

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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 TypeExtracted FieldsPrimary Use Case
Reviews (type: "review")id, userName, date, score, text, thumbsUp, version, replyText, replyDate, hasDeveloperReply, replyLatencyDays, criterias, wordCount, url, storefrontReview monitoring, bug/complaint triage, ASO research
Sentiment analysis (AI, added to review rows)sentiment, sentimentScore, emotion, topics, reviewCategory, isSpam, aiSummary, aiLanguageTriaging thousands of reviews without reading each one
Ratings analytics (type: "app", summary rows)ratingDistributionPct, reviewToInstallRatio, reviewsCollected, avgScoreCollected, collectedStarCounts, developerReplyRate, sentimentBreakdownASO 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+ moreApp 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.

FeatureGoogle Play Developer API (reviews.list)This Actor
Which apps it can readOnly apps you manage in Play ConsoleAny public app — package ID or Play Store link
SetupGoogle Play Console account + OAuth/service-account credentialsApify account, no Google login
Apps per callOne packageName per requestAny number of apps in one run (appTargets)
App metadata, search, similar appsNot part of this endpointIncluded (scrapeAppUrls, scrapeAppSearch, scrapeSimilarApps modes)
Sentiment / topic classificationNot providedOptional AI pass, 20 selectable models
Star / date / keyword / version filteringNot provided by the endpointBuilt 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?

  1. Open the actor on its Apify Store page and go to the Input tab.
  2. Add your apps to appTargets — one package ID (com.spotify.music) or Play Store link per line. Leave it empty and add keywords to searchTerms instead to let the actor discover apps first.
  3. 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.).
  4. Click Start. Rows appear in the dataset table while the run is still going.
  5. 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).

ParameterTypeRequiredDefault / PrefillDescription
modestring (enum)Noprefill scrapeReviewsscrapeReviews | scrapeAppUrls | scrapeAppSearch | scrapeSimilarApps. Falls back to scrapeReviews if omitted entirely.
appTargetsarrayNoPackage IDs and/or Play Store links, one per line. Used by the reviews, app-records and similar-apps modes.
searchTermsarrayNoprefill ["habit tracker", "budget planner"]Keywords. Drive the keyword-search mode, and auto-discover apps in the other modes when appTargets is empty.
storefrontCountrystring (enum, 83 values)Noprefill usWhich Google Play storefront to read. Reviews, ratings and app records are all storefront-specific.
maxRecordsintegerNomin 0, prefill 60Run-wide ceiling on stored rows (reviews + app summaries). 0/empty = no ceiling.
maxReviewsPerAppintegerNodefault 0, min 0, prefill 40Per-app ceiling on review rows, on top of maxRecords. 0 = no per-app ceiling.
sortReviewsBystring (enum)Nodefault mostRelevant, prefill newestmostRelevant | newest | rating.
reviewsPageSizeintegerNodefault 100, min 10, max 199Reviews requested per round trip. The actor clamps whatever value is entered into the 10–199 range.
includeAppSummarybooleanNodefault trueAdds one ratings-analytics row per app.
resumeFromTokenstringNoContinue a previous reviews run (lastCursor value from the key-value store). Applies to the first app in the target list only.
starRatingsarray of "1""5"NoKeep only these star levels. Each selected level is collected as its own pass.
reviewsPostedAfterstring (date)NoAbsolute date (2026-01-31) or relative window (30 days, 6 months).
reviewsPostedBeforestring (date)NoAbsolute date or relative window.
containsKeywordsarrayNoKeep a review only if its text contains at least one of these (case-insensitive).
excludeKeywordsarrayNoDrop a review as soon as its text contains one of these (case-insensitive).
appVersionFilterstringNoExact version (9.1.68.1888) or prefix (9.1) to match a release line.
minThumbsUpintegerNodefault 0, min 0Minimum helpful votes. 0 keeps everything.
onlyWithDeveloperReplybooleanNodefault falseKeep only reviews that carry a developer reply.
deduplicateReviewsbooleanNodefault trueDrop a review already stored earlier in the same run.
enableSentimentAnalysisbooleanNodefault falseTurn on AI review classification.
aiModelstring (enum, 20 values)Nodefault claude-haiku-4-5Provider is inferred from the model name (claude-* = Anthropic, gpt-*/o3-* = OpenAI, gemini-* = Google, grok-* = xAI, deepseek-* = DeepSeek, sonar* = Perplexity, mistral-* = Mistral).
aiApiKeystring (secret)NoYour 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.
aiMaxReviewsintegerNodefault 0, min 0, prefill 60Cost guard: only the first N collected reviews are classified. 0 = classify every collected review.
proxyConfigurationobjectNo{"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:

FieldTypeDescription
idstringReview ID.
appId, parentIdstringThe app the review belongs to (parentId mirrors appId).
userNamestringReviewer display name (often "A Google user").
userImagestringReviewer avatar URL.
datestringISO-8601 timestamp the review was posted.
scorenumberStar rating, 1–5.
scoreTextstringStar rating as a string.
textstringFull review text.
titlenullGoogle Play does not publish review titles; kept for schema compatibility.
thumbsUpnumberHelpful votes.
versionstring | nullApp version the review was written on.
replyText, replyDatestring | nullDeveloper reply text and its timestamp.
hasDeveloperReplybooleanWhether a developer reply exists.
replyLatencyDaysnumber | nullDays between the review and the reply, when both dates are known.
criteriasarrayPer-review sub-ratings ({"criteria": ..., "rating": ...}); empty for apps that don't expose them.
textLength, wordCountnumberCharacter and word count of the review text.
urlstringDeep link to the review.
storefrontstringStorefront country the review came from.
type, isChildstring / booleanRow labels ("review" / true).
scrapedAtstringISO-8601 collection timestamp.
sentimentstring | nullAI only: positive | neutral | negative.
sentimentScorenumber | nullAI only: −1…1, rounded to 3 decimals.
emotionstring | nullAI only: dominant emotion, lowercase.
topicsarray | nullAI only: up to 5 lowercase topics.
reviewCategorystring | nullAI only: bug_report | feature_request | praise | complaint | question | spam | other.
isSpamboolean | nullAI only: spam flag.
aiSummarystring | nullAI only: one-line summary, capped at 300 characters.
aiLanguagestring | nullAI 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:

FieldTypeDescription
reviewsCollectednumberReviews stored for this app in this run.
avgScoreCollectednumber | nullAverage star score of those reviews.
collectedStarCountsobject | null{1: n, 2: n, 3: n, 4: n, 5: n} count of each star level collected.
developerReplyRatenumber | nullPercentage of collected reviews carrying a developer reply.
sentimentBreakdownobject | nullAI 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"] with sortReviewsBy: "newest" and an appVersionFilter prefix to catch a crash wave the day a release ships.
  • 📊 ASO specialists — read ratingDistributionPct, avgScoreCollected and developerReplyRate on 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 appTargets and enableSentimentAnalysis, receives structured review JSON with sentiment/topics/reviewCategory already attached, and passes it straight to the model as grounded context — no separate classification step.
  • 🎧 Support / CX teams — filter onlyWithDeveloperReply: true and check replyLatencyDays to 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 ApifyClient
client = 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.


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.