Apple App Store Scraper
DeprecatedPricing
$1.00 / 1,000 apps
Apple App Store Scraper
DeprecatedScrape Apple App Store category charts, full app details, reviews, keyword search-rank, and similar-apps. Built for app-market research: competitor density, positioning, review sentiment, and keyword landscape before committing engineering time to a new app.
Pricing
$1.00 / 1,000 apps
Rating
0.0
(0)
Developer
Kashif Ali
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
Scrape Apple App Store category charts, full app details, reviews, keyword search-rank, and similar apps — built for app-market research and idea validation: competitor density, positioning, review sentiment, and keyword landscape before committing engineering time to a new app.
Wraps the maintained app-store-scraper npm package (v0.18.0, ISC — same author, facundoolano, as google-play-scraper, which powers the sibling google-play-store-scraper actor) — public, unauthenticated iTunes Search API / App Store RSS endpoints, no login, no anti-bot wall.
What you get per run
Five dataset views, all in one dataset:
| View | Rows | Use case |
|---|---|---|
| charts | One per listed app | Market sizing, competitor density, category trends |
| details | One per app | Deep competitor analysis, monetization, rating distribution |
| reviews | One per review | Sentiment, feature requests, crash reports, version-specific feedback |
| search | One per ranked result per term | Keyword-rank tracking — the ASO data AppTweak sells |
| similar | One per related app | Competitor/adjacent-app mapping ("customers also bought") |
Modes (single actor, one input)
| Mode | What it does |
|---|---|
charts | Category/collection listings only |
details | Full app details for explicit appIds |
reviews | Reviews for explicit appIds |
search | Keyword search-rank for searchTerms |
similar | Related apps for explicit appIds |
all (default) | Charts → auto-feeds discovered apps to details → reviews for everything |
search and similar are opt-in — they take explicit keyword/appId lists rather than falling out of chart discovery, so they aren't part of all.
The all mode workflow
{"mode": "all","categories": ["BUSINESS", "PRODUCTIVITY"],"collections": ["TOP_FREE_IOS", "TOP_GROSSING_IOS"],"countries": ["us"],"numPerChart": 50,"fetchDetailsForListedApps": true,"maxReviewsPerApp": 50}
- Scrapes 2 categories × 2 collections × 1 country × 50 apps = 200 chart rows
- Deduplicates the 200 apps → unique bundle IDs
- Fetches full details for every unique app
- Fetches up to 50 reviews per app
- Single run, single dataset, complete market picture
Input
Quick start (zero config)
Hit Run with defaults → gets top 50 free/paid/grossing apps in Business, Productivity, Health & Fitness (US), fetches full details + 50 reviews each.
Full input reference
{"mode": "all","categories": ["BUSINESS", "PRODUCTIVITY", "HEALTH_AND_FITNESS"],"collections": ["TOP_FREE_IOS", "TOP_PAID_IOS", "TOP_GROSSING_IOS"],"countries": ["us"],"numPerChart": 50,"appIds": [],"fetchDetailsForListedApps": true,"fetchRatingsHistogram": true,"maxReviewsPerApp": 50,"searchTerms": [],"searchNumPerTerm": 20,"maxItems": 5000,"maxConcurrency": 3,"retryAttempts": 3,"retryDelayMs": 1500}
| Field | Type | Default | Description |
|---|---|---|---|
mode | enum | "all" | charts | details | reviews | search | similar | all |
categories | string[] | ["BUSINESS","PRODUCTIVITY","HEALTH_AND_FITNESS"] | 70 App Store genres. Use ["ALL"] for all 70. |
collections | string[] | ["TOP_FREE_IOS","TOP_PAID_IOS","TOP_GROSSING_IOS"] | iPhone/iPad/Mac × top/new charts (13 total) |
countries | string[] | ["us"] | 2-letter codes (ISO 3166-1 alpha-2) |
numPerChart | int | 50 | Apps per category/collection/country (max 200, App Store RSS limit) |
appIds | string[] | [] | Bundle IDs, numeric App Store IDs, or full App Store URLs — for details/reviews/similar |
fetchDetailsForListedApps | bool | true | In all mode, auto-fetch details for every app found in charts |
fetchRatingsHistogram | bool | true | Fetch the 1-5 star breakdown per app (one extra request per app) |
maxReviewsPerApp | int | 50 | 0 = skip reviews. The App Store review feed hard-caps around 500 (10 pages) per app regardless. |
searchTerms | string[] | [] | Keywords for search mode |
searchNumPerTerm | int | 20 | Ranked results to capture per term |
maxItems | int | 5000 | Hard cap on total dataset rows |
maxConcurrency | int | 3 | Parallel requests. Apple rate-limits harder than Google Play. |
retryAttempts | int | 3 | Retries for transient errors |
retryDelayMs | int | 1500 | Base delay for exponential backoff |
Output
Chart row
{"type": "chart","category": "BUSINESS","collection": "TOP_GROSSING_IOS","country": "us","rank": 1,"id": "288429040","appId": "com.linkedin.LinkedIn","title": "LinkedIn: Community & Network","developer": "LinkedIn Corporation","price": 0,"free": true,"currency": "USD","genre": "Business","genreId": "6000","icon": "https://is1-ssl.mzstatic.com/...","url": "https://apps.apple.com/us/app/linkedin-community-network/id288429040","scrapedAt": "2026-09-13T22:14:49.555Z"}
Detail row
{"type": "detail","id": 294934058,"appId": "com.hotschedules.hotschedules","title": "HotSchedules","primaryGenre": "Business","score": 4.60016,"reviews": 67269,"ratings": 67,"histogram": { "1": 3364, "2": 973, "3": 2315, "4": 5892, "5": 54725 },"price": 2.99,"free": false,"currency": "USD","requiredOsVersion": "17.1","released": "2008-10-31T05:30:52Z","updated": "2026-09-12T06:49:02Z","version": "6.0.1","description": "...","screenshots": ["https://...", "..."],"supportedDevices": ["iPhone16-iPhone16", "..."],"developer": "HotSchedules","developerWebsite": "http://www.hotschedules.com","url": "https://apps.apple.com/us/app/hotschedules/id294934058","country": "us","scrapedAt": "2026-09-13T22:14:55.796Z"}
Note App Store addresses apps by both a numeric id (trackId) and a string appId (bundle ID) — unlike Play's single package-name scheme. Both are always present on detail/chart rows; appIds input accepts either form plus full URLs.
Key fields for idea validation:
score+ratings/histogram— rating distribution, not just average (histogram is a separate request per app — seefetchRatingsHistogram)reviews/currentVersionReviews— engagement and version-specific receptionscreenshots/description/releaseNotes— positioning and update cadencecontentRating,languages,supportedDevices— market reach signalsdeveloperWebsite— contact for partnerships
Review row
{"type": "review","reviewId": "14540170480","appId": "com.linkedin.LinkedIn","userName": "TweetyRuns7","version": "9.1.570","score": 1,"title": "Can't login","text": "I am not sure what's going on...","url": "https://itunes.apple.com/us/review?id=288429040&type=Purple%20Software","updated": "2026-09-12T01:34:22-07:00","country": "us","scrapedAt": "2026-09-13T22:20:52.940Z"}
The App Store review RSS feed caps at ~500 reviews (10 pages) per app — this is Apple's limit, not ours.
Search row (keyword-rank)
{"type": "search","term": "budgeting app","rank": 1,"id": 1621020173,"appId": "com.fleurbudget","title": "Fleur - Budget Planner App","developer": "Akash Jain","primaryGenre": "Finance","score": 4.80138,"url": "https://apps.apple.com/us/app/fleur-budget-planner-app/id1621020173","country": "us","scrapedAt": "2026-09-13T22:30:07.974Z"}
This is the keyword-rank data AppTweak/ASO tools sell — automated App Store search, capturing which apps rank where for each term.
Similar row
{"type": "similar","sourceAppId": "310633997","relatedId": 454638411,"relatedAppId": "com.facebook.Messenger","relatedTitle": "Messenger","relatedDeveloper": "Meta Platforms, Inc.","relatedScore": 4.6613,"relatedPrimaryGenre": "Social Networking","relatedUrl": "https://apps.apple.com/us/app/messenger/id454638411","country": "us","scrapedAt": "2026-09-13T22:30:25.503Z"}
Apple's own "customers also bought" data per app listing — competitor/adjacent-app mapping.
What this doesn't do
This actor covers everything that's actually scrapable — public store metadata, charts, reviews, keyword search-rank, and similar-apps. Two things 42matters/AppTweak/Sensor Tower sell that this deliberately does not attempt:
- Install/revenue estimates. These come from proprietary SDK panels (analytics SDKs embedded in thousands of apps, giving device-level usage samples extrapolated statistically) and calibration deals with Google Play's disclosed install bands. Not scrapable — no public data source exists. If this is ever genuinely needed, buy API access from one of those vendors rather than trying to rebuild the model from rank/rating signals; that's a data-science project of its own with a poor accuracy ceiling.
- iOS SDK/tech-stack detection. App Store binaries are FairPlay-DRM-encrypted per purchase — getting a clean binary to inspect for embedded SDKs requires circumventing that DRM, a DMCA anti-circumvention issue, not a difficulty issue. (Android SDK detection via public APK teardown is technically feasible but was explicitly scoped out of this build — separate concern, ask if it's needed later.)
Reliability
- Concurrency control —
p-limitsemaphore, default 3 (lower than the Play actor's default 5 — Apple's iTunes endpoints rate-limit harder, returning 403 rather than 429) - Retry with backoff — exponential backoff + jitter on 403/429/5xx and network errors (
ETIMEDOUT/ECONNRESET/ECONNREFUSED/ENETUNREACH/ENOTFOUND/EAI_AGAIN) - Graceful degradation — one failed appId/category/term doesn't kill the run; a missing ratings histogram doesn't lose the rest of a detail row
- Fail loud — a run that pushes 0 rows fails with reason — not a green run with an empty dataset
- Deduplication — apps deduplicated across chart discoveries and explicit
appIds(by resolved bundle ID or numeric ID) - Global
maxItemscap — stops cleanly at limit
Categories & Collections (from the package, not hardcoded)
import appStore from 'app-store-scraper';// category: 70 genres (BOOKS, BUSINESS, GAMES, ... WEATHER)// collection: 13 charts (TOP_FREE_IOS, TOP_PAID_IPAD, TOP_GROSSING_MAC, NEW_IOS, ...)
ALL_CATEGORIES/ALL_COLLECTIONS in src/utils.ts read these directly from the library at runtime — use ["ALL"] in categories to scrape all 70.
Local development
cd apple-app-store-scrapernpm installnpm test # runs unit tests (no network)npm start # runs locally, reads storage/key_value_stores/default/INPUT.json
Local storage directory is controlled by CRAWLEE_STORAGE_DIR (not APIFY_LOCAL_STORAGE_DIR), and its default-store input file must live at <dir>/key_value_stores/default/INPUT.json — running via the apify CLI (apify run) sets this up automatically; running node directly does not.
Test input (save as storage/key_value_stores/default/INPUT.json)
{"mode": "all","categories": ["BUSINESS"],"collections": ["TOP_FREE_IOS"],"countries": ["us"],"numPerChart": 5,"fetchDetailsForListedApps": true,"fetchRatingsHistogram": false,"maxReviewsPerApp": 5,"maxItems": 100,"maxConcurrency": 3}
Deployment
$apify push
Is scraping the App Store legal?
Scraping publicly available app listings, ratings, and reviews is generally legal. This actor collects only public, non-personal data — app metadata, aggregate ratings, and public reviews — via the same endpoints the App Store app itself uses. No user accounts, no private data, no DRM circumvention, no authentication bypass.
You are responsible for how you use the output, including under GDPR/CCPA where relevant. Apple's ToS prohibits automated access; use at your own risk. When in doubt, take legal advice.
Known dependency vulnerabilities
app-store-scraper depends on the deprecated request HTTP library, which transitively pulls in form-data/qs/tough-cookie/uuid versions with known CVEs (npm audit flags 2 critical, 7 moderate). All of them are exploitable only via attacker-controlled multipart form bodies or cookie jars — this actor only issues GET requests to fixed, hardcoded Apple endpoints and never sends multipart data or persists cookies, so none of these are reachable in practice. No non-breaking fix exists upstream (the fix downgrades to app-store-scraper@0.4.0, a materially older and less capable version); documenting the ceiling here rather than downgrading.
Changelog
- 1.0 — Initial release: charts, details, reviews, keyword search-rank, similar-apps, 70 categories, 13 collections, retry/backoff, fail-loud, deduplication, dataset views.
License
Apache-2.0
Pricing & cost estimator
Pay-per-event: $1.00 per 1,000 app rows. You are charged only for rows that contain data; empty or failed targets are free. A 100-item run typically finishes in well under a few minutes and costs a fraction of a cent in platform usage. Use maxItems to control spend.
Example output (real run)
{"type": "chart","category": "BUSINESS","collection": "TOP_FREE_IOS","country": "us","rank": 1,"id": "1113153706","appId": "com.microsoft.skype.teams","title": "Microsoft Teams","developer": "Microsoft Corporation","developerUrl": "https://apps.apple.com/us/developer/microsoft-corporation/id298856275?uo=2","price": 0,"free": true,"currency": "USD","genre": "Business","genreId": "6000","icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/5b/d9/40/5bd940d9-d71d-17b0-7515-8fff4d9e7aa4/AppIcon-0-…","url": "https://apps.apple.com/us/app/microsoft-teams/id1113153706?uo=2","scrapedAt": "2026-10-01T19:39:02.027Z"}
Limitations
Chart positions and ratings reflect the moment of the run and the chosen country. Review texts are not collected unless maxReviewsPerApp is set.
No login, no cookies
This actor only reads public Apple App Store listings and charts. It never asks for a cookie, password or account and does not access private data. Use the data in line with the source site's terms and applicable law (GDPR/CCPA for personal data).
Need a custom version?
Need a field this actor doesn't return, a different site, a schedule, or delivery to Google Sheets / your CRM? We build and maintain custom scrapers, public data only. Open an Issue on this actor titled "Custom request", or email kashif@dialnorth.com.