Google Play Reviews Scraper — See Why the Rating Moved avatar

Google Play Reviews Scraper — See Why the Rating Moved

Pricing

from $0.08 / 1,000 reviews

Go to Apify Store
Google Play Reviews Scraper — See Why the Rating Moved

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

Northbell

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

7 days ago

Last modified

Security

Limited permissions

Share

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.

nameaverageRatingratingCountinstallsratingsAddedSinceLastRunnewRatingsAverage
Spotify: Music and Podcasts4.3485364958191B+10584.94
Duolingo: Learn Languages4.744851033746500M+127284.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 days
day 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:

fieldmeaning
averageRating, ratingCountthe app's overall rating and how many ratings, right now
installs, category, price, developerthe listing
ratingsAddedSinceLastRunhow many ratings arrived since you last ran
newRatingsAveragethe average of just those new ratings
newRatingsAverageReliable, newRatingsAverageErrorBoundwhether that figure can be trusted, and its margin
ratingDropAlert, ratingDropGapset when new reviews run a full star or more below the app's norm — even after the error margin is subtracted
firstSeenAt, observations, hoursSinceLastRunyour own series
removedthe app is gone from that country's store — recorded, not treated as an error
foundBySearch, searchRankthe 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:

fieldmeaning
score, textthe star and the full review body
textEmptytrue when someone left a star but no words — common, and worth counting separately
userNamethe reviewer's public display name on Google Play (empty with Leave out people's names)
at, thumbsUpwhen it was written and how many found it helpful
appVersionthe app version the reviewer was on — the field that tells you which release broke things
replyFrom, replyText, replyAtthe developer's reply, when there is one
arrivedSinceLastRunthis review landed after your previous run
duringRatingDropAlertthis review was pulled on a run where the rating alarm fired
reviewId, urlstable 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:

eventwhen
Actor startonce per run
App checkedone 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 install
npm 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 companies

App stores

Our own running cost is about **$0.139 per 1,000 rows** of Apify platform usage at 512 MB (22-run measurement, Sept 2026 — [how it was measured](https://dev.to/apify/i-measured-what-my-11-actors-cost-to-run-the-96x-spread-was-mostly-one-config-field-hoj)) — already included in the price; nothing is billed on top.