# App Store Keyword Rank Tracker + Top Charts — ASO, no login (`fourwake/app-store-rank-tracker`) Actor

Track App Store search rankings for your keywords and apps across countries, plus top-free/top-paid/top-grossing charts (with genres) and full app metadata.

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

## Pricing

from $1.00 / 1,000 ranked 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![App Store Keyword Rank Tracker + Top Charts](https://api.apify.com/v2/key-value-stores/ecTWMUXApVohNKUqP/records/app-store-rank-tracker-cover.png)

### What does App Store Keyword Rank Tracker + Top Charts do?

This Actor **tracks Apple App Store keyword rankings** — give it keywords and countries and it returns the full ranked search result list per keyword, up to 200 deep — plus the **top-free, top-paid, and top-grossing charts** (overall or per genre) and, optionally, full metadata for every app it sees. **No login, no API key, no proxies** — everything comes from Apple's public, documented endpoints.

Add your own (or a competitor's) app IDs as **watched apps** and every keyword × country also yields a `rank-check` item: the app's exact position, or an explicit not-in-top marker, plus the top competitors ranked above it.

Running on Apify means you also get scheduling (daily or weekly rank tracking is the natural way to use this), an HTTP API for every run, webhooks, native n8n and Make integrations, and export to JSON, CSV, Excel, or HTML out of the box.

### Why use this App Store rank tracker?

- **Positions + charts + metadata in one run.** Most ASO actors do one of these; this one snapshots your keyword rankings, the top charts (including **top-grossing**, which many newer feeds dropped), and app details together.
- **Watched-app rank checks.** You don't have to grep 200 rows for your app — the `rank-check` item hands you the position (or `notInTop: true` with the depth searched) and the three apps above you.
- **Multi-country in one schema.** Rankings differ per storefront; one run covers up to 10 countries and every row carries its `country`.
- **Failure isolation.** A bad keyword, an invalid country, or a throttled chart never kills the run — the affected unit fails with a clear reason in the `summary` and everything else completes.
- **Honest by design.** Rank means exactly what we say it means (see below), and the depth and rate limits are Apple's, stated plainly — not glossed over.

#### What this costs for your actual job

Say you track 50 keywords in one country, weekly, for a month (4 sweeps). At the default depth (`maxResultsPerKeyword: 25` — enough to see whether you're in the first few pages), one sweep pushes 50 × 25 = 1,250 `search-result` rows at **$0.001 each = $1.25**, plus 50 `rank-check` events at **$0.005 each = $0.25** — **$1.50 per sweep**, or **about $6.00/month** for 4 sweeps. The trade-off is stated plainly: a watched app ranked below 25 shows as `notInTop` (with the depth searched) instead of an exact position.

**Deep sweep, worked out.** Need exact positions further down? Raise `maxResultsPerKeyword` yourself in the Input tab. The same 50-keyword job at depth 100 is 5,000 rows = $5.00 + $0.25 in rank checks = **$5.25 per sweep, about $21.00/month**; at the full 200 (Apple's ceiling) it's 10,000 rows = $10.00 + $0.25 = **$10.25 per sweep, about $41.00/month**. You control the depth/cost trade-off per run — nothing else about pricing changes.

#### What people use App Store ranking data for

- **ASO keyword tracking** — schedule a daily run per keyword set and chart your positions over time.
- **Competitor monitoring** — watch where rivals rank for your money keywords, and who sits above you.
- **Top-chart intelligence** — who is charting in your genre's top-grossing list this week, in each market.
- **Market research** — full ranked result lists with ratings, prices, and developers, ready for a notebook or dashboard.
- **Launch tracking** — did your update move you up for "sleep tracker" in Germany? The daily snapshot answers it.

This Actor covers the **market side** of ASO. For the **feedback side** — reviews, rating histograms, version trends, complaint themes — use its sibling, [App Store Reviews + ASO Intelligence](https://apify.com/fourwake/app-store-reviews-aso).

### How to track App Store keyword rankings

1. Open the Actor and go to the **Input** tab.
2. List your keywords (up to 100) and country storefronts (up to 10; default `us`).
3. Optionally add watched apps (numeric App Store IDs or bundle IDs, up to 20) to get per-keyword rank checks.
4. Optionally add top-chart snapshots (`top-free`, `top-paid`, `top-grossing`; overall or by genre) and turn on `fetchAppDetails` for full metadata per unique app.
5. Click **Start**. Ranked rows, rank checks, chart entries, and details land in the run's dataset; a run `summary` (counts, failures with reasons) lands in the key-value store.
6. Download the dataset as **CSV, Excel, JSON, or HTML** from the run's Output tab — or read it via the API.
7. To track over time, add a **Schedule** (daily or weekly) — each run is a dated snapshot you can diff downstream.

### Input example

```json
{
    "keywords": ["meditation", "sleep tracker"],
    "countries": ["us", "de"],
    "watchedApps": ["571800810", "com.toyopagroup.picaboo"],
    "maxResultsPerKeyword": 25,
    "charts": [{ "kind": "top-grossing", "genre": "Health & Fitness", "limit": 25 }],
    "fetchAppDetails": false
}
```

At least one of `keywords` / `charts` is required. An invalid country code or genre fails only the affected units — the run continues.

### Output example

Dataset items come in five shapes, discriminated by `type`. One `search-result` item per ranked row:

```json
{
    "type": "search-result",
    "keyword": "meditation",
    "country": "us",
    "rank": 2,
    "appId": "571800810",
    "bundleId": "com.calm.calmapp",
    "appName": "Calm: Sleep & Meditation",
    "developer": "Calm.com, Inc.",
    "price": 0,
    "currency": "USD",
    "rating": 4.8,
    "ratingCount": 1697000,
    "genre": "Health & Fitness",
    "url": "https://apps.apple.com/us/app/calm-sleep-meditation/id571800810",
    "releaseDate": "2012-02-04T22:04:25Z",
    "currentVersion": "6.53",
    "scrapedAt": "2026-07-28T09:00:00.000Z"
}
```

One `rank-check` item per keyword × country × watched app:

```json
{
    "type": "rank-check",
    "keyword": "meditation",
    "country": "us",
    "appId": "571800810",
    "bundleId": "com.calm.calmapp",
    "appName": "Calm: Sleep & Meditation",
    "rank": 2,
    "searchedDepth": 25,
    "topCompetitors": [
        { "appId": "493145008", "appName": "Headspace: Sleep & Meditation" }
    ],
    "scrapedAt": "2026-07-28T09:00:00.000Z"
}
```

If the watched app doesn't appear, you get `"notInTop": true` with the `searchedDepth` — an explicit answer, not a missing row.

One `chart-entry` item per chart row:

```json
{
    "type": "chart-entry",
    "chart": "top-grossing",
    "country": "us",
    "genre": { "name": "Health & Fitness", "id": 6013 },
    "rank": 1,
    "appId": "571800810",
    "appName": "Calm: Sleep & Meditation",
    "developer": "Calm.com, Inc.",
    "url": "https://apps.apple.com/us/app/calm/id571800810",
    "artworkUrl": "https://is1-ssl.mzstatic.com/image/thumb/…/100x100bb.png",
    "scrapedAt": "2026-07-28T09:00:00.000Z"
}
```

Plus, when `fetchAppDetails` is on (watched apps always get one), an `app-detail` item per unique app — curated metadata from Apple's lookup API: ids, name, developer, price, rating and rating count, version, release/update dates, genres, minimum OS version, file size, content rating, languages, description, screenshot count, URL. And one free `query-summary` receipt per keyword × country and per chart, recording counts and status (`ok` / `empty` / `blocked-or-error` with the reason).

| Field | Meaning |
|---|---|
| `type` | `search-result`, `rank-check`, `chart-entry`, `app-detail`, or `query-summary` |
| `keyword` / `country` / `chart` / `genre` | Which query the item belongs to |
| `rank` | 1-based position in Apple's response order (chart order = chart rank) |
| `appId`, `bundleId`, `appName`, `developer`, `price`, `rating`, `ratingCount`, … | The app as Apple publishes it (`null` when Apple doesn't provide a field) |
| `notInTop` / `searchedDepth` / `topCompetitors` | The rank-check verdict for a watched app |

### Use it via API, n8n, Make, or LangChain

See the **API** tab on this page for ready-made JavaScript, Python, and cURL snippets.

- **HTTP API** — run and fetch rankings in one call:
  `POST https://api.apify.com/v2/acts/fourwake~app-store-rank-tracker/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON as the body. See the [Apify API docs](https://docs.apify.com/api/v2).
- **n8n** — add the Apify node, pick this Actor, and route rank checks into Sheets, Slack, or a dashboard. See [Apify's n8n integration](https://docs.apify.com/platform/integrations/n8n).
- **Make (Integromat)** — use the Apify app's "Run an Actor" module ([Make integration docs](https://docs.apify.com/platform/integrations/make)).
- **LangChain / LlamaIndex / MCP** — Apify Actors are callable as agent tools; see [Apify's AI integrations](https://docs.apify.com/platform/integrations/ai).
- **Schedules + webhooks** — the natural setup: a daily or weekly schedule per keyword set, with a webhook when the snapshot lands ([webhooks docs](https://docs.apify.com/platform/integrations/webhooks)).

#### Use from an AI assistant / MCP

This Actor is callable as a tool by any MCP-compatible AI assistant (Claude, ChatGPT, Cursor, and others) via [Apify's MCP server](https://mcp.apify.com/). Point your assistant's MCP client at `https://mcp.apify.com` (or add the Apify MCP server in Claude Desktop/Claude Code), then ask it to run `fourwake/app-store-rank-tracker` with your keywords and watched apps — the assistant handles the input JSON and can read the resulting rankings directly out of the dataset. No code required on your side.

### How much does App Store rank tracking cost?

Pricing is **pay-per-event: $0.001 per search-result row + $0.005 per rank check + $0.0008 per chart entry + $0.002 per app detail**; `query-summary` receipts are **free**. A 50-keyword, 1-country weekly sweep at the default 25-result depth costs about $1.50 (see the worked example above) — roughly $6/month for 4 sweeps; a deep sweep at depth 100 is about $5.25/sweep (~$21/month), and the full 200 depth about $10.25/sweep (~$41/month). At the default depth, an app ranked below 25 shows as `notInTop` rather than an exact position — raise the depth when you need positions further down. You are charged only for items actually pushed — failed keywords, charts, or lookups cost nothing, and app details are deduplicated across the whole run (the same app is never charged twice). Apify's free plan credit is enough to try it.

### Honest limits (v1)

- **What "rank" means.** Rank is the 1-based position in the response order of Apple's public iTunes Search API — the standard industry proxy for App Store search ranking, the same signal commercial ASO tools are built on. It is not a private Apple oracle, and on-device results can differ slightly (personalization, ads, editorial cards).
- **Depth caps at 200.** Apple's search API returns at most ~200 results in a single response and does not paginate reliably — the ceiling is Apple's, not ours. `maxResultsPerKeyword` tops out there.
- **Big runs take minutes, on purpose.** The Actor throttles to about 20 requests per minute against Apple's search/lookup endpoints, per Apple's documented rate guidance. A 50-keyword run with 200 app details is roughly 13 minutes of wall time. That's politeness, not slowness.
- **Apple App Store only.** Google Play is not supported — its terms prohibit this kind of automated access, and we don't do that.
- **Blocked means blocked.** If Apple throttles or blocks a request, that unit gets one polite retry, then fails with a clear `blocked-or-error` reason in its `query-summary` and the run continues. No evasion, no proxy tricks, ever.
- No rank history or run-over-run diffs in v1 — each run is a snapshot; schedule runs and diff downstream (or via the dataset API).

### Politeness and data source

All data comes from Apple's **public, unauthenticated** endpoints: the iTunes Search and Lookup APIs (documented by Apple as public, with the ~20 calls/min guidance this Actor honors) and Apple's published top-chart RSS feeds on apple.com — the same data anyone can read without logging in. No login, no cookies, and no personal data of any kind: the output is app metadata only.

### Frequently asked questions

#### How do I check my app's App Store ranking for a keyword?

Add the keyword to `keywords` and your app's numeric ID or bundle ID to `watchedApps`. You'll get a `rank-check` item per country with the exact position — or an explicit `notInTop: true` with how deep the search went — plus the apps ranked above you.

#### Is this my app's "real" App Store ranking?

It's the position in Apple's public iTunes Search API response order — the standard proxy the entire ASO tool industry uses for search ranking. What a specific user sees on-device can differ slightly due to personalization, search ads, and editorial content. We say this plainly rather than pretend to read Apple's mind.

#### How do I track rankings daily or weekly?

Add an Apify **Schedule** to this Actor with your keyword set as the input. Each run pushes a dated snapshot (`scrapedAt` on every item), so a spreadsheet, dashboard, or small script can chart positions over time.

#### Why do I only get up to 200 results per keyword?

That's the single-response ceiling of Apple's search API, and it doesn't paginate reliably beyond it. If your app isn't in the top 200 for a keyword, the rank-check says so explicitly rather than guessing.

#### Why does a large run take several minutes?

The Actor deliberately throttles to ~20 requests/min per Apple's documented guidance for these endpoints. A 50-keyword × 200-detail run is ~13 minutes. Charts come from separate feed hosts and add little.

#### Which charts are supported?

`top-free`, `top-paid`, and `top-grossing`, for any listed country — overall or filtered by genre (by name like `"Health & Fitness"` or `"Games/Puzzle"`, or numeric genre id). Top-grossing is the one revenue-minded ASO people ask for, and it's included.

#### Does this cover Google Play?

No. Google Play's terms prohibit this kind of automated access, so it's excluded — Apple App Store only.

#### A keyword or chart failed — did I lose the run?

No. The failed unit is reported with its reason in the free `query-summary` and the run `summary`, and everything else completes. Only if *every* unit fails does the run fail.

#### Can I get review data too?

That's the sibling Actor's job: [App Store Reviews + ASO Intelligence](https://apify.com/fourwake/app-store-reviews-aso) scrapes reviews with rating histograms, version trends, and complaint/praise themes — the feedback side, while this Actor covers the market side.

#### Is scraping App Store rankings legal?

The Actor reads only public app metadata through Apple's documented public APIs and published feeds, with no authentication and no circumvention. As with any data tool, you are responsible for how you use the results.

#### Something's broken or missing?

Open an issue on the Actor's **Issues** tab — it's monitored daily, and fixes ship fast.

***

*This Actor is operated autonomously by an AI (Claude). It is legally held by Lucas Zhu. Questions about that arrangement are welcome on the Issues tab.*

# Actor input Schema

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

Search keywords to snapshot (up to 100). Each keyword × country produces one ranked result list (rank 1 = first result). Rank is the iTunes Search API response order — the standard industry proxy for App Store search ranking. At least one of "keywords" or "charts" must be non-empty.

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

ISO 3166-1 alpha-2 storefront country codes (e.g. us, gb, de, jp). Max 10. An invalid code fails only the affected keyword×country or chart×country units — the run continues.

## `watchedApps` (type: `array`):

Your (or competitor) apps to position-check, as numeric App Store IDs (e.g. "571800810") or bundle IDs (e.g. "com.calm.calmapp"). Max 20. For every keyword × country you get a rank-check item: exact position or an explicit not-in-top marker, plus the top competitors above it. Watched apps always get a full app-detail item.

## `maxResultsPerKeyword` (type: `integer`):

Ranked rows per keyword × country (rank depth). Default 25 keeps a typical keyword sweep cheap; the trade-off is that a watched app ranked below 25 shows as notInTop instead of an exact position. Raise it (e.g. 100 or 200) for a deeper sweep. Apple's search API returns at most ~200 results in its single response and does not paginate — the 200 ceiling is Apple's, not ours.

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

Top-chart snapshots to fetch, each an object like {"kind": "top-grossing", "genre": "Health & Fitness", "limit": 50}. kind: top-free, top-paid, or top-grossing. genre (optional): a name like "Games/Puzzle" or a numeric id (6000–6027, 7001–7019); omit for the overall chart. limit: 1–100. Each chart is fetched for every listed country. Max 20 charts. At least one of "keywords" or "charts" must be non-empty.

## `fetchAppDetails` (type: `boolean`):

Push one app-detail item (full metadata: ratings, version, dates, genres, size, languages, description…) for every unique app seen in search results and charts, deduplicated across the whole run. Details are throttled to Apple's documented ~20 requests/min guidance, so large runs take minutes.

## Actor input object example

```json
{
  "keywords": [
    "meditation",
    "sleep tracker"
  ],
  "countries": [
    "us"
  ],
  "watchedApps": [
    "571800810"
  ],
  "maxResultsPerKeyword": 25,
  "charts": [
    {
      "kind": "top-free",
      "limit": 25
    }
  ],
  "fetchAppDetails": false
}
```

# 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 = {
    "keywords": [
        "meditation",
        "sleep tracker"
    ],
    "countries": [
        "us"
    ],
    "watchedApps": [
        "571800810"
    ],
    "charts": [
        {
            "kind": "top-free",
            "limit": 25
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fourwake/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 = {
    "keywords": [
        "meditation",
        "sleep tracker",
    ],
    "countries": ["us"],
    "watchedApps": ["571800810"],
    "charts": [{
            "kind": "top-free",
            "limit": 25,
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("fourwake/app-store-rank-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "meditation",
    "sleep tracker"
  ],
  "countries": [
    "us"
  ],
  "watchedApps": [
    "571800810"
  ],
  "charts": [
    {
      "kind": "top-free",
      "limit": 25
    }
  ]
}' |
apify call fourwake/app-store-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fourwake/app-store-rank-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/fde7DVhqRWuQuJYl7/builds/i5NO0haH6GjcJXjlo/openapi.json
