# Apple App Store Scraper — Apps, Ratings, Charts & Developers (`tagadanar/apple-app-store-scraper`) Actor

Scrape the Apple App Store: search results with rank, full app details by id, URL or bundle id, a developer's apps, and top free / paid / grossing charts by country and genre. One flat row per app: ratings, price, version, size, screenshots. $1 per 1,000 apps + $0.001/run.

- **URL**: https://apify.com/tagadanar/apple-app-store-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Developer tools, SEO tools, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 app rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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, Ratings, Charts & Developers

Scrape the **Apple App Store** in any country: **search results** with their rank, **full app details** by id, link or bundle id, **every app of a developer**, and the **top free / paid / grossing charts** (iPhone and iPad, overall or per category). You get one flat row per app with ratings, price, version, size, release notes, languages, screenshots and links. No login, no API key, no browser.

### What you get

| Input | What comes back |
|-|-|
| **Search terms** | The apps Apple's App Store search lists for each term, in order, with `searchRank` 1, 2, 3… (up to about 190 per term) |
| **App ids, links or bundle ids** | The full record of each app. Ids that don't exist in that country are named in the run status and never charged |
| **Developer ids or links** | That developer's apps in the chosen country (up to 200) |
| **Top charts** | Top free, top paid, top grossing (iPhone and iPad), new free and new paid apps, with `chartRank`, overall or for one category (Games, Business, Health & Fitness…) |

Every row carries: `trackId`, `bundleId`, `title`, developer (`developerName`, `developerId`, `developerUrl`), `seller`, `primaryGenre` and `genres`, `price` / `currency` / `formattedPrice`, `rating` and `ratingCount` (all versions and the current version), `contentRating`, `releaseDate`, `currentVersionReleaseDate`, `version`, `releaseNotes`, `sizeBytes`, `minimumOsVersion`, `supportedDevicesCount`, `languages`, `description`, `iconUrl`, iPhone and iPad `screenshots`, and the `appUrl`.

### How to use it

1. Fill in any mix of **search terms**, **app ids**, **developer ids** and **top charts**.
2. Pick the **country** (`us`, `gb`, `de`, `jp`…). Prices, ratings, charts and search order are per storefront.
3. Set **max apps** per search, developer and chart (default 50).
4. Run it. Each run lists any id that didn't exist, so you know what's missing.

### Input example

```json
{
    "searchTerms": ["habit tracker", "budget planner"],
    "appIds": ["1232780281", "com.burbn.instagram", "https://apps.apple.com/us/app/calm/id571800810"],
    "developerIds": ["284882218"],
    "charts": ["top-free", "top-grossing"],
    "chartGenre": "6014",
    "country": "us",
    "maxApps": 50
}
```

### Output example

```json
{
    "source": "chart",
    "query": "top-grossing",
    "country": "gb",
    "searchRank": null,
    "chartRank": 1,
    "chart": "top-grossing",
    "chartGenre": "Games",
    "trackId": "431946152",
    "bundleId": "com.roblox.robloxmobile",
    "title": "Roblox",
    "developerName": "Roblox Corporation",
    "developerId": "431946155",
    "developerUrl": "https://apps.apple.com/gb/developer/roblox-corporation/id431946155",
    "seller": "Roblox Corporation",
    "sellerUrl": "http://www.roblox.com/",
    "primaryGenre": "Games",
    "primaryGenreId": "6014",
    "genres": ["Games", "Entertainment", "Action", "Adventure"],
    "price": 0,
    "currency": "GBP",
    "formattedPrice": "Free",
    "isFree": true,
    "rating": 4.49423,
    "ratingCount": 2859562,
    "ratingCurrentVersion": 4.49423,
    "ratingCountCurrentVersion": 2859562,
    "contentRating": "12+",
    "advisories": ["Frequent/Intense Cartoon or Fantasy Violence", "Loot Boxes"],
    "releaseDate": "2011-05-26T20:51:47Z",
    "currentVersionReleaseDate": "2026-10-28T17:00:01Z",
    "version": "2.745.1138",
    "releaseNotes": "To make Roblox work better for you, we deliver updates regularly…",
    "sizeBytes": 224158720,
    "minimumOsVersion": "14.0",
    "supportedDevicesCount": 130,
    "languages": ["EN", "FR", "DE", "ID", "IT", "JA", "KO", "PT", "RU", "ZH", "ES", "TH", "TR", "VI"],
    "description": "ROBLOX – MILLIONS OF GAMES ACROSS EVERY GENRE…",
    "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/…/512x512bb.jpg",
    "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/…/392x696bb.jpg"],
    "ipadScreenshots": ["https://is1-ssl.mzstatic.com/image/thumb/…/576x768bb.jpg"],
    "gameCenter": false,
    "appUrl": "https://apps.apple.com/gb/app/roblox/id431946152",
    "input": null,
    "scrapedAt": "2026-10-30T21:56:18.574Z"
}
```

| Field | Meaning |
|-|-|
| `source` | `search`, `app`, `developer` or `chart`: which input produced the row |
| `query` | The search term, the id you gave, the developer id, or the chart name |
| `searchRank` | Position in Apple's search results for the term (search rows only) |
| `chartRank` | Position in the chart (chart rows only) |
| `rating`, `ratingCount` | Average stars and number of ratings in that country, all versions |
| `ratingCurrentVersion`, `ratingCountCurrentVersion` | The same for the current version |
| `sizeBytes` | Download size in bytes |
| `supportedDevicesCount` | How many iPhone / iPad / iPod models Apple lists as supported |
| `languages` | Two-letter codes of the languages the app supports |

