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

Get App Store app details, top charts by country and category, keyword search rankings for ASO, developer portfolios and optional customer reviews via Apple's public iTunes Search/Lookup API and RSS feeds. No login, no proxies.

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

## Pricing

from $1.00 / 1,000 app results

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

## Apple App Store Scraper: Apps, Top Charts, ASO & Reviews

Scrape the **Apple App Store** into clean datasets for app-market research and ASO: **top charts** by country and category, **keyword search rankings**, full **app details**, a developer's whole **app portfolio**, and optional **customer reviews**. It uses only Apple's public endpoints: the iTunes Search & Lookup API and the official RSS feeds. No login, no proxies, no browser. **$1 per 1,000 app records.**

- ✅ **Top charts**: Top Free, Top Paid, Top Grossing (iPhone and iPad), New Apps, in any storefront and any of 25 categories
- ✅ **ASO keyword ranks**: the position of every app for your keywords, plus `keyword_rank` rows for tracked apps that dropped out
- ✅ **Rank tracking**: `previous_rank`, `rank_change` and `is_new_entry` compared with your last run
- ✅ **App lookup** by App Store URL, numeric ID or bundle ID, and **developer portfolios**
- ✅ Full metadata: rating and rating count (overall and current version), price, version, release notes, size, genres, languages, screenshots, content rating, plus `aso` stats
- ✅ **Customer reviews** (optional), with an **only new reviews** monitor for daily alerts
- ✅ Respects Apple's ~20 calls/minute limit and batches lookups (100 apps per call)

### Input example

```json
{
  "countries": [
    "us",
    "gb",
    "de"
  ],
  "charts": [
    "top-free",
    "top-grossing"
  ],
  "chartGenreIds": [
    "6014"
  ],
  "chartLimit": 50,
  "searchTerms": [
    "habit tracker",
    "language learning"
  ],
  "searchLimit": 25,
  "trackAppIds": [
    "570060128"
  ],
  "appIds": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128",
    "com.burbn.instagram"
  ],
  "developerIds": [
    "https://apps.apple.com/us/developer/duolingo/id570060151"
  ],
  "includeReviews": true,
  "maxReviewsPerApp": 100,
  "onlyNewReviews": true
}
```

Every chart, keyword and lookup runs once per country. Category `6014` is Games.

### Output example (real run)

A chart entry (`record_type: chart_entry`; search results look the same with `search_term` instead of `chart`). Long lists are shortened here:

```json
{
  "record_type": "chart_entry",
  "chart": "top-free",
  "chart_genre_id": null,
  "rank": 1,
  "previous_rank": 1,
  "rank_change": 0,
  "is_new_entry": false,
  "app_id": "407558537",
  "bundle_id": "com.capitalone.enterprisemobilebanking",
  "name": "Capital One Mobile",
  "developer": "Capital One",
  "developer_id": "339644101",
  "developer_url": "https://apps.apple.com/us/developer/capital-one/id339644101",
  "seller_name": "Capital One Services, LLC",
  "seller_url": "https://www.capitalone.com/applications/mobile/",
  "country": "us",
  "price": 0,
  "currency": "USD",
  "formatted_price": "Free",
  "is_free": true,
  "rating": 4.846,
  "rating_count": 11213915,
  "rating_current_version": 4.846,
  "rating_count_current_version": 11213915,
  "version": "6.55.1",
  "current_version_release_date": "2026-10-05T15:22:57Z",
  "release_date": "2010-12-13T08:00:00Z",
  "release_notes": "Thanks for using Capital One Mobile. We make regular updates to our app to ensure your experience…",
  "primary_genre": "Finance",
  "primary_genre_id": 6015,
  "genres": [
    "Finance"
  ],
  "content_rating": "4+",
  "advisories": [],
  "minimum_os_version": "17.0",
  "size_bytes": 421811200,
  "languages": [
    "EN",
    "ES"
  ],
  "features": [
    "iosUniversal"
  ],
  "supported_devices_count": 130,
  "is_game_center_enabled": false,
  "icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/29/54/f0/2954f0a2-d9a9-24ca-7cca-28bb9a71db3c/AppIcon-0-0-1x_U007epad-0-1-P3-85-220.png/512x512bb.jpg",
  "screenshot_urls": [
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/c7/fb/61/c7fb61d2-58d1-c4e2-2d51-1bbcad5282d1/b86453f3-3aaf-462f-8ee7-b24ee004a610_capone_appstore_02_updatedJuly2701_5.5.jpg/392x696bb.jpg",
    "…"
  ],
  "ipad_screenshot_urls": [
    "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/0d/91/fe/0d91fef3-e333-1d78-2c4b-9bf031445b91/6229ac2f-1b2d-4977-b10c-3babc540d3c0_Capone_iPad_AppStore_updatedJul2701.jpeg.jpg/576x768bb.jpg",
    "…"
  ],
  "app_url": "https://apps.apple.com/us/app/capital-one-mobile/id407558537",
  "description": "What’s on the Capital One Mobile app? All of your accounts, and so much more.\n\nWhether you’re out in the world or feeling right at home, you can manage your…",
  "aso": {
    "name_length": 18,
    "description_length": 1733,
    "screenshot_count": 8,
    "ipad_screenshot_count": 8,
    "language_count": 2
  },
  "scraped_at": "2026-10-21T19:03:28Z"
}
```

