# App Store Keyword Rankings (SERP Capture) (`appsigma/app-store-keyword-rankings`) Actor

Capture Apple App Store search rankings for any keyword and storefront — organic results plus sponsored slots, one row per result.

- **URL**: https://apify.com/appsigma/app-store-keyword-rankings.md
- **Developed by:** [AppSigma.io](https://apify.com/appsigma) (community)
- **Categories:** SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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 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.

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 Keyword Rankings 🔎 (SERP Capture)

**See exactly where apps rank in Apple App Store search.** Give this Actor a list of
keywords and it returns the ranked search results a real user sees — organic results
**and** Apple's sponsored ("ad") slots — for any keyword, in any country storefront.
One clean row per result, ready to export to CSV, Excel, JSON, or push into your own
pipeline.

No scraping, no proxies, no HTML parsing, no rate-limit headaches. Powered by the
[AppSigma App Store API](https://appsigma.io), served straight from Apple's data.

---

### What it does

For every **keyword × country** you provide, the Actor runs one App Store search and
records each result as a flat row — its rank, whether it's organic or a paid ad, and
the app's full listing snapshot (developer, category, rating, price, devices, and more).

- ✅ **Organic + sponsored** results, ranked exactly as Apple returns them
- ✅ **Any storefront** — search the same keyword across `us`, `gb`, `de`, `jp`, …
- ✅ **Rich app data** per result — no second lookup needed
- ✅ **Flat, spreadsheet-friendly** output (nested fields pre-unwrapped into columns)
- ✅ **Fast & reliable** — parallel requests, automatic retries, no proxies to configure

### Use cases

- **ASO keyword tracking** — monitor where your app (and competitors) rank for target
  keywords, per country, over time.
- **Competitor SERP monitoring** — snapshot the full ranked list for a keyword and watch
  it shift release-to-release.
- **Apple Search Ads audit** — capture which apps are buying the sponsored slot for a
  keyword and how often.
- **Market & category research** — discover the top apps surfacing for a whole set of
  keywords in a niche.

---

### Input

Configure it from the visual input form or pass JSON:

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| **`keywords`** *(required)* | array of strings | — | Search terms, exactly as typed into App Store search |
| `countries` | array of strings | `["us"]` | ISO 3166-1 alpha-2 storefronts; each keyword is searched in every one |
| `resultsPerKeyword` | integer 1–50 | `10` | Max organic results to capture per keyword, in Apple's rank order |
| `includeAds` | boolean | `true` | Include Apple's sponsored slot(s) shown above organic results |
| `maxResults` | integer | `0` | Stop after this many total rows (`0` = no limit) |
| `concurrency` | integer 1–20 | `5` | How many searches to run in parallel |
| `iconWidth` | integer 16–2048 | `512` | Pixel width for the ready-to-use `icon` image URL |

#### Example input

```json
{
  "keywords": ["photo editor", "video editor"],
  "countries": ["us", "gb"],
  "resultsPerKeyword": 25,
  "includeAds": true
}
````

***

### Output

Each row is one search result. Nested objects (developer, rating, price) are flattened
into plain columns so the data drops straight into a spreadsheet.

#### Example row

```json
{
  "keyword": "spotify",
  "country": "us",
  "slot": "organic",
  "rank": 1,
  "appId": 324684580,
  "name": "Spotify: Music and Podcasts",
  "shortName": "Spotify",
  "subtitle": "Songs, Playlists & Audiobooks",
  "developerId": 324684583,
  "developerName": "Spotify",
  "primaryGenre": "Music",
  "primaryGenreId": 6011,
  "icon": "https://is1-ssl.mzstatic.com/image/thumb/.../AppIcon/512x0w.png",
  "ratingScore": 4.8,
  "ratingCount": 41049614,
  "priceFormatted": "Free",
  "priceAmountMinor": 0,
  "priceCurrency": "USD",
  "priceDiscount": false,
  "hasInAppPurchases": false,
  "hasAds": true,
  "supportsArcade": false,
  "hasAchievements": false,
  "supportedDevices": ["appletv", "watch", "iphone", "ipad"],
  "releaseDate": "2011-07-14T00:00:00.000Z",
  "deletedInStoreAt": null,
  "_fetchedAt": "2026-07-24T11:22:22.856Z"
}
```

#### Fields

| Field | Description |
|-------|-------------|
| `keyword`, `country` | The query and storefront that produced this row |
| `slot` | `organic` or `ad` |
| `rank` | 1-based position within its slot |
| `appId`, `name`, `shortName`, `subtitle` | App identity |
| `developerId`, `developerName` | Publisher |
| `primaryGenre`, `primaryGenreId` | Apple category |
| `ratingScore`, `ratingCount` | Aggregate star rating and number of ratings |
| `priceFormatted`, `priceAmountMinor`, `priceCurrency`, `priceDiscount` | Pricing (`priceAmountMinor` is in minor units, e.g. cents) |
| `hasInAppPurchases`, `hasAds`, `supportsArcade`, `hasAchievements` | Store flags |
| `supportedDevices`, `releaseDate` | Device support, first-release date |
| `icon` | Ready-to-use icon image URL, sized to `iconWidth` (default 512px) |
| `_fetchedAt` | When the row was captured (ISO 8601) |

***

### Exporting & integrating

Results land in a standard Apify dataset, so you can:

- **Download** as CSV, JSON, Excel, XML, or RSS from the run's Storage tab.
- **Fetch via API** — pull the dataset programmatically with the Apify API or clients.
- **Automate** — schedule runs, or connect to Make, Zapier, n8n, Slack, and more.

### Pricing

This Actor is **pay per result** — you're charged per row it returns, with no platform
usage or compute to reason about. Use `resultsPerKeyword` and `maxResults` to control
exactly how many rows (and how much spend) each run produces.

### FAQ

**Do I need an API key or an account anywhere?**
No. Just provide keywords and run it — billing is handled through Apify.

**How is this different from the free iTunes Search API?**
You get the ranking *and* Apple's paid-ad slot *and* a full listing snapshot per result,
in a stable, flat schema — no HTML parsing, storefront juggling, or undocumented quirks.

**Can I search outside the US?**
Yes — put any ISO country codes in `countries` (e.g. `["us","gb","de","jp"]`). Apple
ranks per storefront, so the same keyword returns different orders per country.

**What are the "ad" rows?**
Apple inserts a sponsored (Apple Search Ads) result above organic results for many
queries. Those come back with `slot: "ad"`. Set `includeAds: false` to skip them.

**How many results can I get per keyword?**
Up to 50 organic results per keyword (Apple's maximum), plus any sponsored slot.

# Actor input Schema

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

Search terms to look up, exactly as a user would type them into App Store search.

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

ISO 3166-1 alpha-2 storefront codes (e.g. us, gb, de). Each keyword is searched in every storefront.

## `resultsPerKeyword` (type: `integer`):

Maximum organic results to capture per keyword (1-50), in Apple's ranking order.

## `includeAds` (type: `boolean`):

Include Apple's sponsored slot(s) shown above organic results.

## `maxResults` (type: `integer`):

Stop after pushing this many rows total (0 = no cap).

## `concurrency` (type: `integer`):

How many searches to run in parallel (1-20). Lower this if you hit rate limits.

## `iconWidth` (type: `integer`):

Width in pixels for the app icon URL. Apple returns a base URL; the Actor appends a size suffix (e.g. 512x0w.png) so the icon field is a ready-to-use image link.

## Actor input object example

```json
{
  "keywords": [
    "youtube"
  ],
  "countries": [
    "us"
  ],
  "resultsPerKeyword": 10,
  "includeAds": true,
  "maxResults": 0,
  "concurrency": 5,
  "iconWidth": 512
}
```

# Actor output Schema

## `rankings` (type: `string`):

The default dataset — one flat row per keyword × country × result (organic and ad slots), in Apple's ranking order.

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

The OUTPUT record in the default key-value store: keywords, countries, rowsPushed, searchesRun, creditsSpent, and stoppedReason.

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

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store Keyword Rankings (SERP Capture)",
        "description": "Capture Apple App Store search rankings for any keyword and storefront — organic results plus sponsored slots, one row per result.",
        "version": "0.1",
        "x-build-id": "a4H64HMCt4ojgFyFB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/appsigma~app-store-keyword-rankings/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-appsigma-app-store-keyword-rankings",
                "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/appsigma~app-store-keyword-rankings/runs": {
            "post": {
                "operationId": "runs-sync-appsigma-app-store-keyword-rankings",
                "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/appsigma~app-store-keyword-rankings/run-sync": {
            "post": {
                "operationId": "run-sync-appsigma-app-store-keyword-rankings",
                "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": {
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Search terms to look up, exactly as a user would type them into App Store search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countries": {
                        "title": "Countries / storefronts",
                        "type": "array",
                        "description": "ISO 3166-1 alpha-2 storefront codes (e.g. us, gb, de). Each keyword is searched in every storefront.",
                        "default": [
                            "us"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "resultsPerKeyword": {
                        "title": "Results per keyword",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum organic results to capture per keyword (1-50), in Apple's ranking order.",
                        "default": 10
                    },
                    "includeAds": {
                        "title": "Include sponsored (ad) results",
                        "type": "boolean",
                        "description": "Include Apple's sponsored slot(s) shown above organic results.",
                        "default": true
                    },
                    "maxResults": {
                        "title": "Max results (cost cap)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after pushing this many rows total (0 = no cap).",
                        "default": 0
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many searches to run in parallel (1-20). Lower this if you hit rate limits.",
                        "default": 5
                    },
                    "iconWidth": {
                        "title": "Icon width (px)",
                        "minimum": 16,
                        "maximum": 2048,
                        "type": "integer",
                        "description": "Width in pixels for the app icon URL. Apple returns a base URL; the Actor appends a size suffix (e.g. 512x0w.png) so the icon field is a ready-to-use image link.",
                        "default": 512
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
