Google Play Reviews Scraper
Pricing
$0.08 / 1,000 reviews
Google Play Reviews Scraper
Scrape Google Play Store reviews to JSON by app package name or URL. No Google Play account. One record per review with rating, text, author, developer reply, thumbs-up, app version, and date. Apps with no reviews cost $0. $0.08 per 1,000 reviews.
Pricing
$0.08 / 1,000 reviews
Rating
0.0
(0)
Developer
apihq
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Export a Google Play app's user reviews as clean JSON from a package name or a Play Store URL. No Google Play account, no Play Console, no browser.
The contract is simple: an app with no reviews never fails your run, and you only pay for reviews delivered. Scrape a batch of apps, sort by newest or rating, and get one row per review with the rating, text, author, developer reply, and date. Pay-per-review at $0.08 per 1,000 reviews. Apps that return nothing cost $0.
See one run
Input:
{"appIds": ["com.spotify.music", "com.duolingo"],"sort": "newest","maxReviews": 50,"country": "us","language": "en"}
What comes back:
- Up to 50
success: truereview rows per app, billed: the newest US English reviews for Spotify and Duolingo - Each row carries the rating, review text, author, thumbs-up count, app version, developer reply (when present), and date
- Run status: SUCCEEDED
- Charged: up to 100 reviews = $0.008
appId alone works too. Every knob above is optional: sort (newest, rating, or relevance), maxReviews (how many reviews per app), and country / language (the review locale, default us / en). An app with no reviews is a free success: false row, so one bad package never blocks the batch.
Why this Actor
- No Google Play account, no Play Console. Play Console only shows reviews for apps you own. This Actor reads any public app's reviews directly by package name, so there is no account to connect and no console access to arrange, just structured JSON out.
- You pay only for reviews. Billing fires on an explicit per-review event, not on dataset writes, so an app that returns nothing sits in your dataset for free. There is no per-run start fee, so an empty run costs zero.
- A bad package never breaks the batch. An unrecognizable package, a Play Store URL with no app, or an app with no reviews returns a
success: falserecord with a machine-readablecode(NO_REVIEWS,VALIDATION_FAILED,PLAY_REVIEWS_TIMEOUT,DEADLINE_EXCEEDED). Branch oncodewithout parsing English.
Best for
Data and AI workflows that turn app reviews into text: sentiment and brand-safety analysis, competitor and market research, release-quality monitoring across app versions, and building review datasets for LLM pipelines. The failure-free billing and machine-readable error rows matter most when the extraction runs unattended inside a larger pipeline, where one bad package should never take down the batch. It works fine for one-off manual pulls too.
Input example
A single app, top-rated reviews:
{"appId": "com.instagram.android","maxReviews": 200,"sort": "rating"}
A batch of apps, newest first, one locale:
{"appIds": ["com.spotify.music","https://play.google.com/store/apps/details?id=com.duolingo","com.whatsapp"],"maxReviews": 500,"sort": "newest","country": "us","language": "en"}
appId and appIds are merged and de-duplicated (a package name and its Play Store URL count as the same app). Up to 50 unique apps run per job. Each app is walked page by page until it reaches maxReviews or the app runs out of reviews. sort, country, and language apply to every app in the run.
Output example
One record per review. The app's package is copied onto every row so each row stands alone:
{"success": true,"review_id": "41a06364-b9f1-42d5-8b06-1b6682321902","app_id": "com.spotify.music","user_name": "Mark Ogden","score": 5,"text": "Update - Really enjoying Spotify, seems more stable, audio books are a big plus.","thumbs_up": 1090,"posted_at": "2025-02-19T07:49:57.000Z","app_version": "9.0.18.604","reply_text": "Hey! We're sorry to hear this. We're open to feedback...","reply_posted_at": "2023-11-17T00:38:44.000Z","criteria": [{ "feature": "vaf_phase1_dj_feature", "rating": 3 }],"url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=41a06364-b9f1-42d5-8b06-1b6682321902"}
An app that cannot be found lands in the same dataset and is not charged:
{"success": false,"app_id": "com.example.does.not.exist","code": "NO_REVIEWS","error": "Google Play returned no reviews for app: com.example.does.not.exist","request_id": "req_911f37d2e55644ff9d9e4a3f","status_code": 404}
Split hits from misses on the success field. Quote request_id in any support issue and we can trace the exact request.
What you get
Every review is one record with success: true:
| Field | Type | What it is |
|---|---|---|
success | boolean | true for a review (billed), false for an app that returned nothing (not billed). |
review_id | string | Google Play's unique review ID. |
app_id | string | The app package name the review belongs to. |
user_name | string | Reviewer display name. |
user_image | string | Reviewer avatar URL. May be absent. |
score | integer | Star rating, 1 to 5. |
text | string | The review body. May be empty (Google Play allows a rating with no text). |
thumbs_up | integer | Number of users who marked the review helpful. |
posted_at | string | ISO 8601 UTC timestamp the review was posted. |
app_version | string | App version the review was written against. Absent when not exposed. |
reply_text | string | The developer's reply body. Absent when there is no reply. |
reply_posted_at | string | ISO 8601 UTC timestamp of the developer reply. Absent when there is no reply. |
criteria | array | Feature-specific ratings (feature name + rating 1-5), when Google Play attaches them. |
url | string | Permalink to the review on Google Play. |
Apps that could not be listed carry success: false, app_id, a machine-readable code, a human-readable error, the service request_id, and the HTTP status_code. They are not charged.
Pricing
Pay-per-review. One charge per review delivered: $0.00008 each, which is $0.08 per 1,000 reviews. The charge fires only after a review row lands in your dataset.
- 1,000 delivered reviews cost $0.08.
- A run that hits only empty or nonexistent apps costs $0.
- There is no per-run start fee, so an empty run is genuinely free.
Apify subscriber discounts apply automatically: roughly $0.064 per 1,000 on the Scale plan and $0.048 per 1,000 on Business. Platform compute is included in the per-review price. Cap the maximum spend of a single run from Apify's Run Limits panel; the Actor honors the cap and stops cleanly mid-app when the budget runs out.
What this Actor does not do
Honest scope, so you know before you run it:
- Reviews are localized. Google Play serves reviews for one country and language per run (defaults
us/en). To cover another market, run the app again with a differentcountryandlanguage. One run is one locale. - Developer replies and feature ratings are only present when Google attaches them. Most reviews have no developer reply;
reply_textis simply absent on those rows, not an error. - It reads reviews, not store metadata. Ratings histograms, install counts, screenshots, and the app's overall score are out of scope; this Actor returns the individual review records.
- Public reviews only. It returns what a signed-out visitor sees on the Play Store listing.
How to use this Actor
- Open the Actor in the Apify Console.
- Set
appId(single) orappIds(a list). Each accepts a package name (for examplecom.instagram.android) or a Play Store URL. Up to 50 unique apps run per job. - Set
maxReviewsto cap how many reviews to return per app,sorttonewest,rating, orrelevance, and optionallycountry/languagefor the review locale. - Click Start. Each review is one
success: truerecord. Apps that cannot be listed produce onesuccess: falserecord and do not stop the run. Only reviews are charged.
The Actor is also callable from the Apify API and every official integration (Make, Zapier, n8n, Slack, webhooks). The API tab in the Console has ready-to-paste JavaScript, Python, and curl snippets.
Reliability
A bad app never fails the batch. A mistyped package, a Play Store URL with no app, or an app with no reviews becomes a success: false record with a specific code. The run keeps going and finishes successfully.
You never pay for a miss. Billing fires on an explicit per-review charge event, not on dataset writes, so success: false records are free. There is no per-run start fee either.
Hard 30-second deadline per page request. Each page of reviews is fetched under a 30-second deadline. If Google Play or the proxy network stalls, that app returns a 504 with code: DEADLINE_EXCEEDED as a success: false record instead of hanging your run.
FAQ
Do I need a Google account or Play Console access?
No. The Actor reads public Play Store reviews directly by package name. Play Console only exposes reviews for apps you own; this works for any public app.
How do I point it at an app?
Use the package name (com.instagram.android) or a Play Store URL (https://play.google.com/store/apps/details?id=com.instagram.android). Both resolve to the same app. An unrecognizable value comes back as a success: false record with code: VALIDATION_FAILED, not a rejected run.
How many reviews can I get per app?
As many as the app has, capped by maxReviews. The Actor walks review pages in order until it hits your cap or the app runs out. Popular apps have far more reviews than niche ones, so a very high maxReviews on a small app returns fewer.
Can I get reviews in other languages or countries?
Yes. Set country (for example gb, de) and language (for example de, pt-BR). Google Play returns reviews for that locale. One run covers one locale; run the app again per market for wider coverage.
What if an app has no reviews?
It comes back as a success: false record with code: NO_REVIEWS. You are not charged.
Can I use this Actor from my own code?
Yes. Use the Apify API or one of the official SDKs (Node.js: apify-client, Python: apify-client). The Console shows ready-to-paste code samples on the API tab.
How does billing know an app returned nothing?
Billing fires on an explicit per-review charge event, not on dataset writes. The Actor only fires it when a review is delivered, so success: false records sit in your dataset for free. You get every result in one place and still branch on success and code, with a request_id for support correlation.
Found a bug or want a feature?
Open an issue on this Actor's Issues tab and include the request_id from any error record you saw. We respond within one business day.