# App Store & Google Play Keyword Rank Tracker (ASO) (`reaperoak/app-store-google-play-keyword-rank-tracker`) Actor

Track where your app ranks for any keyword in the Apple App Store and Google Play, by country. Get rank, change since the last run, who ranks above you, and entered or dropped-out alerts. Schedule it for daily ASO.

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

## Pricing

from $6.80 / 1,000 rank 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/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 & Google Play Keyword Rank Tracker (ASO)

Track where your app ranks for any keyword on the **Apple App Store and Google Play**, in any country. Each row gives the rank, the **change since the last run**, who ranks above you, and flags when your app enters or drops out of the results. Schedule it daily and you have an ASO (app store optimization) rank tracker without a monthly subscription.

### What is the App Store & Google Play Keyword Rank Tracker?

App store optimization tools charge by the month to show where an app ranks for a keyword. This Actor does the core job pay-per-check: it runs the store searches, finds your app's position and remembers it so the next run can show movement. Track your own apps and your competitors' on the same keywords.

### What makes it different?

- **Both stores in one run.** Apple ids and Google Play package names can be mixed.
- **Movement, not just a number.** Previous rank, change, entered and dropped-out are computed from the last run.
- **Context for every rank.** The top three apps for each search are included so you see who you are up against.
- **Alerts mode.** Return only the rows that changed, so a daily run stays quiet unless something moved.

### What data can you extract?

| Field | Example |
|---|---|
| `store, appId, appName` | `apple`, `493145008`, `Headspace` |
| `keyword, country` | `meditation`, `us` |
| `rank, found` | `4`, `true` (null when not in the results) |
| `previousRank, rankChange` | `6`, `2` (positive means it moved up) |
| `enteredTop, droppedOut` | `false`, `false` |
| `leaders` | the top three apps for that search |

A `SUMMARY` record shows how many checks ran and how many apps were found, improved, entered or dropped out.

### How to track app keyword rankings

1. Add your apps (and competitors): App Store ids or URLs, Google Play package names or URLs.
2. Add the keywords you want to rank for and the countries that matter.
3. Run it once for a baseline, then create a **Schedule** (daily is typical).
4. Send the output to Slack, email, Google Sheets, Make, n8n or Zapier. Turn on *Only return rows that changed* for alerts.

```json
{
    "apps": [
        "493145008",
        "com.getsomeheadspace.android"
    ],
    "keywords": [
        "meditation"
    ],
    "countries": [
        "us"
    ]
}
```

- **apps**: Apple ids look like `310633997`; Google Play packages look like `com.whatsapp`.
- **countries**: rankings are per country, so each extra country is another check.
- **depth**: how many results to look through. Apple returns up to about 190. **Google Play returns about 30 apps per search** however high you set this.
- **remember**: keeps each app's ranks so later runs can show change.

### How much does app rank tracking cost?

You pay per rank check returned plus a very small start fee. There is no subscription.

| Rank checks | Approximate cost |
|---|---|
| 10 | $0.08 |
| 100 | $0.80 |
| 1,000 | $8 |
| 10,000 | $80 |

Paid Apify plans get tiered discounts, and you can set a maximum cost per run. You can try it on Apify's free plan without a card.

### Who is it for?

- **App publishers and indie developers** doing ASO.
- **Marketing and growth teams** tracking keyword visibility.
- **Agencies** reporting rankings for clients.
- **Competitor researchers** watching who ranks for which terms.

### Frequently asked questions

**Is the rank exactly what I see in the store?** It is very close but not guaranteed identical. The Actor uses Apple's public search API and Google Play's search, which can differ slightly from the in-app search and from personalised results on a phone.

**Why does Google Play stop around 30 results?** Google Play's search returns about 30 apps per keyword. Apps ranked lower are reported as not found.

**Do ranks differ by country?** Yes, a lot. Add every country you care about.

**Can I track competitors?** Yes. Add their ids to the app list; every app is checked on the same keywords.

**What if a store changes its search?** The run fails with an explicit error instead of returning empty ranks, and the Actor is health-checked every night.

### Notes and limits

- Rankings are a snapshot at the time of the run and can move during the day.
- Reads public store search endpoints. This Actor is not affiliated with Apple or Google.

# Actor input Schema

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

Apple App Store ids or URLs (<code>310633997</code>) and Google Play package names or URLs (<code>com.whatsapp</code>). Each app is tracked on its own store.

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

Search terms to check, one per line, for example <code>meditation</code> or <code>sleep sounds</code>.

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

Two-letter store country codes, for example <code>us</code>, <code>gb</code>, <code>de</code>. Rankings differ by country. Leave empty for <code>us</code>.

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

Two-letter language used for Google Play searches. Apple searches use the country.

## `depth` (type: `integer`):

How many results to check per search. Apple returns up to about 190. Google Play returns about 30 apps per search however high this is set.

## `onlyChanges` (type: `boolean`):

Return only rows where the rank went up, went down, entered the results or dropped out since the last run. Good for alerts.

## `remember` (type: `boolean`):

Stores each app's ranks so the next run can show previous rank and change.

## Actor input object example

```json
{
  "apps": [
    "493145008",
    "com.getsomeheadspace.android"
  ],
  "keywords": [
    "meditation"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "depth": 50,
  "onlyChanges": false,
  "remember": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per app, keyword and country: rank, previous rank, change, and the top three apps for that search.

## `summary` (type: `string`):

Totals for the run: checks made, apps found in the results, improved, dropped out and entered, and rows per app.

# 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": [
        "493145008",
        "com.getsomeheadspace.android"
    ],
    "keywords": [
        "meditation"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("reaperoak/app-store-google-play-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": [
        "493145008",
        "com.getsomeheadspace.android",
    ],
    "keywords": ["meditation"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("reaperoak/app-store-google-play-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": [
    "493145008",
    "com.getsomeheadspace.android"
  ],
  "keywords": [
    "meditation"
  ],
  "countries": [
    "us"
  ]
}' |
apify call reaperoak/app-store-google-play-keyword-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reaperoak/app-store-google-play-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/XrwiKCWkE7bhLUJPS/builds/P5Zw6fFRoIuOHkH8i/openapi.json
