SFOLN

Catalogue / App stores

App Store Scraper – App Details & Top Charts

sfoln/app-store-scraper · Ecommerce, Developer tools, Automation

Apple App Store data by app ID, bundle ID or URL in any country: name, developer, price, rating, ratings count, version, release notes, size, genres, screenshots. Plus keyword search, customer reviews and top free, paid and grossing charts. $1 per 1,000 apps, $0.10 per 1,000 reviews.

About

What it does

Get Apple App Store data as clean JSON: app details by app ID, bundle ID or App Store URL in any country, customer reviews, keyword search results and top free, paid and grossing charts. One record per app, review or chart entry, for app-market research, ASO and competitor tracking, review monitoring and AI agents. $1 per 1,000 apps, $0.10 per 1,000 reviews, no start fee; unknown apps and errors are free.

Price

Price per delivered record

EventPricePer 1,000Charged for
App Store app
app
$0.001$1 / 1,000One app record: the details of an app in one App Store country (apps mode), or one app of a keyword search (search mode).
App Store review
review
$0.0001$0.10 / 1,000One customer review row (rating, title, text, version, author name, date).
Top chart entry
chart-entry
$0.0005$0.50 / 1,000One app of a top chart (rank, app ID, name, developer, link).

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~app-store-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apps":["1232780281"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/app-store-scraper"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~app-store-scraper/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Get the App Store details (rating, ratings count, version, price) of app 1232780281 in the US and UK stores.

Input

Input fields

Pick a mode and fill its list: apps (App Store IDs, bundle IDs or URLs) for app details or customer reviews, keywords for search, or charts for top charts. Every app, keyword or chart is fetched in each country you list. Each one is an item with its own summary in the dataset.

