Google Play Reviews Scraper: App Reviews, Ratings & Replies avatar

Google Play Reviews Scraper: App Reviews, Ratings & Replies

Pricing

from $0.09 / 1,000 review scrapeds

Go to Apify Store
Google Play Reviews Scraper: App Reviews, Ratings & Replies

Google Play Reviews Scraper: App Reviews, Ratings & Replies

Scrape Google Play app reviews by package name or store URL: reviewer, star rating, full text, date, app version, thumbs-up count, per-aspect ratings and the developer's reply. Sort three ways, filter by stars, language, country and date. No API key, no proxies, no browser.

Pricing

from $0.09 / 1,000 review scrapeds

Rating

0.0

(0)

Developer

Arman Hossain

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

Google Play Reviews: Every review as a clean row, stars, text, app version, helpful votes and the developer's reply

Google Play Reviews Scraper reads the user reviews of any Google Play app and returns one clean row per review: reviewer, star rating, full text, exact timestamp, app version, helpful-vote count, per-aspect ratings and the developer's reply with its own timestamp.

Point it at a package name or paste a store URL. Sort three ways, keep only chosen star ratings, read any language edition and storefront, and window by date. Every row carries reviewId, the review's stable identifier, so results join across runs and diff cleanly. No API key, no billing account, no proxy setup and no browser.

Agent skill: SKILL.md

https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/google-play-reviews-scraper.md

What you get

Output fieldMeaning
appIdThe app's package name, e.g. com.spotify.music
reviewIdThe review's stable identifier. Use it as your join and diff key
urlA store link straight to this review
userNameReviewer's display name
userImageReviewer's avatar URL
ratingStars, 1–5, always a whole number
textThe full review text. null for rating-only reviews
dateWhen it was written, ISO 8601 with millisecond precision
appVersionThe app version the review was written against, where the store records it
thumbsUpHow many people marked the review helpful
replyText, replyDateThe developer's public reply and when it was posted, or null
criteriaPer-aspect ratings where the store collects them (ad frequency, battery use and similar), as name and rating pairs
language, countryThe language edition and storefront the run read
sortWhich sort order produced the row
positionThe row's rank within its app for this run
scrapedAtRun timestamp

A RUN_SUMMARY record in the key-value store holds per-app counts: pages read, reviews fetched, saved, duplicates collapsed, rows outside the date range, whether the app ran out of reviews or hit your cap, and any field that failed its shape check.

Input

