# Apple App Store Scraper: Reviews, Apps & Charts (`fabricalabs/apple-app-store`) Actor

Apple App Store app details (rating, ratings count, price, version, what's new, age rating), keyword search rankings, top free, paid and grossing charts by genre, a developer's apps, and reviews with date and rating filters, no reviewer personal data. Any country.

- **URL**: https://apify.com/fabricalabs/apple-app-store.md
- **Developed by:** [Fabrica Labs](https://apify.com/fabricalabs) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 apps

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Apple App Store Scraper do?

**Apple App Store Scraper** collects **app details**, **keyword search rankings**, **top charts**, **a developer's apps** and **reviews** from the [Apple App Store](https://apps.apple.com), for any country, without a browser. It reads Apple's public iTunes Search API and RSS feeds, at the pace Apple asks for.

It costs **$0.50 per 1,000 apps** and **$0.10 per 1,000 reviews**, with no start fee beyond Apify's tiny run fee. Apps that don't exist, searches with no results and reviews your filters leave out are free. Apify's free plan ($5 of credit every month) covers about 10,000 app details or 50,000 reviews a month.

### What data can you get?

- **App details**: title, bundle ID and numeric app ID, developer and seller, genres, **average rating and number of ratings**, price in the local currency, age rating and the reasons for it, version, release date and last update, **what's new**, description, size, minimum iOS version, languages, supported devices, icon, iPhone and iPad screenshots.
- **Search**: the apps the App Store shows for a keyword, in order, with each app's **position** and full details. Track keyword rankings (ASO) and see who you compete with.
- **Reviews**: rating, title, text, date, app version and helpful votes. **Nothing about the reviewer**: no name, nickname, profile link or review ID. Filter by rating or date range: reviews left out are not charged.
- **A developer's apps**: up to 200 apps of a developer, Mac apps included, from the developer's ID or App Store link.
- **Top charts**: top free, top paid or top grossing, for all apps and games or one genre (Games, Productivity, Games: Puzzle...), up to 100 apps per country, each with full details.

Every mode works for several countries in one run.

### Why use this App Store scraper?

- **No reviewer personal data.** Reviews come with rating, title, text, date, app version and votes, and nothing that identifies their author, so there is nothing to scrub before you analyse them.
- **You only pay for what you keep.** Reviews your rating or date filters leave out are never charged, and with most-recent order the scraper stops paging as soon as reviews get older than your start date.
- **Full details everywhere.** Search results, chart entries and developer lists carry the same complete app record as the details mode, at the same price.
- **Fast where it can be.** Up to 200 apps are looked up in a single request, so tracking 1,000 apps takes seconds, not minutes.
- **A good citizen.** Requests are paced to Apple's published limit of about 20 per minute, and the scraper only switches IP after Apple says no, never to go faster.
- **Safe restarts.** If the platform moves your run to another server, it resumes where it stopped, without duplicate rows or double charges.
- **Same input as our Google Play Scraper.** `mode`, `searchTerms`, `appIds`, `developerIds`, `maxResults`, `country`, `countries`, `reviewScores`, `reviewsSince` and `reviewsUntil` have the same names in both, so one workflow covers both stores.

### How to use Apple App Store Scraper

1. Click **Try for free** (you need a free Apify account; no credit card).
2. Pick what to collect: app details, search results, reviews, a developer's apps or top charts.
3. Add app IDs, bundle IDs or App Store links (e.g. `310633997`, `com.spotify.client`), keywords, developer IDs, or a chart and genre.
4. Choose one or several countries and, for reviews, the order and filters you need.
5. Click **Start** and download the data as JSON, CSV or Excel, or save the input as a task and schedule it to track rankings, ratings and new reviews over time.

### Use cases

- **ASO keyword tracking**: see where your app and your competitors rank for the keywords that matter, country by country.
- **Competitor monitoring**: follow ratings, prices, versions and release notes of any app.
- **Review analysis**: collect reviews for sentiment, bug reports and feature requests, without personal data.
- **Market research**: compare charts, genres and prices across countries.

### Input examples

App details from IDs, bundle IDs or App Store links:

```json
{ "mode": "details", "appIds": ["310633997", "com.spotify.client", "https://apps.apple.com/us/app/instagram/id389801252"] }
```

Keyword rankings in the UK and Germany:

```json
{ "mode": "search", "searchTerms": ["photo editor", "vpn"], "countries": ["gb", "de"], "maxResults": 200 }
```

Last week's one- and two-star reviews, newest first:

```json
{ "mode": "reviews", "appIds": ["310633997"], "reviewSort": "mostRecent", "reviewsSince": "7 days", "reviewScores": [1, 2], "maxResults": 500 }
```

The same app's reviews in five countries (up to 500 each):

```json
{ "mode": "reviews", "appIds": ["com.spotify.client"], "countries": ["us", "gb", "ca", "au", "ie"], "maxResults": 500 }
```

A developer's apps, by ID or developer link:

```json
{ "mode": "developer", "developerIds": ["https://apps.apple.com/us/developer/google/id281956209"] }
```

The top grossing games in Japan, with English texts:

```json
{ "mode": "topCharts", "chartCollection": "topGrossing", "chartCategory": "games", "country": "jp", "language": "en_us" }
```

### Output examples

A search result, from a real run (long texts and lists shortened):

```json
{
  "searchTerm": "photo editor",
  "position": 2,
  "appId": "com.magicv.AirBrush",
  "trackId": 998411110,
  "title": "Airbrush: Face Photo Editor",
  "developer": "PIXOCIAL TECHNOLOGY (SINGAPORE) PTE. LTD.",
  "developerId": 1533253001,
  "genre": "Photo & Video",
  "categories": ["Photo & Video", "Graphics & Design"],
  "score": 4.79643,
  "ratings": 203083,
  "price": 0.0,
  "free": true,
  "currency": "USD",
  "contentRating": "12+",
  "version": "8.17.0",
  "updated": "2026-09-26T07:54:25Z",
  "released": "2015-10-08T05:51:37Z",
  "url": "https://apps.apple.com/us/app/airbrush-face-photo-editor/id998411110",
  "country": "us",
  "scrapedAt": "2026-09-30T11:35:51Z"
}
```

App details, from a real run (long texts and lists shortened):

```json
{
  "appId": "net.whatsapp.WhatsApp",
  "trackId": 310633997,
  "title": "WhatsApp Messenger",
  "developer": "WhatsApp Inc.",
  "developerId": 310634000,
  "developerUrl": "https://apps.apple.com/us/developer/whatsapp-inc/id310634000",
  "sellerName": "WhatsApp Inc.",
  "sellerUrl": "http://www.whatsapp.com/",
  "genre": "Social Networking",
  "genreId": 6005,
  "categories": ["Social Networking", "Utilities"],
  "categoryIds": [6005, 6002],
  "score": 4.68374,
  "ratings": 18687721,
  "price": 0.0,
  "free": true,
  "currency": "USD",
  "formattedPrice": "Free",
  "contentRating": "12+",
  "advisories": ["Infrequent/Mild Medical/Treatment Information", "Infrequent/Mild Horror/Fear Themes", "..."],
  "version": "26.38.74",
  "updated": "2026-09-28T15:54:35Z",
  "released": "2009-05-04T02:43:49Z",
  "recentChanges": "We update the app regularly to fix bugs, optimize performance and improve the experience...",
  "description": "WhatsApp from Meta is a free messaging and calling app used by over 2 billion people...",
  "minimumOsVersion": "15.1",
  "fileSizeBytes": 385214464,
  "languages": ["AR", "BN", "CA", "..."],
  "supportedDevices": ["MacDesktop-MacDesktop", "iPhone5s-iPhone5s", "..."],
  "features": ["iosUniversal"],
  "gameCenterEnabled": false,
  "kind": "software",
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/54/08/2d/.../512x512bb.jpg",
  "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/d8/95/88/.../320x480bb.jpg", "..."],
  "ipadScreenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/9a/1e/81/.../360x480bb.jpg", "..."],
  "url": "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
  "country": "us",
  "scrapedAt": "2026-09-30T11:36:02Z"
}
```

A review, from a real run:

```json
{
  "appId": "net.whatsapp.WhatsApp",
  "trackId": 310633997,
  "appTitle": "WhatsApp Messenger",
  "score": 5,
  "title": "WhatsApp",
  "text": "I need to update my chat",
  "date": "2026-09-28T13:34:56Z",
  "appVersion": "26.37.76",
  "voteSum": 0,
  "voteCount": 0,
  "country": "us",
  "scrapedAt": "2026-09-30T11:36:23Z"
}
```

A chart entry, from a real run (developer rows look the same, with `developerId` first instead of the chart fields; every app field of the details mode follows):

```json
{
  "chartCollection": "topGrossing",
  "chartCategory": 6014,
  "chartCategoryName": "Games",
  "position": 1,
  "appId": "com.scopely.monopolygo",
  "trackId": 1621328561,
  "title": "MONOPOLY GO!",
  "developer": "Scopely, Inc.",
  "score": 4.79775,
  "ratings": 3842481,
  "price": 0.0,
  "genre": "Games",
  "version": "1.77.1",
  "url": "https://apps.apple.com/us/app/monopoly-go/id1621328561",
  "country": "us",
  "scrapedAt": "2026-09-30T11:37:29Z"
}
```

An app ID the App Store doesn't know becomes a free row that says what to fix:

```json
{ "trackId": 999999999999, "country": "us", "error": "The App Store of country us has no app with this ID: it may not exist, or not be sold there. Check the ID, or try another country." }
```

### How much does it cost to scrape the App Store?

| What you get | Price |
|---|---|
| Each app (app details, search result, developer app, chart entry) | $0.0005 ($0.50 per 1,000) |
| Each review | $0.0001 ($0.10 per 1,000) |
| Apps not found, searches or charts with no results, reviews left out by your filters | Free |

Apify adds a tiny start fee of $0.00005 per run, which also buys the run's first seconds of compute. There are no proxy or compute charges on top.

Examples: the 500 newest reviews of an app in five countries cost $0.25; tracking the details of 100 competitor apps every week costs about $0.22 a month; the top 100 free apps in one country cost $0.05.

### Good to know

- **500 reviews per app and country.** Apple's review feed gives at most 10 pages of 50 reviews for each app in each country, newest first or most helpful first. Reviews differ from one country's App Store to another (in our checks, the UK and Australia shared none of the 50 newest WhatsApp reviews), so adding countries is how you get more.
- **Speed follows Apple's limit.** Apple asks for no more than about 20 requests a minute, so the scraper makes one request every 3 seconds: 1,000 app details take 5 to 7 requests, 500 reviews of one app take 11 requests (about 35 seconds), a search or a developer's list takes 1, a chart 2.
- **No reviewer data, by design.** The reviewer's nickname, profile link and the review's ID are never read.
- **Keep the default Apify proxy for reviews.** Apple sometimes serves one IP a review feed cut short after its first page. The scraper notices and asks again through a new proxy IP, which needs a proxy: without one, a few apps may stop at 50 reviews.
- **Apple's review feed runs behind the App Store.** In our checks its newest reviews were about two days old, and for the busiest apps the 500 most recent reviews covered about a day and a half (Spotify in the US). For regular tracking, use a window a little longer than your schedule and drop the few repeats by matching `appId`, `country`, `date` and `title`.
- `score` is the average in the chosen country; it is empty for apps nobody has rated yet (Apple says 0).
- A search returns up to 200 apps (182 for "photo editor" in our checks). Apple leaves a few apps out of each answer, so the scraper asks for more than `maxResults` and keeps the first ones. Charts hold up to 100 apps.
- `countries` repeats every input in each country (up to 50 per run); `country` still works for one.
- `language` sets the language of titles, descriptions and release notes where that App Store offers it, e.g. `en_us` in Germany or Japan, `es_mx` in the US; other codes Apple knows are ignored, and codes it doesn't know are refused. Without it, each country's own language is used.
- `chartCategory` takes a genre name (`games`, `productivity`, `photo-video`, `games-puzzle`...) or Apple's genre ID (6014). Unknown genres are refused, because Apple would silently answer with the overall chart.
- A developer's list includes their Mac apps (`kind` is `mac-software`).
- Apps not sold in the chosen country, unknown developers and country codes without an App Store become free rows with a clear error.

### FAQ

**Does it collect reviewer names?** No, by design: only the review itself.

**How many reviews can I get?** Up to 500 per app in each country, which is all Apple's feed shows. Run several countries to get more.

**Which countries?** Any App Store country, by its two-letter code (`us`, `gb`, `de`, `jp`...).

**Can I use App Store links?** Yes, for apps (`https://apps.apple.com/us/app/.../id310633997`) and developers (`https://apps.apple.com/us/developer/.../id281956209`). Bundle IDs work for apps too.

**Why are there fewer than 200 apps for my search?** Apple leaves a few apps out of each search answer; the scraper returns every app Apple gives, up to `maxResults`.

**How do I get only new reviews every day?** Sort by most recent, set `reviewsSince` to `3 days` and schedule the task daily. Apple's feed runs about two days behind, so a one-day window can come back empty; paging stops at the first older review, so you pay only for the reviews in the window. Match rows on `appId`, `country`, `date` and `title` to drop the repeats of overlapping days.

**Do I need an Apple account?** No.

**Can AI agents use it?** Yes. Through the Apify MCP server, your agent can call it as a tool with app IDs, keywords or a chart.

**Something doesn't work?** Open an issue on the Issues tab and include a link to your run.

**Is it legal to collect this data?** The Actor reads Apple's public iTunes Search API and RSS feeds within the rate Apple asks for, and collects no personal data about reviewers. Check the terms that apply to your use case.

### Other Actors by Fabrica Labs

- [Google Trends Scraper](https://apify.com/fabricalabs/google-trends-fast): interest over time, by region and city, related queries and topics for any keyword.
- [Google Trends Trending Now Scraper](https://apify.com/fabricalabs/google-trends-trending-now): what is trending right now in any country, with search volume, growth and news.
- [Woolworths Scraper](https://apify.com/fabricalabs/woolworths-au-products): prices, specials and nutrition from Woolworths Australia.
- [ALDI Scraper](https://apify.com/fabricalabs/aldi-products): prices, Special Buys and product details from ALDI Australia, the UK and Ireland.
- [Google Play Scraper](https://apify.com/fabricalabs/google-play-apps): app details, keyword rankings, top charts and reviews without personal data.

This Actor uses Apple's public iTunes Search API and RSS feeds. It is not affiliated with or endorsed by Apple. App Store is a trademark of Apple Inc.

# Changelog

This Actor's version history is a separate document: https://apify.com/fabricalabs/apple-app-store/changelog.md

# Actor input Schema

## `mode` (type: `string`):

What to collect. App details: every public field of each app. Search: the apps the App Store shows for keywords, with positions. Reviews: rating, title, text, date and app version, without reviewer data. A developer's apps, or a top chart (free, paid or grossing) per genre and country, each app with its position.

## `appIds` (type: `array`):

For details and reviews. Apple's numeric app ID (310633997), the bundle ID (com.spotify.client) or the App Store link (https://apps.apple.com/us/app/whatsapp-messenger/id310633997). Up to 200 apps are looked up in one request, so long lists are fast.

## `searchTerms` (type: `array`):

For search mode. Each term returns the apps the App Store shows for it, up to 200, in order, with their position.

## `developerIds` (type: `array`):

For a developer's apps. The developer's numeric ID (281956209) or App Store developer link (https://apps.apple.com/us/developer/google/id281956209). Every app row carries developerId, so details or search results lead you to it.

## `chartCollection` (type: `string`):

For top charts: which ranking. Apple's charts list up to 100 apps per genre and country.

## `chartCategory` (type: `string`):

For top charts: empty for all apps and games, or a genre such as games, productivity, photo-video, health-fitness, social-networking, finance or shopping, a game genre such as games-puzzle or games-action, or Apple's genre ID such as 6014.

## `maxResults` (type: `integer`):

Results per input in each country. Apple returns at most 200 apps per search or developer, 100 per chart and 500 reviews per app and country. Not used by app details.

## `country` (type: `string`):

Two-letter code of the App Store country, e.g. us, gb, de, jp. Prices, rankings, reviews and availability depend on it.

## `countries` (type: `array`):

Optional. Two-letter codes (us, gb, de) to run every input in each of these App Stores; replaces Country when set. Up to 50. Reviews differ per country, so this is also how to get more than 500 reviews of one app.

## `language` (type: `string`):

Optional. Language of titles, descriptions and release notes, as a code like en\_us, es\_mx or ja\_jp. Empty: each country's own language. Apple uses it where that App Store offers the language (en\_us in Germany or Japan, es\_mx in the US), ignores other known codes and refuses unknown ones. Reviews stay as written.

## `reviewSort` (type: `string`):

For reviews: which ones come first. With Most recent, Reviews since stops the paging as soon as older reviews arrive.

## `reviewScores` (type: `array`):

Optional. Star ratings to keep, e.g. \[1, 2] for the unhappy reviews. Leave empty for all. Reviews left out are not charged.

## `reviewsSince` (type: `string`):

Optional. Only reviews written or edited on or after this date (2026-09-01), or within this period back from now (7 days). With Most recent, the Actor stops as soon as it reaches older reviews, saving time and money.

## `reviewsUntil` (type: `string`):

Optional. Only reviews up to this date, inclusive (2026-09-15), or up to this long ago (1 day).

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy is the cheapest option. Either way, requests are paced to Apple's limit of about 20 a minute; switch to residential only if your runs get refused.

## Actor input object example

```json
{
  "mode": "details",
  "appIds": [
    "310633997",
    "com.spotify.client"
  ],
  "searchTerms": [
    "photo editor"
  ],
  "developerIds": [
    "281956209"
  ],
  "chartCollection": "topFree",
  "maxResults": 100,
  "country": "us",
  "reviewSort": "mostRecent",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `searchResults` (type: `string`):

Search results, a developer's apps or a top chart, each app with its position in the list.

## `appDetails` (type: `string`):

Rating, ratings count, price, genre, age rating, version, last update and what's new for each app.

## `reviews` (type: `string`):

Reviews with rating, title, text, date, app version and helpful votes; nothing about their authors.

## `results` (type: `string`):

Every field of every row, including descriptions, screenshots, languages and supported devices.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "appIds": [
        "310633997",
        "com.spotify.client"
    ],
    "searchTerms": [
        "photo editor"
    ],
    "developerIds": [
        "281956209"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabricalabs/apple-app-store").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "appIds": [
        "310633997",
        "com.spotify.client",
    ],
    "searchTerms": ["photo editor"],
    "developerIds": ["281956209"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabricalabs/apple-app-store").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "appIds": [
    "310633997",
    "com.spotify.client"
  ],
  "searchTerms": [
    "photo editor"
  ],
  "developerIds": [
    "281956209"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabricalabs/apple-app-store --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fabricalabs/apple-app-store"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ifNdOeMWwTQoMfXRo/builds/kMXsRWSheTbECjVJB/openapi.json
