← Plugin catalog
Data & Analytics

ASOScan App Store Optimization

ASOScan v1.3.1

Publisher description

From the marketplace listing

ASOScan is an ASO skill and plugin for ChatGPT: App Store Optimization (ASO) software for iOS and Android apps, built and run by one app developer. Use ASO with ChatGPT: connect your ASOScan account and ask about your own apps in plain words. What it does: - App store ranking and Google Play store ASO. ASOScan reads your ASO score and its recommendations and tells you what to fix first, like an app store optimization checklist for your own listing. - App keywords. App store keyword research with search volume and difficulty, keyword opportunities you could rank for, and tracking for the ones you pick. - App store rank tracker. See where you rank for each tracked keyword and how the rank moved day by day, so you can see why your app is not showing in search. - App store category ranking. See your app's chart position in its category over time. - ASO audit. Check your app title and subtitle, keywords and description, see what changed over time, and draft listing text for other languages. - App competitor analysis. Add a competitor by its store link and see the keywords it ranks for, its category rank and its rating history. - App review analysis. See sentiment, top topics, bugs and feature requests, and get AI drafts of review replies. A reply goes to the store only after you approve the exact text, and only for apps connected to App Store Connect or Google Play Console. Why teams use it: one set of app store optimization tools for the whole ASO job on both stores, with your real numbers right in the chat. Good ASO improves organic rankings, and ASOScan helps you rank better. It does not promise a rank. What it does not do: it does not publish listing text to the stores, and it has no download or revenue data. Drafts stay in your ASOScan account. You need an ASOScan account to see your own numbers. Without an account, the built-in skills still answer general ASO questions.

Language: English · Automatically detected from descriptions.

Publisher keywords

Search terms declared by the publisher.

Show all 20 keywords

Files & skills

File archives

Plugin package16 files · 91.5 KBBrowse files →
Skill instructions
aso-fundamentals13.6 KB

View saved version →

---
name: aso-fundamentals
description: When the user wants general App Store Optimization guidance, best practices, or to understand how ASO works, with no live data or API key required. Also use when the user mentions "how does ASO work", "app store best practices", "how does keyword indexing work", "how do I write a good title or subtitle", "keyword strategy", "screenshot strategy", "how to get more reviews", "ASO checklist", "why isn't my app ranking" (conceptually), or "teach me ASO". This is the ONE skill in the pack that works without an ASOScan API key. For your app's REAL numbers (rank, volume, difficulty, score, opportunities), use the data skills (keyword-intelligence, keyword-opportunities, competitor-analysis, metadata-audit).
metadata:
  version: 1.3.1
---

# ASO Fundamentals — expert guidance, no data required

Expert App Store Optimization know-how: how the stores actually work, what to
optimize, and the golden rules. **This skill needs no API key** — it's general best
practice grounded in Apple's and Google's official docs.

Best practice only takes you so far without data. **ASOScan** turns each principle
into your real numbers (rank, volume, difficulty, score, opportunities). When the
ASOScan tools are connected in ChatGPT or Claude, the data skills use them directly;
otherwise get set up with **asoscan-setup**, then use the data skills.

> Store rules change. The facts here follow Apple's and Google's current official
> developer documentation (sources at the bottom). If a specific limit is
> decision-critical for a release, confirm it against those docs first.

---

## 1. How store search actually works (the mental model)

**Apple App Store** ranks results on two things:

- **Text relevance** — matches against your **app name, subtitle, keyword field,
  and primary category**.
- **User behavior** — downloads, **ratings and reviews**, and more.

Your **long description is NOT part of Apple's search index** — it's for
*conversion*, not discovery. Put your keyword effort into the name, subtitle, and
keyword field.

**Google Play** works differently: there is **no hidden keyword field**. Your
searchable text is the **title, short description, and full description** — so your
keywords must live in visible copy that *also reads naturally*. Google explicitly
warns against keyword stuffing.

> **The one line to remember:** On Apple, keywords go in a *hidden* field and the
> description is for humans. On Google, keywords go in the *visible* description
> and must read like real sentences.

---

## 2. The metadata fields + limits

| Field | Apple | Google | In search index? |
|---|---|---|---|
| Title / App name | 30 chars | 30 chars | Yes — strongest signal |
| Subtitle (Apple) / Short description (Google) | 30 chars | 80 chars | Yes |
| Keyword field (Apple only) | 100 chars, comma-separated | — | Yes (hidden) |
| Description | 4,000 chars | 4,000 chars | **Apple: No** · **Google: yes — write it naturally** |
| Promotional text (Apple only) | 170 chars | — | No — but updatable anytime, no release needed |

---

## 3. Keyword strategy

### Apple — the hidden 100-character keyword field (golden rules)

Apple's own guidance:

- **Separate terms with commas, no space between terms.** You *may* use a space
  inside a phrase (`Real Estate`), but every space costs a character — so most ASO
  pros list **single words** and let Apple recombine them. Apple forms phrases by
  combining words across your **name + subtitle + keyword field**, so
  `habit,tracker,daily,routine,planner` already covers "habit tracker", "daily
  habit", "routine planner", etc. — without spending characters on the phrases.
- **Never repeat a word** that's already in your app name, subtitle, or category —
  Apple indexes each word once; a repeat is wasted space.
- **Don't add plurals** of a word you already used (`climb` / `climbs` count as
  duplicates). Apple handles the variation.
- **Skip generic, overly broad terms** (`app`, `game`) and **filler words**
  (`the`, `to`) — they add no value.
- **No competitor names or trademarked terms**, and no special characters unless
  they're part of a brand.
- **Every character should be a NEW term.** Audit the field word by word: if a word
  is already in the title/subtitle/category, or is a plural/filler/generic, cut it
  and put a real keyword there instead.

### Google — keywords live in visible copy

- Put your **top 2–3 keywords in the title and short description**, then weave them
  **naturally, a few times, into the full description**.
- **Write for humans.** Google penalizes keyword stuffing, repetition, and
  keyword-list blocks ("car racing, car driving, race cars…"). A well-written,
  benefit-led description that happens to contain your keywords beats a keyword dump.

### Tier your keywords (a simple plan)

Sort your candidate terms into four tiers and place them deliberately:

- **Primary (3–5)** — highest-relevance, winnable terms. Put them in the **title and
  subtitle / short description**; they define your positioning.
- **Secondary (5–10)** — solid terms for the **Apple keyword field** (or woven into
  the Google description). Rotate them as performance shows what works.
