Google Play Reviews Scraper - $0.09/1k, No Key
Pricing
from $0.09 / 1,000 google play reviews
Google Play Reviews Scraper - $0.09/1k, No Key
Every Google Play storefront holds its own reviews, in the languages people wrote them. The German listing is not a translated American one. Any country and language, star and date filters, app metadata in the same run. Up to 5,000 per app. $0.09 per 1,000 reviews.
Pricing
from $0.09 / 1,000 google play reviews
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Google Play Reviews Scraper
Every Google Play storefront holds its own set of reviews, in whatever language people wrote them,
so the German listing is not a translated version of the American one. Name a storefront and an
Android package ID like com.spotify.music, or paste the Play Store URL, and it pages through that
store's reviews and writes one row each: score, text, title, userName, date, thumbsUp,
the app version reviewed, and replyText / replyDate when the developer answered.
No Google account, no API key, no Play Console access. Direct HTTP requests by default, so there's no proxy bill either.
$0.09 per 1,000 reviews ($0.00009 each), plus $0.001 when a run starts. Same rate on the free plan as on a paid one.
Input
{"appIds": ["com.spotify.music", "com.whatsapp"],"country": "us","language": "en","sort": "newest","maxReviewsPerApp": 500,"starRating": "1","dateCutoff": "2026-01-01","includeAppMetadata": true}
| Field | Default | What it does |
|---|---|---|
appIds | — | Package IDs. Play Store URLs are accepted here too. |
appUrls | — | Play Store details URLs. Merged with appIds and deduplicated. |
country | us | Two-letter storefront code. |
language | en | Two-letter review and store language. |
sort | newest | newest, rating or helpfulness. |
maxReviewsPerApp | 100 | Rows kept per app after filtering. Ceiling is 5,000. |
starRating | all | all, or one value from 1 to 5. |
dateCutoff | — | Keep reviews on or after this YYYY-MM-DD UTC date. |
includeAppMetadata | true | One extra lookup per app; attaches title, developer, rating, installs, genre, version, icon and price to every review row. |
requestsPerSecond | 3 | Shared request rate, 1 to 10. |
proxyConfiguration | off | Optional fallback if Google Play starts refusing you. |
Nothing is required, so an empty run finishes successfully with one labelled _sample: true row and
charges nothing for it.
A row
{"ok": true,"_sample": false,"appId": "com.spotify.music","appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music","appTitle": "Spotify: Music and Podcasts","appDeveloper": "Spotify AB","appScore": 4.3,"appRatings": 33000000,"appInstalls": "1,000,000,000+","appGenre": "Music & Audio","appVersion": "Varies with device","appIcon": "https://play-lh.googleusercontent.com/...","reviewId": "gp:AOqpTOH...","reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=...","userName": "Reviewer","userImage": "https://play-lh.googleusercontent.com/...","date": "2026-07-24T16:10:00.000Z","score": 5,"scoreText": "5","title": null,"text": "The review text.","thumbsUp": 12,"version": "9.0.0","replyDate": null,"replyText": null,"criterias": [],"country": "us","language": "en","sort": "newest"}
Google Play doesn't always have every field. Missing values come back as null, an empty array or
an empty string rather than being dropped.
Limits
5,000 reviews per app per run, and a hard stop at 100 pagination pages. If an app has more than
that and you want the lot, split it across runs by dateCutoff or by sort order.
maxReviewsPerApp counts rows kept, not rows read. Filtering to 1-star reviews on a
well-reviewed app means the scraper reads a lot of pages to fill your quota, and it may hit the
100-page stop first.
With sort: "newest" and a dateCutoff, it stops as soon as a page crosses the cutoff, because
everything after it is older. With rating or helpfulness sorting it can't do that, so it keeps
paging.
Country and language are Google's, not a translation layer. country: "de" gets you the German
storefront's reviews, in whatever language people wrote them.
No official API exists for Play Store review data. This reads public pages and the endpoints the store's own front-end uses, so formats can change. When something breaks you get a diagnostic row, not a failed run.
Diagnostics
Errors and empty results end the run successfully with an uncharged row where ok is false. Read
errorCode, error and details.
| Code | Meaning |
|---|---|
BAD_INPUT | An app ID, URL, locale, filter, limit or proxy setting is invalid. |
NOT_FOUND | The app isn't available in the country you asked for. |
RATE_LIMITED | Google Play rate-limited the run after retries. |
BLOCKED | A captcha, consent wall or access block came back. |
PARSE_ERROR | The response format changed. |
NETWORK | The request couldn't complete. |
NO_RESULTS | Nothing matched the app, locale and filters. |
One app failing doesn't stop the others. If pagination breaks halfway, the rows already collected
are kept and the diagnostic carries partial: true.
Billing
$0.09 per 1,000 reviews, plus $0.001 per run start. So 1,000 reviews is $0.091 all-in.
Rows are written in page-sized batches and only charged after the batch is safely saved. These are never charged: the empty-input sample row, every diagnostic, duplicate reviews, and reviews your star or date filter threw out. A run that finds nothing costs the start fee.
Direct requests are the default, so there's no proxy line on your bill unless you turn one on. Residential bandwidth is billed to you by Apify on top of the review fee and can easily exceed it on a small run, so keep it as a fallback for genuinely blocked high-volume work rather than a default.
Proxy guidance
Google Play usually answers fine without one. If a big run starts returning RATE_LIMITED or
BLOCKED: lower requestsPerSecond first, then wait for the block to clear, and only then enable a
proxy. Note that country is what selects the storefront; a proxy only matters when you need strict
geolocation on top of that.
Data source
Parsing and pagination sit on the @mradex77/google-play-scraper package, pinned to an exact
version rather than a range, so an upstream release can't change your output without a rebuild here.
Not affiliated with Google. Public data, used at your own responsibility under Google's terms and your local rules.