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.