Google Play Reviews Scraper
Pricing
from $7.00 / 1,000 review scrapeds
Google Play Reviews Scraper
Scrape Google Play reviews at scale with features competitors don't offer. Perfect for sentiment analysis, competitor research, and automation workflows.
Pricing
from $7.00 / 1,000 review scrapeds
Rating
5.0
(1)
Developer
WebDataLabs
Maintained by CommunityActor stats
1
Bookmarked
163
Total users
14
Monthly active users
6 days ago
Last modified
Categories
Share
Paste one or more Google Play app URLs, get their reviews as clean, flat rows.
What you get
One row per review, 14 fields, ready for a spreadsheet, a database, or an n8n/Zapier/Make step:
| Field | Type | Description |
|---|---|---|
reviewId | string | Unique Google Play review ID. Stable across runs - use it as your primary key. |
appId | string | Package ID of the app the review belongs to |
rating | integer | Star rating, 1-5 |
text | string | null | Review body. null when the user left stars but wrote nothing. |
userName | string | null | Reviewer display name |
userImage | string | null | Reviewer avatar URL |
reviewDate | string | null | When it was posted, ISO 8601 UTC |
thumbsUp | integer | null | How many people marked the review helpful (often 0) |
version | string | null | App version the reviewer was running |
replyText | string | null | The developer's public reply, null if there is none |
replyDate | string | null | When the developer replied, ISO 8601 UTC |
url | string | null | Direct link to the review on Google Play |
criteriaRatings | array | null | Structured tags Google attaches to some reviews (mostly games) |
scrapedAt | string | When this run fetched the review, ISO 8601 UTC |
Fields Google does not provide come back as null. They are never filled with "",
"Anonymous", 0, or today's date. An empty cell means Google had nothing, not that the scraper
guessed.
How often each optional field is actually filled
Measured on real runs, not estimated. Fill rates depend entirely on the app:
| Field | Minecraft (3,816 reviews) | Spotify (300) | Duolingo (80) |
|---|---|---|---|
text, userName, userImage, reviewDate, url, thumbsUp | 100% | 100% | 100% |
version | 74.7% | 84.3% | 95.0% |
criteriaRatings (non-empty) | 23.5% | 30.7% | 8.8% |
thumbsUp greater than 0 | 33.8% | 4.7% | 1.3% |
replyText / replyDate | 0% | 9.0% | 0% |
replyText is 0% for developers who do not reply publicly. That is a real finding about the app,
not a scraper failure.
Example row
{"reviewId": "b12666f2-b2b9-4fa7-b02a-e40271faabeb","appId": "com.mojang.minecraftpe","rating": 5,"text": "this pal is the best game ever bro","userName": "Steven Oliver","userImage": "https://play-lh.googleusercontent.com/a-/ALV-UjXg-IEmSRVgQhI6IghHASxYMh7VxeM","reviewDate": "2026-08-09T14:05:35.853Z","thumbsUp": 0,"version": "1.26.40.5","replyText": null,"replyDate": null,"url": "https://play.google.com/store/apps/details?id=com.mojang.minecraftpe&reviewId=b12666f2-b2b9-4fa7-b02a-e40271faabeb","criteriaRatings": [{ "criteria": "vaf_app_quality_battery_efficiency", "rating": 1 },{ "criteria": "vaf_app_quality_performance", "rating": 3 }],"scrapedAt": "2026-08-10T14:13:51.162Z"}
Input
Six settings, one of them required.
| Setting | Type | Default | Description |
|---|---|---|---|
Google Play App URLs (startUrls) | array | - | Required. Full https://play.google.com/store/apps/details?id=... URLs, one per app. Bare package IDs are rejected by Apify's URL validation, so paste the whole URL. |
Max Reviews (maxReviews) | integer | 100 | Reviews to keep per app, 1-100,000 |
Sort By (sortBy) | select | Most Recent | NEWEST, RATING (highest first) or HELPFULNESS |
Rating Filter (rating) | select | All reviews | ALL, NEGATIVE (1-2 stars only) or POSITIVE (4-5 stars only) |
Language (language) | string | en | Two-letter language code. Google returns reviews written in that language. |
Proxy Configuration (proxyConfiguration) | object | Apify Proxy | Present for compatibility. It currently has no effect - requests go out directly from the Apify platform, which Google Play accepts without a proxy. |
{"startUrls": [{ "url": "https://play.google.com/store/apps/details?id=com.duolingo" },{ "url": "https://play.google.com/store/apps/details?id=com.spotify.music" }],"maxReviews": 500,"sortBy": "NEWEST","rating": "NEGATIVE"}
Two things the input does not do
- Country is fixed to the US storefront. There is no country setting; reviews are always read
from
country=us.languagestill works and changes which reviews Google returns. Rating Filteris applied after fetching. Google has no server-side star filter here, so asking for 500 negative reviews reads several thousand reviews to find them. It costs you nothing extra - you are only billed for the rows you receive - but it takes longer.
How many reviews can you actually get?
Short answer: as many as you ask for, up to your run's cost limit.
- Google serves reviews 150 at a time. The actor pages through them until it has what you asked for or Google runs out.
- Verified on 2026-08-10: a single run against
com.mojang.minecraftperequesting 30,000 reviews read 200 consecutive full pages - 30,000 reviews, zero short pages, in about 2 minutes. Google did not cut pagination off. Older versions of this actor stopped at 15,000; that limit is gone. - The real ceiling for most runs is Apify's Maximum cost per run budget, not Google. When the run reaches it the actor stops, says so in the log, and reports how many reviews it actually delivered. Raise the limit in the run options if you need more in one go.
If a run stops early you will see the reason in the log: max-reviews-reached, no-more-pages,
page-budget-exhausted, or the charge-limit message. It is never silent.
When the run fails
This actor is designed to fail loudly rather than return an empty dataset and call it a success.
- App ID does not resolve - reported per app by name, with the storefront and language it was looked up under. The other apps in the run continue.
- All requested apps failed - the run fails with a message listing every app ID and why. It does not exit green with zero rows.
- Some apps worked, some did not - the run succeeds, delivers the data it got, and prints a
Partial successsummary naming the failures. - App exists but no review matched your rating filter - this succeeds with zero rows for that app. That is a real answer, and it is reported differently from "app not found".
A per-app breakdown (status, reviews read, reviews delivered, pages fetched, stop reason) is saved
to the key-value store record STATS on every run.
Pricing
Pay-per-event. Two events:
| Event | Free | Bronze | Silver | Gold+ |
|---|---|---|---|---|
| Review scraped (per review row delivered) | $0.010 | $0.009 | $0.008 | $0.007 |
| Actor start (per GB of run memory, once per run) | $0.004 | $0.003 | $0.002 | $0.001 |
So 1,000 reviews on the Bronze tier is about $9.00 plus the start event. You are charged per review row that reaches your dataset - rows that could not be delivered are not billed. The Console shows your exact tier price before you run.
Limitations, stated plainly
- US storefront only.
- Sub-ratings (
criteriaRatings) use Google's own undocumented tag IDs. The numbers in them are small integers (1, 2, 3 observed), not star scores, and Google does not publish what they mean. - No incremental / "only new reviews since last run" mode. Every run fetches from the top of the
sort order. De-duplicate on
reviewIdif you run on a schedule. - No webhook delivery from inside the actor. Use Apify's own webhooks or an integration on the run.
- Google does not expose a review title, so there is no
titlefield.
FAQ
Where do I get the app URL? Open the app on play.google.com and copy the address bar. It looks
like https://play.google.com/store/apps/details?id=com.duolingo.
Can I scrape several apps at once? Yes. Add one URL per app; maxReviews applies to each app
separately.
How do I get only 1-2 star reviews? Set Rating Filter to "Negative only". If you also set Sort By to "Highest Rating" the actor switches you to "Most Recent" and says so, because sorting by rating puts the negative reviews last.
Why is text null on some rows? Google Play lets people rate an app without writing anything.
Those reviews are real and are included, with text: null.
How do I export to CSV? Dataset tab -> Export -> CSV.
Run it from the API
curl -X POST "https://api.apify.com/v2/acts/webdatalabs~google-play-reviews-scraper/runs" \-H "Content-Type: application/json" \-H "Authorization: Bearer YOUR_API_TOKEN" \-d '{"startUrls": [{ "url": "https://play.google.com/store/apps/details?id=com.duolingo" }],"maxReviews": 500,"sortBy": "NEWEST"}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('webdatalabs/google-play-reviews-scraper').call({startUrls: [{ url: 'https://play.google.com/store/apps/details?id=com.duolingo' }],maxReviews: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Explore more of our actors
| Actor | Description |
|---|---|
| Shopify Scraper Pro | Extract complete Shopify product data with variants and sales estimates |
| Etsy Scraper Pro | Fast Etsy product scraper with ratings, reviews, and shop data |
| Amazon Reviews Scraper | Extract Amazon customer reviews for sentiment analysis |
The full catalogue is at apify.com/webdatalabs.
Need this data as a managed feed?
If you would rather receive this data on a schedule than run the Actor yourself, we can build and operate the feed: the fields you specify, the cadence you set, delivered to a dataset, S3, a webhook, or your database. Every scheduled run is checked against an agreed shape rather than assumed to be fine, missing values are reported as null instead of filled with placeholders, and repairing the collector when the source changes is covered by the monthly rate. Priced as a one-time setup fee plus a monthly rate, scoped in writing before anything is built.
Contact: support@webdatalabs.net
Leave a review
Is this actor saving you time? A quick review on the Store helps other people find it — and tells us which fields to add next. Rate this actor →
Legal Disclaimer
This actor is a general-purpose tool for analyzing publicly accessible web data. The user bears sole responsibility for ensuring their specific use complies with:
- Applicable laws (GDPR/DSGVO, copyright law)
- The target website's Terms of Service
- Apify's Terms of Service
The provider (webdatalabs) expressly disclaims liability for any unauthorized or unlawful use. By using this actor, the user agrees to indemnify the provider against any third-party claims arising from their use of the data.
This tool is not affiliated with Google. All trademarks belong to their respective owners.