# App Store Scraper (`deriverge/app-store-scraper`) Actor

Apps from Apple's App Store by link, keyword search, top chart or developer, with price, rating, version and category in any storefront. Search and chart rows carry each app's position, and a scheduled task shows how positions moved since the last run.

- **URL**: https://apify.com/deriverge/app-store-scraper.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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.
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

## App Store Scraper

App Store Scraper returns one row per app from Apple's App Store: name, developer, price, rating and number of ratings, version and release notes, size, category, age rating, languages and supported devices. It finds apps four ways, in any storefront: links or IDs you paste, keyword searches with each app's position, top charts, and developers' catalogs. The form is prefilled with a search for `photo editor` and the top free chart; click **Start** to see them. Apple publishes no download counts, so the output has none. It costs $0.80 per 1,000 apps on the Free plan ($0.40 on Business), and the $5 of monthly credit in Apify's Free plan covers about 6,200 apps.

### What data does it return?

| Field | Description |
|---|---|
| `name`, `appId`, `bundleId` | App name as the storefront shows it, Apple's numeric app ID (`878783582`) and the bundle ID (`com.adobe.lrmobilephone`). |
| `source` | How the row was found: `app`, `search`, `chart` or `developer`. |
| `searchTerm`, `searchRank` | The search term and the app's place in Apple's results for it, counted from 1. |
| `chart`, `chartCategory`, `chartRank` | The chart (`top-free` or `top-paid`), the category you asked for (`All`, `Productivity`) and the app's place: in the whole chart, or among the apps of that category in it. |
| `previousRank`, `rankChange`, `newInRanking` | Place in the previous run of the same task or watch name, the change (positive means the app moved up) and whether the app is new in that search or chart. `null` without an earlier run. |
| `developer`, `developerId`, `seller` | Developer name and ID as the App Store shows them, and the legal seller behind the app. |
| `website` | The developer's website from the app page. Missing on about one row in five in September 2026. |
| `price`, `currency`, `free` | Price in the storefront's currency (`0` for free apps), the currency code (`USD`, `GBP`, `EUR`) and a free flag. In-app purchases are not included. |
| `rating`, `ratingCount` | Average stars over all versions, rounded to two decimals (`4.77`), and the number of ratings in that storefront, which is `0` for an app with no ratings yet. |
| `ratingCurrentVersion`, `ratingCountCurrentVersion` | Apple's figures for the current version. In September 2026 Apple returned the same values as for all versions. |
| `version`, `releaseNotes`, `updatedAt` | Current version, its release notes and its release date, ISO 8601 in UTC. |
| `releasedAt` | When the app was first released. |
| `category`, `categoryId`, `categories` | Primary category and its ID (`Photo & Video`, `6008`), and every category the app is listed in. |
| `contentRating`, `advisories` | Age rating (`4+`, `9+`, `12+` or `17+`) and the reasons Apple gives for it. |
| `minimumOsVersion`, `sizeMb` | Lowest iOS version the app runs on (`18.0`) and the download size in MB (`347.8`). |
| `languages` | Supported languages as capital two-letter codes. `ZH` appears twice when an app offers both simplified and traditional Chinese. |
| `devices`, `gameCenter` | Device families (`iPhone`, `iPad`, `iPod touch`, `Apple Watch`, `Mac`) and Game Center support. |
| `description` | The App Store description, cut to 300 characters unless **Include the full description** is on. |
| `icon`, `screenshots`, `ipadScreenshots` | The 512 px icon, and the iPhone and iPad screenshots when **Include screenshot links** is on. |
| `url`, `developerUrl` | App and developer pages on apps.apple.com. |

### How to scrape the App Store

1. Fill any mix of the four inputs: **Apps** (App Store links, numeric IDs or bundle IDs), **Search terms**, **Top charts** (top free or top paid) with optional **Chart categories**, and **Developers** (developer page links or IDs).
2. List the **Storefronts** as two-letter country codes such as `us`, `gb` or `de`. Every input is read in every storefront. Empty means `us`.
3. Set **Results per search term** (at most 200) and **Places per chart** (at most 100). The form starts at 20 of each.
4. Turn on **Include the full description** or **Include screenshot links** if you need them.
5. Click **Start**. In October 2026, a run of both charts with two categories in two storefronts returned 462 rows in about 30 seconds. The **Output** tab has two views, **Apps** and **Search and chart ranks**, and exports to CSV, Excel or JSON.

The same kind of input through the API, with rank tracking:

```json
{
  "searchTerms": ["photo editor", "habit tracker"],
  "charts": ["top-free", "top-paid"],
  "chartCategories": ["all", "6007"],
  "apps": ["https://apps.apple.com/us/app/lightroom-ai-photo-editor/id878783582", "com.spotify.client"],
  "developers": ["https://apps.apple.com/us/developer/spotify/id324684583"],
  "countries": ["us", "gb", "de"],
  "maxSearchResults": 100,
  "watchName": "my-keywords"
}
```