A review (`record_type: review`, only when reviews are enabled):

```json
{
  "record_type": "review",
  "app_id": "570060128",
  "name": "Duolingo: Learn Languages",
  "country": "us",
  "review_id": "14689728897",
  "rating": 4,
  "review_title": "Love it",
  "review_text": "The app is really good and I love the way it is built, but the only thing is that I can spend so much time doing it, but then when it comes time to talk to my Italian family, I feel so in prepared! So sometimes I think I feel like I am learning a lot, but actually I am just doing a bunch of work. Other than that, the app is great and super fun!",
  "author": "#!£€¥|\\_#{}<",
  "app_version": "7.145.0",
  "vote_sum": 0,
  "vote_count": 0,
  "reviewed_at": "2026-10-20T08:19:14-07:00",
  "scraped_at": "2026-10-21T19:04:37Z"
}
```

Use the **Apps, charts & ranks** and **Reviews** dataset views, or export JSON, CSV or Excel. The `OUTPUT` record lists each task (chart, keyword, lookup) with its record count and any errors.

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| App result (chart entry, search result, keyword rank, app or developer app) | **$0.001** ($1 per 1,000) |
| Review result (only with reviews enabled) | $0.00015 ($0.15 per 1,000) |
| Actor start (per run) | $0.002 |

The default run (Top Free US top 25, one keyword, one app) returns 35 records for about $0.037. Tracking 20 keywords × 3 countries × top 25 every day costs about $1.50 per day. Failed lookups are never charged, and you can set a maximum cost per run.

### Use cases

- **ASO keyword tracking**: daily positions for your app and your competitors, with rank changes.
- **Top-chart monitoring** by country and category to spot rising apps and new entries.
- **Competitor research**: ratings, rating counts, release cadence (version dates and notes) and pricing.
- **Lead generation**: developers and seller websites of apps in a category.
- **Review mining** for product feedback, sentiment analysis and support alerts.

### FAQ

**Which data sources are used?** Apple's public iTunes Search API and Lookup API (`itunes.apple.com/search` and `/lookup`), the official RSS top-chart feeds, and the public customer-reviews RSS feed. Apple documents a limit of about 20 Search/Lookup calls per minute, and the Actor stays below it (minimum 3 s between calls).

**How many reviews can I get?** Apple's reviews feed serves the latest 500 reviews per app and country (10 pages of 50). For more history, schedule the Actor with **Only new reviews** so every review is captured as it appears.

**How does rank tracking work?** Chart and keyword ranks are saved in a named key-value store (`stateStoreName`). The next run adds `previous_rank`, `rank_change` (positive means moved up) and `is_new_entry`. Use a separate store name for each tracker.

**Why is an app missing from a country?** Apps can be unavailable in some storefronts. Failed lookups are listed in `OUTPUT.errors` and aren't charged.

**Google Play?** Not included. This Actor covers the Apple App Store only.

# Actor input Schema

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

Two-letter store country codes, e.g. <code>us</code>, <code>gb</code>, <code>de</code>, <code>pl</code>, <code>jp</code>. Every chart, search and lookup runs once per country.

