# App Store Top Charts & Keyword Rank Tracker (`echolab/app-store-rank-tracker`) Actor

App Store rank tracker: returns where iPhone/iPad apps rank in top charts and keyword search. Input: countries (ISO-2), charts, categories, keywords, app IDs to track. Output: one row per app, chart/keyword and country: rank or found=false, app ID, name, developer. Official Apple feeds; no login.

- **URL**: https://apify.com/echolab/app-store-rank-tracker.md
- **Developed by:** [Echo Lab](https://apify.com/echolab) (community)
- **Categories:** Marketing, SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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 Top Charts & Keyword Rank Tracker

**App Store rank tracker and keyword ranking checker** for iPhone and iPad apps, plus the Top Free Mac chart. Give it countries, top charts, categories and search keywords, plus your own app and competitors, and it returns where every app ranks: one row per app, chart or keyword, and country, with the position or `found: false` when the app is not ranked. Data comes from Apple's official public feeds (iTunes RSS top charts and the iTunes Search API), so there is no login, no proxy and no browser.

- **App Store keyword ranking** for iPhone and iPad apps, for any search term in any storefront (Apple's top 200 results per keyword; Mac App Store search is not covered)
- **App Store top charts by country and category**: Top Free / Paid / Grossing for iPhone and iPad, New Apps, Top Free Mac, including game subcategories
- **Rank tracking** for your apps and competitors, with "not ranked" rows so gaps show up in your history
- App ID, name, developer, price, category and App Store link on ranked rows; rating, rating count and version on ranked keyword rows, and on ranked chart rows with `includeAppDetails`
- Runs on 256 MB and finishes in seconds to minutes; export to JSON, CSV, Excel or Google Sheets

### What can I use this App Store rank tracker for?

- **ASO keyword tracking**: schedule a daily run and watch your keyword positions in 10+ countries.
- **Competitor tracking**: see when a competitor enters or leaves the Top 100 in your category.
- **Top charts research**: snapshot the Top Grossing chart per category and country (for example, iPhone games in Japan) to spot growing niches.
- **Launch tracking**: follow a new app's chart and keyword positions during launch week.
- **Dashboards and alerts**: send rows to Google Sheets, Slack or a webhook with Apify integrations.

### How much does it cost to track App Store rankings?

This Actor is priced **per result**: **$1.00 per 1,000 rows** saved to the dataset ($0.001 per row), plus an Actor start fee of $0.00005 per run. Apify platform usage is included in that price, so you do not pay separately for compute.

| Example run | Rows | Cost |
|---|---|---|
| 1 app, 3 keywords + 1 category chart, 5 countries, `trackedAppsOnly` | 20 | about $0.02 per run, about $0.60 per month if run daily |
| Top 100 of one chart in one country | 100 | about $0.10 |
| Top 25 of the Top Free iPhone chart in 10 countries | 250 | about $0.25 |

Set a maximum cost per run in the run options: the Actor stops cleanly when the limit is reached. The price shown on the Pricing tab of this page is the one that applies.

### Input

| Field | Type | Description |
|---|---|---|
| `countries` | array | ISO 3166-1 alpha-2 storefront codes, e.g. `us`, `gb`, `de`, `jp`. Default `["us"]`. |
| `charts` | array | Any of `top-free-iphone`, `top-paid-iphone`, `top-grossing-iphone`, `top-free-ipad`, `top-paid-ipad`, `top-grossing-ipad`, `new-apps`, `new-free-apps`, `new-paid-apps`, `top-free-mac`. Empty = keywords only. |
| `genres` | array | `all` for the overall chart, or genre IDs/names (see table below). |
| `chartLimit` | integer | Positions per chart, 1–100 (Apple publishes at most 100). |
| `keywords` | array | Search terms to check, e.g. `habit tracker`. |
| `keywordResultsLimit` | integer | Top results returned per keyword and country, 0–200. |
| `trackAppIds` | array | App Store IDs or URLs of apps to track. |
| `trackedAppsOnly` | boolean | Only return rows for tracked apps (cheapest daily tracker). |
| `includeAppDetails` | boolean | Add rating, rating count, version and size to chart rows. |
| `requestDelaySecs` | integer | Pause between Apple search requests (default 3). |

#### Example: daily rank tracker for one app

```json
{
  "countries": ["us", "gb", "de", "ca", "au"],
  "charts": ["top-free-iphone"],
  "genres": ["Productivity"],
  "keywords": ["habit tracker", "daily planner", "routine"],
  "trackAppIds": ["https://apps.apple.com/us/app/id6443918070"],
  "trackedAppsOnly": true
}
```

This returns 5 countries × (1 chart + 3 keywords) = 20 rows per run.

#### Example: category chart snapshot

```json
{
  "countries": ["us"],
  "charts": ["top-free-iphone", "top-grossing-iphone"],
  "genres": ["6015", "6013"],
  "chartLimit": 100,
  "includeAppDetails": true
}
```

#### Category IDs

| ID | Category | ID | Category |
|---|---|---|---|
| 6000 | Business | 6013 | Health & Fitness |
| 6001 | Weather | 6014 | Games |
| 6002 | Utilities | 6015 | Finance |
| 6003 | Travel | 6016 | Entertainment |
| 6004 | Sports | 6017 | Education |
| 6005 | Social Networking | 6018 | Books |
| 6006 | Reference | 6020 | Medical |
| 6007 | Productivity | 6021 | Magazines & Newspapers |
| 6008 | Photo & Video | 6023 | Food & Drink |
| 6009 | News | 6024 | Shopping |
| 6010 | Navigation | 6026 | Developer Tools |
| 6011 | Music | 6027 | Graphics & Design |
| 6012 | Lifestyle | | |

Game subcategories: 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. Names work too, e.g. `"Games: Puzzle"`.

Apple still lists 6022 Catalogs, 6025 Stickers, 7007 Games: Dice and 7008 Games: Educational, but its chart feeds return no apps for them (checked in November 2026), so they are left out of the table. The same category IDs work for the Top Free Mac chart.

### Output

One row per app per chart/keyword per country. Example:

```json
{
  "type": "keyword",
  "country": "us",
  "chart": null,
  "genreId": null,
  "genreName": null,
  "keyword": "habit tracker",
  "rank": 2,
  "isTracked": true,
  "found": true,
  "appId": "6443918070",
  "appName": "Habit Tracker Example",
  "developer": "Example Apps Ltd",
  "bundleId": "com.example.habits",
  "price": 0.0,
  "currency": "USD",
  "category": "Productivity",
  "categoryId": "6007",
  "releaseDate": "2022-10-27T07:00:00Z",
  "appUrl": "https://apps.apple.com/us/app/habit-tracker-example/id6443918070",
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/.../512x512bb.jpg",
  "rating": 4.84,
  "ratingCount": 2534,
  "version": "2.9.1",
  "currentVersionReleaseDate": "2026-10-20T15:02:11Z",
  "contentRating": "4+",
  "sizeBytes": 48523264,
  "minimumOsVersion": "16.0",
  "listSize": 200,
  "checkedAt": "2026-11-04T08:00:00Z"
}
```

| Field | Meaning |
|---|---|
| `type` | `chart` or `keyword` |
| `rank` | 1-based position; `null` when a tracked app is not in the list |
| `isTracked` / `found` | `isTracked` is true for apps from `trackAppIds`; `found` tells whether a tracked app is in the list (`null` for untracked rows) |
| `listSize` | How many apps the chart or search returned (charts: up to 100, keywords: up to 200 when tracking) |
| `rating`, `ratingCount`, `version`, ... | App details on ranked keyword rows, and on ranked chart rows when `includeAppDetails` is on. Null on `found: false` and error rows (they carry only app ID, name, developer, bundle ID and links) |
| `error`, `errorMessage` | Only present if Apple refused a specific chart or keyword; the run continues with the rest |

Developer names are the public seller names shown on the App Store.

Every dataset row counts as one result. Use `trackedAppsOnly` to get only the rows you need. If Apple refuses a specific chart or keyword after retries, one error row is written for it so you can see what failed. Empty charts produce no rows, so nothing is billed for them: if Apple returns an empty chart (or a keyword search with zero results when you track no apps), the run log and status message name it, and a run that ends with no rows at all is marked failed instead of "succeeded with no data". A keyword search with zero results still gives a `found: false` row for each tracked app, because "not ranked" is a real answer there.

### Tips and limits

- **Keyword ranks are approximate.** They follow the order of Apple's public iTunes Search API, which is close to, but not always identical with, what a person sees in the App Store app (personalisation, ads and A/B tests are not reflected). They are consistent from day to day, which is what matters for tracking trends.
- Apple's New Apps feeds (`new-apps`, `new-free-apps`, `new-paid-apps`) are store-wide: Apple ignores the category for them, so the Actor fetches them once per country with genre `All` instead of returning the same list once per category.
- Apple's top-chart feeds return at most 100 apps per chart. The Top Paid / Top Grossing Mac feeds are currently empty on Apple's side, so only Top Free Mac is offered.
- Apple rate-limits its search API (about 20 requests per minute per IP). The Actor paces requests (`requestDelaySecs`, default 3) and retries on 403/429. Large runs (hundreds of keywords × countries) take longer but stay reliable.
- Schedule the Actor (e.g. daily) and connect the dataset to Google Sheets or a database to build your rank history.

### FAQ

#### Is this an App Store API?

It works like one: you send countries, charts, categories, keywords and app IDs as JSON (through the Apify API, an integration or the Console) and get structured rows back. Under the hood it reads Apple's official public iTunes RSS, Search and Lookup endpoints.

#### Are keyword ranks the same as what I see in the App Store app?

Close, but not always identical. Ranks follow the order of Apple's public iTunes Search API, which does not include personalisation, search ads or A/B tests. The order is consistent from day to day, which is what matters for tracking trends.

#### Which countries are supported?

Any App Store storefront, as a two-letter code (`us`, `gb`, `de`, `jp`, `br`, `in`, `cn` and about 150 more). In November 2026 we checked the Top Free iPhone chart in all 156 storefronts in the built-in list and every one returned data.

#### How do I track my own app?

Put your App Store URL or numeric ID in `trackAppIds`, add your keywords, and turn on `trackedAppsOnly`. You get one row per keyword or chart and country with your rank, or `found: false`. Schedule the run daily to build a rank history.

#### Does it cover Google Play?

No. It only covers Apple's App Store: charts and keyword search for iPhone and iPad, and the Top Free Mac chart.

#### Do I need an Apple developer account or API key?

No. Only public endpoints are used; no account, cookie or key is needed.

#### Can an AI agent call it?

Yes. It is a regular Apify Actor, so agents can run it through the Apify API or Apify's MCP server with a JSON input like the examples above.

### Compliance and data source

The Actor only reads Apple's official public endpoints: the iTunes RSS top-chart feeds, the iTunes Search API and the iTunes Lookup API. It does not log in, use cookies, bypass any protection, or collect personal data — only public app metadata. You are responsible for using the data in line with Apple's terms and the laws that apply to you.

### Support

Found a bug or need a field? Open an issue on the Actor's Issues tab.

More real output, worked pricing examples and a comparison with alternatives: https://echolab-tools.pages.dev/app-store-rank-tracker/

# Actor input Schema

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

App Store storefronts as ISO 3166-1 alpha-2 codes, e.g. us, gb, de, jp, br. Every chart and keyword is checked in every country.

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

Which top charts to fetch. Leave empty to only check keywords.

## `genres` (type: `array`):

"all" for the overall chart, or Apple genre IDs / names, e.g. 6007 or Productivity, 6015 Finance, 6013 Health & Fitness, 6014 Games, 7012 Games: Puzzle. Full list in the README.

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

How many positions to return from each chart (Apple publishes at most 100).

## `keywords` (type: `array`):

Search terms to check rankings for, e.g. "habit tracker". Ranks follow the order of Apple's public iTunes Search API (top 200).

## `keywordResultsLimit` (type: `integer`):

How many top search results to return per keyword and country (0-200). Set 0 with tracked apps to return only your tracked apps' positions.

## `trackAppIds` (type: `array`):

Optional. App Store IDs or app URLs (e.g. https://apps.apple.com/us/app/id1438388363). For each chart and keyword you get a row with the app's position, or found=false if it is not ranked.

## `trackedAppsOnly` (type: `boolean`):

Return only the rows for your tracked apps (one row per app per chart/keyword) instead of full lists. Cheapest way to run a daily rank tracker.

## `includeAppDetails` (type: `boolean`):

Adds average rating, rating count, current version, size and content rating to chart rows (one extra Apple request per chart). Keyword rows always include these.

## `requestDelaySecs` (type: `integer`):

Apple's search API allows roughly 20 requests per minute. Keep at 3 or above for reliable runs.

## Actor input object example

```json
{
  "countries": [
    "us",
    "gb"
  ],
  "charts": [
    "top-free-iphone"
  ],
  "genres": [
    "all",
    "6007"
  ],
  "chartLimit": 25,
  "keywords": [
    "habit tracker"
  ],
  "keywordResultsLimit": 10,
  "trackAppIds": [],
  "trackedAppsOnly": false,
  "includeAppDetails": false,
  "requestDelaySecs": 3
}
```

# Actor output Schema

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

Dataset items, one per result row.

# 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 = {
    "countries": [
        "us",
        "gb"
    ],
    "charts": [
        "top-free-iphone"
    ],
    "genres": [
        "all",
        "6007"
    ],
    "chartLimit": 25,
    "keywords": [
        "habit tracker"
    ],
    "keywordResultsLimit": 10,
    "trackAppIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("echolab/app-store-rank-tracker").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 = {
    "countries": [
        "us",
        "gb",
    ],
    "charts": ["top-free-iphone"],
    "genres": [
        "all",
        "6007",
    ],
    "chartLimit": 25,
    "keywords": ["habit tracker"],
    "keywordResultsLimit": 10,
    "trackAppIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("echolab/app-store-rank-tracker").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 '{
  "countries": [
    "us",
    "gb"
  ],
  "charts": [
    "top-free-iphone"
  ],
  "genres": [
    "all",
    "6007"
  ],
  "chartLimit": 25,
  "keywords": [
    "habit tracker"
  ],
  "keywordResultsLimit": 10,
  "trackAppIds": []
}' |
apify call echolab/app-store-rank-tracker --silent --output-dataset

```

## MCP server setup

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

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/06UQwa5ATKRfrLmvD/builds/K0bYWzqBFotqlhprg/openapi.json
