---
title: ToolRouter — Tool Detail
description: Detailed documentation for a ToolRouter tool including skills, parameters, and examples.
url: https://toolrouter.com/tools/appstore-aso
---
# App Store ASO

Complete iOS App Store optimization toolkit. Analyze keyword difficulty, update metadata directly, track competitor rankings, manage in-app events, and monitor reviews. Built for developers and marketers who want higher rankings.

- **Version:** 0.02
- **Categories:** marketing, analytics, search

## Skills (16)

### Analyze Keywords (`analyze_keywords`)

Analyze keyword difficulty, traffic, and opportunity scores for iOS App Store. Returns difficulty (0-10), traffic (0-10), and opportunity scores for each keyword. Use this to find the best keywords to target for ASO.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `keywords` | array | Yes | List of keywords to analyze (max 20 per call) |
| `country` | string | No | Country code for regional analysis (e.g. us, gb, de, jp) [default: "us"] |

**Returns:** Array of keyword analysis results, each with difficulty (0-10), traffic (0-10), and opportunity scores

**Examples:**

*Analyze countdown-related keywords on iOS:*

```json
{
  "keywords": [
    "countdown",
    "countdown widget",
    "timer app"
  ],
  "country": "us"
}
```

### Search Apps (`search_apps`)

Search the iOS App Store for apps matching a search term. Returns app title, developer, rating, reviews, and price for each result. Use this to see what apps rank for a given keyword.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `term` | string | Yes | Search term to look up |
| `country` | string | No | Country code [default: "us"] |
| `num` | number | No | Number of results to return (max 20) [default: 10] |

**Returns:** List of matching iOS apps with title, developer, rating, review count, price, and app ID

**Examples:**

*Search iOS App Store for countdown apps:*

```json
{
  "term": "countdown widget",
  "num": 10
}
```

### App Details (`app_details`)

Get full details for a specific app on the iOS App Store. Returns title, rating, reviews, description, version, category, developer info, and more. Use a numeric App Store ID (e.g. "1611434405").

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Numeric App Store ID (e.g. "1611434405") |
| `country` | string | No | Country code [default: "us"] |

**Returns:** Full app metadata including title, rating, reviews, description, version, category, and developer info

**Examples:**

*Get details for Spotify on iOS:*

```json
{
  "app_id": "324684580"
}
```

### Competitor Analysis (`competitor_analysis`)

Run a full competitor analysis for an iOS app. Finds similar apps, compares ratings and reviews, and optionally checks who ranks for specific keywords. Returns your app details, similar apps list, and keyword rankings.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Your iOS App Store ID (numeric) |
| `country` | string | No | Country code [default: "us"] |
| `search_terms` | array | No | Keywords to check competitor rankings for (max 5) |

**Returns:** Your app details, list of similar competing apps, and keyword ranking comparison

**Examples:**

*Analyze competitors for a countdown app on iOS:*

```json
{
  "app_id": "1611434405",
  "search_terms": [
    "countdown",
    "countdown widget",
    "timer"
  ]
}
```

### Keyword Hints (`keyword_hints`)

Get autocomplete keyword suggestions from Apple's App Store search. Returns suggested search terms with priority ranking. Use this for keyword brainstorming and discovery.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `query` | string | Yes | Starting query to get suggestions for (e.g. "countdown") |
| `country` | string | No | Country code (us, gb, au, ca, de, fr, es, jp) [default: "us"] |

**Returns:** Autocomplete keyword suggestions from App Store search with priority ranking

**Examples:**

*Get keyword suggestions for "countdown":*

```json
{
  "query": "countdown",
  "country": "us"
}
```

### Keyword Popularity (`keyword_popularity`)

Get Apple Ads popularity scores (0-100) for keywords. Returns real Apple Search Ads data including popularity score and difficulty label. Requires an Apple Ads session cookie for authentication. Use this for data-driven keyword prioritization.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `keywords` | array | Yes | List of keywords to check popularity for (max 50 per call) |
| `app_id` | string | No | Your iOS App Store ID (numeric). Falls back to saved ios_app_id credential. |
| `country` | string | No | Country code for regional popularity (e.g. us, gb, de, jp) [default: "us"] |

