Google Play Reviews Scraper - App Reviews by Country
Pricing
from $0.09 / 1,000 google play reviews
Google Play Reviews Scraper - App Reviews by Country
Get Google Play reviews for any app, by app ID or URL. Each store has its own reviews, in the language people wrote them. The German listing is not a translated American one. Pick any country and language. Filter by star and by date. Up to 5,000 per app. $0.09 per 1,000 reviews.
Pricing
from $0.09 / 1,000 google play reviews
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Google Play Reviews Scraper: reviews for any app, from any storefront, no key
Give it Android package IDs like com.spotify.music, or paste Play Store links, and it pages
through that storefront's reviews and writes one row each: star score, text, reviewer, date, thumbs
up, the app version reviewed, and the developer's reply when there is one. Filter by star rating and
by date, and attach the app's own details to every row.
The thing to know before a long run: one bad app ID stops everything. If a single entry in your list
will not parse, the run writes one BAD_INPUT row and scrapes nothing at all, rather than doing the
other nine apps. Check the list first.
| Input | Android package IDs, Play Store links, or both |
| Output | One row per review |
| Ceiling | 5,000 reviews per app, and 100 pages of paging |
| Account needed | None. No Google account, no Play Console |
| Price | $0.09 per 1,000 reviews, flat on every plan |
đïž What Google Play Reviews Scraper does
Every Google Play storefront holds its own reviews, in whatever language people wrote them. The
German listing is not a translated American one. So you name the storefront with country, the
language with language, and you get what that store actually shows.
It pages through the reviews for each app until it has the number you asked for, your date cutoff is
crossed, or Google runs out. starRating keeps one rating band. dateCutoff keeps reviews on or
after a date. With includeAppMetadata on, one extra lookup per app attaches the title, developer,
score, install band, genre, version, icon and price to every review row.
đ„ What you give it
{"appIds": ["com.spotify.music", "com.whatsapp"],"country": "us","language": "en","sort": "newest","maxReviewsPerApp": 500,"starRating": "1","dateCutoff": "2026-01-01","includeAppMetadata": true}
| Field | Default | What it is |
|---|---|---|
appIds | box starts at com.spotify.music | Package IDs, one per line. Play Store links are accepted here too. |
appUrls | none | Play Store details links. Merged with appIds and deduplicated. |
country | us | Two-letter storefront code. de, jp, br and the rest. |
language | en | Two-letter language for the reviews and the store text. |
sort | newest | newest, rating or helpfulness. |
starRating | all | all, or one value from 1 to 5. |
dateCutoff | none | Keep reviews on or after this YYYY-MM-DD UTC date. |
maxReviewsPerApp | 100 | Rows kept per app after filtering, up to 5,000. |
includeAppMetadata | on | One extra lookup per app, attaching its details to every review row. |
requestsPerSecond | 3 | Shared request rate, 1 to 10. Lower it if a big run starts getting refused. |
proxyConfiguration | off | Optional. Your own servers, if you have a reason to use them. |
Nothing is required. An empty run finishes with one row marked _sample: true so you can see the
shape, and that row is not charged as a review.
đ€ What you get back
A real review row from a recent run, with the long image links cut short:
{"ok": true,"_sample": false,"appId": "com.spotify.music","appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us","appTitle": "Spotify: Music and Podcasts","appDeveloper": "Spotify AB","appScore": 4.3461704,"appRatings": 36333539,"appReviewCount": 1853008,"appInstalls": "1,000,000,000+","appMinInstalls": 1000000000,"appGenre": "Music & Audio","appVersion": "VARY","appUpdated": "2026-09-18T07:51:07.000Z","appIcon": "https://play-lh.googleusercontent.com/IzQgYCcnCFCD08GR-3bdtcT8xz...","appPriceText": "Free","appContentRating": "Teen","reviewId": "83d77596-5f69-4723-9702-b87c370328ea","reviewUrl": null,"userName": "Onwuka Kaiser","date": "2026-09-19T07:02:26.842Z","score": 5,"scoreText": null,"title": null,"text": "the greatest music app I've ever used","thumbsUp": 0,"version": "9.1.80.2221","replyDate": null,"replyText": null,"criterias": [],"country": "us","language": "en","sort": "newest"}
| Field | What it is |
|---|---|
score, text | The star rating and the review body. Most Play reviews have no title, so it is usually null. |
date | ISO timestamp. Google Play gives a real date here, not a relative string. |
replyText, replyDate | The developer's public reply, null when there is none. |
version | The app version that reviewer was on, when Google records it. |
thumbsUp | Reads 0 when Google leaves the count out, so a real zero and a missing value look the same. text behaves the same way with an empty string. |
app* fields | Only filled when includeAppMetadata is on. appTitle is null otherwise. |
criterias | Google's per-category ratings for the app, an empty array on most reviews. |
đ§Ÿ Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A review | ok: true and _sample: false | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
| Code | What it means |
|---|---|
BAD_INPUT | An app ID, link, country, language, filter or limit is not valid. The whole run stops here. |
NOT_FOUND | That app is not available in the country you asked for. |
NO_RESULTS | Nothing matched that app, storefront and filter combination. |
RATE_LIMITED | Google Play throttled the run after retries. Lower requestsPerSecond and try again. |
BLOCKED | Google Play answered with a consent or access wall instead of reviews. |
PARSE_ERROR | The response came back in a shape the parser did not expect. |
NETWORK | The request could not complete. |
Apart from BAD_INPUT, one app failing does not stop the others. If paging breaks partway, the rows
already collected are kept and the diagnostic carries partial: true with how many came back. The
Overview table does not show errorCode, so read the dataset as JSON when a run looks empty.
â¶ïž How to run it
- Open Google Play Reviews Scraper and click Try for free.
- Put your package IDs into App IDs, one per line, replacing the example.
- Set Country and Language for the storefront you want.
- Set Maximum reviews per app, add a Star filter or Reviews on or after date if you need one, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
đ° How much does it cost?
$0.09 per 1,000 reviews, which is $0.00009 each. The same rate on every Apify plan, no volume tiers.
Rows are saved in page-sized batches and only charged once the batch is safely stored.
Not charged as reviews: the sample row, every diagnostic row, duplicates, and the reviews your star or date filter threw out. You pay for rows that reach your dataset.
đĄ What people use it for
- Watching the 1-star reviews on your own app across a few countries, on a daily schedule.
- Pulling every review since a release date with
dateCutoff, to see what the update actually changed. - Reading a category's apps side by side, with
includeAppMetadatagiving you score and install band on the same row. - Feeding review text into your own tagging or sentiment work, with
versionalready attached.
đ§ What it does not do
- One bad app ID stops the whole run. It writes a single
BAD_INPUTrow and scrapes nothing. - One storefront per run.
countryandlanguageapply to everything in the list. Run it again for another market. - 5,000 reviews per app, and a hard stop at 100 pages. Split a bigger job by
dateCutoffor by sort order. maxReviewsPerAppcounts rows kept, not rows read. Filtering to 1-star reviews on a well-reviewed app burns a lot of pages, and the 100-page stop can arrive before your quota does.sortchanges when it can stop early. Withnewestand adateCutoffit stops as soon as a page crosses the date. Withratingorhelpfulnessit cannot, so it keeps paging.- If the app's details page cannot be found in that country, the app is skipped, even where
reviews might exist. Try another
country, or turnincludeAppMetadataoff. - A missing
thumbsUpreads as0and missing text as an empty string, so you cannot tell those apart from real values. - No official API exists for this data. Pages and formats change, and when they do you get a diagnostic row rather than a failed run.
đ§ Which Google scraper do you need?
| If you want | Use |
|---|---|
| Reviews for an Android app | This one |
| The app listings themselves, by keyword or category | Google Play Apps Scraper |
| Reviews for a business on Google Maps | Google Maps Reviews Scraper |
| Reviews with drafted replies, on a schedule | Google Reviews Monitor |
| The web results page for a keyword | Google Search Results Scraper |
â Questions people ask
Do I need a Google account or Play Console access? No. These are public store pages.
Can I get every review an app has? Up to 5,000 per app per run, and paging stops at 100 pages.
For more, split the job by date with dateCutoff.
Why are the reviews in a language I did not ask for? Because that is how people wrote them.
language picks the storefront's language, not a translation.
Can I scrape several countries at once? Not in one run. country is per run, so schedule one per
market.
Does starRating cost me for the reviews it throws away? No. You are charged for rows that land
in your dataset.
Is scraping Google Play legal? These are public listings and public reviews. Reviews carry personal data, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers. Not affiliated with Google.
đ If something breaks
Open the Issues tab on the actor page. Send the app ID, the country and the run ID. The
errorCode on the diagnostic row usually names the problem on its own.