Google Play Reviews Scraper · $0.09/1K, 49 Languages, Only New avatar

Google Play Reviews Scraper · $0.09/1K, 49 Languages, Only New

Pricing

from $0.06 / 1,000 scraped reviews

Go to Apify Store
Google Play Reviews Scraper · $0.09/1K, 49 Languages, Only New

Google Play Reviews Scraper · $0.09/1K, 49 Languages, Only New

Google Play reviews scraper for app monitoring and competitor research: Android app Reviews in every language Google serves, up to all 49 merged in one run, deduplicated, with developer replies. Monitoring mode charges only what is new. No login.

Pricing

from $0.06 / 1,000 scraped reviews

Rating

0.0

(0)

Developer

TheQuietStack

TheQuietStack

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

2 hours ago

Last modified

Share

Google Play Reviews Scraper · Android Reviews, All Languages

Android reviews from Google Play in every language: Play Store reviews merged from up to 49 languages in one run, deduplicated, with developer replies — plus a keyword filter, the app's exact star breakdown, and a monitoring mode that only charges you for reviews you have not already seen.

Scrape Google Play Store reviews for any Android app, in one, several or all 49 review languages in a single run. Every review becomes one clean, flat row with stars, text, app version, date, thumbs-up count and the developer's reply, deduplicated by review ID. No login, no API key.

Looking for iPhone/iPad reviews? Use the twin Actor App Store Reviews Scraper. Both return one flat row per review with rating, text, app version, ISO date and a review ID, so the two stores fit into one sheet.

Why this scraper

  • Google shows each language its own reviews. A scraper set to English only ever sees the English review set. Measured on 23 Sep 2026: WhatsApp's 150 newest reviews in English, German, Spanish, Portuguese and Japanese share zero review IDs. The first page (150 newest) of all 49 languages returned 7,350 reviews, all 7,350 different. This Actor merges the languages you pick (or all of them) into one dataset. Every row has a language field, and duplicates are removed.
  • Run it on a schedule and pay only for what is new. Switch on onlyNew and the Actor remembers, per app, language and country, where the last run stopped. The next run writes only reviews it has never written before, and stops paging as soon as a whole page is older than the mark. Measured on 8 Oct 2026 (com.whatsapp, English + German, 1–2★, last 3 days): run 1 wrote and charged 187 reviews; runs 2 and 3, minutes later, looked at 450 reviews and wrote 0 — reviews a daily monitor would otherwise fetch, write and bill again every single day.
  • Keyword filter, and you do not pay for the misses. Google's review endpoint takes stars, date, version and language, but it has no text search — so every scraper that offers keywords filters after fetching. The difference is who pays for the fetched-and-dropped rows. Here you do not: measured 8 Oct 2026 on com.whatsapp, keywords: ["crash","update","ads"] over 1–2★ English reviews fetched 750, wrote 50 and dropped 527 that were never charged. Options for any-word vs. all-words, whole-word matching, and searching the developer's reply as well.
  • The exact star breakdown, not the rounded one. With includeRatingBreakdown each app gets one extra APP_SUMMARY row with the precise number of 1★ to 5★ ratings. The public page rounds everything it shows: com.whatsapp on 8 Oct 2026 displayed "245M" and "4.6", while the row carries 245,328,127 ratings and an average of 4.617647. The row also puts the lifetime 1–2★ share next to the 1–2★ share of the reviews this run wrote, which is how you see a rating getting worse before the average moves. The numbers come out of the app data the Actor already loads, so they cost no extra request, and the row is not charged as a review.
  • Developer replies included. developerReply and developerReplyDate are fields on every row (empty when there is no reply). There is also a filter for reviews the developer answered, which is useful for studying how a competitor handles support.
  • Input the way you have it. A Play Store URL, a package name (com.whatsapp), or just a search term ("notion").
  • Filters that save money. Star rating is filtered on Google's side, so a 1–2★ run never pages through thousands of 5★ reviews. There are also filters for date range, rolling recentDays, app version, minimum "helpful" votes, minimum review length, "has developer reply" and "has text". Filtered-out reviews are never charged. With sortBy: newest, paging stops as soon as reviews are older than sinceDate.
  • Every country Google serves, including cn, hk, tw, in and br — two-letter codes, no fixed list to pick from.
  • Deep history. Paging goes as far back as Google serves. In our test we stopped Notion (English) after 8,400+ reviews reaching back to October 2024, without hitting the end.
  • A hard limit you can trust. maxReviews stops the run cleanly. You are never charged for more reviews than that, and never for duplicates.
  • No silent empty results. Google Play's review endpoint is undocumented and can change. Every response is checked against the known format. If Google answers in a shape the Actor does not recognise, the run summary says FORMAT_WARNING with samples, and a run that writes nothing because of it fails visibly. You never get an empty "success".

