Google Play Reviews Scraper — See Why the Rating Moved
Pricing
from $0.08 / 1,000 reviews
Google Play Reviews Scraper — See Why the Rating Moved
Google Play reviews scraper: full review text, stars, author, date, thumbs-up, app version and developer reply, by package name or straight from a search term. No login, no API key. It records each app's rating over time, so when the rating moves you can pull the reviews from that window.
Pricing
from $0.08 / 1,000 reviews
Rating
0.0
(0)
Developer
Northbell
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
7 days ago
Last modified
Categories
Security
Limited permissionsShare
Scrape Google Play reviews — full text, star, date, thumbs-up, app version and the developer's reply. No login, no cookies, no API key.
Try it now. The input is already filled in. Press Start: Spotify and Duolingo — each app's rating and its newest 100 reviews — in about 9 seconds, for about $0.04.
name | averageRating | ratingCount | installs | ratingsAddedSinceLastRun | newRatingsAverage |
|---|---|---|---|---|---|
| Spotify: Music and Podcasts | 4.3485 | 36495819 | 1B+ | 1058 | 4.94 |
| Duolingo: Learn Languages | 4.7448 | 51033746 | 500M+ | 12728 | 4.69 |
The last two columns need a previous run: on our account, which read these apps 13.5 hours earlier, Spotify had gained 1,058 ratings averaging 4.94 — well above its overall 4.35 — and ratingDropAlert stayed false. On your first run they are empty; they fill in from your second. Each review row has the star, text, date, thumbs-up, app version and the developer's reply (17 of these 200), plus arrivedSinceLastRun.
$0.005 per app checked plus $0.10 per 1,000 reviews — one app with 500 reviews costs $0.07 including the run start.
And then the part other review scrapers do not do: it also records each app's rating over time, so when the rating moves you can pull up the exact reviews that arrived in that window. Every review row carries arrivedSinceLastRun and duringRatingDropAlert.
A one-off scrape tells you what people wrote. This one tells you what changed, and which reviews changed it.
The number that goes stale the moment you read it
An app showing 4.3 stars from 36 million ratings tells you where it has been. It says nothing about which way it is moving right now. A wave of 1-star reviews after a bad update barely dents a 36-million average — the headline number keeps saying 4.3 while users are furious.
A rating cannot be back-filled. There is no endpoint that tells you what an app's rating was last Tuesday, or what the reviews that came in yesterday averaged. If you did not record it, that day is gone. This Actor records it and keeps the series:
com.example.app — 4.31 → 4.29 → 4.24 over three daysday 3: +812 new ratings, averaging 2.1 ⚠ well below the app's 4.24 norm
The trick Google Play makes possible
Play reports an app's average to full precision — 4.343131065368652, not a rounded 4.3. Combined with the exact rating count, two observations are enough to recover the average of everything that landed between them:
new-reviews average = (count×avg now − count×avg last time) ÷ (new ratings)
So without reading a single review body, you learn that the 812 ratings added since yesterday averaged 2.1 — and that is a fire alarm a static 4.24 would never trip.
It refuses to guess when it can't. On a 36-million-rating app, three new ratings move the average by less than the precision allows, so the recovered figure would be noise. When that happens newRatingsAverageReliable is false and the Actor does not pretend. A number without that flag is a number that will eventually lie to you.
What you get
Every run appends to your dataset. Rows are tagged by type.
app: one row per app:
| field | meaning |
|---|---|
averageRating, ratingCount | the app's overall rating and how many ratings, right now |
installs, category, price, developer | the listing |
ratingsAddedSinceLastRun | how many ratings arrived since you last ran |
newRatingsAverage | the average of just those new ratings |
newRatingsAverageReliable, newRatingsAverageErrorBound | whether that figure can be trusted, and its margin |
ratingDropAlert, ratingDropGap | set when new reviews run a full star or more below the app's norm — even after the error margin is subtracted |
firstSeenAt, observations, hoursSinceLastRun | your own series |
removed | the app is gone from that country's store — recorded, not treated as an error |
foundBySearch, searchRank | the search term that found this app and its place in Play's results (empty for apps you listed by id) |
review: one row per review:
| field | meaning |
|---|---|
score, text | the star and the full review body |
textEmpty | true when someone left a star but no words — common, and worth counting separately |
userName | the reviewer's public display name on Google Play (empty with Leave out people's names) |
at, thumbsUp | when it was written and how many found it helpful |
appVersion | the app version the reviewer was on — the field that tells you which release broke things |
replyFrom, replyText, replyAt | the developer's reply, when there is one |
arrivedSinceLastRun | this review landed after your previous run |
duringRatingDropAlert | this review was pulled on a run where the rating alarm fired |
reviewId, url | stable id and a direct link |
Turn on Leave out people's names (omitPersonalNames) and userName stays empty: useful for GDPR-minded projects in the EU that should hold no personal data.
Order them by newest, most helpful, or highest rated. Narrow to a star range if you only want the complaints — Google Play has no star filter upstream, so this Actor fetches and then filters, which is stated plainly in the input so the cost is no surprise.
Runs daily
Point it at your app (and your competitors' apps) and run it once a day. The first run is a baseline; from the second run on you get velocity and alerts. History lives in a named key-value store, so it survives between runs.
No login. Not as a policy — as a property of the code.
This Actor reads only the public Play Store page an anonymous visitor sees. It never signs in and never sends a cookie; the input schema refuses any field that looks like cookie, token, session or password. Unit tests assert the no-login behaviour and the recovery maths.
Two things it gets right
A removed app is data, not a failure. When an app 404s, the Actor records removed: true with the last rating it saw — that is the end of the app's life in that store, which is exactly what you were watching. It does not fail the run.
It never ends green and empty. If every app fails to load, the run is marked failed with an error row you will actually see — because a silent empty result is the worst outcome for something you check once a day.
Input
{"appIds": ["com.spotify.music", "com.duolingo"],"country": "US","language": "en"}
No package names? Start from a search. Give searches ("habit tracker", "meditation") and the top appsPerSearch apps of each (default 3, up to 20) are tracked — ratings and reviews alike, so you can watch a whole category or your competitors without looking up a single id. Finding the apps is free; you pay for the app checks and reviews as usual.
{"searches": ["habit tracker"],"appsPerSearch": 5,"reviewsPerApp": 50}
Paste a full Play Store URL instead of a package name and the id is taken from it. Ratings differ by country store, so set country to the market you care about.
Sizing and cost
One request per app. Pay per event:
| event | when |
|---|---|
| Actor start | once per run |
| App checked | one app's rating recorded (a removed or errored app is not charged for the check) |
Every run also pays the $0.01 run-start fee once, even one that returns nothing.
On data and privacy
This Actor records an app's public numbers — rating, review count, installs. It does not read, store or return reviewer names, profiles or review text. The persistent history holds counts and dates only.
Running locally
npm installnpm test # 22 unit tests, no network, including the no-login guarantee and the recovery maths
For AI agents
This Actor works well as an agent tool: the input schema is small and fully described, every run returns structured rows, and failures come back as data rather than silent gaps. Use it when you need to:
- track a Google Play app's rating and review count over time
- get the average rating of new Google Play reviews since the last run
- detect when new reviews of an Android app run well below its normal rating
More no-login scrapers by northbell
Every one of these reads only public pages — no login, no cookies — and most of them record the numbers that cannot be back-filled if you don't capture them today.
LinkedIn jobs
- LinkedIn Jobs Scraper with Applicant Counts: jobs plus how fast applicants are arriving
- LinkedIn Jobs Scraper — Filters That Actually Work: the experience/workplace filters LinkedIn silently ignores, applied for real
- LinkedIn Jobs Salary Data — Filter by Pay: salary parsed into numbers so you can filter by yearly pay
- Fast LinkedIn Jobs Scraper: bulk job listings, cheap and quick
- LinkedIn Company Jobs Scraper: every open role at a company you name
LinkedIn companies
- LinkedIn Company Scraper with Headcount Growth: the real headcount and how fast it's growing
- LinkedIn Company Posts + Engagement: a company's posts with exact reaction and comment counts
- Official Company Headcount: the headcount from business registers and tax boards (8 European countries, Japan and the US), with source and date
App stores
- App Store Rank & Rating Scraper: iOS keyword rank and rating changes over time
- Shopify App Reviews Scraper — Filter & Sort by Rating: exact per-star review counts, filter and sort
- Google Play Rating & Review Tracker: an Android app's rating tracked day by day