DEV Community

Hải Hà Phan Thanh
Hải Hà Phan Thanh

Posted on

How to get App Store and Google Play reviews into a spreadsheet in 5 minutes

If you work on an app, or on a competitor's, you eventually want the raw reviews in a spreadsheet: to tag complaints, track a rating drop after a release, or feed them to a sentiment model. The App Store and Google Play make that annoying. Apple has no export for other people's apps, Google Play's console only shows your own reviews, and the two stores have different formats.

This post shows two ways to do it: a DIY version for each store, and a version using an Apify actor I built that returns both stores in one schema. I'll be upfront about limits at the end.

The DIY route

Apple publishes a public customer-reviews RSS feed. No key needed:

import requests

app_id, country = "310633997", "us"   # WhatsApp
url = f"https://itunes.apple.com/{country}/rss/customerreviews/page=1/id={app_id}/sortby=mostrecent/json"
entries = requests.get(url, timeout=20).json()["feed"].get("entry", [])
for e in entries:
    if "im:rating" not in e:   # sometimes the first entry is the app itself, not a review
        continue
    print(e["im:rating"]["label"], e["title"]["label"])
Enter fullscreen mode Exit fullscreen mode

Each page has up to 50 reviews and the feed stops at 10 pages, so roughly 500 of the newest reviews per app and country. Some apps return an empty feed even though they have reviews, which is the most common "my script is broken" report.

Google Play has no official public reviews API for third parties. The community library google-play-scraper works well:

from google_play_scraper import reviews, Sort
result, _ = reviews("com.whatsapp", lang="en", country="us", sort=Sort.NEWEST, count=200)
Enter fullscreen mode Exit fullscreen mode

It parses Google's internal format, so it can break when Google changes things. For one app and one country this is all you need. The pain starts when you want 30 apps across 5 countries, with throttling, retries and one consistent column layout.

The 5-minute route: no code

  1. Open the App Store & Play Reviews actor and click Try for free.
  2. Paste app URLs or package names into apps. iOS and Android can be mixed; the store is detected automatically.
  3. Set countries (for example us, gb), maxReviewsPerApp, and sort to newest.
  4. Click Start, then Export the dataset as CSV or Excel. Open it in Google Sheets.

The Python route

# pip install apify-client pandas
from apify_client import ApifyClient
import pandas as pd

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("bachiembmt/app-store-play-reviews").call(run_input={
    "apps": [
        "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
        "com.whatsapp",
    ],
    "countries": ["us", "gb"],
    "maxReviewsPerApp": 200,   # per app AND per country
    "sort": "newest",
    "language": "en",
})
items = list(client.dataset(run.default_dataset_id).iterate_items())
df = pd.DataFrame(items)
df.to_csv("reviews.csv", index=False)
print(df.groupby(["appName", "store"])["rating"].agg(["count", "mean"]))
Enter fullscreen mode Exit fullscreen mode

Every row has the same fields regardless of store: store, appId, appName, country, reviewId, userName, rating, title, text, version, date, thumbsUp, developerReply, replyDate, url.

Monitoring only new reviews

Use minDate with sort: newest and schedule the actor weekly in the Console:

run_input = {"apps": ["com.whatsapp"], "sort": "newest", "minDate": "2026-10-15"}
Enter fullscreen mode Exit fullscreen mode

Then a quick check for what hurts most:

low = df[df.rating <= 2]
print(low.groupby("version").size().sort_values(ascending=False).head())
print(low.text.str.len().describe())
Enter fullscreen mode Exit fullscreen mode

Pipe low.text into whatever sentiment or topic tool you prefer. The unified schema means you write that code once.

Honest limits

  • Apple: the free RSS feed stops at about 500 reviews per app and country. The actor reads Apple's web reviews API instead (several hundred deep per country in my tests) and falls back to RSS, but it is still not a full multi-year history.
  • Google Play access depends on an unofficial library, so it can break for a while after Google changes its format.
  • Requests are throttled to about 1 per second, so big jobs take a while.
  • Only public review data. No login, no private data.
  • If you only need one app once, the DIY snippets above are free and enough.

Price

Pay per event: about $0.50 per 1,000 reviews returned (check the Store page for the current price). 200 reviews cost around a tenth of a cent; a 30-app by 3-country run at 200 each is 18,000 reviews, so around $9. Apify accounts normally include some free monthly platform credit, so a first test costs nothing; check your plan for the current amount.

I built this actor, so I'm biased, but I'd rather you try the free snippets first and use the actor only if maintaining the scraper is not how you want to spend your time.

Try it: App Store & Play Reviews actor

Top comments (0)