# App Store Keyword Rank Tracker: iOS ASO Rankings by Country (`kramer_konversations/app-store-keyword-rank-tracker`) Actor

Check where any iPhone app ranks for your keywords in App Store search, in any country, plus the top competing apps for each keyword. Schedule it to track rank changes over time. Official Apple search API. $0.0009 per keyword check.

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

## Pricing

$0.90 / 1,000 keyword checks

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 Keyword Rank Tracker: where your iPhone app ranks, by keyword and country

**See where any iOS app ranks in App Store search for the keywords you care about**, in any country, and which apps beat it. Track your own app and your competitors side by side. Schedule it daily or weekly and every row shows the **previous rank and the change**.

- **Many apps × many keywords × many countries** in one run
- **Competitor view:** the top apps for every keyword, so you see who you're up against
- **Rank changes over time:** each run compares with your last run (positive change = moved up)
- **Official data:** Apple's public search API. No login, no proxies.

### Sample output (real, US App Store, Oct 2026)

```json
{
  "type": "rank",
  "query": "Babbel",
  "appId": 829587759,
  "appName": "Babbel - Language Learning",
  "keyword": "learn spanish",
  "country": "us",
  "rank": 2,
  "inTop200": true,
  "resultsForKeyword": 173,
  "previousRank": null,
  "change": null,
  "topApps": [
    {
      "rank": 1,
      "app": "Duolingo: Learn Languages",
      "developer": "Duolingo, Inc"
    },
    {
      "rank": 3,
      "app": "Learn Spanish for Beginners",
      "developer": "Appcano LLC"
    }
  ],
  "checkedAt": "2026-10-30T02:10:00+00:00"
}
```

### How to use

1. Add **apps** (yours and competitors): a name, App Store URL, or numeric ID.
2. Add **keywords**: the search terms you want to rank for.
3. Pick **countries** (default `us`).
4. Run, then export from the Dataset tab. To track over time, click **Schedule** and pick daily or weekly. Use **tracker name** to keep separate tracking sets.

#### Sample input

```json
{ "apps": ["Duolingo", "Babbel"], "keywords": ["language learning", "learn spanish"], "countries": ["us", "gb"] }
```

### Pricing

- **$0.0009 per keyword check** (one app, one keyword, one country)
- **No start fee.** Apps that aren't found cost nothing, and failed searches cost nothing.

Example: 2 apps × 10 keywords × 1 country = 20 checks = **$0.018** per run. Weekly for a year is under $1.

### Good to know

- Ranks come from Apple's official search API (top 200 results). It closely follows what people see when they search in the App Store app, but personalization and ads can make the in-app view differ slightly. Use it for trends and comparisons.
- `rank: null` means the app isn't in the top 200 for that keyword.
- Apple limits how fast searches can run, so large runs take about 3 seconds per keyword per country.

### More App Store tools

- [**App Store Reviews Scraper**](https://apify.com/kramer_konversations/app-store-reviews-scraper): every recent review, with star filters and weekly monitoring ($0.08 per 1,000)
- [**App Store Review Insights**](https://apify.com/kramer_konversations/app-store-review-insights): complaint themes, feature requests, and bugs in one report

### Who it's for

- **Indie developers:** check whether your new title or keywords actually moved you up
- **ASO consultants and agencies:** weekly rank reports for clients and their competitors
- **Product and growth teams:** watch competitors climb or fall on the terms that matter
- **AI agents:** one call returns structured ranks ready to reason over

# Actor input Schema

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

App names ("Duolingo"), App Store URLs, or numeric app IDs. Add competitors too to compare ranks side by side.

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

Search terms to check, e.g. language learning, learn spanish. Each keyword is one check per country, covering all your apps.

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

Two-letter App Store country codes, e.g. us, gb, de.

## `topCompetitors` (type: `integer`):

Lists the apps ranking at the top for each keyword (0 to 20).

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

Each run compares ranks to the previous run with the same tracker name. Schedule it daily or weekly to track changes.

## Actor input object example

```json
{
  "apps": [
    "Duolingo",
    "Babbel"
  ],
  "keywords": [
    "language learning",
    "learn spanish"
  ],
  "countries": [
    "us"
  ],
  "topCompetitors": 5,
  "monitorName": "default"
}
```

# Actor output Schema

## `ranks` (type: `string`):

No description

## `allResults` (type: `string`):

No description

# 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": [
        "Duolingo",
        "Babbel"
    ],
    "keywords": [
        "language learning",
        "learn spanish"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kramer_konversations/app-store-keyword-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 = {
    "apps": [
        "Duolingo",
        "Babbel",
    ],
    "keywords": [
        "language learning",
        "learn spanish",
    ],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("kramer_konversations/app-store-keyword-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 '{
  "apps": [
    "Duolingo",
    "Babbel"
  ],
  "keywords": [
    "language learning",
    "learn spanish"
  ],
  "countries": [
    "us"
  ]
}' |
apify call kramer_konversations/app-store-keyword-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kramer_konversations/app-store-keyword-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/p0yrV61dEgyWgCS5N/builds/ElyJ5WVTIRxaLqpgR/openapi.json