## `charts` (type: `array`):

Apple's official RSS top charts. Each chart entry is enriched with full app metadata through the Lookup API.

## `chartGenreIds` (type: `array`):

Limit charts to App Store categories. Leave empty for the overall chart. Each category is a separate chart request.

## `chartLimit` (type: `integer`):

Number of chart positions to return (Apple serves up to 100).

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

App Store search keywords. Each result gets its search rank, so you can track keyword positions over time.

## `searchLimit` (type: `integer`):

How many search results to keep per keyword and country (max 200).

## `trackAppIds` (type: `array`):

Optional app IDs or App Store URLs. When a tracked app is missing from a keyword's results, the Actor writes a <code>keyword_rank</code> row with <code>rank: null</code>, so your rank tracker sees the drop.

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

App Store URLs (<code>https://apps.apple.com/us/app/duolingo/id570060128</code>), numeric app IDs (<code>570060128</code>) or bundle IDs (<code>com.duolingo.DuolingoMobile</code>).

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

Developer page URLs (<code>https://apps.apple.com/us/developer/duolingo/id570060131</code>) or numeric developer IDs.

## `includeDescription` (type: `boolean`):

Turn off for a smaller dataset.

## `includeReviews` (type: `boolean`):

Fetch the latest customer reviews from Apple's public reviews RSS feed (up to 500 per app and country, charged per review).

## `reviewsScope` (type: `string`):

Which apps get reviews.

## `maxReviewsPerApp` (type: `integer`):

Apple's reviews feed serves at most 10 pages of 50 reviews per app and country.

## `reviewsSort` (type: `string`):

Most recent is best for monitoring, most helpful for research.

## `onlyNewReviews` (type: `boolean`):

Remember the reviews already delivered and output only new ones. Schedule the Actor daily for review alerts.

## `trackRankChanges` (type: `boolean`):

Store the last chart and keyword ranks, and add <code>previous_rank</code>, <code>rank_change</code> (positive means moved up) and <code>is_new_entry</code> to every chart and search row.

## `stateStoreName` (type: `string`):

Named key-value store for rank history and seen reviews. Use a different name for each independent tracker.

## `apiIntervalSecs` (type: `number`):

Apple allows about 20 Search/Lookup calls per minute, so the minimum is 3 s. Lookups are batched (100 apps per call).

## Actor input object example

```json
{
  "countries": [
    "us"
  ],
  "charts": [
    "top-free"
  ],
  "chartLimit": 25,
  "searchTerms": [
    "habit tracker"
  ],
  "searchLimit": 10,
  "appIds": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "includeDescription": true,
  "includeReviews": false,
  "reviewsScope": "lookup",
  "maxReviewsPerApp": 100,
  "reviewsSort": "mostrecent",
  "onlyNewReviews": false,
  "trackRankChanges": true,
  "stateStoreName": "apple-app-store-scraper-state",
  "apiIntervalSecs": 3.2
}
```

# Actor output Schema

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

Chart entries, search results, keyword ranks and app lookups with full metadata.

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

Customer reviews (when enabled).

## `summary` (type: `string`):

Records per task, failed tasks with error messages.

# 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 = {
    "countries": [
        "us"
    ],
    "charts": [
        "top-free"
    ],
    "chartLimit": 25,
    "searchTerms": [
        "habit tracker"
    ],
    "searchLimit": 10,
    "appIds": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sysco32/apple-app-store-scraper").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 = {
    "countries": ["us"],
    "charts": ["top-free"],
    "chartLimit": 25,
    "searchTerms": ["habit tracker"],
    "searchLimit": 10,
    "appIds": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"],
}

# Run the Actor and wait for it to finish
run = client.actor("sysco32/apple-app-store-scraper").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 '{
  "countries": [
    "us"
  ],
  "charts": [
    "top-free"
  ],
  "chartLimit": 25,
  "searchTerms": [
    "habit tracker"
  ],
  "searchLimit": 10,
  "appIds": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ]
}' |
apify call sysco32/apple-app-store-scraper --silent --output-dataset

```

## MCP server setup

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

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/KpAGwamI9o05eDljf/builds/wqmhCaLZslP6Sl4G8/openapi.json
