Apple App Store reviews for any app, in any country, as clean JSON or CSV

Last updated:

The App Store Connect API only gives you reviews for apps your team owns, and it needs a private key. To read what users say about any app, including competitors, in any storefront, this Actor collects reviews from Apple's public customer-review feed and adds the app's public metadata. It needs no login and no Connect key.

What you get

One row per review:

FieldExample
appId, appName, country570060128, Duolingo: Language Lessons, us
reviewId, title, text, rating (1–5)14612250135, Fun, Very fun and…, 5
version, date, userName7.142.0, 2026-09-30T13:01:34-07:00, …
voteCount, voteSumhelpfulness votes

Optionally, one app-details row per app × country: name, developer, price and currency, average rating, rating count, version, release dates, genres, content rating, size, minimum OS and description.

App-details row from a real run:

json
{
  "type": "app",
  "appId": "570060128",
  "country": "us",
  "name": "Duolingo: Language Lessons",
  "developer": "Duolingo, Inc",
  "price": 0,
  "currency": "USD",
  "averageRating": 4.72302,
  "ratingCount": 5481026,
  "version": "7.142.0",
  "currentVersionReleaseDate": "2026-09-28T17:42:01Z",
  "genres": ["Education", "Social Networking"],
  "contentRating": "4+",
  "url": "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128?uo=4"
}

Use cases

Run it in the Apify Console (no code)

  1. Open the App Store Reviews Scraper and click Try for free.
  2. Paste App Store URLs or numeric app ids, for example https://apps.apple.com/us/app/duolingo-language-lessons/id570060128 or 570060128.
  3. Choose countries (us, gb, de…), the maximum number of reviews per app, and optionally a sinceDate.
  4. Click Start, then export the dataset as CSV, Excel or JSON.

Run it from code

Replace <owner>/app-store-reviews with the Actor id shown on its Store page.

Node.js (apify-client)

js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('<owner>/app-store-reviews').call({
  apps: ['570060128'], countries: ['us'], maxReviewsPerApp: 50, includeAppDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const row of items) console.log(row.type, row.type === 'app' ? `${row.name} ★${row.averageRating}` : `${row.rating}★ ${row.title}`);

Python (apify-client ≥ 3)

python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("<owner>/app-store-reviews").call(
    run_input={"apps": ["570060128"], "countries": ["us", "gb"], "maxReviewsPerApp": 200},
)
for item in client.dataset(run.default_dataset_id).list_items().items:
    print(item["type"], item.get("rating"), item.get("title"))

curl (one call, results in the response)

bash
curl -s -X POST "https://api.apify.com/v2/acts/<owner>~app-store-reviews/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"apps":["570060128"],"countries":["us"],"maxReviewsPerApp":50}'

Limits

Pricing

$0.20 per 1,000 rows ($0.0002 per review or app-details row), pay per event. You pay only for rows delivered, with no subscription.

Open the App Store Reviews Scraper on Apify