# App Store Scraper: Apple App Details & Top Charts by Country (`latamdatatools/apple-app-store-charts-scraper`) Actor

Get App Store app details (price, rating, version, developer, size, category) and Top Free / Top Paid charts (up to 200 ranks) for any country, category and iPhone / iPad / Mac, with rank changes between runs. Official Apple endpoints only, no reviews, robots.txt compliant.

- **URL**: https://apify.com/latamdatatools/apple-app-store-charts-scraper.md
- **Developed by:** [Julian Genuario](https://apify.com/latamdatatools) (community)
- **Categories:** Developer tools, Marketing, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 app details

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

## App Store Scraper: Apple App Details & Top Charts by Country

Get **App Store app details** and **Top Charts** (Top Free and Top Paid, up to 200 ranks) for any country, any category and iPhone, iPad or Mac, as clean JSON, CSV or Excel. Schedule it daily and every chart row also tells you how many places the app moved since the last run.

It only uses Apple's own public endpoints: the official **iTunes Lookup API** for app details and the public **App Store Top Charts pages** for rankings. No login, no API key, no browser, no reviews scraping, and it **obeys Apple's robots.txt**. That makes it fast, cheap and stable.

### What does App Store Scraper do?

App Store Scraper gets Apple App Store app details (price, rating, number of ratings, version, release notes, developer, size, category) by app ID, URL or bundle ID, all apps of a developer, and the iOS Top Free and Top Paid charts (up to rank 200) for any country, category and iPhone, iPad or Mac. Run it on a schedule to track app rankings and rank changes for ASO and competitor research.

### How to use App Store Scraper

1. Click **Try for free** on this page (a free Apify account is enough to start).
2. Fill in the input (see the examples below) or keep the prefilled example.
3. Click **Start** and wait for the run to finish.
4. Download the results from the **Output** tab as JSON, CSV, Excel or HTML, or read them with the Apify API.
5. Optional: create a **Schedule** to run it daily or weekly, and connect a webhook or an integration (Make, Zapier, n8n, Slack).

### What you can use it for

- **ASO and market research**: see which apps rank in your category in 10 countries at once, with price, rating count, size and last update date.
- **Competitor tracking**: follow a list of competitor apps (or every app of a developer) and see when they change price, ship a new version or gain ratings.
- **Daily rank monitoring**: schedule the Actor; `rankChange` shows climbers and fallers, `isNewInChart` shows new entries.
- **Lead generation for app agencies and SDK vendors**: developer name, developer page and seller website of every charted app.
- **Investment and trend research**: which categories and countries new apps are breaking into.

### What you get

| Mode | Input | One result per |
|---|---|---|
| App details | `appIds`: numeric IDs, App Store URLs or bundle IDs | app and country |
| Developer catalogue | `developerIds`: developer IDs or developer page URLs | app and country |
| Top Charts | `chartCategories` + `chartTypes` + `countries` | chart row (rank) |

App fields: `appId`, `bundleId`, `name`, `developer`, `developerId`, `developerUrl`, `sellerName`, `sellerWebsite`, `price`, `currency`, `formattedPrice`, `isFree`, `rating`, `ratingCount`, `ratingCurrentVersion`, `ratingCountCurrentVersion`, `version`, `currentVersionReleaseDate`, `releaseNotes`, `firstReleaseDate`, `primaryCategory`, `primaryCategoryId`, `categories`, `contentRating`, `advisories`, `fileSizeBytes`, `minimumOsVersion`, `languages`, `supportedDevicesCount`, `isGameCenterEnabled`, `url`, `iconUrl` (plus `description` and screenshots if you ask for them).

Chart rows add: `chart` (top-free / top-paid), `chartTitle`, `categoryId`, `categoryName`, `platform`, `rank`, `previousRank`, `rankChange` (positive = climbed), `isNewInChart`, `subtitle`, `hasInAppPurchases`, `isEditorsChoice` and `enriched`.

Every item of the same `type` has exactly the same keys, so CSV and Excel exports line up.

### Input examples

Top 100 free and paid games in the US, UK and Brazil, with full details for every rank:

```json
{
    "countries": ["us", "gb", "br"],
    "chartCategories": ["Games"],
    "chartTypes": ["top-free", "top-paid"],
    "maxChartRank": 100
}
```

Track three competitors and a whole developer in two countries:

```json
{
    "appIds": ["6448311069", "https://apps.apple.com/us/app/notion/id1232780281", "com.burbn.instagram"],
    "developerIds": ["https://apps.apple.com/us/developer/meta-platforms-inc/id284882218"],
    "countries": ["us", "de"]
}
```

| Field | Default | Description |
|---|---|---|
| `appIds` | none | IDs (`6448311069`), URLs or bundle IDs (`com.openai.chat`). |
| `developerIds` | none | Developer IDs or developer page URLs; returns all their apps. |
| `countries` | `["us"]` | 2-letter storefront codes. |
| `chartCategories` | none | Category IDs or names (table below). Empty = no charts. |
| `chartTypes` | both | `top-free`, `top-paid`. |
| `chartPlatform` | `iphone` | `iphone`, `ipad` or `mac`. |
| `maxChartRank` | 100 | Ranks 1 to N (max 200). |
| `enrichChartEntries` | true | Full Lookup API details for every rank (otherwise ranks 26+ only have the ID). |
| `trackRankChanges` | true | Stores each chart in the named key-value store `app-store-chart-history` and compares on the next run. |
| `includeDescription` / `includeScreenshots` | false | Heavier optional fields. |
| `maxConcurrency` / `maxRequestsPerMinute` / `delayBetweenRequestsSecs` | 1 / 20 / 1 | Politeness limits. |

#### Categories

`36` All Apps (overall chart) · `6000` Business · `6001` Weather · `6002` Utilities · `6003` Travel · `6004` Sports · `6005` Social Networking · `6006` Reference · `6007` Productivity · `6008` Photo & Video · `6009` News · `6010` Navigation · `6011` Music · `6012` Lifestyle · `6013` Health & Fitness · `6014` Games · `6015` Finance · `6016` Entertainment · `6017` Education · `6018` Books · `6020` Medical · `6021` Magazines & Newspapers · `6023` Food & Drink · `6024` Shopping · `6026` Developer Tools · `6027` Graphics & Design.
Game sub-genres: `7001` Action · `7002` Adventure · `7003` Casual · `7004` Board · `7005` Card · `7006` Casino · `7009` Family · `7011` Music · `7012` Puzzle · `7013` Racing · `7014` Role Playing · `7015` Simulation · `7016` Sports · `7017` Strategy · `7018` Trivia · `7019` Word.

You can type the name instead of the ID (`"Games"`, `"Puzzle"`, `"Photo & Video"`).

### Output example

```json
{
    "type": "chart-entry",
    "country": "us",
    "platform": "iphone",
    "chart": "top-free",
    "chartTitle": "Top Free Games",
    "categoryId": "6014",
    "categoryName": "Games",
    "rank": 1,
    "previousRank": 3,
    "rankChange": 2,
    "isNewInChart": false,
    "subtitle": "Brain Puzzle Games",
    "hasInAppPurchases": true,
    "enriched": true,
    "appId": "6761760135",
    "bundleId": "com.oakever.meowdoku",
    "name": "Meowdoku!",
    "developer": "Oakever Games",
    "price": 0,
    "currency": "USD",
    "isFree": true,
    "rating": 4.81,
    "ratingCount": 373631,
    "version": "1.22.0",
    "currentVersionReleaseDate": "2026-10-25T07:00:00Z",
    "primaryCategory": "Games",
    "url": "https://apps.apple.com/us/app/meowdoku/id6761760135",
    "scrapedAt": "2026-10-26T13:13:05.120Z"
}
```

A run summary (apps, chart rows, IDs not found in a country, empty charts, failed requests) is saved in the default key-value store as `RUN_SUMMARY`. If nothing at all is extracted, the run is marked as **failed** instead of "succeeded with 0 results".

### Pricing

Pay per result, no subscription:

- **App details**: USD 2.00 per 1,000 apps
- **Chart entry** (one rank in a Top Free / Top Paid chart): USD 1.00 per 1,000 entries
- Actor start: USD 0.00005 per run

Example: the top 200 free games in one country (each chart row already includes the app details) is 200 chart entries = about USD 0.20.

### Speed and limits

Apple's Lookup API allows about 20 calls per minute, so the Actor spaces requests ~3 seconds apart and batches up to 100 apps per call. A 200-rank chart with full details takes about 4 requests (~15 s). 10 countries x 2 charts x 100 ranks is about 2,000 rows in roughly 2 minutes.

### What it does not do

- **No reviews.** Plenty of review scrapers exist; this one focuses on metadata and rankings.
- **No keyword search.** Apple's robots.txt disallows automated access to `/search`, so the Actor does not use it. Use app IDs, developers or charts instead.
- **No Top Grossing chart.** Apple no longer publishes it publicly.
- Some "apps" in charts are app bundles that the Lookup API does not return; those rows keep the data shown on the chart (`enriched: false`).

### Is it legal?

The Actor reads public data that Apple publishes for everyone, through documented endpoints, at a low rate and in line with robots.txt. It collects no personal data. You are responsible for how you use the results (for example, respecting Apple's trademarks).

### Why use App Store Scraper

- **Top charts by country, category and device.** Top Free and Top Paid, up to rank 200, for iPhone, iPad or Mac, in as many countries as you list.
- **Every chart row comes with the app details** (price, rating, rating count, version, size, developer, release date) at the chart-entry price, so you do not need a second run.
- **Rank changes between runs.** Schedule it daily and each row gets `previousRank`, `rankChange` and `isNewInChart`.
- **Lookups by App Store URL, numeric ID, bundle ID or developer ID.**
- **Official Apple endpoints only, robots.txt respected.** No login, no browser.

### Cost examples

Prices at the current pay-per-event rates (see Pricing). You can set a maximum charge per run in the run options.

| Job | Approximate cost |
|---|---|
| Top 200 free games in one country | about $0.20 |
| Top 100 free + top 100 paid in 10 countries | about $2.00 |
| 1,000 apps by ID or bundle ID | about $2.00 |
| Daily top 50 free apps in 1 country, one month | about $1.50 |

### Use it from your code, an integration or an AI agent

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("latamdatatools/apple-app-store-charts-scraper").call(run_input={
    "appIds": [
        "https://apps.apple.com/us/app/chatgpt/id6448311069",
        "com.burbn.instagram"
    ],
    "countries": [
        "us"
    ],
    "chartCategories": [
        "Games"
    ],
    "maxChartRank": 25
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript / Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('latamdatatools/apple-app-store-charts-scraper').call({
  "appIds": [
    "https://apps.apple.com/us/app/chatgpt/id6448311069",
    "com.burbn.instagram"
  ],
  "countries": [
    "us"
  ],
  "chartCategories": [
    "Games"
  ],
  "maxChartRank": 25
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**No code:**

- **Schedules:** run it daily or weekly from Apify Console (Schedules), with the same input saved as a Task.
- **Integrations:** send results to Google Sheets, Slack, email, Make, Zapier, n8n or Airbyte from the Integrations tab, or call your own webhook when a run finishes.
- **AI agents:** add it as a tool in Claude, Cursor, VS Code and other MCP clients through the Apify MCP server (`https://mcp.apify.com`), so the agent can run App Store Scraper and read the results.

### FAQ

**Can I call it from my own code or from an AI agent?** Yes. Start runs and fetch results with the Apify API or the JavaScript / Python clients, or use it as a tool from Claude, Cursor and other MCP clients through the Apify MCP server (`mcp.apify.com`).

**Can I run it automatically?** Yes. Create a Schedule in Apify Console (for example every morning) and add a webhook or an integration to get the results where you need them.

**Which export formats are available?** JSON, JSONL, CSV, Excel (XLSX), XML, RSS and HTML table, from the Output tab or the API.

**What does it cost?** See the Pricing section above. You only pay for the events listed there.

**Can it search the App Store by keyword?** No. Apple's robots.txt disallows the search endpoint, so this Actor does not use it. Start from app URLs, IDs, bundle IDs, developer IDs or the top charts.

**Does it scrape reviews?** No, it focuses on app details and chart rankings.

**Where is the ranking history kept?** With `trackRankChanges` on, each chart is saved in the named key-value store `app-store-chart-history` of your account, and the next run compares against it.

# Actor input Schema

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

Apps to get full details for. Accepts numeric IDs (6448311069), App Store URLs (https://apps.apple.com/us/app/chatgpt/id6448311069) or bundle IDs (com.openai.chat). Each app found is one result per country.

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

Developer IDs or developer page URLs (https://apps.apple.com/us/developer/meta-platforms-inc/id284882218). Returns every app of the developer (up to 200).

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

2-letter ISO country codes. Apps and charts are fetched for every country listed (prices, ratings and rankings differ per country).

## `chartCategories` (type: `array`):

Leave empty to skip charts. Category IDs or names: 36 or "All Apps" (overall chart), 6014 or "Games", 6007 "Productivity", 6015 "Finance", 6005 "Social Networking", game sub-genres like "Puzzle" (7012)... See the README for the full list.

## `chartTypes` (type: `array`):

Which charts to return for each category.

## `chartPlatform` (type: `string`):

Device charts to read.

## `maxChartRank` (type: `integer`):

Return ranks 1 to N of each chart (Apple publishes up to 200). Each chart row is one billable result.

## `enrichChartEntries` (type: `boolean`):

Look up every charted app with the official iTunes Lookup API (price, rating count, version, size, release dates...). Without it, ranks below 25 only have the app ID.

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

Saves each chart in a named key-value store (app-store-chart-history) and adds previousRank, rankChange and isNewInChart on the next run. Ideal with a daily schedule.

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

Adds the long App Store description (makes the dataset much bigger).

## `includeScreenshots` (type: `boolean`):

Adds iPhone and iPad screenshot URLs.

## `maxConcurrency` (type: `integer`):

Parallel requests. Kept at 1 on purpose: Apple allows about 20 Lookup API calls per minute.

## `maxRequestsPerMinute` (type: `integer`):

Global rate limit (Apple's documented limit is about 20 per minute).

## `delayBetweenRequestsSecs` (type: `integer`):

Politeness delay.

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

Optional. Not needed in normal use.

## Actor input object example

```json
{
  "appIds": [
    "https://apps.apple.com/us/app/chatgpt/id6448311069",
    "com.burbn.instagram"
  ],
  "countries": [
    "us"
  ],
  "chartCategories": [
    "Games"
  ],
  "chartTypes": [
    "top-free",
    "top-paid"
  ],
  "chartPlatform": "iphone",
  "maxChartRank": 25,
  "enrichChartEntries": true,
  "trackRankChanges": true,
  "includeDescription": false,
  "includeScreenshots": false,
  "maxConcurrency": 1,
  "maxRequestsPerMinute": 20,
  "delayBetweenRequestsSecs": 1
}
```

# Actor output Schema

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

No description

## `runSummary` (type: `string`):

No description

# 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": [
        "https://apps.apple.com/us/app/chatgpt/id6448311069",
        "com.burbn.instagram"
    ],
    "countries": [
        "us"
    ],
    "chartCategories": [
        "Games"
    ],
    "maxChartRank": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("latamdatatools/apple-app-store-charts-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 = {
    "appIds": [
        "https://apps.apple.com/us/app/chatgpt/id6448311069",
        "com.burbn.instagram",
    ],
    "countries": ["us"],
    "chartCategories": ["Games"],
    "maxChartRank": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("latamdatatools/apple-app-store-charts-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 '{
  "appIds": [
    "https://apps.apple.com/us/app/chatgpt/id6448311069",
    "com.burbn.instagram"
  ],
  "countries": [
    "us"
  ],
  "chartCategories": [
    "Games"
  ],
  "maxChartRank": 25
}' |
apify call latamdatatools/apple-app-store-charts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,latamdatatools/apple-app-store-charts-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/hdUU3T8ufenXtdwkq/builds/4tukj7Mm36DDZa6vI/openapi.json
