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

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.