Input example

{
"apps": ["https://play.google.com/store/apps/details?id=com.whatsapp", "com.instagram.android"],
"searchTerms": ["notion"],
"languages": ["en", "de", "es"],
"ratings": [1, 2],
"sinceDate": "2026-08-01",
"maxReviews": 1000
}

Set "allLanguages": true to scrape all 49 languages. Languages where the app has no reviews cost nothing. With a limit, the limit is shared fairly across languages page by page: WhatsApp with all 49 languages and a 5,000 limit returns 102–103 reviews from every one of the 49 languages, instead of 5,000 from the first few. Languages with fewer reviews hand their unused share to the others.

Monitoring one app every day

{
"apps": ["com.whatsapp"],
"languages": ["en", "de", "es"],
"onlyNew": true,
"sortBy": "newest",
"recentDays": 14,
"maxReviews": 2000
}

Run this on an Apify schedule. The first run fills the dataset and sets the mark; every run after it writes only the reviews that appeared since. The mark lives in a named key-value store in your account (stateStoreName, default google-play-reviews-state), so you can inspect it, and resetState: true clears it when you want the full history again.

Give the first run of a monitor either a generous maxReviews or a date bound (recentDays / sinceDate). The mark starts at the newest review the first run wrote, so if that run is cut off by the limit, the older reviews it did not reach stay unread — the run summary says so per stream (backlogNotCovered).

Finding every complaint about one thing

{
"apps": ["com.spotify.music"],
"allLanguages": true,
"keywords": ["crash", "freeze", "not opening"],
"ratings": [1, 2],
"minTextLength": 40,
"maxReviews": 2000
}

Output example

{
"rowType": "REVIEW",
"reviewId": "1492883b-928a-467b-8777-e8a2504ee2fb",
"appId": "com.spotify.music",
"appName": "Spotify: Music and Podcasts",
"language": "en",
"country": "gb",
"rating": 1,
"text": "too many ads",
"version": "9.1.84.2231",
"date": "2026-09-22T21:47:34.301Z",
"ts": 1790286454,
"thumbsUp": 0,
"author": "SHAWN",
"developerReply": "Hey. We hear you and we'll pass your feedback along to the Ads team. For an ad-free experience, we'd recommend checking out our Premium plans at spotify.com/premium. If you've never had Premium before, you should be eligible for our trial.",
"developerReplyDate": "2026-09-22T22:04:45.642Z",
"matchedKeywords": ["ads"],
"aspectRatings": [
{ "aspect": "app_quality_ads_frequency", "rating": 1 },
{ "aspect": "phase1_learning_piano", "rating": 3 }
],
"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=1492883b-928a-467b-8777-e8a2504ee2fb"
}
FieldMeaning
rowTypeREVIEW for review rows, APP_SUMMARY for the optional star-breakdown row
ratingStars, 1–5
textReview body (Google Play reviews have no title)
versionApp version the reviewer was using (empty if Google does not report it)
date / tsReview date, ISO 8601 UTC — and the same instant as unix seconds
language / countryThe language/country view the review was found in
thumbsUp"Helpful" votes
developerReply, developerReplyDateThe developer's public answer, if any
matchedKeywordsWhich of your keywords this review contained (null when no keyword filter was used)
aspectRatingsGoogle's optional per-aspect ratings (ads, usability, performance ...), where given

With includeRatingBreakdown there is one extra row per app, marked rowType: "APP_SUMMARY" (com.whatsapp, 8 Oct 2026):

