# App Store Market Intelligence (`nohchangdae/app-store-market-intelligence`) Actor

Rankings, reviews with theme analysis, keyword/ASO search & app metadata from the Apple App Store AND Google Play - iOS + Android, 150+ countries incl. Korea & Japan. No API key.

- **URL**: https://apify.com/nohchangdae/app-store-market-intelligence.md
- **Developed by:** [Seoul Data Labs](https://apify.com/nohchangdae) (community)
- **Categories:** Developer tools, E-commerce, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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 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

## App Store Market Intelligence 📱

Pull **rankings, reviews, keyword/ASO data, and app metadata** from any Apple App Store storefront — **US, Korea, Japan, and 150+ countries** — with no API key and no setup. Built on Apple's official public feeds, so it runs fast and reliably from anywhere.

Whether you track competitors, research a market before launch, monitor your own app's reviews, or feed app data into a dashboard, this Actor returns clean, structured JSON you can use immediately.

### What it does

Choose one of four modes:

| Mode | What you get |
| --- | --- |
| **Reviews + analysis** | The most-recent customer reviews for any app **plus** an instant summary: rating histogram, positive/negative %, and the top keyword themes driving praise and complaints (works in any language — Korean, Japanese, English…). |
| **Top-chart rankings** | Top Free / Paid / Grossing / New apps for a country, optionally filtered by category (Games, Finance, Shopping…). |
| **Keyword search (ASO)** | Where apps rank for a search term in a given storefront — the core signal for App Store Optimization. |
| **App details** | Full metadata for specific apps: rating, rating count, version, size, release + update dates, description, screenshots, and more. |

### Why this Actor

- **🌏 Every storefront, first-class** — most scrapers assume the US store. Here Korea (`kr`), Japan (`jp`), and every other storefront are equal citizens. Great for Asia-market research.
- **🧠 Reviews you can act on** — you don't just get raw review rows, you get *why* an app is rated the way it is: a rating breakdown and the recurring themes in positive vs. negative reviews.
- **⚡ Reliable & keyless** — uses Apple's public CDN feeds. No login, no proxies, no breakage from anti-bot walls.
- **🧾 Clean schema** — stable field names, ready for a spreadsheet, database, or BI tool.

### Example inputs

**Analyze a competitor's Korean reviews**
```json
{
  "mode": "reviews",
  "country": "kr",
  "appIds": ["362057947"],
  "maxReviewsPerApp": 200,
  "includeReviewAnalysis": true
}
````

**Top-grossing games in the US**

```json
{ "mode": "rankings", "country": "us", "chart": "topgrossing", "category": "games", "maxItems": 50 }
```

**Who ranks for "배달" (food delivery) in Korea**

```json
{ "mode": "search", "country": "kr", "searchTerm": "배달", "maxItems": 25 }
```

**Full details for specific apps**

```json
{ "mode": "appDetails", "country": "jp", "appIds": ["310633997", "389801252"] }
```

> **Finding an App ID:** open any App Store link and copy the number after `id`, e.g.
> `apps.apple.com/kr/app/kakaotalk/id362057947` → `362057947`.

### Output

Rows are written to the dataset. Review runs emit one `reviewSummary` row per app followed by `review` rows:

```json
{
  "recordType": "reviewSummary",
  "appId": "362057947",
  "country": "kr",
  "count": 200,
  "averageRating": 2.6,
  "ratingHistogram": { "5": 58, "4": 17, "3": 16, "2": 4, "1": 105 },
  "negativePct": 54.5,
  "positivePct": 37.5,
  "topKeywordsNegative": [ { "keyword": "업데이트", "count": 41 }, { "keyword": "숏폼", "count": 33 } ],
  "topKeywordsPositive": [ { "keyword": "좋아요", "count": 22 } ]
}
```

Rankings, search, and app-details rows include `rank`/`searchRank`, `title`, `developer`, `category`, `rating`, `ratingCount`, `price`, `appId`, and more. Export any run to **JSON, CSV, Excel, or via API**.

### Common use cases

- **Competitive intelligence** — track rival apps' rankings and review sentiment over time (schedule daily runs).
- **Market entry research** — see what dominates the Korean/Japanese charts before you localize.
- **ASO** — monitor keyword rankings and mine review language for the terms real users use.
- **Reputation monitoring** — get alerted to a spike in 1-star reviews and the themes behind them.
- **Investment / trend research** — watch top-grossing charts across countries.

### Notes

- Apple's public review feed returns up to ~500 most-recent reviews per app per storefront.
- All data comes from Apple's public endpoints; this Actor performs no login and collects no private data.
- Country codes are ISO two-letter storefront codes (`us`, `kr`, `jp`, `gb`, `de`, `fr`, `cn`, `in`, `br`, …).

# Actor input Schema

## `store` (type: `string`):

Apple App Store (iOS) or Google Play (Android). Rankings are iOS-only — Google removed its public top-chart endpoint; Google Play supports reviews, search, and app details.

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

What to fetch. rankings = top charts by country/category (iOS only); reviews = customer reviews + theme analysis for given apps; search = keyword (ASO) results; appDetails = full metadata for given apps.

## `country` (type: `string`):

Two-letter storefront code: us, kr, jp, gb, de, fr, cn, in, br ... Korea/Asia storefronts are first-class here.

## `lang` (type: `string`):

Two-letter language code for results, e.g. en, ko, ja. Mainly affects Google Play and search relevance. Leave blank for the storefront default.

## `appIds` (type: `array`):

iOS: numeric track IDs from an App Store URL /idXXXXXXXXX, e.g. 362057947 (KakaoTalk). Android: package names from a Play URL ?id=..., e.g. com.kakao.talk.

## `searchTerm` (type: `string`):

Keyword to search the store for. Works in any language (e.g. 배달, 게임, fitness).

## `chart` (type: `string`):

Which top chart to pull when mode = rankings.

## `category` (type: `string`):

Category name (games, finance, social, shopping, food, ...) or a numeric Apple genre id. Leave blank for all categories.

## `maxItems` (type: `integer`):

How many apps to return for rankings or search.

## `maxReviewsPerApp` (type: `integer`):

Up to ~500 most-recent reviews per app (Apple caps the public feed at 500).

## `includeReviewAnalysis` (type: `boolean`):

Adds a per-app summary row: rating histogram, positive/negative %, and top keyword themes.

## Actor input object example

```json
{
  "store": "appstore",
  "mode": "rankings",
  "country": "kr",
  "lang": "",
  "appIds": [],
  "searchTerm": "",
  "chart": "topfree",
  "category": "",
  "maxItems": 50,
  "maxReviewsPerApp": 100,
  "includeReviewAnalysis": true
}
```

# 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 = {
    "store": "appstore",
    "mode": "rankings",
    "country": "us",
    "chart": "topfree",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("nohchangdae/app-store-market-intelligence").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 = {
    "store": "appstore",
    "mode": "rankings",
    "country": "us",
    "chart": "topfree",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("nohchangdae/app-store-market-intelligence").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 '{
  "store": "appstore",
  "mode": "rankings",
  "country": "us",
  "chart": "topfree",
  "maxItems": 50
}' |
apify call nohchangdae/app-store-market-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store Market Intelligence",
        "description": "Rankings, reviews with theme analysis, keyword/ASO search & app metadata from the Apple App Store AND Google Play - iOS + Android, 150+ countries incl. Korea & Japan. No API key.",
        "version": "0.1",
        "x-build-id": "f0NJ75yDs4jUXTMo7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nohchangdae~app-store-market-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nohchangdae-app-store-market-intelligence",
                "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/nohchangdae~app-store-market-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-nohchangdae-app-store-market-intelligence",
                "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/nohchangdae~app-store-market-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-nohchangdae-app-store-market-intelligence",
                "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": [
                    "mode"
                ],
                "properties": {
                    "store": {
                        "title": "Store",
                        "enum": [
                            "appstore",
                            "googleplay"
                        ],
                        "type": "string",
                        "description": "Apple App Store (iOS) or Google Play (Android). Rankings are iOS-only — Google removed its public top-chart endpoint; Google Play supports reviews, search, and app details.",
                        "default": "appstore"
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "rankings",
                            "reviews",
                            "search",
                            "appDetails"
                        ],
                        "type": "string",
                        "description": "What to fetch. rankings = top charts by country/category (iOS only); reviews = customer reviews + theme analysis for given apps; search = keyword (ASO) results; appDetails = full metadata for given apps.",
                        "default": "rankings"
                    },
                    "country": {
                        "title": "Country (App Store storefront)",
                        "type": "string",
                        "description": "Two-letter storefront code: us, kr, jp, gb, de, fr, cn, in, br ... Korea/Asia storefronts are first-class here.",
                        "default": "us"
                    },
                    "lang": {
                        "title": "Language (optional)",
                        "type": "string",
                        "description": "Two-letter language code for results, e.g. en, ko, ja. Mainly affects Google Play and search relevance. Leave blank for the storefront default.",
                        "default": ""
                    },
                    "appIds": {
                        "title": "App IDs (for Reviews / App details)",
                        "type": "array",
                        "description": "iOS: numeric track IDs from an App Store URL /idXXXXXXXXX, e.g. 362057947 (KakaoTalk). Android: package names from a Play URL ?id=..., e.g. com.kakao.talk.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchTerm": {
                        "title": "Search term (for Keyword search)",
                        "type": "string",
                        "description": "Keyword to search the store for. Works in any language (e.g. 배달, 게임, fitness).",
                        "default": ""
                    },
                    "chart": {
                        "title": "Chart (for Rankings)",
                        "enum": [
                            "topfree",
                            "toppaid",
                            "topgrossing",
                            "new",
                            "newfree",
                            "newpaid"
                        ],
                        "type": "string",
                        "description": "Which top chart to pull when mode = rankings.",
                        "default": "topfree"
                    },
                    "category": {
                        "title": "Category (for Rankings, optional)",
                        "type": "string",
                        "description": "Category name (games, finance, social, shopping, food, ...) or a numeric Apple genre id. Leave blank for all categories.",
                        "default": ""
                    },
                    "maxItems": {
                        "title": "Max items (rankings / search)",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "How many apps to return for rankings or search.",
                        "default": 50
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Up to ~500 most-recent reviews per app (Apple caps the public feed at 500).",
                        "default": 100
                    },
                    "includeReviewAnalysis": {
                        "title": "Include review analysis summary",
                        "type": "boolean",
                        "description": "Adds a per-app summary row: rating histogram, positive/negative %, and top keyword themes.",
                        "default": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
