Google Play Reviews Scraper avatar

Google Play Reviews Scraper

Pricing

from $0.84 / 1,000 results

Go to Apify Store
Google Play Reviews Scraper

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

Ibnu Adzim

Maintained by Community

Actor 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 StoreGoogle Play
Ceiling500 per storefront × sort (page 11 is a 400)none found — 1,200 reviews over 12 pages with the cursor still live
What widens coveragecountry (storefronts hold disjoint reviews)language (hl)
What does nothingcountry (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 payloadResponse
[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 with appResolved: false almost certainly means the package name is wrong.
  • Sorts are mostRelevant, newest and rating. A fourth value behaved identically to the first, so it is not offered.
  • The maxResults cap 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.