{
"rowType": "APP_SUMMARY",
"appId": "com.whatsapp",
"appName": "WhatsApp Messenger",
"developer": "WhatsApp LLC",
"stars": { "1": 10911745, "2": 3460954, "3": 8927542, "4": 21916889, "5": 200110944 },
"starsSum": 245328074,
"ratingsTotal": 245328127,
"reviewsTotal": 1951923,
"averageScore": 4.617647,
"averageScoreShown": "4.6",
"shareByStar": { "1": 4.45, "2": 1.41, "3": 3.64, "4": 8.93, "5": 81.57 },
"negativeShareLifetime": 5.86,
"starsSumVsRatingsTotal": 53,
"source": "google-play-app-metadata",
"scrapedInThisRun": {
"scraped": 200,
"stars": { "1": 100, "2": 100, "3": 0, "4": 0, "5": 0 },
"shareByStar": { "1": 50, "2": 50, "3": 0, "4": 0, "5": 0 },
"averageOfScraped": 1.5,
"withDeveloperReply": 0,
"developerReplyRate": 0,
"withText": 200
}
}
  • stars counts ratings (star taps without a text review included); reviewsTotal counts reviews that have a text body. They are different quantities, so they have different names. starsSumVsRatingsTotal is the drift between Google's own total and the sum of its own five bars — reported, not hidden.
  • negativeShareLifetime and scrapedInThisRun.shareByStar are deliberately separate: the first is the app's whole history, the second is only the slice this run wrote. When the second is far worse than the first, the rating is getting worse faster than the average shows. If you used a star filter, the run's distribution reflects your filter, not the app (above: a 1–2★ run, so 50/50).
  • If Google stops serving the breakdown, source is "unavailable" and every number in it is null — never a guess.

A run summary (SUMMARY in the key-value store) lists reviews per language (with cutAtLimit = this language had more reviews when the limit was reached), duplicates removed, how many reviews each filter dropped (including keywords and alreadySeen), languages without reviews, failed streams, the incremental block (how many reviews onlyNew skipped and therefore did not charge), and dataSourceCheck (OK or FORMAT_WARNING).

Honest limits

  • onlyNew needs sortBy: newest to stop paging early (it still skips already-seen reviews in any sort order). The mark recognises a review by ID and, below a cut, by date, so that every review an earlier run wrote is recognised again — but a review that Google surfaces above the cut later than its own date suggests can still arrive a second time. It is rare, not impossible.
  • Google's review feed runs about a day behind. Measured 8 Oct 2026, 16:50 UTC: the newest review com.whatsapp served in English was timestamped 16:31 the previous day. recentDays: 1 can therefore come back empty; use 2 or more.
  • The keyword filter runs after fetching, because Google's endpoint has no text search. It saves you money (dropped reviews are not charged) but not time: the Actor still has to page through the reviews to look at them. Keywords in a language the reviews are not written in are the expensive case — "crash" against Spanish reviews pages a long way for nothing.
  • Country matters much less than language. In our test, English reviews in the US and the UK overlapped by 87 of 150, and German reviews in Germany and the US overlapped by 150 of 150. Add languages to get more reviews. Extra countries mostly return duplicates, which are removed and not charged.
  • Google only lists written reviews. The app's rating count is far larger than what any scraper can list (Instagram on 23 Sep 2026: 169,380,459 ratings, 4,549,231 reviews).
  • The source is the public Play Store web page's own review endpoint (the same one the page uses when you scroll). It is undocumented, which is why every response is validated (see above).
  • Google Play only. Apple App Store is the separate App Store Reviews Scraper.

Pricing (pay per event)

  • Actor start: small flat fee per run
  • Per scraped review: charged only for reviews written to the dataset. No charge for duplicates, for reviews dropped by a filter, for reviews an earlier run already wrote (onlyNew), or for languages without reviews.
  • The APP_SUMMARY row is not charged as a review.

A daily monitor over one app in three languages that finds 40 new reviews a day is charged for 40 rows — not for the 450 the Actor had to look at to find them.

Feedback

Found a bug or missing a field? Open an issue on the Actor's Issues tab. If the Actor saved you time, a short review on the Store page helps other people find it. Thank you!