# Apple App Store Scraper — Apps, Top Charts & Prices (`yugenox/apple-app-store-scraper`) Actor

Scrape Apple App Store apps by link, ID, bundle ID, developer or top chart (free/paid, any category, iPhone, iPad, Mac) in 169 countries: price, rating and count, version, release notes, size, languages, screenshots, chart rank. Monitor mode flags price, rating, version and rank changes. No login.

- **URL**: https://apify.com/yugenox/apple-app-store-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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

## Apple App Store Scraper: apps, top charts and prices in 169 countries

Scrape **Apple App Store** apps by **link, app ID, bundle ID or developer**, or pull Apple's **Top Free and Top Paid charts** for iPhone, iPad or Mac in any category. Every app comes with its **price in the local currency, rating, number of ratings, version, release notes, description, size, languages, age rating, screenshots and icon**. Run the same apps in **any of 169 App Store countries** in one go to compare prices and availability, and switch on **monitor mode** to see what changed since the last run: price, rating, version, name or chart position. No login, no Apple ID, no API key.

### What you get

| | |
|---|---|
| **App** | App ID, bundle ID, name, link, developer, developer ID and page, seller, developer website |
| **Price** | Price, currency and the price as shown in that country's store ("Free", "£6.99", "¥800"), free or paid |
| **Ratings** | Average rating and number of ratings, for all versions and for the current version |
| **Release** | Current version, its release date and release notes, first release date |
| **Details** | Description, categories, age rating and content advisories, minimum iOS/macOS version, download size, supported languages, devices (iPhone, iPad, Mac, Apple Watch, Apple TV, Vision), Game Center |
| **Media** | Icon (512×512), iPhone, iPad and Apple TV screenshots |
| **Charts** | Chart (top free / top paid), platform, category, rank and the app's subtitle (top 25) |
| **Monitor** | What changed since the last run, the previous values, new ratings and chart places gained or lost |

### How to use it

1. Add **apps**: App Store links, app IDs (the number after `id` in the link) or bundle IDs such as `com.duolingo.DuolingoMobile`.
2. Or add **developers**: a developer link or ID gets every app they publish.
3. Or pick **top charts**: Top Free and/or Top Paid, for iPhone, iPad or Mac, in "All Apps" or any category (Games, Productivity, "Games: Puzzle" …), up to 200 places each.
4. Pick **countries**: two-letter codes (`us`, `gb`, `de`, `jp` …), country names, or `all` for all 169 App Store countries. Every app, developer and chart is scraped in every country you list.
5. Optional: turn on **monitor mode** and schedule the task daily.

#### Input examples

The same apps in five countries (price comparison):

```json
{
  "apps": [
    "https://apps.apple.com/us/app/finch-self-care-pet/id1528595748",
    "1438388363",
    "com.duolingo.DuolingoMobile"
  ],
  "countries": ["us", "gb", "de", "jp", "in"]
}
```

Every app of a developer:

```json
{
  "developers": ["https://apps.apple.com/us/developer/meta-platforms-inc/id284882218"],
  "countries": ["us"]
}
```

Top 200 free and paid puzzle games in the UK, compared with yesterday:

```json
{
  "charts": ["top-free", "top-paid"],
  "chartPlatforms": ["iphone"],
  "chartCategories": ["Games: Puzzle"],
  "chartLimit": 200,
  "countries": ["gb"],
  "monitorChanges": true
}
```

Only the apps whose price, rating, version or name changed since the last run:

```json
{
  "apps": ["570060128", "1528595748", "1438388363"],
  "countries": ["all"],
  "monitorChanges": true,
  "onlyChanges": true
}
```

### Output example

```json
{
  "appId": "1528595748",
  "bundleId": "com.finch.finch",
  "title": "Finch: Self-Care Pet",
  "url": "https://apps.apple.com/us/app/finch-self-care-pet/id1528595748",
  "country": "us",
  "developer": "Finch Care Public Benefit Corporation",
  "developerId": "1528595750",
  "price": 0,
  "currency": "USD",
  "formattedPrice": "Free",
  "isFree": true,
  "rating": 4.9473,
  "ratingCount": 758165,
  "primaryCategory": "Health & Fitness",
  "categories": ["Health & Fitness", "Lifestyle"],
  "version": "3.73.216",
  "versionReleaseDate": "2026-10-01T20:03:29.000Z",
  "releaseDate": "2021-05-12T07:00:00.000Z",
  "releaseNotes": "Hey Finch Fam! This update includes:\n• Fixing those darned bugs - thanks for reporting them!…",
  "description": "Meet your new self-care best friend! Finch is a self-care pet app that helps you feel prepared and positive, one day at a time…",
  "contentRating": "4+",
  "minimumOsVersion": "15.6",
  "fileSizeMb": 536.5,
  "appType": "ios",
  "platforms": ["iPhone", "iPad"],
  "languages": ["EN"],
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/57/48/02/574802b2-e147-09a4-6720-1704c0caece9/AppIcon-0-0-1x_U007emarketing-0-8-0-85-220.png/512x512bb.jpg",
  "screenshotUrls": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/6f/a9/fe/6fa9feb6-41c9-7c26-0f5c-296558c9f0f1/iPhone_social_large_01.jpg/320x480bb.jpg", "…"],
  "source": "app",
  "scrapedAt": "2026-10-02T00:05:03.105Z"
}
```