### Where the data comes from

All data comes from Apple's own public App Store JSON: the iTunes Search and Lookup APIs for search, app details and developer catalogs, and Apple's App Store chart feeds for the top charts. A chart lists app ids in rank order, and each id is then looked up for its full record. The scraper paces its requests and backs off when Apple rate-limits.

- **Search** lists up to about 190 apps per term (Apple's search API has no paging; it often returns a little fewer than asked).
- **Charts** list up to 100 apps. With a **chart genre**, the run checks that the apps Apple returns really belong to that category. If Apple ignores the genre, the run tells you instead of handing you the overall chart. The new free and new paid lists have no genre filter: they always list new apps of every genre.
- A country the App Store doesn't serve is named in the run status, and nothing is charged for it.

### Pricing

**$1.00 per 1,000 apps + $0.001 per run**, platform usage included. Store discounts apply: Bronze $0.90, Silver $0.80, Gold $0.70 per 1,000 apps.

- One app row = one charge, whatever the source. The same app found by two inputs (e.g. a search and a chart) is two rows, each with its own rank.
- App ids that don't exist, developer ids that aren't developers, unserved countries and failed requests are never charged.

Example: the top 100 free apps plus 5 searches of 50 apps = 350 rows ≈ $0.35.

### FAQ

**Which id do I need for an app?** The number in its App Store link (`apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281` → `1232780281`). You can also paste the full link, or the bundle id (`com.burbn.instagram`).

**And for a developer?** The number in the developer page link (`apps.apple.com/us/developer/meta-platforms-inc/id284882218` → `284882218`), or the link itself. Every app row also has `developerId`, so you can go from an app to its developer.

**Does it return reviews?** No, this actor returns app records. For reviews, use [App Store Reviews Scraper](https://apify.com/tagadanar/apple-app-store-reviews).

**Does it show downloads or revenue?** No. Apple doesn't publish them. The top-grossing chart's rank is the closest public signal.

**What does the run status tell me?** It counts the rows and tasks, and names anything that didn't deliver: an app id or developer id that doesn't exist, a country the App Store doesn't serve, a refused request, or the run timeout. The full per-task list is in the run's `RUN_SUMMARY` record.

### Related actors

- [App Store Reviews Scraper](https://apify.com/tagadanar/apple-app-store-reviews): every review of any iOS app, in any country.
- [App Store & Google Play Scraper](https://apify.com/tagadanar/app-intel-scraper): app data for Android too, plus a new-review monitor for both stores.
- [App Store & Google Play Keyword Rank Tracker](https://apify.com/tagadanar/app-keyword-rank-tracker): where your apps rank for each keyword, across countries, with day-to-day changes.

# Changelog

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

# Actor input Schema

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

App Store searches, as users type them (e.g. "habit tracker", "budget planner"). Each term returns up to "Max apps" apps in Apple's search order, with searchRank 1, 2, 3… Up to 100 terms per run.

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

Apps to fetch in full: the numeric App Store id (1232780281), the apps.apple.com link, or the bundle id (com.burbn.instagram). Up to 1,000 per run, looked up 100 at a time. An id that does not exist in the chosen country is named in the run status and never charged.

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

Developers whose apps you want: the number after /developer/…/id in a developer page link (284882218 for Meta), or the link itself. Returns up to "Max apps" of their apps in the chosen country (Apple lists at most 200).

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

App Store top charts to return in rank order (chartRank 1, 2, 3…). Apple's chart feeds list up to 100 apps. Combine with Chart genre for a category chart (the new-apps lists have no genre filter).

## `chartGenre` (type: `string`):

Optional: limit the top charts to one App Store category. Leave on All apps for the overall chart.

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

Two-letter code of the App Store storefront (us, gb, de, fr, jp, br…). Prices, ratings, charts and search results are per country. Default: us.

## `maxApps` (type: `integer`):

How many apps to return for each search term, developer and chart. Apple's search API returns at most about 190 per term; charts stop at 100. App ids always return every app found.

## Actor input object example

```json
{
  "searchTerms": [
    "habit tracker"
  ],
  "appIds": [
    "1232780281",
    "com.burbn.instagram"
  ],
  "charts": [
    "top-free"
  ],
  "chartGenre": "all",
  "country": "us",
  "maxApps": 10
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchTerms": [
        "habit tracker"
    ],
    "appIds": [
        "1232780281",
        "com.burbn.instagram"
    ],
    "charts": [
        "top-free"
    ],
    "country": "us",
    "maxApps": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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 = {
    "searchTerms": ["habit tracker"],
    "appIds": [
        "1232780281",
        "com.burbn.instagram",
    ],
    "charts": ["top-free"],
    "country": "us",
    "maxApps": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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 '{
  "searchTerms": [
    "habit tracker"
  ],
  "appIds": [
    "1232780281",
    "com.burbn.instagram"
  ],
  "charts": [
    "top-free"
  ],
  "country": "us",
  "maxApps": 10
}' |
apify call tagadanar/apple-app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tagadanar/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/Ye4FBtYzssvuN8dii/builds/8nz4IWBugusJ7jd3X/openapi.json
