Google Play Reviews Scraper avatar

Google Play Reviews Scraper

Pricing

$0.08 / 1,000 reviews

Go to Apify Store
Google Play Reviews Scraper

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

apihq

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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: true review 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: false record with a machine-readable code (NO_REVIEWS, VALIDATION_FAILED, PLAY_REVIEWS_TIMEOUT, DEADLINE_EXCEEDED). Branch on code without 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:

FieldTypeWhat it is
successbooleantrue for a review (billed), false for an app that returned nothing (not billed).
review_idstringGoogle Play's unique review ID.
app_idstringThe app package name the review belongs to.
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 + rating 1-5), when Google Play attaches them.
urlstringPermalink 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 different country and language. One run is one locale.
  • Developer replies and feature ratings are only present when Google attaches them. Most reviews have no developer reply; reply_text is 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

  1. Open the Actor in the Apify Console.
  2. Set appId (single) or appIds (a list). Each accepts a package name (for example com.instagram.android) or a Play Store URL. Up to 50 unique apps run per job.
  3. Set maxReviews to cap how many reviews to return per app, sort to newest, rating, or relevance, and optionally country / language for the review locale.
  4. Click Start. Each review is one success: true record. Apps that cannot be listed produce one success: false record 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.