# 🔑 ASO Keyword Rank Tracker — App Store & Google Play (`nexgenwatch/aso-keyword-tracker`) Actor

Track App Store and Google Play keyword rankings for your apps — position within a searched depth, with a SERP fingerprint. Not-found-within-depth is a named state. No API key or ASO subscription.

- **URL**: https://apify.com/nexgenwatch/aso-keyword-tracker.md
- **Developed by:** [NexGen Watch](https://apify.com/nexgenwatch) (community)
- **Categories:** Business, Marketing
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 🔑 ASO Keyword Rank Tracker — App Store & Google Play

ASO teams and app companies pay to track keyword position by term, store, and country — the recurring optimization input that tells you whether your ASO work is actually moving rankings.

### What you get

- Keyword rank position for your target apps by term, store, and country
- Coverage of both Apple Search and the public Google Play search surface
- Explicit search depth and a `matched` flag so partial-coverage is never hidden
- A 9-field record with `previous_status` for movement tracking
- Optional watch mode that emits only position changes on later runs

### Use cases by team

- **ASO teams:** Measure keyword rank weekly and prove which optimizations moved the needle.
- **App marketers:** Track branded and category terms across both stores in one run.
- **Competitive intel:** See where rivals rank for the keywords you care about.
- **Leadership:** Get a recurring, comparable ASO scorecard instead of ad-hoc spot checks.

### Example inputs

*Track one keyword*

```json
{
  "keywords": [
    "music"
  ],
  "target_app_ids": [
    "324684580",
    "com.spotify.music"
  ],
  "watchMode": false
}
````

*Several keywords*

```json
{
  "keywords": [
    "music",
    "podcasts",
    "radio"
  ],
  "target_app_ids": [
    "324684580"
  ],
  "country": "us"
}
```

*Watch for rank changes*

```json
{
  "keywords": [
    "music"
  ],
  "target_app_ids": [
    "324684580"
  ],
  "watchMode": true
}
```

### 📊 Sample Output

```json
{
  "store": "apple",
  "country": "us",
  "keyword": "music",
  "target_app_ids": [
    "324684580"
  ],
  "position": 2,
  "previous_status": "up",
  "search_depth": 50,
  "matched": true,
  "checked_at": "2026-07-21T00:00:00Z"
}
```

### How it works

Give it keywords and the target app IDs you care about. It checks each app's position in Apple Search and the public Google Play search surface, to an explicit search depth, and returns the rank with a `matched` flag. Public search surfaces only — no login or access-control defeating.

### Pricing

| Event | Price (FREE tier) |
|---|---|
| Actor start (`apify-actor-start`) | $0.02 |
| Keyword check (`keyword-check`) | $0.02 |
| Watch check (`watch-check`) | $0.05 |

Flat list prices; Apify applies its automatic FREE→DIAMOND plan discount on top. Worked example: 20 keyword checks = $0.02 start + 20 × $0.02 = **$0.42**. Blocked or zero-result runs do not intentionally charge; watch runs with no delta charge only the watch check. New to Apify? [Start free](https://apify.com/fpr=2ayu9b).

### Run it — API, CLI, MCP

API:

```bash
curl -X POST "https://api.apify.com/v2/acts/nexgenwatch~aso-keyword-tracker/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" -d @input.json
```

CLI:

```bash
apify call nexgenwatch/aso-keyword-tracker -i @input.json
```

MCP: expose `nexgenwatch/aso-keyword-tracker` through Apify's MCP server, select it as a tool, and pass the same input object.

### Related actors — App Intelligence cluster

| Actor | What it does |
|---|---|
| [Review Sentiment Analyzer](https://apify.com/nexgenwatch/review-sentiment-analyzer?fpr=2ayu9b) | Turn any review set into themes, complaints, sentiment % and trends. |
| [Apple App Store Reviews](https://apify.com/nexgenwatch/ios-app-reviews?fpr=2ayu9b) | Scrape public Apple App Store reviews for any app. |
| [Google Play Reviews](https://apify.com/nexgenwatch/google-play-reviews?fpr=2ayu9b) | Scrape public Google Play reviews for any app. |
| [App Rankings Tracker](https://apify.com/nexgenwatch/app-rankings-tracker?fpr=2ayu9b) | Track Apple App Store top-chart rankings by country. |

### Compliance & honest limits

- Public search surfaces only — no login, CAPTCHA, paywall, or access-control defeating.
- Rank is measured to an explicit `search_depth`; an app deeper than that returns `matched: false` rather than a guessed position.
- A source-confirmed empty result is `SUCCEEDED-0: GENUINE_EMPTY`; exhausted retries fail and truncated runs are `PARTIAL`.

### FAQ

**What do I need to provide?**

Keywords plus the `target_app_ids` you want ranked — Apple numeric IDs and/or Google Play package names.

**What does `matched: false` mean?**

Your app wasn't found within the configured `search_depth` for that keyword — an honest 'not in range', not an error.

**Does it cover both stores?**

Yes — Apple Search and the public Google Play search surface, in one run.

**Does zero mean blocked?**

No. A confirmed-empty search is `GENUINE_EMPTY`; only exhausted retries fail.

**How does watch mode work?**

Set `watchMode: true`. Later runs emit only keywords whose position changed, with `previous_status`.

**How is it priced?**

$0.02 per run start plus $0.02 per keyword check; watch checks with no change cost $0.05.

**How deep does it search?**

To the configured `search_depth`; raise it to catch lower-ranked positions.

### Troubleshooting

- **Always matched: false?** Your app may rank below `search_depth` for that term — raise the depth, or confirm the app ID.
- **Wrong country?** Set `country`; it defaults to US.
- **Watch mode emitting everything?** The first run seeds the baseline; change-only deltas start on the second run.
- **Mixed store IDs?** You can pass both Apple numeric IDs and Play package names in `target_app_ids`.
- **Want the full listing metadata?** Pair with the App Store Metadata scraper for the apps you track.

### About

Part of the NexGenData App Intelligence cluster — the recurring ASO scorecard that closes the loop with metadata and rankings. Built by NexGenData. Questions or need a custom feed? Open an issue on the Actor page.

# Actor input Schema

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

Search phrases to check.

## `target_app_ids` (type: `array`):

Apple numeric and/or Google Play package IDs to locate.

## `stores` (type: `array`):

Store search surfaces.

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

Two-letter storefront countries.

## `language` (type: `string`):

Two-letter result language code.

## `max_per_source` (type: `integer`):

Maximum candidates inspected per keyword and store; Google Play is honestly capped at 30 by the adapter.

## `watchMode` (type: `boolean`):

Seed a named KV baseline on first run, then emit only new or changed records.

## `proxy_configuration` (type: `object`):

Optional Apify proxy settings; a fresh session is requested for every retry.

## Actor input object example

```json
{
  "keywords": [
    "music"
  ],
  "target_app_ids": [
    "324684580",
    "com.spotify.music"
  ],
  "stores": [
    "apple",
    "google_play"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "max_per_source": 30,
  "watchMode": false,
  "proxy_configuration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgenwatch/aso-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 = {}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🔑 ASO Keyword Rank Tracker — App Store & Google Play",
        "description": "Track App Store and Google Play keyword rankings for your apps — position within a searched depth, with a SERP fingerprint. Not-found-within-depth is a named state. No API key or ASO subscription.",
        "version": "0.1",
        "x-build-id": "hR3zG7WSfh2gd83bt"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nexgenwatch~aso-keyword-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nexgenwatch-aso-keyword-tracker",
                "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/nexgenwatch~aso-keyword-tracker/runs": {
            "post": {
                "operationId": "runs-sync-nexgenwatch-aso-keyword-tracker",
                "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/nexgenwatch~aso-keyword-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-nexgenwatch-aso-keyword-tracker",
                "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",
                    "target_app_ids"
                ],
                "properties": {
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Search phrases to check.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "music"
                        ]
                    },
                    "target_app_ids": {
                        "title": "Target app IDs",
                        "type": "array",
                        "description": "Apple numeric and/or Google Play package IDs to locate.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "324684580",
                            "com.spotify.music"
                        ]
                    },
                    "stores": {
                        "title": "Stores",
                        "type": "array",
                        "description": "Store search surfaces.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "apple",
                                "google_play"
                            ]
                        },
                        "default": [
                            "apple",
                            "google_play"
                        ]
                    },
                    "countries": {
                        "title": "Countries",
                        "type": "array",
                        "description": "Two-letter storefront countries.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "us"
                        ]
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter result language code.",
                        "default": "en"
                    },
                    "max_per_source": {
                        "title": "Search depth",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum candidates inspected per keyword and store; Google Play is honestly capped at 30 by the adapter.",
                        "default": 30
                    },
                    "watchMode": {
                        "title": "Watch mode",
                        "type": "boolean",
                        "description": "Seed a named KV baseline on first run, then emit only new or changed records.",
                        "default": false
                    },
                    "proxy_configuration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify proxy settings; a fresh session is requested for every retry.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
