# ASO Keyword Intelligence — Rank Tracker & Search Popularity (`petersutarik/aso-keyword-intel`) Actor

Track App Store & Google Play keyword rankings, discover keyword suggestions, and get real search popularity + difficulty scores. Built by the team behind trysonar.app.

- **URL**: https://apify.com/petersutarik/aso-keyword-intel.md
- **Developed by:** [Peter Šutarík](https://apify.com/petersutarik) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 13 total users, 9 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## ASO Keyword Rank Tracker with Real Search Popularity — App Store & Google Play

Track **App Store and Google Play keyword rankings**, discover **keyword suggestions**, and get **real search popularity and difficulty scores** — the three data points every ASO workflow needs, in one actor. No account, no API key, no setup: enter keywords, run, get data.

Built by the team behind [Sonar](https://trysonar.app), the ASO keyword intelligence tool for indie iOS developers. This actor runs on the same production infrastructure — the data it returns is what the tool itself runs on.

### What data does this ASO keyword tracker give you?

| Feature | Output |
|-|-|
| **Keyword rank tracking** | Where specific apps rank for each keyword on the App Store or Google Play (or the full top-N list per keyword) |
| **Keyword suggestions** | Autocomplete suggestions straight from App Store / Google Play search — the exact phrases users type |
| **Search popularity & difficulty** | Real popularity scores (5–100, Apple-sourced for iOS — not a proxy estimate) and a 0–100 difficulty score |

### How to track your app's keyword rankings

1. Add your keywords (up to 100 per run) and your app's ID — the numeric track ID for iOS (e.g. `6479523618`) or package name for Android (e.g. `com.example.app`).
2. Pick the store (`ios`, `android`, or `both`) and country.
3. Run — each keyword returns your app's rank, or `rank: null` if you're not in the top results.
4. **Set it on an Apify Schedule** (e.g. daily at 07:00) and you have an automated ASO rank tracker with popularity history accumulating in your dataset — for a fraction of the cost of a Sensor Tower or AppTweak seat.

Leave `appIds` empty to get the top-N ranked apps per keyword instead — ideal for competitor research and keyword scouting.

### Use cases

- **Indie developers** — track your launch keywords daily and catch ranking drops before they cost you downloads
- **ASO audits** — pull rankings + popularity + difficulty for a keyword set in one run instead of three tools
- **Competitor monitoring** — top-N mode shows exactly who ranks for the keywords you care about
- **Agencies & consultants** — schedule per-client keyword sets and export the dataset to reports
- **AI agents & pipelines** — call it via the Apify API and get clean, typed JSON rows

### Input example

```json
{
    "keywords": ["meditation app", "sleep tracker"],
    "store": "ios",
    "country": "us",
    "appIds": ["6479523618"],
    "topN": 10,
    "includeSuggestions": true,
    "includePopularity": true
}
```

With `store: "both"`, include app IDs for both stores in `appIds`; IDs not found in a store's results return `rank: null`.

### Output example

One dataset row per data point, discriminated by `type`:

```json
{ "type": "ranking", "keyword": "meditation app", "store": "ios", "country": "us", "rank": 4, "appId": "6479523618", "appName": "…", "developer": "…", "rating": 4.8, "checkedAt": "2026-07-04T07:00:00.000Z" }
{ "type": "suggestion", "keyword": "meditation app", "suggestion": "meditation app free", "store": "ios", "country": "us", "checkedAt": "…" }
{ "type": "metrics", "keyword": "meditation app", "store": "ios", "country": "us", "popularity": 52, "difficulty": 61, "checkedAt": "…" }
```

### Why the popularity score is different

Most ASO tools estimate keyword popularity from autocomplete order — a proxy. For iOS, this actor surfaces **Apple-sourced Search Popularity**, the same signal Apple exposes to advertisers, via the [Sonar](https://trysonar.app) API. If you want alerts, competitor tracking, review analysis, and an MCP server for AI agents on top of this data, check out [Sonar](https://trysonar.app).

### Pricing (pay per event)

| Event | Meaning |
|-|-|
| `ranking-row` | One ranking result row |
| `suggestion-row` | One suggestion row |
| `metrics-row` | One keyword's popularity + difficulty (premium) |

You only pay for the rows the run produces — a focused 20-keyword daily rank check costs cents.

### FAQ

**Do I need an API key or any setup?** No. Provide keywords, run, get data — popularity scores included. Everything is charged through your Apify account, pay-per-event.

**Which countries are supported?** Any two-letter storefront code (us, gb, de, jp, …). Rankings and suggestions work worldwide; iOS suggestions cover 25 major storefronts.

**How fresh is the data?** Every run fetches live — rankings and suggestions straight from the stores, popularity/difficulty from Sonar's production pipeline at request time.

**Can I run it on a schedule?** Yes — that's the intended use. Add an Apify Schedule and you have a rank tracker with popularity history in your dataset.

**Can I use it from the API or an AI agent?** Yes, like any Apify actor: start a run via the API, read the dataset as JSON/CSV. Rows are typed (`ranking` / `suggestion` / `metrics`) for easy filtering.

**Something not working?** Open an issue in the Issues tab — this actor powers our own product, so it's actively maintained.

# Actor input Schema

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

Keywords to analyze (max 100 per run). Each keyword produces ranking rows and, optionally, suggestion and popularity rows.

## `store` (type: `string`):

Which app store(s) to check.

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

Two-letter country code of the storefront (e.g. us, gb, de).

## `appIds` (type: `array`):

App IDs whose rank you want for each keyword — numeric track IDs for iOS (e.g. 6479523618), package names for Android (e.g. com.example.app). Leave empty to get the top-N ranked apps per keyword instead.

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

How many top-ranked apps to return per keyword when no specific apps are tracked.

## `includeSuggestions` (type: `boolean`):

Fetch autocomplete/search suggestions for each keyword (great for keyword discovery).

## `includePopularity` (type: `boolean`):

Fetch real search popularity and keyword difficulty scores for each keyword (premium — powered by Sonar, trysonar.app).

## Actor input object example

```json
{
  "keywords": [
    "meditation app",
    "sleep tracker"
  ],
  "store": "ios",
  "country": "us",
  "appIds": [],
  "topN": 10,
  "includeSuggestions": false,
  "includePopularity": true
}
```

# Actor output Schema

## `rankingsDatasetUrl` (type: `string`):

Ranking rows — tracked app ranks or top-N apps per keyword.

## `suggestionsDatasetUrl` (type: `string`):

Autocomplete suggestion rows per keyword.

## `metricsDatasetUrl` (type: `string`):

Search popularity and difficulty scores per keyword.

# 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 app",
        "sleep tracker"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("petersutarik/aso-keyword-intel").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 app",
        "sleep tracker",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("petersutarik/aso-keyword-intel").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 app",
    "sleep tracker"
  ]
}' |
apify call petersutarik/aso-keyword-intel --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/w4WTaae6mpu8tDtRo/builds/OeORyiKvUawV7JRTG/openapi.json