**Returns:** Apple Ads popularity scores (0-100) and difficulty labels for each keyword

**Examples:**

*Check popularity for countdown keywords:*

```json
{
  "keywords": [
    "countdown",
    "countdown widget",
    "timer app"
  ],
  "app_id": "1611434405",
  "country": "us"
}
```

### Keyword Recommendations (`keyword_recommendations`)

Get related keyword suggestions from Apple Ads based on a seed keyword. Returns recommended keywords with their popularity scores. Requires an Apple Ads session cookie. Use this to discover new keyword opportunities.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `seed_keyword` | string | Yes | Starting keyword to get recommendations for |
| `app_id` | string | No | Your iOS App Store ID (numeric). Falls back to saved ios_app_id credential. |
| `country` | string | No | Country code for regional recommendations [default: "us"] |
| `min_popularity` | number | No | Minimum popularity score to include (0-100) [default: 0] |

**Returns:** Related keyword suggestions from Apple Ads with popularity scores

**Examples:**

*Get keyword recommendations for "fitness":*

```json
{
  "seed_keyword": "fitness",
  "app_id": "1611434405",
  "country": "us"
}
```

### Audit Metadata (`audit_metadata`)

Audit all app metadata across locales via App Store Connect. Checks for missing or underutilized fields and generates warnings. Identifies empty keywords, keywords under 80 chars, missing subtitles, and titles over 30 chars. Requires ASC API credentials.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Your iOS App Store ID (numeric, e.g. "1611434405") |

**Returns:** Metadata audit with per-locale warnings for empty keywords, short keywords, missing subtitles, and long titles

**Examples:**

*Audit metadata for an iOS app:*

```json
{
  "app_id": "1611434405"
}
```

### Export Metadata (`export_metadata`)

Full JSON export of all app metadata from App Store Connect. Exports app info, current version, all app info localizations (title, subtitle), and all version localizations (keywords, description, whats new, promotional text). Use for backups before making changes.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Your iOS App Store ID (numeric, e.g. "1611434405") |

**Returns:** Complete metadata export including app info, version, and all localizations

**Examples:**

*Export all metadata for an iOS app:*

```json
{
  "app_id": "1611434405"
}
```

### Update Metadata (`update_metadata`)

Update app metadata for a specific locale via App Store Connect. Supports title, subtitle, keywords, description, What's New, and promotional text. Defaults to dry-run mode (preview changes without applying). Set dry_run to false to apply changes.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Your iOS App Store ID (numeric) |
| `locale` | string | Yes | Locale to update (e.g. "en-US", "de-DE", "ja") |
| `title` | string | No | New app title (max 30 chars) |
| `subtitle` | string | No | New app subtitle (max 30 chars) |
| `keywords` | string | No | New keywords string (max 100 chars, comma-separated) |
| `description` | string | No | New app description |
| `whats_new` | string | No | New What's New text for the current version |
| `promotional_text` | string | No | New promotional text (can be updated without a new version) |
| `dry_run` | boolean | No | Preview changes without applying (default: true) [default: true] |

**Returns:** List of metadata changes with old and new values, applied or previewed in dry-run mode

**Examples:**

*Preview keyword update for en-US locale:*

```json
{
  "app_id": "1611434405",
  "locale": "en-US",
  "keywords": "countdown,timer,widget,clock,event",
  "dry_run": true
}
```

*Update title and subtitle:*

```json
{
  "app_id": "1611434405",
  "locale": "en-US",
  "title": "My App",
  "subtitle": "Best app ever",
  "dry_run": false
}
```

### Push Keywords (`push_keywords`)

Push a keyword optimization strategy to multiple locales at once. Diffs your strategy JSON against live App Store data and applies changes. Strategy is an object mapping locale codes to title/subtitle/keywords. Defaults to dry-run mode.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Your iOS App Store ID (numeric) |
| `strategy` | object | Yes | Localizations map: { [locale]: { title?, subtitle?, keywords? } }. Each locale key maps to the fields to set. |
| `dry_run` | boolean | No | Preview changes without applying (default: true) [default: true] |

