Google Play Reviews Scraper

Every review
of an app, as rows.

Give it an app ID or a Play Store link and get the reviews back as a table - the text, the star rating, the date, the likes, the app version the reviewer was on, and the developer's reply where one exists. Ten columns, one row per review.

one-time 500 free rows$0.002 per row afterup to 1,000 apps per runCSV · JSON · Excel
Read this first

Built for the second run,
not just the first.

Most review exports are a one-off snapshot. The thing that makes this one useful is what happens when you run it again next month.

Every row carries a review_id. Across our 842 rows there were 559 distinct ones - and not a single run contained a duplicate of its own. The repeats were all between runs, which is exactly what you would expect when you pull the same app twice. That gives you a clean key: union the exports, drop rows whose review_id you already hold, and what remains is genuinely new.

The reference also documents a cutoff parameter that takes an oldest-timestamp, so you can ask for nothing older than your last pull rather than fetching everything and discarding most of it. Between that and the id, a monthly pull stays cheap however large the review history gets - and it does get large: our sample reaches back to August 2016.

One structural difference from the other scrapers on this site is worth flagging. There is no query column here. The submitted app is echoed as app_id instead, so if you batch several apps in one run, that is the column you group on.

livescraper.app · scope
One row per review, ten columns
review_id is stable and dedupable
cutoff limits a pull to what is new
Up to 1,000 apps in a single run
No query column - group on app_id!
A review history you can keep current.
How it works

An app ID in,
its reviews out.

Four settings, and two of them are what keep a recurring pull small.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the Google Play Reviews Scraper.
  3. STEP 3Paste app IDs or Play Store links - up to 1,000 per run.
  4. STEP 4Set how many reviews per app to return.
  5. STEP 5Choose a sort - most relevant, newest, or by rating.
  6. STEP 6Pick your format and click Get Data.

Filtering to a single star rating works only when the sort is set to rating.

Data dictionary

Ten columns,
measured, not assumed.

This is the export header in sheet order, identical across all 11 runs. The fill rates are counted over the 842 rows those runs returned, covering 559 distinct reviews across three apps.

app_id
The app the review belongs to, e.g. com.facebook.katana. Present on all 842. This is what identifies the input - there is no query column on this service.
author
The reviewer's display name. Present on all 842, with 451 distinct values.
author_image
The reviewer's avatar. Present on all 842, always https:// and always on Google's user-content host.
rating
The star rating as a whole number from 1 to 5. Present on all 842 - never a decimal, never out of range.
date
The review date as a plain ISO date, e.g. 2025-03-08. Present on all 842 and matched YYYY-MM-DD in every one. Ours spanned nearly ten years.
review
The review text as written. Any script - our sample includes non-Latin text - and no line breaks in any row.
likes
How many people marked the review helpful. A whole number on all 842, from 0 to over 370,000.
app_version
The build the reviewer was running, e.g. 8.116.0.213. Present on 702 of 842 - but see the note below, because coverage varies a lot by app.
reply
The developer's public response. Present on just 15 of our 842 rows. Treat it as rare rather than optional.
review_id
A stable identifier for the review. 559 distinct across our 842 rows, with no run repeating one internally. This is the column to deduplicate on.

Eight of the ten columns were present on every single row. Only app_version and reply vary, and both do so in ways worth understanding before you build - the note below covers them. Worth knowing about ordering too: the spreadsheet puts review_id last, while the JSON export puts it second. Same ten columns either way, so read by name rather than by position.

Before you build

Four things
an importer should know.

All four come from reading the 842 rows rather than the reference, and each one changes how you would write the job.

review_id is your deduplication key

Our 842 rows held 559 distinct review_id values, and no individual run contained a duplicate of its own - every repeat was across runs, from pulling the same app more than once. So the id is stable between pulls and unique within one. Union your exports on it and you get a growing review history rather than a pile of near-identical files.

Replies are rare, so do not design around them

