# App Store Scraper – App Details & Top Charts (`sfoln/app-store-scraper`)

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.

- Family: App stores
- Categories: Ecommerce, Developer tools, Automation
- Store: https://apify.com/sfoln/app-store-scraper (Markdown: https://apify.com/sfoln/app-store-scraper.md)
- JSON: https://www.sfoln.com/actors/app-store-scraper.json
- MCP: https://mcp.apify.com?tools=sfoln/app-store-scraper
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~app-store-scraper/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~app-store-scraper/runs

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 per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| App Store app (`app`) | $0.001 | $1 / 1,000 | One 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,000 | One customer review row (rating, title, text, version, author name, date). |
| Top chart entry (`chart-entry`) | $0.0005 | $0.50 / 1,000 | One app of a top chart (rank, app ID, name, developer, link). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
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 client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/app-store-scraper"
    }
  }
}
```

Example prompt: Get the App Store details (rating, ratings count, version, price) of app 1232780281 in the US and UK stores.

## Input

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.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `mode` | string | `"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"`. |
| `apps` | array | — | 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). |
| `searchTerms` | array | — | 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. |
| `charts` | array | — | Charts: For the charts mode: which top charts to fetch (default top-free). |
| `chartGenre` | string | — | Chart genre: Optional, charts mode: limit the charts to one genre, by App Store genre ID (6014) or name (Games, Productivity, Finance, Health & Fitness…). |
| `countries` | array | — | 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. |
| `includeReviews` | boolean | `false` | Include reviews (apps mode): In the apps mode, also return each app's customer reviews (up to Max reviews per app, charged per review). |
| `maxReviewsPerApp` | integer | `100` | Max reviews per app: Reviews returned per app and country (1–500; Apple serves the newest or most helpful 500 at most). |
| `reviewSort` | string | `"mostrecent"` | Review order: mostrecent: newest reviews first. mosthelpful: the reviews other users voted most helpful. One of `"mostrecent"`, `"mosthelpful"`. |
| `maxSearchResults` | integer | `50` | Max search results: Apps returned per keyword and country (1–200). |
| `chartSize` | integer | `100` | Chart size: Entries returned per chart and country (1–100). |
| `maxItems` | integer | `1000` | Max 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. |
| `concurrency` | integer | — | 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. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach Apple's unmodified JSON to each record under raw (larger output). |

Example input:

```json
{
  "apps": [
    "1232780281"
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The input item this record belongs to (the app, keyword, chart, account or post, with its country or mode). |
| `status` | string | Status: ok \| not_found \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan \| skipped_unmetered |
| `charged` | boolean | Charged: Whether this record incurred a pay-per-event charge. |
| `chargedEvent` | string | Charged event: Pay-per-event event charged for this record (present only when charged). |
| `chargedCount` | integer | Events charged: Events actually charged when the charge came back short of the requested count (present only then; a warning explains it). |
| `source` | string | Source: Upstream data source. |
| `fetchedAt` | string | Fetched at: ISO timestamp. |
| `error` | object | Error: { 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. |
| `warnings` | array | Warnings: Notes about this record, e.g. a charge that came back short. |
| `raw` | object | Raw: Apple's unmodified JSON for the app, review or chart entry (only with includeRaw). |
| `recordType` | string | Record type: app (app details or a search result), review, chart-entry, or summary (one per input item: what was delivered and why it stopped). |
| `position` | integer | Position: Order of this row among the rows of its input (1-based). |
| `country` | string | null | Country: Two-letter App Store country (storefront) code. |
| `appId` | string | null | App ID: Numeric App Store app ID (as text). |
| `bundleId` | string | null | Bundle ID: The app's bundle identifier, e.g. notion.id. |
| `name` | string | null | Name: App name in this storefront (chart entries: as listed in the chart). |
| `url` | string | null | App Store URL: Link to the app's App Store page. |
| `developer` | string | null | Developer: Developer (artist) name. |
| `developerId` | string | null | Developer ID: Numeric App Store developer ID. |
| `developerUrl` | string | null | Developer page: App Store page of the developer. |
| `sellerName` | string | null | Seller: Legal seller name shown on the App Store. |
| `developerWebsite` | string | null | Developer website: The developer's own website, when listed. |
| `price` | number | null | Price: Price in the storefront currency (0 = free). |
| `currency` | string | null | Currency: ISO currency code of the price. |
| `formattedPrice` | string | null | Formatted price: Price as shown on the App Store (e.g. Free, $4.99). |
| `isFree` | boolean | null | Free: True when the price is 0. |
| `rating` | number | null | Rating: 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. |
| `ratingCount` | integer | null | Ratings: Number of user ratings across all versions. |
| `ratingCurrentVersion` | number | null | Rating (current version): Average rating of the current version. |
| `ratingCountCurrentVersion` | integer | null | Ratings (current version): Number of ratings of the current version. |
| `version` | string | null | Version: App rows: current version. Review rows: the app version the review was written for. |
| `currentVersionReleaseDate` | string | null | Current version released: ISO timestamp of the current version's release. |
| `releaseNotes` | string | null | Release notes: What's new in the current version. |
| `releaseDate` | string | null | Release date: App rows: ISO timestamp of the first release. Chart rows: release date (YYYY-MM-DD). |
| `description` | string | null | Description: Full App Store description. |
| `sizeBytes` | integer | null | Size (bytes): Download size in bytes. |
| `minimumOsVersion` | string | null | Minimum OS: Minimum iOS/macOS version. |
| `primaryGenre` | string | null | Primary genre: Primary App Store genre (category). |
| `primaryGenreId` | string | null | Primary genre ID: Numeric ID of the primary genre. |
| `genres` | array | Genres: All genres of the app (chart rows: the genres the chart lists). |
| `genreIds` | array | Genre IDs: Numeric IDs of the genres. |
| `contentRating` | string | null | Content rating: Age rating, e.g. 4+, 12+, 17+. |
| `advisories` | array | Advisories: Content advisories behind the age rating. |
| `languages` | array | Languages: ISO 639-1 codes of the languages the app supports. |
| `iconUrl` | string | null | Icon: URL of the app icon (512 px for apps, 100 px in charts). |
| `screenshotUrls` | array | iPhone screenshots: URLs of the iPhone screenshots. |
| `ipadScreenshotUrls` | array | iPad screenshots: URLs of the iPad screenshots. |
| `appleTvScreenshotUrls` | array | Apple TV screenshots: URLs of the Apple TV screenshots. |
| `features` | array | Features: App Store feature flags, e.g. iosUniversal. |
| `supportedDeviceCount` | integer | Supported devices: Number of device models the app supports. |
| `gameCenterEnabled` | boolean | null | Game Center: True when the app uses Game Center. |
| `kind` | string | null | Kind: software (iPhone/iPad) or mac-software. |
| `reviewsDelivered` | integer | Reviews delivered: Apps mode with includeReviews: review rows delivered for this app and country. |
| `reviewsStopReason` | string | Reviews stop reason: Apps mode with includeReviews: why the reviews stopped (limit, end, free_plan, budget, error…). |
| `rank` | integer | Rank: Position in the search results or in the chart (1 = first). |
| `searchTerm` | string | Search keyword: Search rows: the keyword this app was found for. |
| `reviewId` | string | Review ID: App Store review ID. |
| `title` | string | null | Review title: Title of the review. |
| `text` | string | null | Review text: Body of the review. |
| `authorName` | string | null | Reviewer: Reviewer's public nickname. |
| `updatedAt` | string | null | Review date: ISO timestamp of the review (or of its last edit). |
| `helpfulVotes` | integer | null | Helpful votes: Users who found the review helpful. |
| `totalVotes` | integer | null | Votes: Users who voted on the review's helpfulness. |
| `sort` | string | Review order: mostrecent or mosthelpful. |
| `chart` | string | Chart: top-free, top-paid or top-grossing. |
| `genreId` | string | null | Chart genre: Genre ID the chart is limited to (null: all genres). |
| `summary` | string | null | Chart summary: Short description from the chart feed (genre and top-grossing charts). |
| `appName` | string | null | App name: Summary rows (reviews mode): name of the app. |
| `term` | string | Keyword: Summary rows (search mode): the keyword. |
| `resultsFound` | integer | Results found: Summary rows (search mode): apps Apple returned. |
| `resultsDelivered` | integer | Rows delivered: Summary rows: rows delivered (and charged) for this input item. |
| `stopReason` | string | Stop reason: Summary rows: limit, end, free_plan, budget, aborted, deadline, empty_pages, max_pages or error. |

Example record:

```json
{
  "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

**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.


## Related

- [Google Play Scraper – App Details & Reviews](https://www.sfoln.com/actors/google-play-scraper.md) (`sfoln/google-play-scraper`)
- [Website Contact Details Scraper](https://www.sfoln.com/actors/company-contacts-finder.md) (`sfoln/company-contacts-finder`)
- [URL Metadata & Open Graph Extractor](https://www.sfoln.com/actors/url-metadata.md) (`sfoln/url-metadata`)
- [Brand Monitoring – X, Reddit, News & Bluesky](https://www.sfoln.com/actors/brand-mentions-monitor.md) (`sfoln/brand-mentions-monitor`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