### Example output

One row from a run on 29 September 2026: Lightroom in third place for `photo editor` in the US storefront. The rank-change fields are `null` because that run had no earlier snapshot to compare with.

```json
{
  "key": "search:us:photo editor:878783582",
  "source": "search",
  "country": "us",
  "searchTerm": "photo editor",
  "searchRank": 3,
  "chart": null,
  "chartCategory": null,
  "chartRank": null,
  "previousRank": null,
  "rankChange": null,
  "newInRanking": null,
  "appId": "878783582",
  "bundleId": "com.adobe.lrmobilephone",
  "name": "Lightroom: AI Photo Editor",
  "url": "https://apps.apple.com/us/app/lightroom-ai-photo-editor/id878783582",
  "developer": "Adobe Inc.",
  "developerId": "331646274",
  "developerUrl": "https://apps.apple.com/us/developer/adobe-inc/id331646274",
  "seller": "Adobe Inc.",
  "website": "https://www.adobe.com/products/photoshop-lightroom.html",
  "price": 0,
  "currency": "USD",
  "free": true,
  "rating": 4.77,
  "ratingCount": 336831,
  "ratingCurrentVersion": 4.77,
  "ratingCountCurrentVersion": 336831,
  "version": "11.5.30",
  "releaseNotes": "- Transform your favorite photos into shareworthy videos with Photo to Video \n- Find photos more quickly with improved, AI-powered search.\n- Bug fixes and stability improvements",
  "updatedAt": "2026-09-14T08:24:43.000Z",
  "releasedAt": "2014-06-22T04:35:34.000Z",
  "category": "Photo & Video",
  "categoryId": "6008",
  "categories": [
    "Photo & Video",
    "Graphics & Design"
  ],
  "contentRating": "12+",
  "advisories": [],
  "minimumOsVersion": "18.0",
  "sizeMb": 347.8,
  "languages": [
    "NL",
    "EN",
    "FR",
    "DE",
    "HI",
    "ID",
    "IT",
    "JA",
    "KO",
    "MS",
    "NB",
    "PL",
    "PT",
    "RU",
    "ZH",
    "ES",
    "SV",
    "TH",
    "ZH",
    "TR",
    "UK",
    "VI"
  ],
  "devices": [
    "iPhone",
    "iPad",
    "iPod touch"
  ],
  "gameCenter": false,
  "description": "Ever wish your photos could really show what makes a moment special? Adobe Lightroom is a free AI photo and video editor that helps you do just that. From your dog’s goofy grin to that sunset that took your breath away, Adobe Lightroom makes it simple to bring those moments to life, just the way you...",
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/4c/72/2a/4c722a35-cad2-509c-dff1-4f720ab886b8/AppIcon-0-1x_U007ephone-0-1-0-0-85-220-0.png/512x512bb.jpg",
  "screenshots": [],
  "ipadScreenshots": []
}
```

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

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 apps | $0.80 | $0.64 | $0.52 | $0.40 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

Following 10 search terms at 200 results and both charts at 100 places in one storefront gives up to 2,200 rows per run, which costs $1.76 on the Free plan and $0.88 on Business. An app found by two search terms, in two charts or in two storefronts is two rows and two charges. An app that is not available in a storefront produces no row there.

### Limits

- `searchRank` is the order of Apple's public search service for the term. The App Store app on a phone can show a different order.
- Apple lists at most 200 apps per search term, and fewer in practice: with **Results per search term** at 200, searches in September 2026 returned between 168 and 198 apps.
- Charts come from Apple's official chart feed, which has the top free and top paid iPhone apps, up to 100 places each. Some have fewer: in October 2026 the UK top paid chart had 97.
- Apple no longer publishes top grossing, new apps or Mac charts in that feed. They stay in **Top charts** so saved tasks keep working, and return no rows with a warning in the log. The iPad charts return the matching iPhone chart.
- The feed has no category charts. A category returns the apps of that category found in the overall top 100, numbered in chart order, and some categories have only a few. These charts hold few games: in October 2026 the Games category returned between 1 and 4 apps per chart.
- Apple's chart feed often fails on the first request. Each chart is asked for at both of Apple's feed addresses at once, in up to 8 rounds, which can add about 90 seconds to a run. A chart that never answers is named in the log and produces no rows.
- Each entry in **Developers** returns up to 200 apps per storefront.
- Names, prices and ratings belong to a storefront. In September 2026 Lightroom had more than 336,000 ratings in the US storefront and more than 33,000 in the German one, where its name is `Lightroom Foto- & Video-Editor`.
- Apple allows about 20 requests a minute from one address, and the actor keeps to that pace, so each search, developer or batch of 100 apps takes about 3 seconds. When Apple limits the requests, the actor waits and slows down. If Apple keeps limiting them or refuses access, the actor stops asking Apple, keeps the rows it has and says so in the log and the status message. If fewer than 60% of requests succeed, the run is marked as failed and keeps the rows it has.