reply was populated on 15 of 842 rows - under two percent. Every one of those fifteen was on a one-star review, and all fifteen belonged to a single app; the other two apps in our sample had none at all. That is far too small a sample to call it a rule about how developers behave, but it is more than enough to say a reply-driven feature will be looking at an almost-empty column most of the time.

app_version coverage depends on the app

Overall it was present on 702 of 842 rows, which sounds comfortable until you split it by app: 90% on one, 84% on another, and 14% on the third. So a version-by-version quality breakdown is realistic for some apps and not for others, and the aggregate figure will not tell you which you are dealing with. Check the coverage on your own app before you build a chart on it.

Ratings are polarised, and averages hide it

Across our rows the split was 35% one-star, 11% two, 12% three, 7% four and 35% five - a U-shape, with the fewest reviews sitting in the middle. Whatever mean you compute from that describes almost nobody. The useful readings are the shape itself and the text behind each end of it, which is the reason to pull the reviews rather than the store's headline score.

Common workflows

Three jobs people
most often run here.

Where a full review history beats the summary on the store page.

Release quality

See which build the complaints belong to

Because app_version travels with the review, you can cut sentiment by build rather than by month. A rating dip stops being a mystery and becomes a specific release - and if the next version's reviews recover, you have your answer without instrumenting anything.

Product · Engineering
Competitive research

Read what users hate about the alternative

Competitor reviews are public and unusually candid. Pull the one-star text for a rival app and you get an unfiltered list of the things people cannot stand about it - which is both a roadmap and a supply of language for your own positioning.

Product · Marketing
Support and monitoring

Keep a running log, not a snapshot

Fix the app list, re-run on a schedule and deduplicate on review_id. What arrives each time is only what is new, so a spike in one-star volume is visible as it happens rather than at the end of a quarter when someone finally checks the store.

Support · Ops
Pricing

Pay only for the rows
you actually pull.

No subscription, no minimum, no per-seat licence. Your first 500 rows are on us - after that, pay-as-you-go.

Free tier

500 free rows - $0

Every new account, one-time. No credit card required. All scrapers unlocked. 500 rows is several apps' worth at a sensible per-app limit, which is enough to see the rating shape and check your own app's version coverage.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

Roughly $2 per 1,000 reviews. Recurring pulls are where this gets cheap: deduplicating on the review id and using the cutoff means a monthly refresh costs a fraction of the first run, however long the history is.

Most popular
Enterprise

Custom · continuous monitoring

Volume pricing, SLAs, dedicated workers and bespoke onboarding for teams watching a portfolio of apps on a fixed cadence. Tell us your numbers and we'll quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

An app has reviews
on more than one store.

Most products ship on both platforms, and the complaints rarely line up. These two cover the other side.

The legal bit

Is it legal to collect
app reviews?

Short answer: yes, with one thing to keep in mind - a review carries a display name, so treat it with a little more care than a price list.

Play Store reviews are public. Anyone can read them without an account, and collecting publicly visible information for research is long-established practice. As long as the data is publicly available and the process doesn't disrupt the site, there are no federal laws prohibiting it.

The part worth being deliberate about is that author and author_image describe a person, even if only by a display name they chose to publish. Under GDPR that is personal data, so the ordinary obligations apply: have a reason for holding it, keep it no longer than you need, and don't try to enrich it into a real identity. If your analysis is about the app rather than the reviewers - which it almost always is - dropping those two columns on import costs you nothing.

Google's terms restrict automated access, so this remains a terms question. We touch nothing behind a login, run no third-party trackers on the data layer, and your exports auto-delete after 30 days.

livescraper.app · principles
Public review pages only
Author name and avatar are personal data
No logins, no paywalls
GDPR-aligned by default
Exports auto-delete (30 days)
Drop the author columns if you don't need them.
Common questions

Things people
ask before signing up.

The questions we hear most. Anything else? Talk to us - humans, not bots, write the answers.