A chart row in monitor mode also has:

```json
{
  "chart": "top-free",
  "chartName": "Top Free Games",
  "chartPlatform": "iphone",
  "chartCategory": "Games",
  "rank": 1,
  "subtitle": "Rip Packs & Collect Cards",
  "changes": [],
  "previous": { "price": 0, "currency": "GBP", "rating": 4.7191, "ratingCount": 979, "version": "1.1.2", "title": "CrownCards - Trading Cards", "rank": 1, "checkedAt": "2026-10-02T00:05:58.000Z" },
  "rankChange": 0,
  "ratingCountChange": 0
}
```

Every row has every field; fields that don't apply are `null`. The dataset has ready-made views: Apps, Top charts, Prices by country and Changes.

### Use cases

- **Price localization research**: see what an app or a competitor charges in every country, in local currency.
- **App Store Optimization (ASO)**: track your chart position and your competitors' ranks, ratings and update cadence every day.
- **Competitor monitoring**: get only the apps that changed price, released a new version or were renamed.
- **Market research**: the top 200 free and paid apps in any category and country, with full details.
- **Lead lists of app publishers**: every app of a developer, with the developer's website.
- **Catalogue data**: descriptions, screenshots, icons, languages and age ratings for app directories.

### FAQ

**Do I need an Apple ID, an API key or a login?** No. The scraper reads the same public App Store data anyone can see, without signing in. It never logs in and needs nothing from you except the apps, developers or charts you want.

**Can I search the App Store by keyword?** Not directly. Apple's robots.txt asks automated tools not to use App Store search, and this Actor follows it. Find apps through the top charts (by category), through a developer, or paste app links, IDs or bundle IDs.

**Which countries are supported?** All 169 countries with an App Store. Use two-letter codes (`us`, `gb`, `de`, `jp`), country names, or `all`. A code Apple doesn't serve is skipped after one request and not charged. Prices, currencies, ratings and texts are those of each country's store. Names and descriptions come in each store's own language, or set **Language** to English or Japanese.

**Why is an app missing in some countries?** The app isn't sold there (or was removed). The run's status message lists these, and you are not charged for them.

**How many chart places can I get?** Up to 200 for each chart (Top Free and Top Paid), for iPhone, iPad and Mac, in All Apps or any category. Paid charts sometimes include app bundles; they keep their place in the ranking but are not saved, so a paid chart can have slightly fewer than 200 rows.

**Why do Mac apps have no rating?** Apple's public data has no ratings for Mac App Store apps, so `rating` and `ratingCount` are empty for them rather than a misleading 0.

**How does monitor mode work?** With **Compare with the previous run** on, each row gets `changes` (`new`, `price`, `rating`, `version`, `title`, `rank`, `newInChart`) and the `previous` values from the last run of the same input (or the same **Watchlist name**). Schedule the task daily. With **Only save apps that changed**, unchanged apps are checked but not saved, which costs much less than saving them. The history lives in a key-value store in your own Apify account (up to 50,000 apps per watchlist). Apple's servers may cache this data for up to a day, so daily runs are the right rhythm.

**How fast is it?** One request returns up to 200 apps for one country, so 1,000 apps in one country take about ten seconds, and one app in all 169 countries about a minute.

**How is it priced?** A small start fee per run, then a price per saved app row (one app in one country, or one chart place). In monitor mode with **Only save apps that changed**, unchanged apps are charged a much smaller "check" fee instead. Apps that aren't available, countries Apple doesn't serve and failed requests are never charged.

**Which proxy should I use?** Keep the default (Apify Proxy, datacenter). It comes with every Apify plan, and the App Store country is set by the **Countries** input, not by the proxy. If Apple turns datacenter IPs away for a while, the run switches to residential proxies when your account has them.

**Is it legal to scrape the Apple App Store?** This Actor only collects publicly available data: app listings that anyone can see on the App Store without an account, such as the app's name, developer, price, rating totals, version, description and screenshots. Collecting publicly available data is generally legal, but you're responsible for how you use it. It does not collect user reviews or reviewers' names. A developer can be an individual who publishes under their own name; that name is shown as the app's developer, and the scraper removes personal e-mail addresses and phone numbers from descriptions and release notes. You must follow privacy laws such as GDPR, PIPEDA and CCPA, as well as Apple's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. Everything comes from public App Store listings and charts that Apple shows to any visitor without signing in. It never uses an Apple ID, never touches purchases, reviews or private accounts, and follows Apple's robots.txt.