**Returns:** Diff of all changes with action types (create/update/unchanged) and summary counts

**Examples:**

*Push keyword strategy for US and DE locales:*

```json
{
  "app_id": "1611434405",
  "strategy": {
    "en-US": {
      "title": "Countdown Widget",
      "subtitle": "Days until your event",
      "keywords": "countdown,timer,widget,clock,event"
    },
    "de-DE": {
      "title": "Countdown Widget",
      "subtitle": "Tage bis zum Event",
      "keywords": "countdown,timer,widget,uhr,ereignis"
    }
  },
  "dry_run": true
}
```

### List Reviews (`list_reviews`)

Fetch recent iOS App Store reviews for an app. Returns review text, rating, user name, date, version, and vote count. Supports sorting by most recent or most helpful.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | iOS App Store ID (numeric). Falls back to saved ios_app_id credential. |
| `country` | string | No | Country code to fetch reviews from [default: "us"] |
| `num` | number | No | Number of reviews to return (max 50) [default: 20] |
| `sort` | string | No | Sort order: most recent or most helpful (recent, helpful) [default: "recent"] |

**Returns:** List of app reviews with rating, title, text, user, date, version, and vote count

**Examples:**

*Get recent reviews for an app:*

```json
{
  "app_id": "1611434405",
  "country": "us",
  "num": 20,
  "sort": "recent"
}
```

### List Events (`list_events`)

List all in-app events for an iOS app via App Store Connect. Returns event details including reference name, badge, priority, purpose, territory schedules, and all localizations. Requires ASC API credentials.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Your iOS App Store ID (numeric) |

**Returns:** All in-app events with their localizations, territory schedules, and state information

**Examples:**

*List all in-app events:*

```json
{
  "app_id": "1611434405"
}
```

### Create Event (`create_event`)

Create a new in-app event with localizations and territory scheduling via App Store Connect. Supports all badge types (LIVE_EVENT, PREMIERE, CHALLENGE, COMPETITION, NEW_SEASON, MAJOR_UPDATE, SPECIAL_EVENT). Events are created in DRAFT state.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `app_id` | string | Yes | Your iOS App Store ID (numeric) |
| `reference_name` | string | Yes | Internal reference name (max 64 chars) |
| `badge` | string | Yes | Event badge type displayed on the App Store (LIVE_EVENT, PREMIERE, CHALLENGE, COMPETITION, NEW_SEASON, MAJOR_UPDATE, SPECIAL_EVENT) |
| `deep_link` | string | No | Deep link URL to open in the app |
| `priority` | string | No | Event priority level (HIGH, NORMAL) [default: "NORMAL"] |
| `purpose` | string | No | Target audience purpose (APPROPRIATE_FOR_ALL_USERS, ATTRACT_NEW_USERS, KEEP_ACTIVE_USERS_INFORMED, BRING_BACK_LAPSED_USERS) |
| `territory_schedules` | array | No | Territory scheduling for the event |
| `localizations` | array | Yes | Localizations for the event (at least one required) |

**Returns:** Created event ID, reference name, and count of localizations created

**Examples:**

*Create a new seasonal event:*

```json
{
  "app_id": "1611434405",
  "reference_name": "Summer Sale 2026",
  "badge": "SPECIAL_EVENT",
  "priority": "HIGH",
  "purpose": "ATTRACT_NEW_USERS",
  "localizations": [
    {
      "locale": "en-US",
      "name": "Summer Sale",
      "short_description": "Huge savings this summer!",
      "long_description": "Get up to 50% off all premium features during our annual summer sale event."
    }
  ]
}
```

### Update Event (`update_event`)