What columns will the export contain?+
Ten: app_id, author, author_image, rating, date, review, likes, app_version, reply and review_id. That is the export header, identical across 11 runs. Eight were present on every one of our 842 rows; only app_version and reply varied. The spreadsheet puts review_id last and the JSON puts it second, so read by name rather than position.
What do I submit - an app ID or a link?+
Either works. An app ID like com.facebook.katana or a full Play Store link to the same app both resolve, and you can mix them in one run of up to 1,000. The app is echoed back as app_id on every row, which is what you group on when you batch several.
Can I pull only new reviews on a repeat run?+
Yes, and it is the main reason to use this rather than a one-off scrape. Every row carries a review_id, and across our 842 rows no single run ever repeated one internally - the duplicates were all between runs. Deduplicate on it and you keep only what is new. There is also a cutoff setting that takes an oldest-timestamp, so you can avoid fetching the old history at all.
How far back do the reviews go?+
Further than most people expect. Our 842 rows ran from 2016-08-16 to 2026-07-10 - close to a decade of history for the apps we pulled. How deep any single run goes is governed by the per-app limit and the sort order you choose.
Do reviews come with the developer's reply?+
When one exists, but that is rarer than you might assume. reply was populated on 15 of our 842 rows - under two percent - and all fifteen happened to be on one-star reviews of a single app. Plan for the column to be empty most of the time.
Is the rating ever a decimal?+
No. It was a whole number from 1 to 5 in all 842 rows, with nothing out of range. Worth knowing that the distribution was strongly U-shaped - about 35% at one star and 35% at five, with only 7% at four - so an average across them describes very few actual reviewers.
How much does it cost?+
The first 500 rows on a new account are free and one-time; after that it's $0.002 per row - about $2 per 1,000 reviews - pay-as-you-go with no subscription. Credits don't expire and there's no monthly reset.

Read what users
actually said.

Submit your app IDs and get the reviews back as rows - text, rating, date, likes, version and reply. Your first 500 rows are free.

Google Play Reviews Scraper - an app's review history as structured rows

The Play Store shows you a star average and the reviews it decides are most relevant. Neither is much use for work: the average flattens a distribution that is usually anything but flat, and the reviews you are shown are a rotating handful chosen by someone else. The Google Play Reviews Scraper returns the underlying reviews as a table instead - one row per review, carrying the text as written, the star rating, the date, the helpful-vote count, the app version the reviewer was running, the developer's reply where one exists, and a stable id for the review itself. Submit app IDs or Play Store links, up to 1,000 in a run, choose how many reviews per app and how to sort them, and export as CSV, JSON or Excel.

The ten columns on this page are measured rather than assumed. They are the export header, identical across 11 runs, and every figure quoted comes from the 842 rows those runs returned - 559 distinct reviews across three apps. Eight of the ten were present on every row. Two were not, and both are worth knowing about before you build: app_version appeared on 702 of 842 overall but its coverage ranged from 90% on one app down to 14% on another, and reply appeared on only 15 rows in total. One limit of the evidence should be said plainly: those runs covered three apps, which is enough to establish the shape of the output and how the columns behave, and not enough to predict what any particular app of yours will return. The free tier exists for that.

What makes this service worth wiring into something permanent is the review id. Across all 842 rows there were 559 distinct ids, and not one run contained a duplicate of its own - every repeat was between runs, exactly as you would expect from pulling the same app twice. That makes the id a reliable deduplication key: union your exports, discard ids you already hold, and you have a review history that grows rather than a folder of overlapping snapshots. The reference documents a cutoff parameter that takes an oldest-timestamp as well, so a recurring pull need not fetch the archive each time. That matters more than it sounds, because the archive is deep - our sample reached back to August 2016.

Two further things shape how the data reads. The first is polarisation: the ratings in our sample split roughly 35% at one star and 35% at five, with only 7% at four, so the middle of the scale is nearly empty and any mean computed from it describes almost nobody. The interesting content sits at the two ends, which is the argument for reading the text rather than the score. The second is that this is the one scraper here with no query column - the submitted app comes back as app_id, so that is the field to group on when you batch. Note also that the export's column names are the export's own; the API reference describes the same data using different names for its raw response, so build against the header you actually receive. Start free: your first 500 rows cost nothing and need no credit card.