**Is this an official Apple product?** No. This Actor is not affiliated with, endorsed by or sponsored by Apple Inc. Apple, App Store, iPhone, iPad and Mac are trademarks of Apple Inc.

# Actor input Schema

## `apps` (type: `array`):

App Store links (e.g. https://apps.apple.com/us/app/finch-self-care-pet/id1528595748), app IDs (1528595748 or id1528595748) or bundle IDs (com.duolingo.DuolingoMobile). Top-chart links (apps.apple.com/us/iphone/charts/6014) work too.

## `developers` (type: `array`):

Developer links (e.g. https://apps.apple.com/us/developer/meta-platforms-inc/id284882218) or developer IDs. Every iPhone, iPad and Mac app of that developer is saved (up to 200 per developer).

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

Save Apple's top charts: Top Free and/or Top Paid (up to 200 positions each). Pick the platform and categories below.

## `chartPlatforms` (type: `array`):

Which store's charts: iPhone (default), iPad and/or Mac.

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

Leave empty for All Apps. Category names: Games, Books, Business, Developer Tools, Education, Entertainment, Finance, Food & Drink, Graphics & Design, Health & Fitness, Lifestyle, Magazines & Newspapers, Medical, Music, Navigation, News, Photo & Video, Productivity, Reference, Shopping, Social Networking, Sports, Travel, Utilities, Weather. Game genres: "Games: Action", "Games: Puzzle", "Games: Casual", "Games: Strategy" … (Action, Adventure, Board, Card, Casino, Casual, Family, Music, Puzzle, Racing, Role Playing, Simulation, Sports, Strategy, Trivia, Word). Numeric category IDs (e.g. 6014) work too.

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

How many places of each chart to save (1–200).

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

Two-letter App Store country codes, e.g. us, gb, de, fr, jp, in, br — or country names, or "all" for all 169 App Store countries. Every app, developer and chart is scraped in every country you list (price, currency, rating and texts differ per country). Leave empty for the United States (or the country in each pasted link).

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

Each store's own language (default; e.g. German in Germany), or always English, or always Japanese.

## `monitorChanges` (type: `boolean`):

Each row gets "changes" (new, price, rating, version, title, rank, newInChart) and the previous values, compared with the last run of the same input. Schedule the run daily to track prices, ratings, updates and chart positions.

## `onlyChanges` (type: `boolean`):

Turns monitor mode on and saves only new or changed apps. Unchanged apps are checked (a small "check" charge each) but not saved. The first run saves everything.

## `monitorName` (type: `string`):

Optional. Runs with the same name share their history. Leave empty to use one history per distinct input.

## `maxItems` (type: `integer`):

Hard cap on saved rows for the whole run, shared fairly between countries. 0 = no cap.

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

Parallel requests (each from a different proxy IP).

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

Apify Proxy (datacenter) is the default and comes with every Apify plan; the App Store country is chosen above, not by the proxy. If Apple refuses datacenter IPs for a while, the run switches to residential proxies when your account has them.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/finch-self-care-pet/id1528595748",
    "1438388363",
    "com.duolingo.DuolingoMobile"
  ],
  "charts": [
    "top-free",
    "top-paid"
  ],
  "chartPlatforms": [
    "iphone"
  ],
  "chartCategories": [
    "Games"
  ],
  "chartLimit": 10,
  "language": "store",
  "monitorChanges": false,
  "onlyChanges": false,
  "maxItems": 0,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped apps.

## `run` (type: `string`):

Status and statistics for this run.

## `report` (type: `string`):

RUN_REPORT: how the run ended, counts, requests, changes found and proxy use.

# 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 = {
    "apps": [
        "https://apps.apple.com/us/app/finch-self-care-pet/id1528595748",
        "1438388363",
        "com.duolingo.DuolingoMobile"
    ],
    "charts": [
        "top-free",
        "top-paid"
    ],
    "chartCategories": [
        "Games"
    ],
    "chartLimit": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/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 = {
    "apps": [
        "https://apps.apple.com/us/app/finch-self-care-pet/id1528595748",
        "1438388363",
        "com.duolingo.DuolingoMobile",
    ],
    "charts": [
        "top-free",
        "top-paid",
    ],
    "chartCategories": ["Games"],
    "chartLimit": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/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 '{
  "apps": [
    "https://apps.apple.com/us/app/finch-self-care-pet/id1528595748",
    "1438388363",
    "com.duolingo.DuolingoMobile"
  ],
  "charts": [
    "top-free",
    "top-paid"
  ],
  "chartCategories": [
    "Games"
  ],
  "chartLimit": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/apple-app-store-scraper --silent --output-dataset

```

## MCP server setup

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