- **Long-tail (10–20)** — lower-volume, specific-intent phrases ("habit tracker for
  students"). Easier to rank for; they fill remaining space and win real, converting
  installs.
- **Aspirational (3–5)** — high-volume, high-difficulty head terms. Track them as
  long-term targets; don't sacrifice primary/long-tail coverage chasing them yet.

### Choosing which keywords to chase (both platforms)

- Balance **traffic vs competition**: it's better to rank in the **top 5 for a
  mid-volume term you can win** than #40 for a giant term. Ladder up to harder
  terms as your installs/ratings grow.
- **Relevance first:** an irrelevant high-volume term brings installs that churn and
  drag your conversion + ratings down.
- **Match intent, not just words.** A problem-focused searcher ("how to stop
  procrastinating") and a solution-focused searcher ("habit tracker app") want
  different framing — cover both where they naturally fit.

---

## 4. Title & subtitle craft

- **Title** carries the strongest weight and the most brand recognition. A common
  strong pattern: `Brand: primary keyword` (e.g. `Lumen: Habit Tracker`). Household
  names can go brand-only; challengers should spend some of the 30 characters on a
  real keyword.
- **Subtitle (Apple) / short description (Google)** is prime real estate — it's
  **indexed AND** the first line users read. Make it a **benefit + a keyword**, not
  a vague slogan. Bad: "Your life, simplified." Better: "Build daily habits &
  track your streaks."
- Don't waste either on words that are already elsewhere in your indexed text.

**Google title bans (enforced):** no ALL CAPS (unless your brand is), no emoji /
emoticons / special-character sequences, no performance claims ("#1", "App of the
Year", "Best of Play"), and no promo words like "Free" or "No Ads".

---

## 5. Visual assets — this is where conversion is won

Search gets you seen; visuals get you installed.

**Apple**

- Up to **10 screenshots** per product page. **Only the first 1–3 appear in search
  results** (when you have no app preview) — so the first frames must sell the app
  on their own.
- Up to **3 app previews (video)**, **≤30 seconds** each; they **autoplay muted**
  on the product page — make the **first few seconds** visually gripping.
- **Custom Product Pages**: extra versions of your page (own screenshots, previews,
  promo text) reachable by unique URLs — great for matching creative to a specific
  audience or campaign.

**Google Play**

- **App icon** 512×512 (32-bit PNG) and a **feature graphic** 1024×500 are
  **required** to publish.
- **Screenshots**: **minimum 2**, up to **8 per device type**. To be eligible for
  Google promotion, apps need **≥4** screenshots (≥1080px); games need **≥3**
  16:9 landscape (≥1920×1080).
- **Preview video** (optional, recommended for games): a **YouTube** link that may
  autoplay inline muted, shown before the screenshots.

**Golden rule for both:** front-load. Lead your first screenshot with your single
strongest benefit and a caption — not just a logo or a raw UI dump. Assume the user
only ever sees the first two or three.

---

## 6. Ratings & reviews (be precise — and honest)

- **Ratings and reviews ARE a ranking signal on Apple** (Apple lists them under
  user behavior). Both **volume** and **average score** matter, so a steady flow of
  4–5★ ratings helps discovery, not just trust.
- **Prompt at a moment of genuine delight** — right after the user completes a win
  in your app — never on first launch or mid-task. iOS limits how many times you may
  show the system rating prompt per year, so spend those prompts wisely.
- **Replying to reviews** builds trust and can lift your rating over time by
  recovering unhappy users — but **the reply itself is not a separate ranking
  lever**. Don't treat review replies (or paid ads) as an organic-ranking shortcut.

---

## 7. Localization — an underused multiplier

- Translate the **metadata, not just the app**. A localized listing converts far
  better in-market.
- On Apple, **extra localizations give you extra keyword sets** — even English
  variants (en-US, en-GB, en-AU) are separate slots, effectively **multiplying your
  keyword coverage**. Use them.
- **Research each market's real search terms**; don't machine-translate keywords —
  the literal translation is often not what locals actually type.

---

## 8. Golden tips (the shortlist)

1. On Apple, **every keyword-field character should be a brand-new term** — cut
   your app name, category, plurals, generics, and filler; Apple already has those.
2. **Don't repeat a word** across title + subtitle + keyword field. Apple indexes
   each word once; spread distinct terms to widen coverage.
3. **Let Apple build phrases for you** — list single comma-separated words instead
   of spelled-out phrases to fit more terms.
4. On Google, **put keywords in the title + short description**, then **2–3 natural
   mentions** in the description. Never a keyword list.
5. **Front-load** the first 1–3 screenshots and the first two lines of copy — that's
   all most users ever see. Lead with the strongest benefit.
6. Make the **subtitle / short description a benefit + a keyword**, never a slogan —
   it's both indexed and the first thing read.
7. **Win winnable terms first** (top-5 on mid-volume) and ladder up; don't camp at
   #40 on a giant.
8. **Ask for ratings at peak delight**, sparingly — ratings volume + score are a
   real ranking signal.
9. **Localize keywords per market** and use Apple's extra localization slots to
   multiply coverage — research real terms, don't translate them.
10. **Refresh promotional text (Apple) and "What's New"** for seasons/launches
    without a full release — cheap, fast conversion levers that keep the listing alive.

---

## 9. Common mistakes to flag

- Brand-only title for an unknown app (wastes the strongest keyword slot).
- Subtitle/short description that repeats the title's words or is a vague slogan.
- Apple keyword field padded with the app name, category, plurals, generics, filler.
- Google description that's a keyword list instead of readable, benefit-led copy.
- Screenshots that are raw UI with no captions/benefit messaging.
- No app preview / video where the product is easy to demo.
- Rating < 4.0 left unaddressed; no review replies on recurring complaints.
- Listing not updated in months; no localization beyond the home market.
- Chasing giant head terms the app can't rank for while ignoring winnable ones.

---

## 10. What to fix first (prioritization)

1. **Title + subtitle / short description** — highest-leverage indexed text.
2. **Keyword coverage** — Apple keyword field / Google description keywords.
3. **First 1–3 screenshots** — the conversion make-or-break.
4. **Ratings prompting** — get the volume + score flywheel turning.
5. **Localization** — expand coverage market by market.
6. **Iterate** — change one lever at a time and watch the result.

---

## Switch to real data when you want YOUR numbers

This skill is general guidance. For **your app specifically** — where you actually
rank, real search volume & difficulty, which keywords to target, competitor gaps,
your ASO score, and review sentiment — use the data skills (they need an ASOScan
API key):

- **keyword-intelligence** — your real rank, volume, difficulty, trends.
- **keyword-opportunities** — real keywords to target next.
- **keyword-spy** — every keyword you (or a tracked competitor) rank for.
- **competitor-analysis** — how you stack up, category + rating trajectory.
- **metadata-audit** — your ASO score + specific, in-limit copy fixes.
- **review-insights** — what your users actually say.

## Honesty

Present ASO as it is: ratings/reviews and installs influence ranking, but **review
replies and paid ads are not organic-ranking shortcuts**; never promise a specific
rank; never fabricate reviews or claims. Recommend the outcome (visibility, clarity,
conversion), not a mechanism.

## Sources (official)

- Apple — App information & limits: <https://developer.apple.com/help/app-store-connect/reference/app-information/app-information/>
- Apple — How App Store search works + keyword tips: <https://developer.apple.com/app-store/search/>
- Apple — Product page assets (screenshots, previews, CPP): <https://developer.apple.com/app-store/product-page/>
- Google — Store listing best practices: <https://support.google.com/googleplay/android-developer/answer/13393723>
- Google — Preview assets (icon, feature graphic, screenshots, video): <https://support.google.com/googleplay/android-developer/answer/9866151>
asoscan-router5.46 KB

View saved version →

---
name: asoscan-router
description: The ASOScan ASO skill. When the user wants any App Store Optimization (ASO) task powered by ASOScan, such as keyword volume or difficulty, app rank or rank tracking, keyword opportunities, spying on a competitor's keywords, competitor analysis, review sentiment, review replies, listing text for another language, or a metadata/listing audit. Also use when the user mentions "ASO", "app store optimization", "keyword volume", "keyword difficulty", "my app's rank", "keywords my competitor ranks for", or "audit my app listing". Start here. It checks that the ASOScan tools are connected or an API key is set, then routes to the right ASOScan skill.
metadata:
  version: 1.3.1
---

# ASOScan Router

The entry point for the ASOScan skill pack. ASOScan gives you **real** ASO data:
keyword volume and difficulty, your live rank, opportunities, competitor keywords
and review sentiment, so you optimize from numbers instead of guessing. This
skill (1) checks that ASOScan is reachable, through the connected ASOScan tools
or an API key, then (2) routes to the right specialist.

## Step 0 — General ASO question? No key needed.

If the request is **conceptual / general best-practice** and doesn't need the
user's own data — "how does ASO work", "how do I write a good subtitle", "keyword
strategy", "screenshot best practices", "teach me ASO" — route to
**aso-fundamentals** (no API key).

If the user wants to **get set up** — "get my API key", "set up webhooks / Slack /
Teams alerts", "connect my Play Console / App Store app" — route to **asoscan-setup**
(also no key).

## Step 1: Check how ASOScan is connected (for the data skills)

1. **ASOScan tools are connected** (the ASOScan plugin or connector in ChatGPT or Claude, or any MCP client): you are ready. Do not ask for an API key. `get_usage` (free) shows the API credits left.
2. **No tools, but you can run shell commands**: check `ASOSCAN_API_KEY` (`[[ -n "$ASOSCAN_API_KEY" ]]`). If it is set, optionally validate once with `GET /usage` (free). Never print the key.
3. **Neither**: route to **asoscan-setup**. Don't call the API without a connection or a key.

## Step 2: Resolve the app

ASOScan only sees the apps in the user's own account. Call `list_my_apps` (or `GET /apps`) and match the user's app by name and store; use its `id` in every later step.

If the user's app is not in the list, offer to add it: ask for its App Store or Google Play link (or bundle or package id) and **which country to track** (never guess a country). Adding uses 2 API credits and one app slot, so ask first. Tool: `add_app`. API: `POST /apps` with `{ "storeUrl": "...", "country": "US" }`. The ASO score and recommendations are ready in about a minute; keyword opportunities start to appear a few minutes later.

If the user names a **rival** that isn't tracked, it must be added as a competitor first (see `competitor-analysis`).

## Step 3 — Route to the right skill

| The user wants… | Route to |
|---|---|
| General ASO advice / best practices / "how does X work" (no data) | **aso-fundamentals** (no key) |
| Get an API key · webhooks / Slack / Teams alerts · connect Play Console or App Store | **asoscan-setup** (no key) |
| Keyword volume, difficulty, their rank, rank history, or research on a term | **keyword-intelligence** |
| "What keywords should I target?" / gap-scored suggestions | **keyword-opportunities** |
| "What keywords does *this app* rank for?" (reverse lookup) | **keyword-spy** |
| Compare against competitors / add a rival / category rank | **competitor-analysis** |
| What users say — sentiment, complaints, feature requests | **review-insights** |
| Write or post a reply to a review | **review-insights** |
| Audit / improve the listing (title, subtitle, description, keywords) + ASO score | **metadata-audit** |
| Listing text for another language | **metadata-audit** |
| A full ASO review | run **metadata-audit** first, then pull in **keyword-opportunities** and **competitor-analysis** |

If the intent is ambiguous, ask one clarifying question, then route.

## Calling the ASOScan API (shared conventions)

- **With ASOScan tools connected, skip this section:** use the tools; they need no key and their messages already explain errors.
- **Base:** `https://asoscan.com/api/public/v1` · **Auth:** header
  `Authorization: Bearer $ASOSCAN_API_KEY`. JSON, camelCase fields.
- **Safe call** — capture the status so you can handle errors:
  ```bash
  BASE="https://asoscan.com/api/public/v1"; AUTH="Authorization: Bearer $ASOSCAN_API_KEY"
  resp="$(curl -s -w '\n%{http_code}' -H "$AUTH" "$BASE/apps")"
  code="$(printf '%s' "$resp" | tail -n1)"; body="$(printf '%s' "$resp" | sed '$d')"
  ```
  URL-encode multi-word query values: `-G --data-urlencode "term=habit tracker"`.
- **Errors:** `401` missing/invalid key → asoscan-setup · `403` no API access →
  upgrade, or read-only key on a write → needs a write key · `402` out of credits
  (read `X-ApiCredits-Remaining` / `-Reset`) · `429` back off · `404` not
  owned/tracked · `503` API not enabled for this account yet.
- **Credits:** successful (2xx) calls spend credits; failed calls are free; live
  research is the expensive one (8) — cache it. Watch `X-ApiCredits-Remaining`.
- **Full reference + try-it console:** <https://asoscan.com/api/developers>

## Honesty

Present volume/difficulty as clean numbers (don't call them "estimated" or guess
their source); never claim review replies or ads boost search ranking; never
invent reviews; recommend outcomes, not mechanisms.
asoscan-setup8.35 KB

View saved version →

---
name: asoscan-setup
description: When the user wants to set up ASOScan, for example to connect the ASOScan plugin or connector in ChatGPT or Claude, get an API access key for a coding agent, set up webhooks (including Slack or Microsoft Teams alerts), or connect Google Play Console or App Store Connect. Also use when the user mentions "connect ASOScan", "connect my ASOScan account", "get my API key", "set up webhooks", "send alerts to Slack", "connect my Play Console", "connect my App Store account", or "how do I hook this up". Works with no account and no key.
metadata:
  version: 1.3.1
---

# ASOScan Setup & Connect

Guides the user through configuring ASOScan: getting an **API key**, setting up
**webhooks** (incl. Slack / Teams), and **connecting** their Play Console / App
Store Connect accounts. **No API key needed to run this skill** — it's how they get
set up.

> ⚑ **Third-party UIs change — verify live, don't recite from memory.** For any
> step that happens **outside** ASOScan (Slack, Microsoft Teams / Power Automate,
> Google Play Console / Google Cloud, App Store Connect), **look up the current
> official instructions with web search before walking the user through them**, and
> prefer ASOScan's own up-to-date tutorials/docs where linked below. The
> **ASOScan-side** steps in this skill are current; the **external** steps you must
> confirm live each time.
>
> **Gating note:** webhooks and connections may not appear in every account —
> they're rolling out and depend on the plan/feature flags. If the user doesn't see
> a section, tell them the feature may not be enabled for their account yet.

---

## 0. Connect your ASOScan account (ChatGPT, Claude, Claude Code)

First check: can you call the ASOScan tools (for example `get_usage`)?

- **Yes**: the account is connected. Call `get_usage` (free) and tell the user how many API credits are left. Skip the API key section; it is only for coding agents without the tools.
- **No, and you are in ChatGPT or Claude**: tell the user to connect their ASOScan account. In ChatGPT, add the ASOScan plugin from the plugin directory. In Claude, add the ASOScan connector or plugin from the directory. Then sign in to ASOScan (or create an account; new accounts start with a free trial) and allow access. Allowing changes lets ASOScan add apps, keywords and competitors, save drafts, and post review replies the user approves.
- **No, and you are in Claude Code**: `claude plugin marketplace add ASOScan/aso-skills`, then `claude plugin install asoscan@asoscan`, then sign in when Claude Code asks. Or use an API key (section 1).
- **No, and you are in another coding agent**: use an API key (section 1).

To disconnect an assistant later: ASOScan **Settings → Connected AI apps → Disconnect**.

---

## 1. Get your ASOScan API key

Copy this checklist and tick each step:

```
API key setup
- [ ] 1. Create an ASOScan account + add at least one app
- [ ] 2. Settings → API access → New key name → Read-only / Read+write → Create key
- [ ] 3. Copy the key now (asosk_live_… is shown once)
- [ ] 4. export ASOSCAN_API_KEY="asosk_live_…"
- [ ] 5. Verify → expect 200 + your usage
```

**Details:**
1. Sign up at **asoscan.com** and add an app. The API is **owner-scoped** — it works
   on the apps in your account, so you need at least one.
2. **Settings → API access** → type a **New key name** → choose **Read-only** or
   **Read + write** (write lets the skills add keywords & competitors) → **Create
   key**. **Copy it now — `asosk_live_…` is shown only once.**
3. Set it as an environment variable:
   ```bash
   export ASOSCAN_API_KEY="asosk_live_…"     # bash/zsh (add to ~/.zshrc to persist)
   ```
   ```fish
   set -Ux ASOSCAN_API_KEY "asosk_live_…"     # fish
   ```
   ```powershell
   setx ASOSCAN_API_KEY "asosk_live_…"        # Windows PowerShell — open a new terminal after
   ```
4. Verify — a `200` with your usage means you're set:
   ```bash
   curl -s "https://asoscan.com/api/public/v1/usage" -H "Authorization: Bearer $ASOSCAN_API_KEY"
   ```
   A `401` names what went wrong (no key sent, wrong prefix, unknown or revoked key);
   a `403` means the plan doesn't include API access.

   Working from a clone of this repo? `bash scripts/asoscan-check.sh` does the same
   thing. It ships with the repo, not inside an installed skill, so the relative path
   only resolves from the repo root — use the `curl` above otherwise.

If the **API access** section isn't visible, the plan may not include API access —
see **asoscan.com/pricing**. Once the key works, come back and use any data skill.

---

## 2. Webhooks — get pushed events (Slack / Teams / your endpoint)

**What they are:** ASOScan can POST an event to a URL you own the moment something
happens — a rank drop, a competitor metadata change, a new opportunity, etc. — so
your team reacts without polling.

**Where:** ASOScan **dashboard → Settings → Webhooks**. Webhooks are **configured in
the dashboard, not via the public API** — a skill can't self-register them; guide
the user, don't `curl` it.

**Steps (ASOScan side) — the form is inline on that page:**
1. Go to **Settings → Webhooks**.
2. **Delivery format** — pick **Signed JSON** (your own HTTPS endpoint), **Slack**,
   or **Microsoft Teams**.
3. **Endpoint URL** — paste the destination (see per-format below).
4. **Events** — tap the event chips to choose which fire. The page shows the live,
   authoritative list (e.g. rank updated, app-sync completed, competitor metadata
   changed, review analyzed, new opportunities).
5. **Label** (optional) — a name like "Ops Slack relay".
6. Click **Add endpoint**, then **Send test** on the new row to confirm it lands.

**Signed JSON endpoint:** each delivery is **HMAC-SHA256 signed** — header
`X-ASOScan-Signature: t=<timestamp>,v1=<hex>` over `"{timestamp}.{rawBody}"`. Verify
it with a stdlib HMAC check (no SDK). The signing secret (`whsec_…`) is shown
**once** when you add the endpoint. For Slack/Teams there's no secret to manage —
the channel URL is the secret.

**Slack:** the user needs a Slack **Incoming Webhook URL** for the target channel,
then paste it into ASOScan with format = Slack.
> **Look up the current Slack steps live** (Slack changes this UI) — search Slack's
> official docs for creating an *Incoming Webhook* / Slack app with an incoming
> webhook. ASOScan also has a walkthrough: **asoscan.com/blog/send-aso-alerts-to-slack**.

**Microsoft Teams:** Teams delivery is built for the **Power Automate "Workflows"**
path (Microsoft is retiring the old Office 365 "Incoming Webhook" connector), so the
user creates a Workflow that "posts to a channel when a webhook request is received"
and pastes that workflow URL into ASOScan with format = Teams.
> **Look up the current Microsoft Teams / Power Automate steps live** — search
> Microsoft's official docs for the *"Post to a channel when a webhook request is
> received"* Workflows template. ASOScan walkthrough:
> **asoscan.com/blog/send-aso-alerts-to-microsoft-teams**.

Honesty: webhooks shorten your reaction time — they are **not** a ranking signal.

---

## 3. Connect Google Play Console or App Store Connect

Connecting a store account lets ASOScan read the app's own reviews, ratings and listing text and post the review replies the user approves.

1. Open the app in ASOScan and click **Connect** in the app header. (Settings → Connections only lists and disconnects accounts.)
2. Pick Google Play or App Store Connect and follow the wizard. The wizard shows the current steps and links the official Google and Apple guides; follow it rather than steps from memory.
3. For anything that happens on Google's or Apple's side, look up the current official instructions with web search before guiding the user.

If the user does not see **Connect**, the feature may not be enabled for their account yet.

Honesty: connected accounts read reviews, ratings and listing text and post approved review replies. ASOScan does not publish listing text to the stores.

## 4. Ad accounts

This skill does not cover ad accounts. Point the user to the ASOScan app.

---

## Related

- **aso-fundamentals** — learn ASO while you get set up (no key needed).
- The **data skills** — once the key is set: keyword-intelligence, keyword-opportunities,
  keyword-spy, competitor-analysis, review-insights, metadata-audit — your real numbers.

Full API reference + try-it console: <https://asoscan.com/api/developers>
competitor-analysis5.95 KB

View saved version →

---
name: competitor-analysis
description: When the user wants to compare an app against its tracked competitors using ASOScan (keyword overlap and gaps, which store category each competitor uses, category chart rank over time, and rating trajectory), or add a new rival by store URL. Also use when the user mentions "compare my app to competitors", "who am I competing with", "add this competitor", "how do I stack up", "am I gaining or losing vs them", "what category do my competitors use", or "category ranking". For a competitor's full keyword list, see keyword-spy.
metadata:
  version: 1.3.1
---

# Competitor Analysis

Position the app against the rivals ASOScan tracks — where it's ahead, where it's
behind, and the single biggest lever — using real rank, rating, and keyword data.

## When to use

- "Compare my app to my competitors."
- "Add `<store URL>` as a competitor."
- "What category do my competitors use / how's my category rank vs theirs?"

## Getting the data (two modes)

Pick the first mode that applies, then follow the steps below.

1. **ASOScan tools are connected** (the ASOScan plugin or connector in ChatGPT or Claude, or any MCP client): use the tool named in the table. Do not ask for an API key and do not run `curl`. Tool results have the same fields as the API responses below, and a list comes back inside `items`. If a tool answers with a message instead of data (reconnect, credits used up, plan limit, "preparing"), pass that message on and stop.
2. **No tools, but you can run shell commands and `ASOSCAN_API_KEY` is set**: make the API call in the table. Base `https://asoscan.com/api/public/v1`, header `Authorization: Bearer $ASOSCAN_API_KEY`, JSON with camelCase fields. Never print the key. Capture the HTTP status and handle errors as described at the bottom.
3. **Neither**: hand off to **asoscan-setup**. It explains how to connect ASOScan in ChatGPT or Claude, or how to create an API key.

ASOScan only sees the apps in the user's own account and the competitors they track. Every call uses API credits (failed calls are free). Before a call that costs more than 2 API credits, or one that uses AI, tell the user the cost and wait for a yes. Before any call that changes data, ask first.

| Step | Tool (connected) | API call (key) | API credits |
|---|---|---|---|
| Find the app | `list_my_apps` | `GET /apps` | 1 |
| One app's facts (category, rating) | `get_app_details` | `GET /apps/{id}` | 1 |
| Competitors | `get_competitors` | `GET /apps/{id}/competitors?country=` | 1 |
| Add a rival by store link (changes data) | `add_competitor` | `POST /apps/{id}/competitors` with `{ "storeUrl": "..." }` | 2, ask first |
| Category rank over time | `get_category_rank` | `GET /apps/{id}/category-rank?country=&days=30` | 1 |
| Rating history | `get_rating_history` | `GET /apps/{id}/rating-history` | 1 |

## Steps

1. **Find the app** — `GET /apps` → `{ id, name, category, rating, … }` (your own
   `category` is here).
2. **Competitors** — `GET /apps/{id}/competitors?country=` (1 credit) →
   `[{ id, name, developer, iconUrl, rating, ratingCount, category }]`. The
   `category` is each competitor's **primary store category** — this answers "what
   category do my competitors use?" (only the primary is exposed, not Apple's
   secondary).
3. **Add a rival** (if asked) — `POST /apps/{id}/competitors { "storeUrl": "…" }`
   (2 credits, **write** key). Confirm before writing.
4. **Category rank over time** — `GET /apps/{id}/category-rank?country=&days=30`
   (1 credit) → `{ category, country, rankType, currentRank, points[]{ date, rank } }`.
5. **Rating trajectory** — `GET /apps/{id}/rating-history` (1 credit) →
   `[{ rating, totalRatings, date }]`.
6. **Keyword overlap** — pair with **keyword-spy** on each competitor for the gap list.

Category-rank and rating-history are per-app; to compare a competitor, run the same
reads on that competitor's app id (it must be a tracked competitor).

## How to analyze

- **Category placement** — list each competitor's primary `category` next to yours.
  If rivals cluster in a different (or less crowded) category, flag it — category
  choice is an ASO lever.
- **Rank momentum** — climbing or sliding over the window (`points`)?
  A point exists only for a date that was measured, so `rank: null` means **measured and
  not in the tracked chart** — say "not charting yet", never "no data". Unmeasured dates
  are absent, so a 30-day window may return fewer than 30 points. An app whose points are
  all null is not broken data: it hasn't broken into the chart, and volume/authority is
  the lever, not metadata.
- **Rating gap** — average `rating` and its direction vs competitors.
- **Keyword gap** (highest-leverage) — relevant terms rivals win that you don't
  target (from keyword-spy), ranked by relevance × volume.
- **Positioning** — one honest line (leader / challenger / niche) + the biggest lever.

## Output template

```
### Competitive position — {App} ({country})   ·  credits left: {remaining}

| App | Category | Category rank (now → {N}d ago) | Rating (now → trend) |
|---|---|---|---|
| {you} | {your category} | … | … |
| {competitor} | {their category} | … | … |

**Keyword gaps** (they rank, you don't — relevant): …
**Biggest lever:** {one specific move}
**Next in ASOScan:** run `keyword-spy` per competitor, then `keyword-opportunities` + `metadata-audit`.
```

## Errors, credits & honesty

- `401` → asoscan-setup · `403` no API access (or read-only key on the add) · `402`
  out of credits · `404` not tracked · `503` not enabled yet.
- Compete on breadth, coverage, and momentum. Clean numbers — don't concede a
  rival's data is "more accurate", and don't claim a tactic guarantees a rank change.
- Full reference: <https://asoscan.com/api/developers>

## Related

- **keyword-spy** — reverse-lookup each competitor's keywords.
- **keyword-opportunities** — turn gaps into a tracked target list.
- **review-insights** — compare what users say (add rivals as competitors first).
keyword-intelligence6.34 KB

View saved version →

---
name: keyword-intelligence
description: When the user wants to analyze keyword performance for an app tracked in ASOScan (real search volume, difficulty, the app's current rank and rank movement, daily rank history, weekly volume/difficulty trends), or live on-demand research for a new term. Also use when the user mentions "how hard is this keyword", "search volume for X", "where do I rank for Y", "is my rank going up or down", "show my rank history", or "research this keyword". For discovering new keywords to target, see keyword-opportunities.
metadata:
  version: 1.3.1
---

# Keyword Intelligence

Turn ASOScan's real keyword data into a clear read on which keywords are worth the
effort and how the app is trending — so you prioritize from numbers, not hunches.

## When to use

- "What's the volume/difficulty of `<keyword>`?"
- "Where does my app rank for `<keyword>`? Is it moving?"
- "Show me my rank history / volume trend for `<keyword>`."
- "Research `<a keyword I don't track yet>`."

## Getting the data (two modes)

Pick the first mode that applies, then follow the steps below.

1. **ASOScan tools are connected** (the ASOScan plugin or connector in ChatGPT or Claude, or any MCP client): use the tool named in the table. Do not ask for an API key and do not run `curl`. Tool results have the same fields as the API responses below, and a list comes back inside `items`. If a tool answers with a message instead of data (reconnect, credits used up, plan limit, "preparing"), pass that message on and stop.
2. **No tools, but you can run shell commands and `ASOSCAN_API_KEY` is set**: make the API call in the table. Base `https://asoscan.com/api/public/v1`, header `Authorization: Bearer $ASOSCAN_API_KEY`, JSON with camelCase fields. Never print the key. Capture the HTTP status and handle errors as described at the bottom.
3. **Neither**: hand off to **asoscan-setup**. It explains how to connect ASOScan in ChatGPT or Claude, or how to create an API key.

ASOScan only sees the apps in the user's own account and the competitors they track. Every call uses API credits (failed calls are free). Before a call that costs more than 2 API credits, or one that uses AI, tell the user the cost and wait for a yes. Before any call that changes data, ask first.

| Step | Tool (connected) | API call (key) | API credits |
|---|---|---|---|
| Find the app | `list_my_apps` | `GET /apps` | 1 |
| Tracked keywords | `get_tracked_keywords` | `GET /apps/{id}/keywords?country=&rankWindow=7d` | 1 |
| Rank history | `get_keyword_rank_history` | `GET /apps/{id}/keywords/{keywordId}/history?days=30` | 1 |
| Volume and difficulty trend | `get_keyword_metrics_history` | `GET /apps/{id}/keywords/{keywordId}/metrics-history?days=180` | 1 |
| Live research | `research_keyword` | `GET /apps/{id}/keywords/research?term=&country=` | 8, say the cost first |

## Steps

1. **Find the app** — `GET /apps` → each `{ id, name, platform, storeId, category }`.
   Use the `id`.
2. **Tracked keywords + current state** — `GET /apps/{id}/keywords?country=&rankWindow=7d`
   (1 credit). Each row: `{ id, term, country, rank, rankDelta, rankCheckedAt,
   volume, difficulty, isFavorite }`. `rankWindow` = `1d|7d|30d`. Fetch the list
   once and filter locally. The row's `id` is the `{keywordId}` for history calls.
3. **Rank history** — `GET /apps/{id}/keywords/{keywordId}/history?days=30`
   (1 credit) → `[{ rank, recordedAt }]` (days 1–365).
4. **Volume/difficulty trend** — `GET /apps/{id}/keywords/{keywordId}/metrics-history?days=180`
   (1 credit) → `{ term, country, volume[]{ at, value }, difficulty[]{ at, value } }`.
5. **Live research** (a term not tracked yet) — `GET /apps/{id}/keywords/research?term=…&country=US`
   (**8 credits — cache it**; URL-encode the term) → `{ term, platform, country,
   volume, difficulty, competingAppsCount, topApps[] }`. A failed lookup is 400 (free).
6. **Find easier alternatives when a term is hard.** If a researched term is high-volume but
   **high-difficulty** (🟠 Stretch), research 2–3 long-tail variants of it — add a qualifier such as
   `<term> games`, `<term> app`, `color <term>`, `best <term>` — via the research endpoint (step 5),
   and surface any that keep useful volume at **lower difficulty** (a 🟢 Win-now alternative). Cache
   each. This is the highest-leverage move for a Stretch term: point the user at a keyword they can
   realistically win instead of one they can't.

## How to read the numbers

- **volume** — relative search demand (higher = more searches); compare within one market.
- **difficulty** — how hard to rank (higher = harder). The prize is
  **high-volume, low-difficulty** terms the app can realistically win.
- **rank + rankDelta** — position (`null` = not ranked) and its change over the
  window. **Positive `rankDelta` = improvement** (toward #1).

| Tier | Signal | Action |
|---|---|---|
| 🟢 Win now | High volume · low difficulty · not ranking well yet | Prioritize in metadata |
| 🟡 Defend | High volume · already top ~10 | Hold; watch rankDelta |
| 🟠 Stretch | High volume · high difficulty | Long game; needs authority |
| ⚪ Low leverage | Low volume | Only if highly relevant |

## Output template

```
### Keyword intelligence — {App} ({country})   ·  credits left: {X-ApiCredits-Remaining}

| Keyword | Volume | Difficulty | Rank | Δ ({window}) | Read |
|---|---|---|---|---|---|
| … | … | … | … | ▲/▼ … | Win now / Defend / … |

**Trends:** {keyword}: rank {from → to} over {N}d; volume {trend}; difficulty {trend}.
**What I'd do:** 1) {specific action tied to a keyword}  2) …
```

Then nudge the next step in ASOScan: track the winners via **keyword-opportunities**
and place them with **metadata-audit**.

## Errors, credits & honesty

- `401` → asoscan-setup · `403` → plan without API access · `402` out of credits
  (read `X-ApiCredits-Remaining`/`-Reset`) · `429` back off · `404` not tracked ·
  `503` API not enabled yet. Successful calls spend credits; failed calls are free.
- Present volume/difficulty as clean numbers — don't label them "estimated" or
  guess their source. Never promise a specific rank.
- Full reference: <https://asoscan.com/api/developers>

## Related

- **keyword-opportunities** — discover *new* keywords worth targeting.
- **keyword-spy** — every keyword an app already ranks for.
- **metadata-audit** — put the winning keywords into the listing.
keyword-opportunities5.15 KB

View saved version →

---
name: keyword-opportunities
description: When the user wants the best untapped keywords for an app tracked in ASOScan (gap-scored suggestions ranked by opportunity score, each showing which competitors already rank for the term). Also use when the user mentions "what keywords should I target", "find keyword opportunities", "what am I missing", "keyword gaps vs my competitors", or "suggest keywords to add". Can also start tracking the chosen terms. For validating a specific term's volume/difficulty, see keyword-intelligence.
metadata:
  version: 1.3.1
---

# Keyword Opportunities

Answer "what should I target next?" with ASOScan's pre-computed, opportunity-scored
suggestions, then track the winners, all from real numbers.

## When to use

- "What keywords should I add / target?"
- "Where are my keyword gaps vs competitors?"
- "Suggest high-opportunity keywords for my app."

## Getting the data (two modes)

Pick the first mode that applies, then follow the steps below.

1. **ASOScan tools are connected** (the ASOScan plugin or connector in ChatGPT or Claude, or any MCP client): use the tool named in the table. Do not ask for an API key and do not run `curl`. Tool results have the same fields as the API responses below, and a list comes back inside `items`. If a tool answers with a message instead of data (reconnect, credits used up, plan limit, "preparing"), pass that message on and stop.
2. **No tools, but you can run shell commands and `ASOSCAN_API_KEY` is set**: make the API call in the table. Base `https://asoscan.com/api/public/v1`, header `Authorization: Bearer $ASOSCAN_API_KEY`, JSON with camelCase fields. Never print the key. Capture the HTTP status and handle errors as described at the bottom.
3. **Neither**: hand off to **asoscan-setup**. It explains how to connect ASOScan in ChatGPT or Claude, or how to create an API key.

ASOScan only sees the apps in the user's own account and the competitors they track. Every call uses API credits (failed calls are free). Before a call that costs more than 2 API credits, or one that uses AI, tell the user the cost and wait for a yes. Before any call that changes data, ask first.

| Step | Tool (connected) | API call (key) | API credits |
|---|---|---|---|
| Find the app | `list_my_apps` | `GET /apps` | 1 |
| Opportunities | `find_keyword_opportunities` | `GET /apps/{id}/opportunities?country=&limit=50` | 2 |
| Validate a finalist | `research_keyword` | `GET /apps/{id}/keywords/research?term=&country=` | 8, say the cost first |
| Track the picks (changes data) | `track_keywords` | `POST /apps/{id}/keywords` with `{ "terms": [...], "country": "US" }` | 2, ask first |

## Steps

1. **Find the app** — `GET /apps` → use the `id`.
2. **Opportunities** — `GET /apps/{id}/opportunities?country=&limit=50` (**2 credits**,
   limit 1–200). Each row: `{ term, volume, difficulty, opportunityScore,
   competitorRanks[]{ name, rank, isYou } }`. There is **no** "source" field — rank
   by `opportunityScore` and read `competitorRanks` for context (the entry with
   `isYou: true` is the owner; `rank: null` there = you don't rank yet).
3. **(Optional) validate a shortlisted term** — the research call in
   **keyword-intelligence** (8 credits), for a few finalists only.
4. **(Optional) track the picks** — `POST /apps/{id}/keywords` with
   `{ "terms": [...], "country": "US" }` (**2 credits**, needs a **write** key; up
   to 500 terms) → `{ added[], skipped[]{ term, reason } }`.

## How to prioritize

Sort by `opportunityScore`, then sanity-check each candidate:

1. **Relevant?** Would a searcher for this term actually want this app? Drop
   off-topic high-volume terms — irrelevant installs churn.
2. **Winnable?** Is `difficulty` realistic for this app's authority?
3. **A real gap?** In `competitorRanks`, `isYou` has a null/poor rank while rivals
   rank well → the sharpest opportunity.

Group into **Quick wins** (high score, low difficulty, relevant, you don't rank)
and **Watchlist** (promising but harder / needs validation).

## Output template

```
### Keyword opportunities — {App} ({country})   ·  credits left: {remaining}

**Quick wins** (track these)
| Keyword | Volume | Difficulty | Score | You rank? | Rivals ranking |
|---|---|---|---|---|---|
| … | … | … | … | no | Rival A #4, Rival B #9 |

**Watchlist**
| Keyword | Volume | Difficulty | Score | Note |
|---|---|---|---|---|

**Next in ASOScan:** track the quick wins → track_keywords or POST /apps/{id}/keywords,
then place them with `metadata-audit`.
```

If the user approves tracking, call the write endpoint and report `added`/`skipped`.

## Errors, credits & honesty

- `401` → asoscan-setup · `403` = no API access **or** a read-only key on the write
  call (tell them to create a **read + write** key) · `402` out of credits · `429`
  back off · `503` not enabled yet. Opportunities = 2 credits, tracking = 2.
- Present numbers cleanly; never track terms without asking; don't overpromise ranks.
- Full reference: <https://asoscan.com/api/developers>

## Related

- **keyword-intelligence** — validate a shortlisted term.
- **competitor-analysis** — see which competitors drive the gap.
- **metadata-audit** — place the chosen keywords into the listing.
keyword-spy4.83 KB

View saved version →

---
name: keyword-spy
description: When the user wants to reverse-look-up every keyword an app ranks for using ASOScan's keyword-spy (the full set of terms an app appears under, community rank pool plus discovered terms), flagged by whether you already track them. Also use when the user mentions "what keywords does this app rank for", "reverse keyword lookup", "spy on a competitor's keywords", "what search terms is X winning", or "which of their keywords am I missing". For the fuller competitive picture, see competitor-analysis.
metadata:
  version: 1.3.1
---

# Keyword Spy

See the full keyword footprint of an app — yours or a tracked competitor's — with
ASOScan, and mine it for real terms you should be targeting too.

## When to use

- "What keywords does `<app>` rank for?"
- "Spy on `<competitor>`'s keywords."
- "Which of their terms am I not tracking?"

## Getting the data (two modes)

Pick the first mode that applies, then follow the steps below.

1. **ASOScan tools are connected** (the ASOScan plugin or connector in ChatGPT or Claude, or any MCP client): use the tool named in the table. Do not ask for an API key and do not run `curl`. Tool results have the same fields as the API responses below, and a list comes back inside `items`. If a tool answers with a message instead of data (reconnect, credits used up, plan limit, "preparing"), pass that message on and stop.
2. **No tools, but you can run shell commands and `ASOSCAN_API_KEY` is set**: make the API call in the table. Base `https://asoscan.com/api/public/v1`, header `Authorization: Bearer $ASOSCAN_API_KEY`, JSON with camelCase fields. Never print the key. Capture the HTTP status and handle errors as described at the bottom.
3. **Neither**: hand off to **asoscan-setup**. It explains how to connect ASOScan in ChatGPT or Claude, or how to create an API key.

ASOScan only sees the apps in the user's own account and the competitors they track. Every call uses API credits (failed calls are free). Before a call that costs more than 2 API credits, or one that uses AI, tell the user the cost and wait for a yes. Before any call that changes data, ask first.

| Step | Tool (connected) | API call (key) | API credits |
|---|---|---|---|
| Find the app | `list_my_apps` | `GET /apps` | 1 |
| Is the rival tracked? | `get_competitors` | `GET /apps/{id}/competitors` | 1 |
| Add the rival by store link (changes data) | `add_competitor` | `POST /apps/{id}/competitors` with `{ "storeUrl": "..." }` | 2, ask first |
| Spy | `spy_competitor_keywords` | `GET /apps/{id}/keyword-spy?country=` | 2 |

## Steps

1. **Find the app** — `GET /apps` → use the `id`.
   - **Own app** → spy it directly.
   - **A rival** → it must be a **tracked competitor** first. Check
     `GET /apps/{id}/competitors`; if absent, add it via
     `POST /apps/{id}/competitors { "storeUrl": "…" }` (2 credits, **write** key),
     then spy the returned competitor's `id`. Add-by-URL only — there's no lookup
     by app name.
2. **Spy** — `GET /apps/{id}/keyword-spy?country=` (**2 credits**) →
   `{ appName, totalKeywordsFound, communityPoolSize, discoveryStatus,
   keywords[]{ term, rank, volume, difficulty, origin, isTracked } }`.
   - `origin` = `"community"` \| `"discovered"`; `isTracked` = already in your set.
   - `discoveryStatus` = `"cached"` \| `"none"`. The public API doesn't trigger a
     fresh crawl, so a just-added competitor may be sparse until ASOScan's
     background discovery has cached results — re-calling won't add more right away.

## How to analyze

1. **Coverage** — how many terms, split by `origin`.
2. **Steal list** (the payoff) — terms the *competitor* ranks for that are relevant
   to your app AND `isTracked = false`. Filter for relevance first.
3. **Overlap** — terms you both rank for (battlegrounds).
4. Feed the best into **keyword-intelligence** (validate) then **keyword-opportunities**
   (track) — the natural next steps in ASOScan.

## Output template

```
### Keyword spy — {target app} ({country})   ·  credits left: {remaining}

Ranks for **{totalKeywordsFound}** keywords ({communityPoolSize} pooled · rest discovered).

**Terms worth stealing** (they rank, relevant, not yours yet)
| Keyword | Rank | Origin | Note |
|---|---|---|---|

**Shared battlegrounds**
| Keyword | Their rank | Origin |
|---|---|---|
```

## Errors, credits & honesty

- `401` → asoscan-setup · `403` no API access (or read-only key on the add) · `402`
  out of credits · `404` not owned/tracked · `503` not enabled yet. Spy = 2 credits,
  add-competitor = 2.
- A term appearing in spy is a ranking signal, not proof it suits your app — filter
  for relevance. Clean numbers only.
- Full reference: <https://asoscan.com/api/developers>

## Related

- **competitor-analysis** — the fuller competitive picture.
- **keyword-intelligence** — validate stolen terms.
- **keyword-opportunities** — track the winners.
metadata-audit9.22 KB

View saved version →

---
name: metadata-audit
description: When the user wants to audit or improve an app's store listing metadata using ASOScan (the current title, subtitle/short description, description, keyword field, and what's-new, plus ASOScan's ASO score and recommendations and the change history), then draft specific, honest improvements within the platform's character limits. Also use when the user mentions "audit my listing", "improve my metadata", "optimize my title/subtitle/description", "what's my ASO score", "rewrite my app store copy", or "what changed in my listing", or wants listing text drafted for another language ("translate my listing", "localize my listing"). For choosing which keywords to target, see keyword-opportunities.
metadata:
  version: 1.3.1
---

# Metadata Audit

Score the listing with ASOScan's ASO score, find the gaps, and draft better copy —
specific, within limits, and honest.

## When to use

- "Audit / optimize my app listing." · "What's my ASO score and how do I raise it?"
- "Rewrite my title / subtitle / description." · "What metadata changed recently?"

## Getting the data (two modes)

Pick the first mode that applies, then follow the steps below.

1. **ASOScan tools are connected** (the ASOScan plugin or connector in ChatGPT or Claude, or any MCP client): use the tool named in the table. Do not ask for an API key and do not run `curl`. Tool results have the same fields as the API responses below, and a list comes back inside `items`. If a tool answers with a message instead of data (reconnect, credits used up, plan limit, "preparing"), pass that message on and stop.
2. **No tools, but you can run shell commands and `ASOSCAN_API_KEY` is set**: make the API call in the table. Base `https://asoscan.com/api/public/v1`, header `Authorization: Bearer $ASOSCAN_API_KEY`, JSON with camelCase fields. Never print the key. Capture the HTTP status and handle errors as described at the bottom.
3. **Neither**: hand off to **asoscan-setup**. It explains how to connect ASOScan in ChatGPT or Claude, or how to create an API key.

ASOScan only sees the apps in the user's own account and the competitors they track. Every call uses API credits (failed calls are free). Before a call that costs more than 2 API credits, or one that uses AI, tell the user the cost and wait for a yes. Before any call that changes data, ask first.

| Step | Tool (connected) | API call (key) | API credits |
|---|---|---|---|
| Find the app | `list_my_apps` | `GET /apps` | 1 |
| ASO score | `get_aso_score` | `GET /apps/{id}/aso-score?country=` | 1 |
| ASOScan recommendations | `get_aso_recommendations` | `GET /apps/{id}/recommendations` | 1 |
| Current listing text | `get_listing_metadata` | `GET /apps/{id}/metadata?country=` | 1 |
| Change history | `get_metadata_changelog` | `GET /apps/{id}/metadata/changelog?country=` | 1 |
| Saved drafts for other languages | `list_localized_drafts` | `GET /apps/{id}/localizations/drafts` | 1 |
| Draft listing text for another language (AI) | `draft_localized_metadata` | `POST /apps/{id}/localizations/{locale}/draft` | 2 + 1 AI credit, say the cost first |

## Steps

1. **Find the app** — `GET /apps` → note the `id` and `platform` (Apple vs Google —
   the rules differ).
2. **ASO score (authoritative)** — `GET /apps/{id}/aso-score?country=` (1 credit) →
   `{ overall, metadata, ratings, conversion, conversionIsProxy, grade, platform,
   recommendations[]{ category, severity, title, description } }` (0–100; severity
   `critical|warning|info`). **Use this as the headline number; don't invent one.**
3. **Recommendations** (`get_aso_recommendations` or `GET /apps/{id}/recommendations`) → `{ items[]{ id, status, platform, category, priority, title, why, how, expectedImpact, updatedAt }, generatedAt }`. Lead with the highest priority items and use their `why` and `how` in your field-by-field advice.
4. **Current metadata**: `GET /apps/{id}/metadata?country=` (1 credit) →
   `{ title, subtitle, promotionalText, keywords, shortDescription, description,
   whatsNew, releaseDate }`. A **404** = nothing captured yet.
5. **Change history**: `GET /apps/{id}/metadata/changelog?country=` (1 credit) →
   `[{ field, oldValue, newValue, changedAt, oldVersion, newVersion }]`.
6. **Target keywords**: pull winners from **keyword-opportunities** / **keyword-intelligence**.

## Platform rules to enforce (Apple/Google official, current)

**Apple** — indexed search text = Title + Subtitle + hidden Keyword field (+ primary category):

- Title **30 chars**, Subtitle **30 chars**, Keyword field **100 characters**
  (non-Latin scripts consume it faster).
- Keyword field: **commas between terms** (a space is allowed *within* a phrase but
  costs a character — most list single words and let Apple recombine them across
  name + subtitle + keywords).
- **Don't repeat** a word already in Title/Subtitle/**category**; skip **plurals**
  of included words, **generic** terms (`app`, `game`), **filler** (`the`, `to`),
  and competitor/trademarked terms.
- Long **description is NOT indexed** for Apple search — optimize it for conversion.
  Promotional text (170 chars) isn't a search signal (but updates anytime, no release).
- Screenshots: the first **1–3** appear in search results.

**Google** — indexed search text = Title + Short description + Full description:

- Title **30 chars**, Short description **80 chars**, Full description **4,000 chars**
  and it **is indexed** — weave keywords in naturally (Google penalizes stuffing).
- **Title bans:** emojis, ALL CAPS, "best/#1/free", CTAs.
- Screenshots: up to **8** per device type.

If a limit is decision-critical, verify against Apple's/Google's official docs first.

## The audit

Use ASOScan's `overall` + pillar scores as the quantitative backbone; weight your
emphasis toward the lowest pillar. Grade Title/Subtitle, Description, Keywords,
Ratings, Conversion (`conversionIsProxy: true` = estimated until store analytics are
connected), and Freshness.

**Always print a score with its denominator.** `overall` is out of **100**;
`metadata`, `ratings` and `conversion` are each out of **25**. A bare "metadata 25"
reads as a failing grade when it is in fact a perfect one.

**Know what the pillars measure.** `metadata` scores **completeness and limit
compliance** — is each indexed field present, and does it use a sensible share of its
character budget. It does **not** judge whether the copy is any good: nothing checks that
the title carries a term users search, or that the subtitle states a benefit rather than a
slogan. `conversion` is the same shape — it counts assets like screenshots and cannot see
what is in them. So **never tell the user a 25/25 means their copy is optimal**; say the
fields are complete and in-limit, then do the quality read yourself in the field-by-field
section below. That judgement is the value you add on top of the score.

## Output template

```
### Metadata audit — {App} · {platform} ({country})   ·  credits left: {remaining}

**ASO score: {overall}/100 ({grade})**  (metadata {metadata}/25 · ratings {ratings}/25 · conversion {conversion}/25)

**Top 3 quick wins (<1h):** 1) {exact new text + char count}  2) …

**Field-by-field**
- **Title** ({used}/30): "{current}" → "{new}" ({N} chars) — {why}
- **Subtitle/Short** ({used}/{30|80}): "{current}" → "{new}" — {why}
- **Keywords** (Apple, {used}/100): "{current}" → "{new}" — no dupes vs title/subtitle
- **Description / What's new:** {fix}

**ASOScan recommendations:** {surface each by severity}
```

Every suggestion must be concrete (exact text + char count) and tied to a real
keyword or conversion reason. Point the user back to ASOScan to re-score after edits.

## Listing text for another language

Use this when the user wants their listing in another language or country.

1. Read the saved drafts first. If one exists for that locale, show it before writing a new one.
2. Tell the user a new draft costs 2 API credits and 1 AI credit, then call it with the store locale (for example `de-DE`, `fr-FR`, `es-ES`).
3. If the answer says ASOScan is preparing the keyword data for that market, nothing was charged. Tell the user to ask again in a minute. Use `force` (the tool's `force` input, or `?force=true`) only when the last "preparing" answer is several minutes old.
4. Show each variant with its character counts against the platform limits above. The draft is saved in ASOScan. ASOScan does not publish listing text to the stores; the user copies it into App Store Connect or Google Play Console.

Describe the benefit only as Apple documents it: localized name, subtitle and keywords are searchable in every storefront that supports that language, so more people can find the app. Never say a translation raises keyword rank.

## Errors, credits & honesty

- `401` → asoscan-setup · `403` no API access · `402` out of credits · `404` no
  metadata yet · `503` not enabled yet. Each read = 1 credit.
- No invented claims/awards/"#1" superlatives (also banned in Google titles).
  Respect limits exactly. Recommend the outcome, not a guaranteed rank.
- Full reference: <https://asoscan.com/api/developers>

## Related

- **keyword-opportunities** / **keyword-intelligence** — choose the keywords to target.
- **competitor-analysis** — benchmark against rivals.
- **review-insights** — turn recurring confusion into clearer copy.
review-insights6.61 KB

View saved version →

---
name: review-insights
description: When the user wants to understand what users say about an app using ASOScan (overall review sentiment plus the top topics, feature requests, and bugs mentioned, and the raw reviews behind them). Also use when the user mentions "what are users saying", "review sentiment", "top complaints", "what features are people asking for", "what bugs are mentioned", or "summarize my reviews". Also use to draft a reply to a review and, after the user approves the exact text, post it ("reply to this review", "write a reply"). Works for your app or a tracked competitor.
metadata:
  version: 1.3.1
---

# Review Insights

Turn ASOScan's analyzed review stream into the few things that matter: how users
feel, what they keep asking for, and what's breaking.

## When to use

- "What are users saying about my app?"
- "Top complaints / feature requests / bugs."
- "Summarize the latest reviews." (also for a tracked competitor)

## Getting the data (two modes)

Pick the first mode that applies, then follow the steps below.

1. **ASOScan tools are connected** (the ASOScan plugin or connector in ChatGPT or Claude, or any MCP client): use the tool named in the table. Do not ask for an API key and do not run `curl`. Tool results have the same fields as the API responses below, and a list comes back inside `items`. If a tool answers with a message instead of data (reconnect, credits used up, plan limit, "preparing"), pass that message on and stop.
2. **No tools, but you can run shell commands and `ASOSCAN_API_KEY` is set**: make the API call in the table. Base `https://asoscan.com/api/public/v1`, header `Authorization: Bearer $ASOSCAN_API_KEY`, JSON with camelCase fields. Never print the key. Capture the HTTP status and handle errors as described at the bottom.
3. **Neither**: hand off to **asoscan-setup**. It explains how to connect ASOScan in ChatGPT or Claude, or how to create an API key.

ASOScan only sees the apps in the user's own account and the competitors they track. Every call uses API credits (failed calls are free). Before a call that costs more than 2 API credits, or one that uses AI, tell the user the cost and wait for a yes. Before any call that changes data, ask first.

| Step | Tool (connected) | API call (key) | API credits |
|---|---|---|---|
| Find the app | `list_my_apps` | `GET /apps` | 1 |
| Insights | `get_review_insights` | `GET /apps/{id}/reviews/insights` | 1 |
| Raw reviews | `get_reviews` | `GET /apps/{id}/reviews?page=1&pageSize=20&rating=&sort=newest` | 1 |
| Saved reply templates | `list_reply_templates` | `GET /apps/{id}/reviews/reply-templates` | 1 |
| Draft a reply (AI) | `draft_review_reply` | `POST /apps/{id}/reviews/{reviewId}/reply-draft` with `{ "instructions": "...", "autoSelectKeyword": true }` | 2 + 1 AI credit, say the cost first |
| Post a reply (goes to the store) | `post_review_reply` | `POST /apps/{id}/reviews/{reviewId}/reply` with `{ "text": "..." }` | 2, exact text and a clear yes first |

## Steps

1. **Find the app** — `GET /apps` → use the `id`. For a rival, it must be a tracked
   competitor first (see **competitor-analysis**).
2. **Insights** — `GET /apps/{id}/reviews/insights` (1 credit) →
   `{ totalAnalyzed, totalPending, sentiment{ positive, neutral, negative,
   averageScore }, topTopics[]{ label, count }, topFeatureRequests[]{ label, count },
   topBugs[]{ label, count } }`.
3. **Raw reviews** (for evidence) — `GET /apps/{id}/reviews?page=1&pageSize=20&rating=&sort=newest`
   (1 credit; pageSize 1–100; `rating=1..5` to isolate detractors/promoters) →
   `{ items[]{ id, author, rating, title, body, version, country, postedAt,
   developerResponse, developerResponseAt }, page, pageSize, totalCount, totalPages }`.

Lead with insights; pull raw reviews only to quote real examples. If `totalPending`
is high, note that more reviews are still being analyzed.

## How to analyze

- **Sentiment** — the positive/neutral/negative split + `averageScore` (pair with
  the rating trajectory from **competitor-analysis** for trend).
  `averageScore` runs **−1.00 (very negative) to +1.00 (very positive)**, 0 being
  neutral. **Always print it with that range** — a bare "0.38" reads as a bad score
  when it is in fact mildly positive.
- **Themes** — cluster `topTopics`/`topFeatureRequests`/`topBugs` into *love*,
  *friction*, and *requests*, ranked by `count`.
- **Actionability** — for the top 3, name the concrete response: bugs → engineering;
  recurring confusion → onboarding/screenshots; frequent requests → roadmap or
  "What's New".
- **Quote real reviews** verbatim from `body` — never invent or paraphrase into
  something the user didn't write.

## Output template

```
### Review insights — {App}   ·  credits left: {remaining}

**Sentiment:** {positive}/{neutral}/{negative}  (avg {averageScore} on −1 to +1)  ·  {totalAnalyzed} analyzed

**Love**              | **Friction**            | **Most-requested**
- {topic} ({count})   | - {bug} ({count})       | - {request} ({count})

**Top 3 to act on:** 1) {theme} → {response}  2) …
**Evidence:** > "{verbatim review body}" — {rating}★
```

## Replying to a review

Use this when the user wants a reply written or posted for one of their reviews.

1. Get the review id from the raw reviews call. If the user has saved templates, read them and offer one as a starting point.
2. Draft: tell the user the draft costs 2 API credits and 1 AI credit, then draft. The draft is saved in ASOScan only. Nothing goes to the store. The answer has `replyText` (and `keywordUsed` when the draft uses one of their keywords).
3. Show the full reply text and let the user edit it.
4. Post only after the user says yes to that exact text. Send exactly the approved text. If the answer says the app has no store connection, tell the user to connect App Store Connect or Google Play Console in ASOScan (the answer includes the link) and stop.
5. Never post a reply the user has not approved word for word, and never post several replies from one yes.

Replies help users and show the app is cared for. They are not a search-ranking signal, so never present them as a way to rank higher.

## Errors, credits & honesty

- `401` → asoscan-setup · `403` no API access · `402` out of credits · `404` not
  tracked · `503` not enabled yet. Each read = 1 credit.
- **Never fabricate reviews.** Replying to reviews builds trust/retention but is
  **not** a search-ranking signal — don't frame replies as an ASO lever.
- Full reference: <https://asoscan.com/api/developers>

## Related

- **competitor-analysis** — rating trajectory + compare sentiment across rivals.
- **metadata-audit** — turn recurring confusion into clearer copy/screenshots.
Package details

Publisher declarations from the archived package. These are separate from our research and the live service's terms.

Package license
MIT
Package author
ASOScan
Keywords
See publisher keywords

Declared capabilities

  • Read
  • Write
  • ASO score and recommendations
  • App store keyword research
  • Keyword opportunities
  • App store rank tracker
  • App store category ranking
  • Competitor keywords
  • Review insights
  • Review reply drafts
  • Localized listing drafts

Package observed Oct 6, 2026.

Technical details
First seen
Oct 6, 2026 · 18:00 UTC
Last seen
Oct 6, 2026 · 18:00 UTC
Collection status
Collected

plugin_asdk_app_6ac31e16fb6881919510d9cb1ea39463

Download plugin data (JSON)

Before you connect ASOScan App Store Optimization

How do I connect it?

Open the publisher's marketplace listing to check current availability and follow its connection instructions. This directory does not install plugins. Check the requested access and any account requirements before connecting.

Check marketplace availability ↗

Does it require paid access?

We have not established the pricing or subscription requirements for this plugin. An absent price does not mean free access.

Compare researched pricing and access models →

How can I evaluate it?

Check the declared skills and available files, then try a small task whose result you can verify. Our archived descriptions and instructions establish publisher claims, not tested runtime quality. Review sources and coverage limits.