### Tracking positions over time

Give the run a **Watch name** such as `my-keywords`, or save the input as a task, and schedule it daily. Each run stores the positions it saw. From the second run on, search and chart rows carry `previousRank`, `rankChange` and `newInRanking`, and the **Search and chart ranks** view shows them side by side. The `CHANGES` record in the run's key-value store lists apps that entered or left each search and chart, apps that moved, and apps whose version or price changed. When a run stops at **Maximum rows**, the rankings it did not reach are carried over and are not reported as dropped.

### FAQ

#### Is it legal to scrape the App Store?

The actor reads the app information that Apple publishes through its public search, lookup and chart services, the same facts shown on each app's page, and it does not log in. It collects nothing about App Store users. Developers who publish as individuals appear under their own name in `developer` and `seller`, as Apple shows them. You are responsible for how you use the data.

#### Where do I find an app ID or a developer ID?

In the link. `https://apps.apple.com/us/app/lightroom-ai-photo-editor/id878783582` has the app ID `878783582`, and a developer link such as `https://apps.apple.com/us/developer/adobe-inc/id331646274` ends in the developer ID. Whole links work in the input, and so do bundle IDs such as `com.spotify.client`.

#### Which charts can it read?

Top free and top paid apps, as Apple publishes them in its official chart feed. **Chart categories** narrow either chart to one of 24 app categories or 18 game genres, such as Productivity or Games: Puzzle, from the top 100 places.

#### Does it return reviews?

No. Rows carry the rating and the number of ratings. For the review texts, pass the `appId` values to App Store Reviews Scraper, linked below.

### Related scrapers

- [App Store Reviews Scraper](https://apify.com/deriverge/app-store-reviews-scraper)
- [Google Play Scraper](https://apify.com/deriverge/google-play-scraper)
- [Google Play Reviews Scraper](https://apify.com/deriverge/google-play-reviews-scraper)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

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

# Actor input Schema

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

App Store links, numeric app IDs (324684580) or bundle IDs (com.spotify.client), one per line. Each app returns one row per storefront.

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

Keywords to search the App Store for, as a user would. Each term returns the apps Apple lists for it, with their position in searchRank.

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

App Store charts to read from Apple's official chart feed, up to 100 places each, with the position in chartRank. The feed has top free and top paid iPhone apps only: the iPad charts return the iPhone chart, and the other charts return no rows.

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

Categories for the charts above, for example Games or Productivity. Apple's official chart feed has no category charts, so a category returns the apps of that category found in the overall top 100, in chart order. Leave empty for the overall chart.

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

Developer page links (https://apps.apple.com/us/developer/spotify/id324684583) or numeric developer IDs. Returns every app of each developer.

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

Two-letter country codes of the App Store storefronts to read, for example us, gb, de or jp. Prices, ratings, search results and charts differ between storefronts. Leave empty for us.

## `maxSearchResults` (type: `integer`):

How many apps to return for each search term in each storefront. Apple lists at most 200.

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

How many places to read from each chart, from the top. Apple publishes up to 100.

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

Adds the full App Store description. Off, each row carries the first 300 characters.

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

Adds the iPhone and iPad screenshot image links.

## `watchName` (type: `string`):

Name of the snapshot that remembers ranks between runs, for example "my-keywords". Runs from a saved task get one automatically. With it, rows show previousRank and rankChange.

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

Hard cap on returned rows in the run.

## Actor input object example

```json
{
  "searchTerms": [
    "photo editor"
  ],
  "charts": [
    "top-free"
  ],
  "countries": [
    "us"
  ],
  "maxSearchResults": 20,
  "chartLimit": 20,
  "includeDescription": false,
  "includeScreenshots": false,
  "maxItems": 50
}
```

# Actor output Schema

## `apps` (type: `string`):

One row per app per storefront and per search term or chart, with 40+ fields.

## `changes` (type: `string`):

Apps that entered or left each search and chart, and apps whose rank, version or price changed, compared with the previous run of the same task or watch name.

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

Rows by source, storefronts, warnings about inputs that found nothing, and request counts.

# 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": [
        "photo editor"
    ],
    "charts": [
        "top-free"
    ],
    "countries": [
        "us"
    ],
    "maxSearchResults": 20,
    "chartLimit": 20,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/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": ["photo editor"],
    "charts": ["top-free"],
    "countries": ["us"],
    "maxSearchResults": 20,
    "chartLimit": 20,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("deriverge/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": [
    "photo editor"
  ],
  "charts": [
    "top-free"
  ],
  "countries": [
    "us"
  ],
  "maxSearchResults": 20,
  "chartLimit": 20,
  "maxItems": 50
}' |
apify call deriverge/app-store-scraper --silent --output-dataset

```

## MCP server setup

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