Google Play's official reviews API reads only your own apps' reviews from the last week. Our /v1/google-play/reviews route returns reviews for any app, including a competitor's. Each call returns up to 150 reviews as JSON, with star score, app version, helpful count and the developer's reply. A Python script saves the newest 1,050 to CSV in 7 calls.
Google's Reply to Reviews API is for developers answering reviews of apps in their own Play Console. You authorize with an OAuth client or a service account that has reply permission on the app. It returns only reviews with a written comment, created or changed in the last week, at 200 GETs an hour per app.
What one call returns
One call returns up to 150 reviews of any app, newest first, plus a next_token that fetches the next page. We make ToolzerHub. Our Google Play API takes a package id or a Play link in package_id_or_url. It also takes a count up to 150, a sort of newest, helpful or rating, and language and country, which default to en_US and US. Each call costs 1 credit and needs the x-api-key header.
export TOOLZERHUB_API_KEY=your_key
curl -G -H "x-api-key: $TOOLZERHUB_API_KEY" \
--data-urlencode "package_id_or_url=com.spotify.music" \
--data-urlencode "count=150" \
--data-urlencode "sort=newest" \
"https://api.toolzerhub.com/v1/google-play/reviews"
A Spotify review from data.reviews, without its author and avatar:
{
"review_id": "ad1b2e6e-8e39-4642-b638-5c4a6d9ece5b",
"score": 4,
"text": "keyboard too small what can I do to make bigger?",
"timestamp": 1793727042,
"helpful_count": 0,
"developer_reply": {
"author": "Spotify AB",
"text": "Hi. Thanks for bringing this up. We're open to feedback, and we'd love to get some more info about this. If you have the time, give our Customer Service a shout. You can find them by heading to support.spotify.com and searching \"Contact us\".",
"timestamp": 1793728440
},
"app_version": "9.1.94.1929"
}
timestamp is in unix seconds, and developer_reply is null when nobody has answered. The /v1/google-play/app route returns the listing: Spotify's shows a 4.321349 rating from 34,402,640 ratings and 1,000,000,000+ installs.
Export Google Play reviews to CSV
The script takes a package id or a Play link, a number of pages of 150 reviews, a file name and a sort order. It follows next_token from page to page and writes one CSV row per review. Each row holds the date, score, app version, helpful count, author, text, whether the developer replied and the reply text. At the end it prints the star counts and the number of replies. Save it as google_play_reviews.py and install requests (pip install requests).
import csv
import os
import sys
import time
from collections import Counter
from datetime import datetime, timezone
import requests
BASE = "https://api.toolzerhub.com/v1/google-play"
HEADERS = {"x-api-key": os.environ.get("TOOLZERHUB_API_KEY", "")}
FIELDS = ["review_id", "date", "score", "app_version", "helpful_count", "author", "text",
"replied", "reply_text"]
def get(path, params, tries=3):
for attempt in range(tries):
r = requests.get(f"{BASE}/{path}", headers=HEADERS, params=params, timeout=60)
if r.status_code in (429, 500, 502, 503, 504) and attempt < tries - 1:
time.sleep(5 * (attempt + 1))
continue
r.raise_for_status()
return r.json()["data"]
def main(app, pages="5", out="reviews.csv", sort="newest"):
# Each call returns up to 150 reviews; next_token goes back in as token.
params = {"package_id_or_url": app, "count": 150, "sort": sort}
rows, calls = [], 0
for _ in range(int(pages)):
data = get("reviews", params)
calls += 1
if not data or not data["reviews"]:
break
for r in data["reviews"]:
reply = r.get("developer_reply") or {}
rows.append({
"review_id": r["review_id"],
"date": datetime.fromtimestamp(r["timestamp"], timezone.utc).date().isoformat(),
"score": r["score"], "app_version": r.get("app_version"),
"helpful_count": r.get("helpful_count"), "author": r["author"],
"text": r.get("text"), "replied": bool(reply),
"reply_text": reply.get("text") if isinstance(reply, dict) else reply,
})
if not data.get("next_token"):
break
params["token"] = data["next_token"]
with open(out, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=FIELDS)
writer.writeheader()
writer.writerows(rows)
stars = Counter(r["score"] for r in rows)
days = sorted({r["date"] for r in rows})
print(f"{len(rows)} reviews in {calls} calls, {days[0]} to {days[-1]}, saved to {out}")
print("stars:", " ".join(f"{s}*={stars[s]}" for s in range(5, 0, -1)),
f"| replied: {sum(r['replied'] for r in rows)}")
if __name__ == "__main__":
if len(sys.argv) < 2:
sys.exit("usage: python google_play_reviews.py com.spotify.music [pages] [file.csv] [newest|helpful|rating]")
if not HEADERS["x-api-key"]:
sys.exit("set TOOLZERHUB_API_KEY first")
main(*sys.argv[1:])
What came out
python google_play_reviews.py com.spotify.music 7 spotify.csv saved 1,050 reviews in 7 calls and 10.8 seconds. We ran the same command for Duolingo and Todoist, with Todoist passed as a Play link. Each saved 1,050 reviews in 7 calls, in 38.8 and 38.9 seconds.
| App | Reviews cover | Average stars | 1-star share | Developer replies |
|---|---|---|---|---|
| Spotify | 2 days | 3.77 | 21.2% | 140 (13.3%) |
| Duolingo | 2 days | 4.44 | 7.5% | 0 |
| Todoist | 14 months | 3.93 | 16.2% | 948 (90.3%) |
Spotify's newest reviews ran below its listing: the listing shows 4.32 stars, the newest 1,050 reviews average 3.77, and 21.2% of them are one star.
Replies show each team's habit. Spotify answered 63 of 223 one-star reviews and 1 of 604 five-star ones. Todoist answered 575 of its 631 five-star reviews, and Duolingo answered none. The replied column lets you track that for any competitor.
The same 1,050 reviews cover 2 days of Spotify or Duolingo and 14 months of Todoist, so busy apps need frequent pulls.
app_version was empty on 177 Spotify reviews, 88 Duolingo reviews and 127 Todoist reviews. The rest group by build: 648 Spotify reviews came from 9.1.94.1929, so you can sort complaints by release.
What it costs
Each call of up to 150 reviews costs 1 credit, so 1,050 reviews cost 7 credits. A daily pull of the newest 150 reviews for 5 competitor apps is 5 credits a day, about 150 a month. You get 100 free credits a month; $19 buys 10,000 credits that never expire, and plans for higher volume are on the pricing page. Set your key and your first app's reviews are a CSV in under a minute.
For reviews on other platforms, see TikTok Shop reviews to CSV and the Google Maps reviews API. For an app's rating, installs and last update, see the Google Play Store API.
We are not affiliated with Google.