FieldTypeDefaultNotes
appIdsarrayrequiredPackage names (com.spotify.music), store URLs, or market:// links, in any mix. Each app is read independently
sortstringnewestnewest, mostRelevant (the store's own default view), or rating (highest first)
starRatingsarrayallKeep only these ratings, e.g. ["1", "2"] for complaints. Filtered at the source, so a 1-star pull does not page through 5-star reviews to find them
maxReviewsPerAppinteger200Cap per app, and the main cost control since charging is per review. Popular apps carry millions
languagestringenThe store's language code: en, de, ja, pt-BR. Selects the store's language grouping of reviews
countrystringusTwo-letter storefront code. The review pool shifts with it
dateFromstringOldest review to keep: 2026-01-15, or relative 30 days, 36 hours. With sort: "newest" the run stops paging at the boundary
dateTostringNewest review to keep, same formats. Ignored unless dateFrom is set
{
"appIds": ["com.headway.books"],
"sort": "newest",
"starRatings": ["1", "2"],
"maxReviewsPerApp": 500,
"dateFrom": "30 days"
}

Output

One record per review. Every field is present on every record; null means the store has nothing there, never that it was skipped.

{
"appId": "com.headway.books",
"reviewId": "b2c0180e-16f5-4384-8ee9-c6e8d36eb5dd",
"url": "https://play.google.com/store/apps/details?id=com.headway.books&reviewId=b2c0180e-16f5-4384-8ee9-c6e8d36eb5dd",
"userName": "Rakesh",
"userImage": "https://play-lh.googleusercontent.com/a-/ALV-UjUteCu2Qkv-bX4YLgMqx1pqn7OIjos_X_SUgZHUj3cDhA5CeXs7",
"rating": 1,
"text": "too many ads and asking premium for every thing",
"date": "2026-08-06T02:40:06.701Z",
"appVersion": null,
"thumbsUp": 0,
"replyText": "Hi! Thanks for being direct. Please, send a few details to support+appstore@get-headway.com from the email linked to your Headway account — it reaches our support team on priority. Specific feedback is what we can actually act on.",
"replyDate": "2026-08-06T11:06:05.208Z",
"criteria": [{ "name": "vaf_app_quality_ads_frequency", "rating": 1 }],
"language": "en",
"country": "us",
"sort": "newest",
"position": 12,
"scrapedAt": "2026-08-09T14:02:11.000Z"
}

Use cases

  • Complaint monitoring. starRatings: ["1", "2"] with dateFrom: "7 days" on a schedule is a weekly digest of what is going wrong, with the app version attached to each report.
  • Release quality tracking. Filter rows by appVersion to see whether the update that shipped on Tuesday is the reason ratings moved on Wednesday.
  • Competitor research. Read the most helpful reviews of the apps in your category: sort: "mostRelevant" returns the reviews users actually see and upvote.
  • Support quality auditing. replyText and replyDate show which complaints a developer answers and how fast, yours or a competitor's.
  • Review corpora for analysis. Tens of thousands of dated, versioned, star-labelled texts per app, in any of the store's languages, for sentiment and topic work.

Limits and behaviour

  • reviewId is the stable identity of a review. Diff runs on it. position is this run's ordering, and the store reshuffles its rankings continuously.
  • Reviews arrive edited. When a user updates their review, the store shows only the latest version, under the same reviewId with a new date. A schedule catches the history that a single pull cannot.
  • The language setting selects an edition, not a detection. language: "en" returns the store's English-edition review stream; a reviewer whose device is set to English but who wrote in another language still appears in it.
  • A date range is cheap only with the newest sort. That is the one order where the run can stop at the boundary. The other sorts apply the same filter exactly, but read on to the cap to apply it.
  • appVersion is missing on roughly a third of rows. Rating-only reviews and reviews from before the store recorded versions carry null. Filter on it rather than expecting it.
  • Star-filtered pulls are fetched directly, not sifted client-side, so they cost what they return. The per-app cap applies to the app as a whole, not per star.
  • A typo'd package name fails loudly. It is named in the log and RUN_SUMMARY.failures as not found; an app with genuinely no reviews returns zero rows and a clean exit instead.
  • Public data only. What the store shows every visitor, and nothing that gets around access controls.

FAQ

Do I need a Google account or API key? No. You supply no credentials.

Why did I get fewer reviews than maxReviewsPerApp? The app ran out of matching reviews. Check perApp in RUN_SUMMARY: exhausted: true means the store had no more; ceilingHit: true means there were more and the cap stopped the run.

Can I get all reviews of a big app? Up to 100,000 per app per run — raise maxReviewsPerApp and expect volume: the run pages steadily and charging is per review saved. Apps with more reviews than that are better pulled in shaped slices: one run per star rating, or date windows over dateFrom/dateTo, each slice with its own 100,000 ceiling.

How do I read reviews in another language? Set language (and usually country to match): language: "de", country: "de" returns the German-edition stream. Runs are per edition; two languages are two runs.

What are the criteria names? The store's own per-aspect rating tags, such as ad frequency or battery use, exactly as it records them. Coverage varies by app and review; most rows carry an empty list.

Does it return the app's overall star average? No — this Actor returns the reviews themselves. The overall rating belongs to an app-details scraper.

Can I plug it into something else? Yes. Apify API, the client libraries, webhooks, scheduled runs, dataset exports to JSON, CSV or Excel, or MCP. The output is structured JSON.

API example

curl -X POST "https://api.apify.com/v2/acts/arman-bd~google-play-reviews-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"appIds": ["com.duolingo"],
"sort": "newest",
"maxReviewsPerApp": 200
}'

JavaScript example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('arman-bd/google-play-reviews-scraper').call({
appIds: ['com.duolingo', 'com.babbel.mobile.android.en'],
starRatings: ['1', '2'],
dateFrom: '30 days',
maxReviewsPerApp: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`${items.length} reviews`);