# App Store Scraper: Search, App Details, Top Charts, ASO Ranks (`swiftkit/app-store`) Actor

iOS App Store data from Apple's official public APIs: search apps by keyword, full app details by ID, link or bundle ID in any country, top free/paid charts, and keyword rank tracking for ASO. Ratings, versions, prices, genres, screenshots.

- **URL**: https://apify.com/swiftkit/app-store.md
- **Developed by:** [SwiftKit](https://apify.com/swiftkit) (community)
- **Categories:** Developer tools, E-commerce, Marketing
- **Stats:** 5 total users, 4 monthly users, 98.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.30 / 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.

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: Search, App Details, Top Charts, ASO Ranks

iOS App Store data in clean JSON, from **Apple's own public APIs** (the iTunes Search & Lookup
APIs and Apple's official charts feed). Four modes:

1. **Search apps** by keyword, in the order the App Store shows them
2. **App details** for any app by link, numeric ID or bundle ID, in any country
3. **Top charts:** top free or top paid apps per country, with full details
4. **Keyword rank tracking (ASO):** where your apps appear in the top 200 results for each search
   term. For example, Notion ranked **#8 for "notes"** in the US store in our test.

Each app row includes: name, developer, price, **rating and number of ratings** (overall and for the
current version), version and release dates, release notes, genres, content rating, size, minimum
iOS, languages, iPad support, icon, screenshots, and optionally the full description.

### Who it's for

- **App developers and ASO:** track keyword ranks daily, watch competitors' ratings and updates.
- **Marketers and investors:** see what's charting in each country.
- **Researchers:** app metadata across countries in one table.

Pair it with our [App Store Reviews Scraper](https://apify.com/swiftkit/app-reviews) for what users
actually say.

### Input

| Option | Used in | What it does |
|---|---|---|
| What to get | all | Search, details, top charts or keyword rank |
| Search terms | search, rank | Words people type in the App Store |
| Apps | details | Links, IDs (`1232780281`) or bundle IDs (`com.spotify.client`) |
| Chart | charts | Top free or top paid |
| Apps to track | rank | Your apps |
| Countries | all | Two-letter codes: `us`, `gb`, `de`, `jp`… |
| Max results | search, charts | Up to 200 for search, 100 for charts |
| Include app descriptions | all | Full description text |

### Output

Top charts (real result, shortened):

```json
{
  "chart": "top-free",
  "rank": 3,
  "country": "gb",
  "appId": "…",
  "name": "ChatGPT",
  "developer": "OpenAI OpCo, LLC",
  "price": 0,
  "rating": 4.8,
  "ratingCount": 1341712,
  "version": "1.2026.266",
  "primaryGenre": "…",
  "url": "https://apps.apple.com/gb/app/…"
}
```

Keyword rank:

```json
{
  "searchTerm": "notes",
  "country": "us",
  "app": "1232780281",
  "rank": 8,
  "inTop200": true,
  "name": "Notion: Notes, Tasks, AI",
  "resultsChecked": 200,
  "topResult": { "appId": "…", "name": "…", "developer": "…" }
}
```

### Pricing

You pay **per row returned** (one app, or one keyword-and-app pair in rank mode). See the Pricing tab.

### Limits, honestly

- Apple allows about 20 requests a minute, so runs with many search terms and countries take a
  while: roughly 3 seconds per term and country.
- Search order from the API is very close to, but not always exactly the same as, what a phone shows
  (the App Store personalizes a little). Ranks beyond 200 aren't available.
- Charts come from Apple's official feed: top free and top paid, overall (no per-category charts).
- Review texts aren't included here; use the App Store Reviews Scraper for those.

### More tools from SwiftKit

- [App Store Reviews Scraper](https://apify.com/swiftkit/app-reviews): iOS App Store reviews from every country
- [Website Screenshot Tool](https://apify.com/swiftkit/website-screenshots): bulk full-page and mobile screenshots, PNG/JPEG/PDF
- [Tech Stack Detector](https://apify.com/swiftkit/tech-stack): what a website is built with: CMS, analytics, ecommerce, hosting

### Questions?

Open an issue on the Issues tab.

# Actor input Schema

## `mode` (type: `string`):

Pick what you need.

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

Search and keyword-rank modes: words people type in the App Store.

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

Details mode: App Store links, numeric app IDs (1232780281) or bundle IDs (com.spotify.client).

## `chart` (type: `string`):

Top charts mode.

## `trackApps` (type: `array`):

Keyword-rank mode: your app(s) as links, IDs or bundle IDs. Their position in the top 200 search results is reported for every search term.

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

Two-letter App Store country codes: us, gb, de, jp…

## `maxResults` (type: `integer`):

Search: up to 200. Charts: up to 100.

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

Adds the full App Store description text.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "habit tracker"
  ],
  "chart": "top-free",
  "countries": [
    "us"
  ],
  "maxResults": 50,
  "includeDescription": false
}
```

# Actor output Schema

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

One row per app (or per keyword and app in rank mode).

# 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"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("swiftkit/app-store").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"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("swiftkit/app-store").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"
  ],
  "countries": [
    "us"
  ]
}' |
apify call swiftkit/app-store --silent --output-dataset

```

## MCP server setup

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

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/NTCEGU9e3lwGvIHbr/builds/iIGUIp2hyBS4fBH1u/openapi.json