FieldTypeDefaultMeaning
modestring"apps"Mode
apps: one record per app with its details. reviews: the app's customer reviews (newest 500 per country). search: apps matching each keyword. charts: top free, paid or grossing apps. One of "apps", "reviews", "search", "charts".
appsarray—Apps
For the apps and reviews modes: App Store app IDs (1232780281), bundle IDs (notion.id) or App Store URLs (https://apps.apple.com/us/app/notion/id1232780281), one per line. Accounts on the Apify free plan can process up to 10 items per run (an item is one app, keyword or chart in one country).
searchTermsarray—Search keywords
For the search mode: keywords to search the App Store for, one per line. Results come in Apple's order with their rank.
chartsarray—Charts
For the charts mode: which top charts to fetch (default top-free).
chartGenrestring—Chart genre
Optional, charts mode: limit the charts to one genre, by App Store genre ID (6014) or name (Games, Productivity, Finance, Health & Fitness…).
countriesarray—Countries
Two-letter App Store country codes (us, gb, de, jp…). Every app, keyword or chart is fetched in each of them. Empty: us, or the country in an App Store URL.
includeReviewsbooleanfalseInclude reviews (apps mode)
In the apps mode, also return each app's customer reviews (up to Max reviews per app, charged per review).
maxReviewsPerAppinteger100Max reviews per app
Reviews returned per app and country (1–500; Apple serves the newest or most helpful 500 at most). Range 1–500.
reviewSortstring"mostrecent"Review order
mostrecent: newest reviews first. mosthelpful: the reviews other users voted most helpful. One of "mostrecent", "mosthelpful".
maxSearchResultsinteger50Max search results
Apps returned per keyword and country (1–200). Range 1–200.
chartSizeinteger100Chart size
Entries returned per chart and country (1–100). Range 1–100.
maxItemsinteger1000Max items
Safety cap on items processed in this run (an item is one app, keyword or chart in one country); the rest is reported as dropped. Range 1–10000.
concurrencyinteger—Concurrency
Items processed in parallel (1–10). Default: 10 for apps (lookups are batched), 2 for reviews and charts, 1 for search. Apple's rate limit applies to the whole run either way. Range 1–10.
includeRawbooleanfalseInclude raw upstream response
Attach Apple's unmodified JSON to each record under raw (larger output).
Example input
{
  "apps": [
    "1232780281"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The input item this record belongs to (the app, keyword, chart, account or post, with its country or mode).
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record (present only when charged).
chargedCountintegerEvents charged
Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
{ code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream codes: auth, insufficient_credits, rate_limit, timeout, network, server, client, invalid_response, not_found.
warningsarrayWarnings
Notes about this record, e.g. a charge that came back short.
rawobjectRaw
Apple's unmodified JSON for the app, review or chart entry (only with includeRaw).
recordTypestringRecord type
app (app details or a search result), review, chart-entry, or summary (one per input item: what was delivered and why it stopped).
positionintegerPosition
Order of this row among the rows of its input (1-based).
countrystring | nullCountry
Two-letter App Store country (storefront) code.
appIdstring | nullApp ID
Numeric App Store app ID (as text).
bundleIdstring | nullBundle ID
The app's bundle identifier, e.g. notion.id.
namestring | nullName
App name in this storefront (chart entries: as listed in the chart).
urlstring | nullApp Store URL
Link to the app's App Store page.
developerstring | nullDeveloper
Developer (artist) name.
developerIdstring | nullDeveloper ID
Numeric App Store developer ID.
developerUrlstring | nullDeveloper page
App Store page of the developer.
sellerNamestring | nullSeller
Legal seller name shown on the App Store.
developerWebsitestring | nullDeveloper website
The developer's own website, when listed.
pricenumber | nullPrice
Price in the storefront currency (0 = free).
currencystring | nullCurrency
ISO currency code of the price.
formattedPricestring | nullFormatted price
Price as shown on the App Store (e.g. Free, $4.99).
isFreeboolean | nullFree
True when the price is 0.
ratingnumber | nullRating
App rows: average user rating (1–5) across all versions. Review rows: the review's star rating (1–5). Summary rows (reviews mode): the app's average rating.
ratingCountinteger | nullRatings
Number of user ratings across all versions.
ratingCurrentVersionnumber | nullRating (current version)
Average rating of the current version.
ratingCountCurrentVersioninteger | nullRatings (current version)
Number of ratings of the current version.
versionstring | nullVersion
App rows: current version. Review rows: the app version the review was written for.
currentVersionReleaseDatestring | nullCurrent version released
ISO timestamp of the current version's release.
releaseNotesstring | nullRelease notes
What's new in the current version.
releaseDatestring | nullRelease date
App rows: ISO timestamp of the first release. Chart rows: release date (YYYY-MM-DD).
descriptionstring | nullDescription
Full App Store description.
sizeBytesinteger | nullSize (bytes)
Download size in bytes.
minimumOsVersionstring | nullMinimum OS
Minimum iOS/macOS version.
primaryGenrestring | nullPrimary genre
Primary App Store genre (category).
primaryGenreIdstring | nullPrimary genre ID
Numeric ID of the primary genre.
genresarrayGenres
All genres of the app (chart rows: the genres the chart lists).
genreIdsarrayGenre IDs
Numeric IDs of the genres.
contentRatingstring | nullContent rating
Age rating, e.g. 4+, 12+, 17+.
advisoriesarrayAdvisories
Content advisories behind the age rating.
languagesarrayLanguages
ISO 639-1 codes of the languages the app supports.
iconUrlstring | nullIcon
URL of the app icon (512 px for apps, 100 px in charts).
screenshotUrlsarrayiPhone screenshots
URLs of the iPhone screenshots.
ipadScreenshotUrlsarrayiPad screenshots
URLs of the iPad screenshots.
appleTvScreenshotUrlsarrayApple TV screenshots
URLs of the Apple TV screenshots.
featuresarrayFeatures
App Store feature flags, e.g. iosUniversal.
supportedDeviceCountintegerSupported devices
Number of device models the app supports.
gameCenterEnabledboolean | nullGame Center
True when the app uses Game Center.
kindstring | nullKind
software (iPhone/iPad) or mac-software.
reviewsDeliveredintegerReviews delivered
Apps mode with includeReviews: review rows delivered for this app and country.
reviewsStopReasonstringReviews stop reason
Apps mode with includeReviews: why the reviews stopped (limit, end, free_plan, budget, error…).
rankintegerRank
Position in the search results or in the chart (1 = first).
searchTermstringSearch keyword
Search rows: the keyword this app was found for.
reviewIdstringReview ID
App Store review ID.
titlestring | nullReview title
Title of the review.
textstring | nullReview text
Body of the review.
authorNamestring | nullReviewer
Reviewer's public nickname.
updatedAtstring | nullReview date
ISO timestamp of the review (or of its last edit).
helpfulVotesinteger | nullHelpful votes
Users who found the review helpful.
totalVotesinteger | nullVotes
Users who voted on the review's helpfulness.
sortstringReview order
mostrecent or mosthelpful.
chartstringChart
top-free, top-paid or top-grossing.
genreIdstring | nullChart genre
Genre ID the chart is limited to (null: all genres).
summarystring | nullChart summary
Short description from the chart feed (genre and top-grossing charts).
appNamestring | nullApp name
Summary rows (reviews mode): name of the app.
termstringKeyword
Summary rows (search mode): the keyword.
resultsFoundintegerResults found
Summary rows (search mode): apps Apple returned.
resultsDeliveredintegerRows delivered
Summary rows: rows delivered (and charged) for this input item.
stopReasonstringStop reason
Summary rows: limit, end, free_plan, budget, aborted, deadline, empty_pages, max_pages or error.
Example record
{
  "input": {
    "mode": "apps",
    "app": "1232780281",
    "country": "us"
  },
  "recordType": "app",
  "appId": "1232780281",
  "bundleId": "notion.id",
  "name": "Notion: Notes, Tasks, AI",
  "url": "https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281",
  "country": "us",
  "developer": "Notion Labs, Incorporated",
  "developerId": "1232780280",
  "developerUrl": "https://apps.apple.com/us/developer/notion-labs-incorporated/id1232780280",
  "sellerName": "Notion Labs, Incorporated",
  "developerWebsite": "https://www.notion.so",
  "price": 0,
  "currency": "USD",
  "formattedPrice": "Free",
  "isFree": true,
  "rating": 4.7752,
  "ratingCount": 90387,
  "ratingCurrentVersion": 4.7752,
  "ratingCountCurrentVersion": 90387,
  "version": "1.7.346",
  "currentVersionReleaseDate": "2026-10-13T04:16:20.000Z",
  "releaseNotes": "Bug fixes and performance improvements.",
  "releaseDate": "2017-09-14T19:07:31.000Z",
  "description": "Notion is an AI-powered all-in-one workspace…",
  "sizeBytes": 485872640,
  "minimumOsVersion": "18.0",
  "primaryGenre": "Productivity",
  "primaryGenreId": "6007",
  "genres": [
    "Productivity",
    "Business"
  ],
  "genreIds": [
    "6007",
    "6000"
  ],
  "contentRating": "4+",
  "advisories": [],
  "languages": [
    "AR",
    "DA",
    "NL",
    "EN",
    "FI",
    "FR",
    "DE"
  ],
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/ba/fa/05/AppIcon/512x512bb.jpg",
  "screenshotUrls": [
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/94/dd/d8/1.png/392x696bb.png"
  ],
  "ipadScreenshotUrls": [],
  "appleTvScreenshotUrls": [],
  "features": [
    "iosUniversal"
  ],
  "supportedDeviceCount": 118,
  "gameCenterEnabled": false,
  "kind": "software",
  "status": "ok",
  "charged": true,
  "chargedEvent": "app",
  "source": "appstore",
  "fetchedAt": "2026-10-14T21:48:14.000Z"
}

FAQ

Questions

Which apps can I look up?
Any app listed in the Apple App Store: pass its numeric ID (1232780281), its bundle ID (notion.id) or its App Store URL. iPhone, iPad and Mac apps are supported; an ID that is not an app (a developer ID, a removed app) comes back as not_found and is not charged.
How many reviews can I get per app?
Apple's public reviews feed serves the newest (or most helpful) 500 reviews per app and country, 50 per page. To collect more, run the same app in several countries: each storefront has its own reviews.
Why did a search fail with a rate_limit error?
Apple throttles keyword search per IP address. The Actor spaces its calls, pauses and tries again; if Apple still refuses, the keyword ends with status error, nothing is charged, and a later run usually succeeds.

Machine-readable

This page for agents