# App Store Keyword Rank Tracker (`arched_friend/appstore-keyword-tracker`) Actor

See exactly where your app ranks on the App Store for the keywords that matter, in any country. Track competitors on the same terms and watch every position change between runs.

- **URL**: https://apify.com/arched\_friend/appstore-keyword-tracker.md
- **Developed by:** [Peach O](https://apify.com/arched_friend) (community)
- **Categories:** Business, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 keyword checkeds

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?

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: Know Where You Rank

Check exactly where your app sits in App Store search for the keywords you care about, in any country. Run it again next week and every row tells you whether you moved up, moved down, or fell out of the results entirely.

Built for app marketers and ASO teams who need position data they can act on, not a monthly PDF.

### How it works

```mermaid
flowchart LR
    A["Keywords<br/>meditation, sleep sounds"] --> C["Apple search"]
    B["Country stores<br/>us, gb, de"] --> C
    C --> D["Ranked results"]
    D --> E["Find your apps<br/>and your rivals"]
    E --> F{"Compare with<br/>last run"}
    F -->|better| G["moved up"]
    F -->|worse| H["moved down"]
    F -->|gone| I["dropped out"]
```

Every keyword is checked in every country, so one run can cover a global launch. Ranks come straight from Apple's own search results, so there is no HTML to break.

### Built for

- **ASO teams** proving a title or subtitle change actually moved positions
- **App marketers** watching rivals climb on the terms they paid to own
- **Founders** checking they still rank for their own brand name
- **Agencies** reporting weekly position changes to app clients

### Input

```json
{
  "keywords": ["meditation", "sleep sounds", "breathing exercises"],
  "trackedApps": ["com.calm.calmapp", "https://apps.apple.com/us/app/headspace/id493145008"],
  "countries": ["us", "gb"],
  "searchDepth": 100
}
```

| Setting | What it does |
| --- | --- |
| `keywords` | The search terms to check |
| `trackedApps` | Your app and competitors, by id, bundle id, URL or name |
| `countries` | Every country store to check |
| `searchDepth` | How far down to look, up to Apple's limit of 200 |
| `includeFullRanking` | Also return the whole chart, to see who owns a keyword |

Ids and bundle ids match exactly. A plain name matches loosely, which is handy for a brand but risky for a common word.

### Output

```json
{
  "keyword": "meditation",
  "country": "us",
  "tracked": "com.calm.calmapp",
  "matchedBy": "bundleId",
  "rank": 2,
  "previousRank": 5,
  "rankChange": -3,
  "movement": "up",
  "appName": "Calm",
  "seller": "Calm.com, Inc.",
  "rating": 4.77,
  "ratingCount": 1948234,
  "appStoreUrl": "https://apps.apple.com/us/app/calm/id571800810",
  "rankedAt": "2026-09-04T09:41:02.115Z"
}
```

`rankChange` is negative when an app improves, because a smaller rank is a better one. `movement` gives you the same thing in words, including `dropped-out` when an app stops ranking at all.

### See who owns a keyword

```json
{
  "keywords": ["habit tracker"],
  "countries": ["us"],
  "includeFullRanking": true,
  "searchDepth": 50
}
```

That returns the top 50 apps for the term with ratings and publishers, which is the fastest way to size up a keyword before you target it.

### Run it as an API

```bash
curl -X POST "https://api.apify.com/v2/acts/arched_friend~appstore-keyword-tracker/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "keywords": ["meditation"],
    "trackedApps": ["com.calm.calmapp"],
    "countries": ["us"]
  }'
```

### Pricing

You pay $0.01 for each keyword and country pair checked, however many apps you track on it. Tracking 10 competitors on one keyword costs the same as tracking one.

| 20 keywords in 3 countries, weekly | Monthly cost |
| --- | --- |
| Checking positions by hand | roughly 12 hours |
| ASO platforms | $50 to $500 per month |
| This Actor | $2.40 per month |

### Common questions

**Why is my app missing?** It did not rank inside your `searchDepth`. Raise it to 200, and if it still shows null then the app is not ranking for that term at all, which is itself the answer.

**Do ranks match what I see on my phone?** They come from Apple's search endpoint for the country you asked about. Your own device also factors in your language, your installed apps and your history, so a personal search is never a clean benchmark.

**How does it know what changed?** Each run records the position it found and compares the next run against it, so history builds from your first run onward.

### Related products

- **App Store Review Tracker** to read what users say once they have found you
- **Google Play Review Tracker** for the same monitoring on Android
- **Tech Stack Checker** to see what a rival app maker runs on the web

# Actor input Schema

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

Search terms to check, one per line. Each keyword is checked in every country you list.

## `trackedApps` (type: `array`):

Your app and your competitors. Use an App Store URL, a numeric app id, a bundle id, or a name. Ids are exact, names match loosely.

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

Two letter country codes, one per line.

## `searchDepth` (type: `integer`):

How far down the results to search for your apps. Apple returns at most 200 per keyword.

## `includeFullRanking` (type: `boolean`):

Also return every app in the results, ranked. Useful for seeing who owns a keyword. Leave off to return only your tracked apps.

## `entity` (type: `string`):

Which catalogue to search.

## `proxyConfiguration` (type: `object`):

Optional. Useful when checking many keywords and countries in one run.

## Actor input object example

```json
{
  "keywords": [
    "meditation",
    "sleep sounds"
  ],
  "trackedApps": [
    "com.calm.calmapp"
  ],
  "countries": [
    "us"
  ],
  "searchDepth": 100,
  "includeFullRanking": false,
  "entity": "software",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per tracked app per keyword, with its position, how it moved since the last run, and the app details behind it.

## `runSummary` (type: `string`):

How many keywords were checked, how many tracked apps are ranking, the best position and how many moved up or down.

# 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 sounds"
    ],
    "trackedApps": [
        "com.calm.calmapp"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arched_friend/appstore-keyword-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 sounds",
    ],
    "trackedApps": ["com.calm.calmapp"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("arched_friend/appstore-keyword-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 '{
  "keywords": [
    "meditation",
    "sleep sounds"
  ],
  "trackedApps": [
    "com.calm.calmapp"
  ],
  "countries": [
    "us"
  ]
}' |
apify call arched_friend/appstore-keyword-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arched_friend/appstore-keyword-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/Zga3QuMk1T4aG00gQ/builds/YodmcLezz6Dhh7nvp/openapi.json