Update an existing in-app event's attributes or localizations via App Store Connect. Can update reference name, badge, deep link, priority, purpose, territory schedules, and localizations. Localizations with an ID are patched; without an ID they are created.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `event_id` | string | Yes | The event ID to update |
| `reference_name` | string | No | New reference name |
| `badge` | string | No | New badge type (LIVE_EVENT, PREMIERE, CHALLENGE, COMPETITION, NEW_SEASON, MAJOR_UPDATE, SPECIAL_EVENT) |
| `deep_link` | string | No | New deep link URL |
| `priority` | string | No | New priority level (HIGH, NORMAL) |
| `purpose` | string | No | New target audience purpose (APPROPRIATE_FOR_ALL_USERS, ATTRACT_NEW_USERS, KEEP_ACTIVE_USERS_INFORMED, BRING_BACK_LAPSED_USERS) |
| `territory_schedules` | array | No | New territory scheduling |
| `localizations` | array | No | Localizations to update or create. Include id to patch existing, omit id to create new. |

**Returns:** Event ID and list of all updates applied (attributes and localizations)

**Examples:**

*Update event badge and add a localization:*

```json
{
  "event_id": "evt-123",
  "badge": "MAJOR_UPDATE",
  "localizations": [
    {
      "locale": "de-DE",
      "name": "Sommer-Angebot",
      "short_description": "Tolle Angebote!",
      "long_description": "Erhalte bis zu 50% Rabatt auf alle Premium-Funktionen."
    }
  ]
}
```

### Delete Event (`delete_event`)

Delete a draft in-app event from App Store Connect. Only events in DRAFT state can be deleted. Published or approved events cannot be deleted via this endpoint.

**Parameters:**

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `event_id` | string | Yes | The event ID to delete (must be in DRAFT state) |

**Returns:** Confirmation of event deletion with event ID

**Examples:**

*Delete a draft event:*

```json
{
  "event_id": "evt-123"
}
```

## Quick Start

```bash
# Via CLI
TOOLROUTER_API_KEY=tr_live_xxx npx -y toolrouter-mcp call appstore-aso analyze_keywords --keywords countdown,countdown widget,timer app --country us

# Via REST API
curl -H "Authorization: Bearer tr_live_xxx" \
     -d '{"tool":"appstore-aso","skill":"analyze_keywords","input":{"keywords":["countdown","countdown widget","timer app"],"country":"us"}}' \
     https://api.toolrouter.com/v1/tools/call
```

## Frequently Asked Questions

### Can it help me improve rankings or just analyze them?

It does both. The tool covers keyword difficulty, competitor ranking checks, and metadata updates, so you can move from research to changes in the same workflow.

### What do I need connected before I can use it?

You need your iOS app bundle ID plus App Store Connect credentials. If you want keyword popularity data, the Apple Ads session cookie is also used.

### Does it cover reviews and in-app events?

Yes. The manifest includes review monitoring and in-app event management alongside ASO research and metadata work.

### Is this only for the iOS App Store?

Yes. It is built for App Store optimization on iOS, not for Google Play listings.

---

## Get Started with ToolRouter

**Already connected?** Call any tool with `use_tool({ tool, skill, input })`. Browse tools with `discover` or visit https://toolrouter.com/llms-full.txt

**New to ToolRouter?** Connect with one command (no API key needed — auto-provisions on first use):

```bash
# MCP (Claude Code, Codex CLI)
claude mcp add toolrouter -- npx -y toolrouter-mcp

# MCP (Cursor, Windsurf, Cline, VS Code, Gemini CLI, Claude Desktop)
{"mcpServers":{"toolrouter":{"command":"npx","args":["-y","toolrouter-mcp"]}}}

# Claude Chat / Claude Cowork / Claude Mobile — add as a connector:
# Settings → Connectors → Add custom connector → URL: https://api.toolrouter.com/mcp

# ChatGPT — add as an app:
# Settings → Apps → Advanced settings → enable Developer mode → Create app → MCP Server URL: https://api.toolrouter.com/mcp

# CLI (works instantly, no restart needed)
npx -y toolrouter-mcp tools                    # browse all tools
npx -y toolrouter-mcp search "seo"             # search by keyword
npx -y toolrouter-mcp call seo analyze_page --url https://example.com
```

Free tools work immediately. For paid tools, visit https://toolrouter.com/claim to add credits.

All platforms: https://toolrouter.com/connect | Full catalog: https://toolrouter.com/llms-full.txt | Docs: https://toolrouter.com/docs