Apple App Store Reviews Scraper avatar

Apple App Store Reviews Scraper

Pricing

$0.10 / 1,000 stored reviews

Go to Apify Store
Apple App Store Reviews Scraper

Apple App Store Reviews Scraper

Collect available Apple App Store reviews by country, including results beyond the common 500-review feed limit. Pay only $0.10 per 1,000 stored reviews.

Pricing

$0.10 / 1,000 stored reviews

Rating

0.0

(0)

Developer

OrbitData Labs

OrbitData Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

Collect available Apple App Store reviews by country, including results beyond the common 500-review feed limit. Pay only $0.10 per 1,000 stored reviews.

Paste an App Store URL and run. That's it. Fast, HTTP-only, no login, no browser, no residential proxies.

Why this scraper

  • Beyond the common 500-review feed limit. Most App Store review scrapers rely on Apple's RSS feed, which serves at most ~500 recent reviews per app per country. This actor's primary source is the same public review endpoint the App Store website itself uses, which often provides reviews beyond that limit — you get whatever reviews Apple currently provides, up to your requested limit.
  • Multi-country in one run. Query us, kr, jp, de, … storefronts in a single run; every record is labeled with requestedCountry and resolvedCountry (verified against the iTunes catalog).
  • Developer replies included when Apple returns them.
  • Fair pay-per-result pricing. You pay only for unique reviews actually stored. Empty results, duplicates, errors, retries, and status/notice records are never charged. There is no per-run start fee.
  • Transparent degradation. If the primary source is unavailable, the actor automatically falls back to the public RSS feed (at most ~500 recent reviews per country) and tells you explicitly — via a notice record and fallbackUsed: true on affected reviews.

Pricing

$0.10 per 1,000 reviews ($0.0001 per stored unique review), charged as pay-per-event. There is no per-run start fee. Only valid unique reviews stored to the dataset are charged — notice records, error records, empty results, duplicates, retries, and the RSS fallback process itself are free.

Estimated maximum price = number of apps × number of countries × maxReviewsPerApp × $0.0001

WorkloadMaximum price
1 app × 1 country × 100 reviews$0.01
1 app × 1 country × 500 reviews$0.05
1 app × 1 country × 1,000 reviews$0.10
10 apps × 3 countries × 1,000 reviews$3.00
100,000 stored reviews$10.00

The actual charge is usually lower — you are billed only for reviews that exist and are stored. Set maxCostPerRun for a hard budget cap; the run stops before exceeding it. The estimated maximum is also printed to the log at the start of every run.

Input

Minimal:

{
"startUrls": [{ "url": "https://apps.apple.com/us/app/chatgpt/id6448311069" }]
}

Full example:

{
"startUrls": [{ "url": "https://apps.apple.com/us/app/chatgpt/id6448311069" }],
"appIds": ["378084485"],
"countries": ["us", "kr", "jp"],
"language": "en-US",
"maxReviewsPerApp": 1000,
"includeAuthorName": false,
"maxCostPerRun": 5,
"proxyConfiguration": { "useApifyProxy": true }
}

This example covers 2 apps × 3 countries × up to 1,000 reviews each — at most 6,000 stored reviews, i.e. at most $0.60.

FieldDefaultNotes
startUrls / appIdsAt least one App Store app URL or numeric app ID. De-duplicated automatically.
countriesus, or the country in each URLTwo-letter storefront codes.
languagestorefront defaultResponse language hint.
maxReviewsPerApp200Per app per country. You receive whatever reviews Apple currently serves within this limit.
includeAuthorNamefalseReviewer public display name; excluded by default for privacy.
maxCostPerRunno capHard USD budget cap, enforced before requests are made.
proxyConfigurationnoneOptional. Datacenter proxies are sufficient; residential proxies are never selected automatically.

Output

One record per review:

{
"type": "review",
"reviewId": "12476009023",
"appId": "6448311069",
"appName": "ChatGPT",
"appUrl": "https://apps.apple.com/us/app/chatgpt/id6448311069",
"requestedCountry": "us",
"resolvedCountry": "us",
"requestedLanguage": null,
"resolvedLanguage": null,
"source": "amp",
"fallbackUsed": false,
"title": "Amazing for college",
"text": "…",
"rating": 5,
"reviewedAt": "2025-03-28T21:44:08Z",
"isEdited": false,
"appVersion": null,
"developerResponse": null,
"developerResponseAt": null,
"collectedAt": "2026-08-26T12:00:00.000Z"
}

Field notes — only values present in Apple's response are stored; anything missing is null, never invented:

  • source: "amp" (primary) provides isEdited and, when Apple returns one, developerResponse / developerResponseAt. It does not provide the review's appVersion.
  • source: "rss" (fallback) provides appVersion; it does not provide isEdited or developer replies.
  • Review order follows Apple's response order and is not guaranteed to be strictly sorted by date.
  • An app missing from a requested storefront produces an uncharged type: "error" record with reason: "APP_NOT_FOUND_IN_COUNTRY" — a country that returns nothing is explained, not silent.
  • A fallback produces an uncharged type: "notice" record (notice: "AMP_UNAVAILABLE_RSS_FALLBACK") so reduced coverage is never silent.

Known limitations

  • No "all reviews" claim. Apple's public endpoints serve a subset of all historical reviews. You get the available reviews within your requested limit — availability varies by app and country and can change over time.
  • The primary source is an unofficial path used by Apple's own web store; Apple may change or restrict it at any time. If that happens, the actor degrades to the documented RSS fallback (~500 recent reviews per country) instead of breaking.
  • Apple throttles bursts (HTTP 429). The actor paces requests, retries with exponential backoff, and rotates proxy sessions — heavy runs get slower rather than failing.
  • Total per-app review depth has been verified into the thousands, but no fixed upper bound is guaranteed.

Development

npm install
npm run build
npm run typecheck
npm run test:fixtures # offline, anonymized-fixture regression

Local run: put an input JSON at storage/key_value_stores/default/INPUT.json, then npm run start.