# App Store ASO Keyword Tool and Rank Tracker (`datawharf/app-store-aso-keyword-tool`) Actor

Track App Store keyword rankings, find the top apps for any keyword, and score keyword difficulty and opportunity. A pay-as-you-go ASO keyword tool and rank tracker on Apple's public API. No subscription. Export to CSV, Excel, or JSON. An affordable AppTweak and Sensor Tower alternative.

- **URL**: https://apify.com/datawharf/app-store-aso-keyword-tool.md
- **Developed by:** [Brad Holder](https://apify.com/datawharf) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 ASO Keyword Tool

Find out which apps rank for any App Store keyword, track where your own app ranks, and see how competitive each keyword is. This tool runs on Apple's public iTunes Search API, so it is fast and reliable, and needs no API key, no login, and no proxies. It gives app marketers the same kind of keyword intelligence that subscription tools charge $83 to $179 a month for, as clean pay-as-you-go data you can open in a spreadsheet. It is a pay-as-you-go App Store ASO keyword tool and rank tracker, and an affordable AppTweak and Sensor Tower alternative for people who want the data in a spreadsheet, not another subscription.

- Track App Store keyword rankings daily
- Find the top apps for any App Store keyword
- Score App Store keyword difficulty and opportunity
- Check where your app ranks for a keyword
- Export ASO keyword data to CSV, Excel, or JSON
- Pay as you go, no ASO subscription

Because it uses an official public API rather than fragile page scraping, there is nothing to break when a web page changes, which makes it dependable for daily rank tracking.

### What it does

The App Store ASO Keyword Tool works in two modes. You give it a list of keywords and pick one of two actions. In "Top apps for keywords" mode it returns the top ranking apps for each keyword, plus a quick read on how popular, difficult, and worth targeting that keyword is. In "Track where apps rank" mode it tells you exactly where each app you care about sits in the search results for each keyword. Results export to CSV, Excel, or JSON like any Apify dataset.

### Who it is for

- Indie app developers who want to track their app's keyword rankings daily without paying for a dashboard seat.
- ASO agencies benchmarking many client apps across many keywords on a schedule.
- Product marketers running a launch-week competitor scan to see who owns the keywords they want.
- Analysts and investors who want clean, flat keyword data to pipe into their own spreadsheets or BI tools.

### Use cases

1. Keyword opportunity research. Run a set of candidate keywords and sort by the opportunity score to find the ones with real demand and beatable competition before you rewrite your app listing.
2. Daily rank tracking. Save your target keywords and schedule a daily run to watch your app climb or slip over time, then chart the history in a spreadsheet.
3. Competitor rank benchmarking. Track a group of competitor apps across your priority keywords to see who ranks above you and where you can overtake them.
4. Market sizing before you build. Scan a niche's keywords in seconds to gauge how crowded and how popular it is before committing to an app idea.

### Two actions

#### Top apps for keywords
Returns one row per ranked app, for each keyword, with the app's rank, name, developer, rating, review count, price, and genre, plus keyword-level context: total results, the review-count scale of the top competitors, the average rating of the top apps, how many of the top apps are paid, and three directional scores (popularity, difficulty, opportunity) from 0 to 100.

#### Track where apps rank
Returns one row per app, for each keyword, showing the app's rank position (or a clear "out of top 200" flag), whether it is your app, and the app's rating, review count, price, genre, and developer.

### Input

| Field | Type | Used by | Description |
| --- | --- | --- | --- |
| action | choice | both | "keyword-top-apps" or "app-rank-tracking". |
| keywords | list of text | both | The search terms to analyze. Required. |
| country | text | both | Two-letter storefront code (us, ca, gb, de). Default us. |
| topN | number | Top apps | How many ranked apps to return per keyword (1 to 50). Default 10. |
| apps | list of text | Track ranks | Apple app IDs to track (the number after /id in an App Store URL). |
| myApp | text | Track ranks | One app ID to flag as yours. |

#### Example input (Top apps for keywords)

```json
{
  "action": "keyword-top-apps",
  "keywords": ["fitness app", "meditation"],
  "country": "us",
  "topN": 10
}
````

#### Example input (Track where apps rank)

```json
{
  "action": "app-rank-tracking",
  "keywords": ["photo editor", "collage maker"],
  "apps": ["389801252", "547702041"],
  "myApp": "389801252",
  "country": "us"
}
```

### Output

#### Example row (Top apps for keywords)

```json
{
  "action": "keyword-top-apps",
  "keyword": "fitness app",
  "storefront": "us",
  "appRank": 1,
  "appId": "449810000",
  "appName": "Fitness Coach and Workout Tracker",
  "developer": "Example Health Inc.",
  "rating": 4.8,
  "ratingCount": 152340,
  "price": 0,
  "formattedPrice": "Free",
  "genre": "Health & Fitness",
  "releaseDate": "2015-03-10T00:00:00Z",
  "iconUrl": "https://.../512x512.jpg",
  "appUrl": "https://apps.apple.com/us/app/id449810000",
  "totalResults": 200,
  "top10MedianRatingCount": 84120,
  "top10AvgRating": 4.7,
  "top10PaidCount": 1,
  "popularityEstimate": 98,
  "difficultyEstimate": 88,
  "opportunityEstimate": 12,
  "scrapedAt": "2026-07-16T12:00:00.000Z"
}
```

#### Example row (Track where apps rank)

```json
{
  "action": "app-rank-tracking",
  "keyword": "photo editor",
  "storefront": "us",
  "appId": "389801252",
  "appName": "Instagram",
  "appRank": 7,
  "rankStatus": "ranked",
  "isMyApp": true,
  "rating": 4.7,
  "ratingCount": 28800000,
  "price": 0,
  "formattedPrice": "Free",
  "genre": "Photo & Video",
  "developer": "Instagram, Inc.",
  "releaseDate": "2010-10-06T04:01:00Z",
  "iconUrl": "https://.../512x512.jpg",
  "appUrl": "https://apps.apple.com/us/app/id389801252",
  "scrapedAt": "2026-07-16T12:00:00.000Z"
}
```

### About the scores

The popularity, difficulty, and opportunity numbers are directional prioritization aids from 0 to 100, worked out from the review counts and ratings of the top ranking apps. They are meant to help you sort and shortlist keywords quickly, not to serve as calibrated indexes. For important decisions, cross-check the raw columns like total results and top-10 median review count, and apply your own judgment.

### Pricing

This tool uses pay per event pricing. You pay a small fee for each result row it returns, and nothing for keywords or apps that return no data. There is no monthly subscription. A typical daily rank check of one app across 20 keywords is only a few cents a day. Compare that to fixed monthly ASO subscriptions in the $83 to $179 range.

### How it works

For each keyword, the App Store ASO Keyword Tool calls Apple's public iTunes Search API with the software filter, which returns apps in App Store ranking order for your chosen storefront. In "Top apps" mode it keeps the top apps you asked for and computes the keyword context. In "Track ranks" mode it looks up your chosen apps once for their details, then finds each app's position in the ranked results. A short delay runs between keywords to stay within Apple's public rate limits.

### Frequently asked questions

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

No. The iTunes Search API is a public endpoint. This tool needs no key, no login, and no cookies.

#### Is it legal to use this data?

The tool reads only publicly available App Store metadata through Apple's official public API, the same information any visitor sees. As always, review the terms that apply to your specific use case.

#### How do I find an app's ID?

Open the app's App Store page. The ID is the number right after /id in the address, for example apps.apple.com/us/app/instagram/id389801252 has the ID 389801252.

#### What does "out of top 200" mean?

Apple's public search returns up to 200 apps per keyword. If your tracked

### Related tools by DataWharf

- [App Store Reviews and Sentiment](https://apify.com/datawharf/app-store-reviews-sentiment) - pull App Store reviews with a built-in sentiment tag.
- [App Store Keyword Search](https://apify.com/datawharf/app-store-keyword-search) - search the App Store by keyword and export structured app data.

# Actor input Schema

## `action` (type: `string`):

Choose 'keyword-top-apps' to see which apps rank for your keywords, or 'app-rank-tracking' to see where specific apps rank.

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

Search terms to analyze, for example fitness app or meditation. Each keyword is looked up separately.

## `country` (type: `string`):

Two-letter App Store region code, for example us, ca, gb, or de. Rankings and app names are localized to this store.

## `topN` (type: `integer`):

For 'Top apps for keywords': how many ranked apps to return per keyword (1 to 50).

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

For 'Track where apps rank': the Apple app IDs to look up. The app ID is the number after /id in an App Store URL, for example 389801252.

## `myApp` (type: `string`):

For 'Track where apps rank': mark one app as yours. Its rows get flagged isMyApp = true so you can filter to your app quickly.

## Actor input object example

```json
{
  "action": "keyword-top-apps",
  "keywords": [
    "fitness app",
    "meditation"
  ],
  "country": "us",
  "topN": 10,
  "apps": [
    "389801252",
    "284882215"
  ]
}
```

# 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 = {
    "action": "keyword-top-apps",
    "keywords": [
        "fitness app",
        "meditation"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datawharf/app-store-aso-keyword-tool").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 = {
    "action": "keyword-top-apps",
    "keywords": [
        "fitness app",
        "meditation",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("datawharf/app-store-aso-keyword-tool").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 '{
  "action": "keyword-top-apps",
  "keywords": [
    "fitness app",
    "meditation"
  ]
}' |
apify call datawharf/app-store-aso-keyword-tool --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store ASO Keyword Tool and Rank Tracker",
        "description": "Track App Store keyword rankings, find the top apps for any keyword, and score keyword difficulty and opportunity. A pay-as-you-go ASO keyword tool and rank tracker on Apple's public API. No subscription. Export to CSV, Excel, or JSON. An affordable AppTweak and Sensor Tower alternative.",
        "version": "0.1",
        "x-build-id": "SHVKysU3cSM1VHypd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/datawharf~app-store-aso-keyword-tool/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-datawharf-app-store-aso-keyword-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/datawharf~app-store-aso-keyword-tool/runs": {
            "post": {
                "operationId": "runs-sync-datawharf-app-store-aso-keyword-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/datawharf~app-store-aso-keyword-tool/run-sync": {
            "post": {
                "operationId": "run-sync-datawharf-app-store-aso-keyword-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "keywords"
                ],
                "properties": {
                    "action": {
                        "title": "What do you want to do?",
                        "enum": [
                            "keyword-top-apps",
                            "app-rank-tracking"
                        ],
                        "type": "string",
                        "description": "Choose 'keyword-top-apps' to see which apps rank for your keywords, or 'app-rank-tracking' to see where specific apps rank.",
                        "default": "keyword-top-apps"
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Search terms to analyze, for example fitness app or meditation. Each keyword is looked up separately.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Storefront (country)",
                        "type": "string",
                        "description": "Two-letter App Store region code, for example us, ca, gb, or de. Rankings and app names are localized to this store.",
                        "default": "us"
                    },
                    "topN": {
                        "title": "Top apps per keyword",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "For 'Top apps for keywords': how many ranked apps to return per keyword (1 to 50).",
                        "default": 10
                    },
                    "apps": {
                        "title": "App IDs to track",
                        "type": "array",
                        "description": "For 'Track where apps rank': the Apple app IDs to look up. The app ID is the number after /id in an App Store URL, for example 389801252.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "myApp": {
                        "title": "Your app ID (optional)",
                        "type": "string",
                        "description": "For 'Track where apps rank': mark one app as yours. Its rows get flagged isMyApp = true so you can filter to your app quickly."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
