# App Store Keyword Rank Tracker & Search Scraper (ASO) (`webatola/app-store-search`) Actor

Track your iOS app's keyword rankings and scrape Apple App Store search results for any keyword and country: rank, rating, rating count, price, genre, version. Official iTunes Search API, no login. $1.00 per 1,000 apps, $0.002 per rank check.

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

## Pricing

from $0.70 / 1,000 search results

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 Keyword Rank Tracker & Search Scraper — iOS ASO

Search the **Apple App Store by keyword** in any country and see **which apps rank for each keyword** – with rating, rating count, price, genre, version, release dates and more. Add your own apps and the Actor reports their **keyword rank** (position in the top 200 search results) for every keyword × country. Export to JSON, CSV or Excel, use the API, or schedule it daily to build a rank history.

- 🔎 **Keyword search** – the top apps for any search term, in any of 175+ storefronts, iPhone or iPad.
- 📈 **Keyword rank tracking** – where your app (and your competitors) rank for each keyword, or "not found" in the top 200.
- 📊 **Rich metadata** – app ID, bundle ID, developer, rating, rating count, price, genre, version, size, minimum iOS, languages, screenshots, description.
- 🔒 **Official public API, no login, no personal data** – uses Apple's public iTunes Search API. No reviews or user names.
- 🤝 **Pairs with [App Store Top Charts Scraper](https://apify.com/webatola/app-store-charts)** for a complete ASO toolkit.
- ⚙️ **Compact output option** – drop descriptions and screenshots for AI agents.

### What can I use it for?

- **App Store Optimization (ASO)** – track your keyword ranks daily per country and see the effect of title/subtitle changes.
- **Competitor research** – find out who ranks for your target keywords and how strong they are (ratings, rating counts, update frequency).
- **Keyword research** – compare how crowded different keywords are.
- **Market research and lead generation** – build lists of apps and publishers in a niche.

### How to use it

1. Enter **keywords** and **countries** (two-letter storefront codes such as `us`, `gb`, `de`).
2. Optionally add **apps to track** – app IDs (`587366035`), App Store URLs or bundle IDs (`com.burbn.instagram`).
3. Choose iPhone or iPad and how many search results to save.
4. Click **Start**.

#### Input example

```json
{
  "keywords": ["photo editor", "collage maker"],
  "countries": ["us", "gb"],
  "device": "iphone",
  "maxResultsPerKeyword": 50,
  "includeSearchResults": true,
  "trackApps": ["587366035", "com.burbn.instagram"]
}
```

### Output

Each dataset item has a `type`:

**`searchResult`** – one ranked app for a keyword:

```json
{
  "type": "searchResult", "keyword": "photo editor", "country": "us", "device": "iphone", "rank": 1, "totalResults": 181,
  "appId": "587366035", "name": "Picsart AI Photo Editor, Video", "developer": "PicsArt, Inc.", "bundleId": "com.picsart.studio",
  "url": "https://apps.apple.com/us/app/picsart-ai-photo-editor-video/id587366035",
  "price": 0, "currency": "USD", "rating": 4.7, "ratingCount": 2000000, "primaryGenre": "Photo & Video", "version": "29.1.0",
  "searchedAt": "2026-10-20T11:05:31.995Z"
}
```

**`keywordRank`** – the rank of a tracked app for a keyword:

```json
{
  "type": "keywordRank", "keyword": "photo editor", "country": "us", "trackedApp": "com.burbn.instagram",
  "found": true, "rank": 106, "checkedDepth": 181, "appId": "389801252", "name": "Instagram",
  "topResult": { "rank": 1, "appId": "587366035", "name": "Picsart AI Photo Editor, Video" }
}
```

`found: false` means the app is not in the top results Apple returns for that keyword (up to 200).

### How much does it cost?

Simple **pay-per-event pricing**, no compute charges:

- **$1.00 per 1,000 search results** (down to $0.70 on Apify Gold)
- **$0.002 per keyword-rank check** (1 tracked app × 1 keyword × 1 country)
- **$0.005 per run**
- Examples: 10 keywords × 1 country × 50 results = 500 apps = **$0.505**. Daily rank tracking of 1 app for 20 keywords in 2 countries with *Save search results* off = 40 checks = **$0.085 per day**.

### Limits and accuracy

- **Ranks can differ slightly from the live App Store app.** Apple's public Search API does not apply personalization, Search Ads, and some ranking signals of the App Store app, so positions may be a few places off. Use them for trends and comparisons, not as exact positions.
- Apple returns at most **200 results** per keyword, so ranks beyond 200 are reported as "not found".
- Apple allows roughly **20 requests per minute**, so the Actor waits ~3 seconds between searches: 100 keyword × country combinations take about 5–6 minutes. Increase the run timeout for large runs.

### FAQ

**Why does the rank differ from what I see on my iPhone?** The App Store app personalizes results and shows Search Ads; Apple's public Search API does not. Positions can be a few places off – ideal for trends and competitor comparison, not exact positions.

**How deep does rank tracking go?** Top 200 results per keyword (Apple's maximum). Deeper ranks are reported as `found: false`.

**How fast is it?** About 3 seconds per keyword × country (Apple allows ~20 requests per minute). 100 combinations ≈ 5–6 minutes.

**Can I get compact output for an AI agent?** Yes – turn off *Include app description text* and *Include screenshot URLs*, and lower *Max search results per keyword*.

**Does it scrape reviews or personal data?** No.

### 🧰 More Actors from the same toolkit

| Actor | What it does |
|---|---|
| [Google Trends Trending Now Scraper](https://apify.com/webatola/google-trends-trending-now) | Today's trending searches per country with search volume and related news |
| [App Store Top Charts Scraper](https://apify.com/webatola/app-store-charts) | Top free & top paid iPhone apps per country with full app details |
| [App Store Keyword Rank Tracker & Search Scraper](https://apify.com/webatola/app-store-search) | App Store search results and your app's keyword rank (ASO) |

All three are fast (no browser), use public endpoints only, and have simple pay-per-result pricing.

### 🤖 Use with AI agents (MCP) and the API

- Works out of the box with the **Apify MCP server** (Claude, ChatGPT, Cursor and other MCP clients): the agent can search for this Actor, read the input schema and run it.
- For compact results that fit an LLM context, turn off the long-text options (see *Input*).
- API: `POST https://api.apify.com/v2/acts/webatola~app-store-search/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON as the body returns the results directly.

### Is it legal?

The Actor only reads **public** app metadata from Apple's official public iTunes Search API, respecting Apple's rate limit. It collects no personal data (no reviews, no user names), needs no login and bypasses no protection. Make sure your use complies with Apple's terms and your local laws.

### Feedback

Missing a field or feature (e.g. Google Play, keyword suggestions)? Open an issue in the *Issues* tab.

# Actor input Schema

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

Search terms exactly as users type them in the App Store. Examples: "photo editor", "habit tracker", "vpn". Each keyword × country is one search (about 3 s each because of Apple's rate limit).

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

Two-letter App Store storefront codes. Examples: us, gb, de, fr, jp, cz.

## `device` (type: `string`):

Which App Store to search.

## `maxResultsPerKeyword` (type: `integer`):

How many top search results to save per keyword and country (1–200). Example: 10 for a quick competitor check, 200 for the full list. Keyword-rank checks always look at the full top 200.

## `includeSearchResults` (type: `boolean`):

Save the ranked apps for each keyword. Turn off if you only need keyword-rank rows for your tracked apps (cheapest option for daily rank tracking).

## `trackApps` (type: `array`):

Optional. Your app and competitors to rank-check for every keyword × country. Accepts App Store IDs (587366035), App Store URLs (https://apps.apple.com/us/app/.../id587366035) or bundle IDs (com.burbn.instagram). Each app × keyword × country is one keyword-rank check.

## `includeDescription` (type: `boolean`):

Include the full App Store description (long text). Turn off for compact output, e.g. for AI agents.

## `includeScreenshots` (type: `boolean`):

Include the list of screenshot image URLs. Turn off for compact output.

## Actor input object example

```json
{
  "keywords": [
    "photo editor"
  ],
  "countries": [
    "us"
  ],
  "device": "iphone",
  "maxResultsPerKeyword": 50,
  "includeSearchResults": true,
  "trackApps": [],
  "includeDescription": true,
  "includeScreenshots": true
}
```

# Actor output Schema

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

All dataset items as JSON.

## `overview` (type: `string`):

Search results using the overview view.

## `keywordRanks` (type: `string`):

Keyword-rank rows of tracked apps.

# 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": [
        "photo editor"
    ],
    "countries": [
        "us"
    ],
    "trackApps": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("webatola/app-store-search").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": ["photo editor"],
    "countries": ["us"],
    "trackApps": [],
}

# Run the Actor and wait for it to finish
run = client.actor("webatola/app-store-search").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": [
    "photo editor"
  ],
  "countries": [
    "us"
  ],
  "trackApps": []
}' |
apify call webatola/app-store-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,webatola/app-store-search"
        }
    }
}
```

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/eOZvcaS7dbVgTy7Uv/builds/ze55adEk0XPps8mmZ/openapi.json
