Apple App Store
App Store Reviews API
Pull a page of Apple App Store customer reviews as JSON: star rating, title, full text, author and author profile URL, helpfulness votes, and — the field the store's own web page never shows you — the APP VERSION each review was written against, so you can cut sentiment by release. 50 reviews per page, up to page 10 per storefront. Costs 1 credit.
Authorizations
AuthorizationstringheaderrequiredBearer authentication header of the form Bearer <token>, where <token> is your Scavio API key (e.g. Bearer sk_live_your_key).
Body
application/jsonapp_idstringrequiredApp Store id, NUMERIC ONLY — the digits after `id` in an apps.apple.com URL. Unlike the App Store App endpoint, the reviews feed has no bundle-id form, so a bundle id is a free 400. Resolve a bundle id through the App Store App endpoint first and use the app_id it returns.
Example: 1232780281
countrystringdefault:usTwo-letter ISO storefront code. Reviews are per storefront, and this is also how you get past the 500-review ceiling: ask gb, de, jp and so on for a different 500 each. Must be exactly two letters — "usa" is a free 400 rather than a silent US result set.
Example: gb
pageintegerdefault:1Reviews page, 1 to 10, 50 reviews each. Apple HARD-STOPS at page 10, so 500 reviews per storefront is the ceiling it publishes anonymously — page 11 is rejected here with a free 400 rather than sold as an empty page. Reach further by changing country, not page.
Example: 2
sortenum<string>default:most_recentReview ordering. It also decides whether the vote fields mean anything: under most_recent almost every review is too new to have been voted on and vote_sum / vote_count come back as zeroes, while most_helpful returns them densely populated. All-zero votes on a recent page are the feed, not a bug.
Example: most_helpful
most_recent— Newest first (the default). Use for monitoring a release.most_helpful— Apple's helpfulness ranking. Use when you want the votes populated.
Request
from scavio import ScavioClient
client = ScavioClient(api_key="sk_live_your_key")
# Watch what a release did: reviews carry the version they were written against.
by_version = {}
for page in range(1, 11): # page 10 is Apple's hard stop
batch = client.app_store.reviews("1232780281", page=page, sort="most_recent")["data"]
if not batch["reviews"]:
break
for review in batch["reviews"]:
by_version.setdefault(review["version"], []).append(review["rating"])
for version, ratings in by_version.items():
print(version, round(sum(ratings) / len(ratings), 2), len(ratings))
# Past 500 reviews? Change storefront, not page.
uk = client.app_store.reviews("1232780281", country="gb", page=1)Response