Apple App Store Reviews Scraper
Pricing
$0.10 / 1,000 stored reviews
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
Maintained by CommunityActor 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 withrequestedCountryandresolvedCountry(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
noticerecord andfallbackUsed: trueon 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
| Workload | Maximum 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.
| Field | Default | Notes |
|---|---|---|
startUrls / appIds | — | At least one App Store app URL or numeric app ID. De-duplicated automatically. |
countries | us, or the country in each URL | Two-letter storefront codes. |
language | storefront default | Response language hint. |
maxReviewsPerApp | 200 | Per app per country. You receive whatever reviews Apple currently serves within this limit. |
includeAuthorName | false | Reviewer public display name; excluded by default for privacy. |
maxCostPerRun | no cap | Hard USD budget cap, enforced before requests are made. |
proxyConfiguration | none | Optional. 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) providesisEditedand, when Apple returns one,developerResponse/developerResponseAt. It does not provide the review'sappVersion.source: "rss"(fallback) providesappVersion; it does not provideisEditedor 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 withreason: "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 installnpm run buildnpm run typechecknpm 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.