Google Play Reviews Scraper
Pricing
from $0.07 / 1,000 results
Google Play Reviews Scraper
Scrape Google Play app reviews and monitor new ones by package name or app URL: rating, text, date and reviewer, plus helpful votes, app version and developer reply when given. Delta mode returns only reviews not seen in earlier runs. Filter by stars, date, keyword or reply. No login.
Pricing
from $0.07 / 1,000 results
Rating
0.0
(0)
Developer
Axiom Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Returns: one row per Google Play review with reviewId, userName, rating, text, publishedAt, reviewUrl and sourceUrl.
Input: {"apps":["com.spotify.music"],"countries":["us"],"sort":"newest","maxItems":30}
Best for: app feedback analysis, release monitoring and developer reply research.
{"reviewId": "15aaafd4-4360-4bc2-9739-67975b168649","packageName": "com.spotify.music","userName": "Pranav Kumar","rating": 1,"text": "useless app only ads","publishedAt": "2026-10-14T04:14:27.449Z","reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=15aaafd4-4360-4bc2-9739-67975b168649"}
See real output: https://api.apify.com/v2/datasets/48n1DFaEofOhxsjRS/items?format=json&clean=true
What does Google Play Reviews Scraper do?
Google Play Reviews Scraper collects public app reviews using package names or Google Play app details URLs. It returns structured review records suitable for spreadsheets, dashboards and research workflows. You can request a storefront country and language, choose the review order, and restrict results by rating or publication date. No login is required.
This Google Play scraper focuses on reviews rather than app metadata. Each row represents a review and includes its stable identifier, reviewer display name, star rating and available text. Helpful vote counts, app versions and developer replies are included when Google Play supplies them. The Actor does not infer missing versions or create replies when none are present. Optional values can be null, and downstream systems should handle that explicitly.
What data can you get?
The following fields describe the returned review records. Dates use UTC ISO timestamps converted from the numeric timestamps in the response. Package, country and language values describe the request context.
| Field | Meaning |
|---|---|
id | Stable review identifier used for deduplication |
reviewId | Google Play review identifier |
userName | Public reviewer display name |
userImage | Reviewer image URL when available; images are not downloaded |
rating | Numeric star rating from one to five |
text | Review text supplied by Google Play |
publishedAt | Review publication timestamp in UTC |
thumbsUp | Helpful vote count |
appVersion | App version attached to the review when supplied |
replyText | Developer response text when present |
repliedAt | Developer response timestamp when present |
replyAuthor | Name of the replying developer account when a reply exists, otherwise null |
reviewUrl | Link to the review on the app's Google Play page, built from packageName and reviewId |
packageName | Requested Android package name |
country | Requested storefront country code |
language | Requested review language |
sourceUrl | Review endpoint from which the row was fetched |
Missing optional values are null. The sourceUrl points to the endpoint and its storefront parameters; fetching it in a browser without the matching POST request will not reproduce the review page. Keep reviewId alongside any analysis so that findings can be traced to individual rows.
How to use
Open the Actor in Apify Console and enter one or more app package names in apps. A package name is the id parameter of an app details URL, such as com.spotify.music. You can also paste the full details URL, including other query parameters; the Actor extracts its id parameter and sends requests only to the Google Play review endpoint.
Choose countries and language for the storefront you want to examine. Leave sort as newest for publication monitoring, or use relevance when you want Google's relevance ordering. Set maxItems to a small value for an initial inspection. Start the run, inspect the dataset, then export JSON, CSV or Excel using the normal Apify dataset controls. Increase limits only after checking that the returned app, country and language match your intended research.
For recurring collection, enable deltaMode and keep the same app and country selections. Delta mode saves returned review identifiers in named key-value stores. The first delta run establishes that state; later runs skip identifiers already saved. A normal run without deltaMode does not establish or update delta state. With newest sorting, the first already-seen review stops pagination for that app and country.
Input
apps is the only required field. Optional controls have defaults, so an API caller can send only apps. Prefilled values in Console are examples for interactive runs and do not replace required API input.
| Input | Description |
|---|---|
apps | App package names (com.spotify.music) or Google Play app links, with or without https://, including market://details?id=... links. Entries without an app id are skipped with a warning. |
countries | Two-letter storefront country codes, default us. |
language | Review language code, e.g. en or de, default en. |
sort | Order reviews by newest, relevance or rating, default newest. |
deltaMode | Return reviews not saved by previous delta runs for each app and country, default false. |
minRating | Rating boundary from 1-5, inclusive. |
maxRating | Rating boundary from 1-5, inclusive. |
dateFrom | Inclusive ISO date boundary; leave empty to disable. |
dateTo | Inclusive ISO date boundary; leave empty to disable. |
keywords | Optional phrases matched against review text, case insensitive; any phrase may match. Empty by default. |
replyStatus | all (default), withReply, or withoutReply based on nonempty developer reply text. |
maxItems | Total results to return, 1-10000, default 50. |
minThumbsUp | Minimum helpful votes; nonnegative integer, default 0 disables |
appVersions | Exact appVersion strings to include; any listed version matches. Empty by default. |
minReviewLength | Minimum trimmed Unicode text characters; nonnegative integer, default 0 disables |
maxItemsPerApp | Maximum results per app across countries, 1-10000, default 10000. |
proxyConfiguration | Proxy to use for requests, default Apify Proxy (datacenter). Switch to residential proxies only if runs get blocked. |
{"apps":["com.spotify.music"],"countries":["us"],"language":"en","sort":"newest","deltaMode":false,"minRating":1,"maxRating":5,"dateFrom":"","dateTo":"","maxItems":50,"maxItemsPerApp":10000,"proxyConfiguration":{"useApifyProxy":true}}
maxItems applies to the entire run, while maxItemsPerApp applies to each app across all requested countries. Country combinations are processed in input order. A small total limit may therefore finish before later countries or apps are reached. If balanced country samples matter, run separate country inputs with explicit limits instead of assuming the total is divided equally.
Rating filters are inclusive. A minimum and maximum of two returns two-star reviews only. Date boundaries are inclusive timestamps; use a full timestamp when the exact boundary matters. A dateFrom without a time represents midnight UTC; a bare dateTo includes the entire UTC day. Leave the date fields empty to disable filtering. With newest sorting, pagination stops when reviews become older than dateFrom.
Keywords let you focus an export on reported crashes, subscriptions or another topic without saving every review first. Matching uses case insensitive literal substrings in review text, with Unicode compatibility normalization. It does not search reviewer names or developer replies, translate text, interpret regular expressions, or infer sentiment. Supply phrases in the language you request. An empty keywords array disables this filter. Multiple phrases use OR: a review needs to contain at least one. Rating, date and reply filters still apply together with AND.
Set replyStatus to withoutReply to collect reviews without a nonempty developer response, or withReply to inspect responses already published. The default all preserves the unfiltered output. These options do not add inferred reply records: replyText and repliedAt retain their existing nullable meanings. A missing response means only that this endpoint supplied no nonempty reply text at collection time.
For example, {"apps":["com.spotify.music"],"keywords":["crash","subscription"],"replyStatus":"withoutReply","maxRating":2,"maxItems":20} asks for up to twenty low-rated reviews mentioning either phrase and lacking a response. These filters operate on fetched source records before saving, so rejected records do not count toward maxItems or trigger result events. Narrow selections can require more pages and may return fewer than the requested limit. Each app/country scan stops after its page budget or seventy seconds without a saved match; broaden filters if an empty sample is unexpected. This is a bounded sample, not an exhaustive guarantee that no matching review exists.
Delta mode remembers saved matches rather than every scanned review. Changing filters can therefore reveal previously unsaved reviews, but reviews already saved by that app/country delta store remain excluded. Use deltaMode false for an independent filtered export when you need to inspect older reviews again.
To focus on feedback other readers found helpful, set minThumbsUp to a positive whole number. A value of 5 keeps rows whose thumbsUp is at least five. Missing vote counts are excluded when this filter is enabled. Keep the default zero to leave vote counts unrestricted. The Actor applies this filter to the source review count, without requesting reviewer images or fetching extra app pages.
Use minReviewLength to exclude short comments before saving results. A value of 40 requires at least forty Unicode characters after trimming outer whitespace from text; the exported text itself remains unchanged. Missing text cannot meet a positive minimum. This is a length filter, not a sentiment or quality judgment. Both new settings combine with ratings, dates, keywords and reply status. Restrictive combinations may require more pages and can return fewer results than requested. Only matching saved rows consume maxItems.
For example, this input collects up to seven substantive, helpful Spotify reviews while leaving every output field in its existing format:
{"apps":["com.spotify.music"],"sort":"relevance","minThumbsUp":1,"minReviewLength":40,"maxItems":7}
To isolate feedback for a release, set appVersions to exact strings copied from appVersion in a recent unfiltered export. For example, {"apps":["com.spotify.music"],"appVersions":["9.0.88.728"],"maxItems":20} selects only reviews carrying that version. Multiple entries match with OR; all other filters still apply with AND. Matching is case sensitive and does not interpret version ranges, prefixes or wildcards. Missing versions do not match a nonempty selection. An empty array preserves the default behavior, including reviews without version metadata. Google does not offer a version selector in this request, so the Actor scans pages locally and may stop before finding an older release. Broaden the version selection if too few reviews match.
Output
This record came from a local run against the public Google Play review endpoint. Review availability and vote counts can change between runs. The example shows actual returned field shapes, including null developer replies.
[{"id": "15aaafd4-4360-4bc2-9739-67975b168649","reviewId": "15aaafd4-4360-4bc2-9739-67975b168649","userName": "Pranav Kumar","userImage": "https://play-lh.googleusercontent.com/a-/ALV-UjUGymPgHxXi3beugO_FkyUdtTT545Tje_VphynciihQ0oW1VBNI","rating": 1,"text": "useless app only ads","publishedAt": "2026-10-14T04:14:27.449Z","thumbsUp": 0,"appVersion": null,"replyText": null,"repliedAt": null,"replyAuthor": null,"reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=15aaafd4-4360-4bc2-9739-67975b168649","packageName": "com.spotify.music","country": "us","language": "en","sourceUrl": "https://play.google.com/_/PlayStoreUi/data/batchexecute?rpcids=oCPfdb&hl=en&gl=us&source-path=%2Fstore%2Fapps%2Fdetails&rt=c"}]
Within a run, review identifiers are deduplicated across pages, apps and countries. If the same review appears in multiple storefront responses, only its first returned occurrence is saved. This avoids charging for duplicate records but also means a multi-country output is not a count of every storefront appearance. Treat country as the request context of the saved occurrence.
How much does it cost?
The Actor is charged per result returned. Each saved review triggers one result event. Skipped duplicates, filtered reviews and failed requests do not become dataset rows or result events. maxItems caps the total number of saved reviews. See the Pricing tab for the current charging details before starting a run.
Use with AI agents (MCP)
Connect an MCP client to the Apify MCP server with this Actor selected. The schema exposes apps first so an agent can identify the required target and then choose limits and filters. Use explicit package names in prompts when several apps have similar display names.
{"mcpServers":{"apify":{"url":"https://mcp.apify.com/?tools=axiomworks/google-play-reviews-scraper"}}}
Example prompt: “Collect twenty newest Google Play reviews for com.spotify.music in the US and summarize the complaints using rating, text and publishedAt.” Another prompt: “Return ten German-language reviews for com.duolingo in Germany, keeping reviewId and appVersion in the output.” A third prompt: “Collect one-star and two-star reviews for com.whatsapp and group the returned text by recurring topic.”
Integrations and API
Use the Apify API or SDK clients to run the Actor and retrieve its default dataset. Configure your own Apify token securely in your application environment. These examples use the same Store path as the MCP configuration.
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("axiomworks/google-play-reviews-scraper").call(run_input={"apps":["com.spotify.music"],"maxItems":50})rows = client.dataset(run["defaultDatasetId"]).list_items().items
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN});const run = await client.actor('axiomworks/google-play-reviews-scraper').call({apps:['com.spotify.music'],maxItems:50});const {items} = await client.dataset(run.defaultDatasetId).listItems();
curl -X POST 'https://api.apify.com/v2/acts/axiomworks~google-play-reviews-scraper/run-sync-get-dataset-items' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"apps":["com.spotify.music"],"maxItems":50}'
FAQ
Why did a run return fewer reviews than maxItems?
The selected storefront may have exhausted its available pages, filters may exclude records, delta mode may reach already-seen reviews, or a target may remain blocked after retries. maxItems is an upper limit, not a promise that every selection has enough matching reviews. Read the final status message and logs before increasing limits. An empty delta run also suggests setting deltaMode=false to export previously seen reviews again. HTTP attempts share the request retry deadline, so a late retry cannot start a fresh full timeout after that budget expires.
Can I use a Play URL with extra parameters?
Yes. A Google Play app details URL with an id parameter is accepted. Package names are also supported directly. Supply a Google Play details URL or package name rather than an app title or search URL. The parser extracts a package-shaped id parameter from supplied links; it requests only the Google Play review endpoint and does not visit the supplied link.
Does delta mode track every changed review?
Delta state tracks returned identifiers, not content revisions. Already-seen edited reviews are skipped; use normal snapshots to compare changes. Deleting the named store resets history. Unreadable stores trigger a warning and a full scan within existing limits. Failed saves leave collected reviews available but may cause repeats next run. Runs without new identifiers avoid a state write.
Are developer replies always available?
No. replyText and repliedAt are null when Google Play does not supply a reply. The Actor does not generate responses, estimate reply dates or contact developers. appVersion can also be missing on individual reviews.
How are blocked requests handled?
Requests use the selected proxyConfiguration. Temporary errors and block responses are retried with backoff and a fresh proxy session. Persistent blocks produce an empty successful result with guidance when no target succeeds. The Actor does not solve CAPTCHAs or access content behind login.
Can I compare storefronts directly?
You can request multiple countries, but the response is the endpoint's selection for each country and language. Reviews may overlap. Use separate runs if you need independent samples and retain country and language in your analysis. Do not treat returned sample sizes as app installation counts.
Is it legal to scrape Google Play?
This Actor reads publicly available review data without login. Reviewer names and image URLs can be personal data, so choose retention, sharing and downstream uses appropriate to your circumstances. The Actor is not affiliated with Google Play or endorsed by Google. Users remain responsible for reviewing applicable rules and requirements for their use of the collected records.
Feedback
If a result looks wrong, share the app package, country, language, sort and relevant reviewId in an Actor issue. Describe the expected field and the returned value so the extraction can be investigated. Avoid including credentials or unnecessary personal details.