Google Play Reviews Scraper
Pricing
from $0.84 / 1,000 results
Google Play Reviews Scraper
Google Play reviews across as many languages as you name. Language is what widens coverage here - each one returns a different set - while country is inert and returns the same reviews twice. No upstream ceiling was found, unlike Apple.
Pricing
from $0.84 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Customer reviews from the Google Play Store — rating, text, author, date, thumbs-up count and app version — across as many languages as you name. HTTP-only, no API key, no login, no browser.
This is the Android half of a pair. Its sibling,
appstore-reviews-scraper, covers Apple — and the two behave in opposite
ways on the axis that matters most:
| Apple App Store | Google Play | |
|---|---|---|
| Ceiling | 500 per storefront × sort (page 11 is a 400) | none found — 1,200 reviews over 12 pages with the cursor still live |
| What widens coverage | country (storefronts hold disjoint reviews) | language (hl) |
| What does nothing | — | country (gl) |
If you have used the Apple actor, the instinct it teaches — vary the country — is the wrong one here, and it fails silently. See quirk 2.
Three upstream quirks it corrects
1. Every failure is an HTTP 200
This endpoint essentially never returns an error status. Measured against the same request, same minute:
| Inner payload | Response |
|---|---|
[null,null,[2,s,[n,null,null]],[[pkg,7]]] | 200, 108 bytes, empty |
[[null,[[2,n,[...]],[pkg,7]]]] | 200, with PlayDataError inside it |
[null,null,[2,s,[n,null,null]],[pkg,7]] | 200, 35,624 bytes ✅ |
A wrong payload shape does not 400 — it answers 200 with an empty envelope, or with an error object buried inside a successful response. An unknown package does the same. So the status code carries almost no information here, and the actor verifies it actually received reviews rather than trusting the transport.
2. hl (language) decides which reviews you get. gl (country) does nothing
Measured on WhatsApp, 50 reviews:
hl=en gl=US vs hl=en gl=GB -> 50 of 50 IDENTICAL (country inert)hl=de gl=US vs hl=de gl=DE -> 50 of 50 IDENTICAL (country inert)hl=de gl=US vs hl=en gl=US -> ZERO overlap (language decides)
So varying country returns you the same reviews twice, with no error and
nothing in the output to suggest it. languages is therefore the list-valued
input; country is a single value, recorded per row as countryQueried with
a standing note that it does not affect results.
3. Reviews are undocumented positional arrays
Each review is a 17-element array with no keys: the id at index 0, rating at 2, text at 4, timestamp at 5, thumbs at 6, app version at 10 (frequently null). Every index is a guess about a shape nobody publishes, so each read is guarded — one moved field costs one column, not the run.
The response itself is a wire envelope, not JSON: a )]}' guard line, then a
batchexecute frame in which the payload is a JSON string nested inside a
JSON array. It is parsed twice, and the frame is located by its RPC id because
Google interleaves other frames alongside it.
Output
One SEARCH_SUMMARY per run, one REVIEW per review, one ERROR per
language that failed.
REVIEW: packageId, appName, language, countryQueried, sortUsed,
reviewId, authorName, authorAvatarUrl, rating, review, postedAt,
postedAtEpoch, thumbsUp, appVersion, pageFetched, resultRank.
SEARCH_SUMMARY adds appResolved, reviewsPerLanguage, emptyLanguages,
duplicateReviewsDropped and a ratingHistogram.
Limits
- An unknown package returns an empty envelope under HTTP 200, identical to
a real app with no reviews in that language. The actor fetches the public app
page once to tell them apart and reports
appResolved— an empty result withappResolved: falsealmost certainly means the package name is wrong. - Sorts are
mostRelevant,newestandrating. A fourth value behaved identically to the first, so it is not offered. - The
maxResultscap is divided across the languages so one cannot consume it all. - No WAF on this host; a proxy is offered but was not needed for any of the reconnaissance, and it does not change which reviews come back.