# App Store Scraper - App Data, Rankings & ASO API (`amitmudaliyar/app-store-intelligence-aso`) Actor

App Store metadata, multi-country rating comparison and keyword search rankings, straight from Apple's official public API.

- **URL**: https://apify.com/amitmudaliyar/app-store-intelligence-aso.md
- **Developed by:** [Amit Mudaliyar](https://apify.com/amitmudaliyar) (community)
- **Categories:** Developer tools, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 app profileds

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.

- **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

## App Store Scraper — App Data, Rankings & ASO API

**App Store metadata, multi-country rating comparison and keyword search rankings — straight from Apple's own public API.**

No scraping, no proxies, no API key. Apple publishes this data through the iTunes Search API, so runs are fast and don't break when a page layout changes.

```
Input:   ["1052238659"]  across ["gb", "us", "de"]

Output:  Monzo Bank
         GB   4.86   346,696 ratings
         US   4.75     5,635 ratings
         DE   4.64       251 ratings
```

Same app. Same version. Wildly different market position — and you only see that by asking every storefront.

***

### Three modes

#### 1. Lookup — specific apps across storefronts

Give it App Store IDs, bundle IDs, or store URLs. Mix them freely.

```json
{
  "mode": "lookup",
  "apps": ["1052238659", "com.spotify.client", "https://apps.apple.com/gb/app/revolut/id932493382"],
  "countries": ["gb", "us", "de"]
}
```

Apple runs a **separate store per country** with different ratings, pricing, availability and even app names — in the German store, Spotify is listed as *"Spotify Musik und Podcasts"*. One record per app per storefront.

#### 2. Keywords — App Store search rankings (ASO)

```json
{
  "mode": "keywords",
  "keywords": ["budgeting", "expense tracker"],
  "countries": ["gb", "us"],
  "resultsPerKeyword": 50
}
```

This is what App Store SEO actually looks like. Search "budgeting" and you get a ranked list — **Fleur ranks #1 in the US, Emma ranks #1 in the GB**. Same keyword, different winner per market. Track your rank, find who's beating you, and see it per country.

#### 3. Developer — a publisher's whole portfolio

```json
{ "mode": "developer", "developerIds": ["324684583"], "countries": ["us"] }
```

Every app a company publishes. The `developerId` comes back on every app record, so you can go from one competitor's app to their entire catalogue in two runs.

***

### What you can do with it

**ASO and rank tracking.** Schedule it daily, watch your keyword positions move by market.

**Competitive intelligence.** Rating trajectory, release cadence, pricing changes, which markets a competitor actually invests in.

**Market entry research.** Before localising, see who already owns your keywords in that storefront and how strong they are.

**App investing / M\&A screening.** `updateRecency` flags whether a product is `active`, `maintained`, `slowing` or `stale` — a shipped-in-18-months app with good ratings is a very different asset from one shipping weekly.

**Portfolio monitoring.** Track every app you or your clients publish across every market in one run.

***

### Output

One flat record per app per storefront:

```json
{
  "type": "app",
  "appId": "1052238659",
  "bundleId": "co.uk.getmondo",
  "name": "Monzo Bank - Mobile Banking",
  "country": "GB",
  "developer": "Monzo Bank Limited",
  "developerId": "1052238661",
  "rating": 4.86,
  "ratingCount": 346696,
  "ratingCurrentVersion": 4.87,
  "price": 0,
  "formattedPrice": "Free",
  "isFree": true,
  "primaryGenre": "Finance",
  "version": "7.40.0",
  "currentVersionReleaseDate": "2026-08-17T10:18:32Z",
  "updatedDaysAgo": 4,
  "updateRecency": "active",
  "releaseNotes": "Bug fixes & performance improvements.",
  "fileSizeMb": 214.6,
  "languageCount": 2,
  "screenshotCount": 6,
  "appStoreUrl": "https://apps.apple.com/gb/app/..."
}
```

In `keywords` mode each record also carries `keyword` and `rank`.

The dataset ships with prebuilt **Apps** and **Keyword rankings** views, so you can flip between them without writing a transformation.

***

### Honest limits

**iOS only.** This covers Apple's App Store. Google Play is not included — Play has no equivalent public API, so supporting it would mean HTML scraping that breaks whenever Google changes their markup. That's the opposite of what makes this Actor reliable, so it's deliberately out of scope rather than half-done.

**No review text.** Apple publishes a customer-reviews RSS feed, but it was tested across several apps and storefronts and returns results inconsistently — some major apps return nothing at all, and pagination skips pages unpredictably. Shipping it would mean silent, intermittent gaps in your data, so it is deliberately not used. Ratings and rating counts, which come from the reliable endpoint, are included.

**Rating counts are per storefront.** A global total isn't published; sum the storefronts you care about.

**Rankings are search rankings.** These are Apple's search results for a term, which is what ASO tracks. They are not the "Top Free / Top Paid" chart positions.

### Pricing

Pay per event: one charge per app record returned, plus a small charge per keyword searched. Apps that aren't available in a storefront cost you nothing and are listed in the run summary with the reason.

### Support

Missing a storefront or a field you need? Open an issue and it'll get added.

***

### More from this creator

Three Actors, one account-intelligence picture — all built on official public APIs, no proxies:

| Actor | Answers |
| --- | --- |
| [ATS Jobs Scraper & Hiring Signals](https://apify.com/amitmudaliyar/company-jobs-hiring-signals) | Who is a company **hiring**? Open roles from nine ATS platforms plus a scored hiring-momentum report. |
| [Tech Stack Lookup](https://apify.com/amitmudaliyar/company-tech-stack-vendor-intelligence) | What does a company **buy**? AI tools, CRM, security and analytics vendors, detected from public DNS records. |
| **App Store Intelligence** (this one) | How does an app **perform**? Ratings, rankings and ASO across every country storefront. |

# Actor input Schema

## `mode` (type: `string`):

What to run: look up specific apps, get keyword search rankings, or pull a developer's whole portfolio.

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

App Store IDs (1052238659), bundle IDs (com.spotify.client), or App Store URLs. Mix freely.

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

Search terms to rank. Each term is searched in every selected storefront — that's how you see who owns a keyword in each market.

## `developerIds` (type: `array`):

Apple artist IDs, e.g. 324684583 for Spotify. You can find one in the developerId field of any app record.

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

Two-letter storefront codes. Apple runs a separate store per country, with different ratings, rankings, pricing and even app names — comparing them is the point.

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

How deep to rank each keyword, up to Apple's maximum of 200.

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

Adds the full store description to every record. Useful for keyword analysis; makes the dataset much larger.

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

How many storefronts or keyword lookups to run in parallel.

## Actor input object example

```json
{
  "mode": "lookup",
  "apps": [
    "1052238659",
    "com.spotify.client",
    "https://apps.apple.com/gb/app/revolut/id932493382"
  ],
  "keywords": [
    "budgeting",
    "expense tracker"
  ],
  "developerIds": [
    "324684583"
  ],
  "countries": [
    "gb",
    "us",
    "de"
  ],
  "resultsPerKeyword": 50,
  "includeDescription": false,
  "concurrency": 5
}
```

# Actor output Schema

## `apps` (type: `string`):

One record per app per storefront: ratings, pricing, version, update recency and metadata.

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

Ranked search results per keyword and storefront (keywords mode).

## `downloadCsv` (type: `string`):

No description

## `runSummary` (type: `string`):

Counts plus anything that could not be found, with the reason.

# 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": [
        "1052238659",
        "com.spotify.client",
        "https://apps.apple.com/gb/app/revolut/id932493382"
    ],
    "keywords": [
        "budgeting",
        "expense tracker"
    ],
    "developerIds": [
        "324684583"
    ],
    "countries": [
        "gb",
        "us",
        "de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("amitmudaliyar/app-store-intelligence-aso").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": [
        "1052238659",
        "com.spotify.client",
        "https://apps.apple.com/gb/app/revolut/id932493382",
    ],
    "keywords": [
        "budgeting",
        "expense tracker",
    ],
    "developerIds": ["324684583"],
    "countries": [
        "gb",
        "us",
        "de",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("amitmudaliyar/app-store-intelligence-aso").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": [
    "1052238659",
    "com.spotify.client",
    "https://apps.apple.com/gb/app/revolut/id932493382"
  ],
  "keywords": [
    "budgeting",
    "expense tracker"
  ],
  "developerIds": [
    "324684583"
  ],
  "countries": [
    "gb",
    "us",
    "de"
  ]
}' |
apify call amitmudaliyar/app-store-intelligence-aso --silent --output-dataset

```

## MCP server setup

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

```

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/BYAhu97neSlPTWimp/builds/oMzUZLG5KK5e72Hjy/openapi.json
