apihq/google-play-reviews-scraper · Google Play

Google Play Reviews Scraper

Export a Google Play app's reviews to JSON from a package name or store URL. One record per review with rating, text, author, developer reply, and date.

$0.00008/review · failed items $0.0000 — on your existing Apify account, a one-item first run costs under a cent.

What does Google Play Reviews Scraper do?

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.

Best for

Use it for sentiment analysis, competitor and market research, release-quality monitoring across app versions, and building review datasets for LLM pipelines. The billing matters most when the job runs unattended and one bad package must not take down the batch.

Use something else when

Reviews are localized. Google Play serves one country and language per run (defaults us / en). To cover another market, run the app again with a different country and language.

Price
$0.08 per 1,000 reviews · failed items $0
Usage on Apify
23,500+ reviews delivered

Example run

input
{ "appIds": ["com.spotify.music", "com.duolingo"], "sort": "newest", "maxReviews": 50 }

outcome

  • Up to 50 success: true review rows per app, newest first — billed
  • An app with no reviews returns success: false, code: NO_REVIEWS — not billed
  • Run status: SUCCEEDED
  • Charged: up to 100 reviews = $0.008

Good input returns billed rows. Bad input returns free error rows in the same dataset, and the run still succeeds.


Why pipelines pick it

No Google Play account, no Play Console

Play Console only shows reviews for apps you own. This actor reads any public app's reviews from a plain package name or Play Store URL.

You pay only for reviews

The charge fires per review delivered, not per dataset write. There is no start fee, so a run that returns nothing costs $0.

A bad package never breaks the batch

An unrecognizable package or an app with no reviews returns a success:false row with a machine-readable code. The rest of the batch keeps going.

Hard 30-second deadline per page

If Google Play or the proxy network stalls, the actor writes an unbilled success: false row with code DEADLINE_EXCEEDED (status_code 504) and continues the batch.

Best for: Use it for sentiment analysis, competitor and market research, release-quality monitoring across app versions, and building review datasets for LLM pipelines. The billing matters most when the job runs unattended and one bad package must not take down the batch.


Input & output

input example
{
  "appIds": [
    "com.spotify.music",
    "https://play.google.com/store/apps/details?id=com.duolingo",
    "com.whatsapp"
  ],
  "maxReviews": 500,
  "sort": "newest",
  "country": "us",
  "language": "en"
}
output — success (billed)
{
  "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"
}
output — failure (free, same dataset)
{
  "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
}

Branch on the success field to split hits from misses. Quote the request_id in any support issue and we can trace the exact request.

output fields

fieldtypewhat it is
successbooleantrue for a review (billed), false for an app that returned nothing (free).
review_idstringGoogle Play's unique review ID.
app_idstringThe app package name the review belongs to. Copied onto every row so each row stands alone.
user_namestringReviewer display name.
user_imagestringReviewer avatar URL. May be absent.
scoreintegerStar rating, 1 to 5.
textstringThe review body. May be empty; Google Play allows a rating with no text.
thumbs_upintegerNumber of users who marked the review helpful.
posted_atstringISO 8601 UTC timestamp the review was posted.
app_versionstringApp version the review was written against. Absent when not exposed.
reply_textstringThe developer's reply body. Absent when there is no reply.
reply_posted_atstringISO 8601 UTC timestamp of the developer reply. Absent when there is no reply.
criteriaarrayFeature-specific ratings (feature name plus rating 1-5), when Google Play attaches them.
urlstringPermalink to the review on Google Play.

Error codes, stable across releases

Every failure record carries one of these machine-readable codes. None of them are ever charged.

codebilledmeaning
NO_REVIEWS$0.0000The app has no reviews in the requested locale, or the app does not exist.
VALIDATION_FAILED$0.0000The input was not a recognizable package name or Play Store URL.
PLAY_REVIEWS_TIMEOUT$0.0000Listing the app's reviews timed out.
DEADLINE_EXCEEDED$0.0000The 30-second per-page deadline was hit. Returned as an unbilled row with status_code 504.

Every error code across the eight APIs, in one reference →


What a run costs

per review$0.00008
per 1,000 reviews$0.08
per failed item$0.0000
per-run start fee$0.0000

The charge fires only when a result is delivered, and platform compute is included in the per-result price. To cap the spend of a run, set a limit in Apify's Run Limits panel. The actor stops at the cap and reports how far it got.

How pay-per-result billing works →


What this actor doesn't do

  • Reviews are localized. Google Play serves one country and language per run (defaults us / en). To cover another market, run the app again with a different country and language.
  • Developer replies and feature ratings are only present when Google attaches them. Most reviews have no reply; reply_text is simply absent on those rows.
  • It reads reviews, not store metadata. Ratings histograms, install counts, screenshots, and the app's overall score are out of scope.
  • It reads public reviews only, the same set a signed-out visitor sees on the Play Store listing.

Frequently asked questions

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. Both resolve to the same app. An unrecognizable value comes back as success:false 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.
Can I get reviews in other languages or countries?
Yes. Set country (gb, de) and language (de, pt-BR). 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.
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.

Guides for this API


Automation templates


Pairs with

Run it on the Apify account you already have

Paste one input into the actor's console and check the dataset it returns. A one-item first run costs under a cent — no new subscription, pay only for delivered results.

Get an app's reviews