How to export App Store reviews to CSV
App Store Connect only exports reviews of your own apps, and only in its web view. For any app, Apple's public review feed gives the most recent 500 reviews per country. This script saves them as a CSV that opens in Excel or Google Sheets.
1. The script
Save as reviews2csv.py:
import csv, json, sys, time, urllib.request
app_id, countries = sys.argv[1], sys.argv[2].split(',') if len(sys.argv) > 2 else ['us']
rows = []
def fetch_page(country, page, tries=15):
# Apple often answers a page with an EMPTY feed, at random per URL. A fresh query string gets a fresh answer.
for i in range(tries):
url = f'https://itunes.apple.com/{country}/rss/customerreviews/id={app_id}/page={page}/sortby=mostrecent/json?v={i}{int(time.time())}'
try:
entries = json.load(urllib.request.urlopen(url, timeout=30))['feed'].get('entry', [])
except Exception as e:
print(f'{country} page {page}: {e}', file=sys.stderr); entries = []
if isinstance(entries, dict): entries = [entries] # a page with one review is not a list
entries = [e for e in entries if 'im:rating' in e] # skip the app's own entry, if present
if entries: return entries
time.sleep(0.5)
return []
for country in countries:
for page in range(1, 11): # the feed stops at page 10 (50 reviews per page)
entries = fetch_page(country, page)
if not entries: break
for e in entries:
rows.append({'country': country, 'id': e['id']['label'], 'date': e['updated']['label'],
'rating': e['im:rating']['label'], 'version': e['im:version']['label'],
'author': e['author']['name']['label'], 'title': e['title']['label'],
'review': e['content']['label']})
time.sleep(1) # be gentle
with open(f'reviews-{app_id}.csv', 'w', newline='', encoding='utf-8-sig') as f:
w = csv.DictWriter(f, fieldnames=['country', 'id', 'date', 'rating', 'version', 'author', 'title', 'review'])
w.writeheader(); w.writerows(rows)
print(f'{len(rows)} reviews -> reviews-{app_id}.csv')
2. Run it
Pass the app ID (the number after id in the App Store link) and the store countries:
python3 reviews2csv.py 389801252 us,gb
Our run printed 800 reviews -> reviews-389801252.csv, with these columns:
country,id,date,rating,version,author,title,review
One row per review: the two-letter store, Apple's review ID, the date, 1 to 5 stars, the app version it was written for, the reviewer's nickname, the title and the text.
3. Why the retry loop
Apple's feed is old and undocumented, and it often answers a page with an empty feed even when reviews exist. In our tests on 2026-09-30 and 2026-10-01, the same page came back empty or full depending on the exact URL, and one URL spelling (…/page=1/id=…) was empty every time for a day. A fresh query string (?v=…) gets a fresh answer, so the script asks up to 15 times before treating a page as empty.
Even so, a run can stop early: our US run ended at 300 reviews because page 7 never came back with entries, while the UK run got the full 500. Run it again later to fill the gap; the id column lets you drop duplicates.
4. Limits
- 500 reviews per country (10 pages of 50), most recent first. For a popular app that covers weeks, not years. Save a CSV regularly if you need history.
- Only written reviews. Star-only ratings are never listed.
- Each country is a separate store with its own reviews; add codes like
de,fr,jp,ca,au.
The feed's URL format, fields and the App Store Connect API for your own apps are covered in App Store reviews API.
5. Without code, many apps or countries
Our App Store Reviews Scraper on Apify takes app IDs, links or names and many countries at once, retries the feed the same way, and exports CSV, Excel or JSON directly.
Frequently asked questions
Can I export reviews from App Store Connect?
App Store Connect shows the reviews of your own apps and offers them through its API (customerReviews), but has no CSV export button. For your own app, the API or the script above both work; for any other app, only the public feed does.
Why does my CSV have fewer than 500 reviews?
Either the app has fewer written reviews in that country, or Apple's feed stopped serving pages early. Run the script again later and remove duplicate ids.
Does it work for Google Play reviews?
No. Google Play has a different system; the Play Console exports reviews of your own apps as CSV files from Google Cloud Storage.
Written with AI assistance. The script was run on 2026-10-01 for Instagram (app ID 389801252) in the US and UK stores: 800 reviews (UK 500, US 300), all unique, dated 2026-08-08 to 2026-09-29, Python 3 standard library only. The Apify tool is ours; the APIs are free to call directly.