openaso

tools / audit

audit

read-only

ASO research bundle

The whole research pass — listing, word pool, scored keyword candidates — in one call.

audit compresses the opening hours of an ASO engagement into one tool call per storefront. It fetches the app's current listing (title plus web-scraped subtitle), derives the visible word pool, seeds App Store autocomplete with that pool to discover what users actually type, and scores every candidate — demand (popularity, the volume model), competition, incumbent strength (medianTopRatings) and this app's current rank for the term.

Each candidate is scored from a single shared search, where separate volume + rank calls would search twice. Supply your own phrases and they are always scored alongside the discoveries; supply seeds to steer discovery somewhere specific.

The result is a decision table, not a report: high popularity, low medianTopRatings, and a null rank is the shape of an opportunity. The tool is deliberately autocomplete-only in its discovery — mine reviews for vocabulary and competitors for who wins each phrase, then draft with coverage.

worked example

Audit HabitKit's US listing with up to 8 discovered candidates.

tools/call → audit
{
  "name": "audit",
  "arguments": {
    "appId": 6443918070,
    "countries": [
      "US"
    ],
    "limit": 8
  }
}
audit → structuredContent (excerpt)
{
  "appId": 6443918070,
  "storefronts": [
    {
      "country": "US",
      "app": { "trackName": "Habit Tracker - HabitKit", "subtitle": "Streaks & Accountability", … },
      "pool": [
        { "word": "habit", "field": "title" }, { "word": "tracker", "field": "title" },
        { "word": "habitkit", "field": "title" }, { "word": "streaks", "field": "subtitle" },
        { "word": "accountability", "field": "subtitle" }
      ],
      "seeds": ["habit", "tracker", "habitkit", "streaks", "accountability"],
      "candidates": [
        { "keyword": "habit tracker", "popularity": 82, "label": "Very high",
          "competition": 189, "medianTopRatings": 14002, "rank": 2 },
        { "keyword": "accountability partner", "popularity": 65, "label": "High",
          "competition": 186, "medianTopRatings": 439, "rank": 88 },
        { "keyword": "streaks", "popularity": 49, "label": "Medium",
          "competition": 188, "medianTopRatings": 12238, "rank": 3 },
        … 5 more candidates, including autocomplete noise like "the habit burger grill" …
      ]
    }
  ]
}

real response, captured 2026-07-29 — trimmed only where marked with …

when to use it

description — as served to agents

One-call ASO research bundle for an app, per storefront: the current listing (title + web-scraped subtitle), its visible word pool, keyword candidates discovered from App Store autocomplete seeded with that pool (plus any supplied phrases), and for every candidate a demand number (popularity, as in the volume tool — real Apple Search Ads popularity when popularitySource is "apple", else an estimate), competition, incumbent strength (medianTopRatings) and this app's current rank — each candidate scored from a single shared search. Feed the result into coverage ({phrase, value: popularity} weights) to draft metadata, confirm real positions with rank, and register the target set with track for daily movement; the optimize_metadata prompt packages the whole playbook. Costs one lookup, one listing scrape, one autocomplete request per seed and one search plus up to 3 autocomplete probes per candidate, all throttled ~1/s — expect roughly seeds + 4 x candidates seconds per storefront; progress notifications are sent when requested. Discovery is autocomplete-only: mine reviews for user vocabulary and competitors for who wins each phrase.

input

appId *
integer
App Store trackId of the app
countries
string[]
2-letter storefront codes, e.g. ["US", "GB", "JP"]. Each storefront is queried separately; at most 25 per call.(default ["US"])
phrases
string[]
Target phrases always scored alongside discovered candidates (e.g. phrases the app already ranks for or should)
seeds
string[]
Autocomplete seed terms; default: the substantive words of the current title + subtitle
limit
integer
Max discovered candidates scored per storefront (supplied phrases do not count against this)(default 12)

output

appId *
integer
storefronts *
object[]
country *
string
available *
boolean
app *
object | null
Summary of the listing (or the full iTunes lookup record, description included, when full=true); null when unavailable
trackId
integer
trackName
string
subtitle
string | null
App Store subtitle from the web listing; only present when subtitle=true (null if none/unreadable)
developer
string | null
genre
string | null
rating
number | null
ratings
integer
version
string | null
price
string | number | null
formatted price string (summary) or numeric price (full record)
languages
array | null
ISO language codes the listing supports
url
string | null
pool *
object[]
visible word pool (title + subtitle, strongest field first; the hidden keyword field is not public)
word *
string
field *
"title" | "subtitle"
stopword *
boolean
seeds *
string[]
seed terms whose autocomplete suggestions were harvested
candidates *
object[]
scored keyword candidates, sorted by popularity descending
keyword *
string
source *
"supplied" | "discovered"
how the candidate was found (distinct from popularitySource)
suggestedBy *
object[]
autocomplete evidence: seeds whose suggestions surfaced this keyword, with 1-based positions (Apple's lists are demand-ordered)
seed *
string
position *
integer
popularity *
integer
popularitySource *
"apple" | "proxy"
apple = real Apple Search Ads popularity; proxy = estimate
applePopularity *
integer | null
raw Apple popularity 5-100; 5 floored, null when unavailable
floored *
boolean
estimate *
integer
label *
"Low" | "Medium" | "High" | "Very high"
competition *
integer
apps surfaced by the search (capped at 200)
medianTopRatings *
integer
median rating count of the top-10 apps — incumbent strength
rank *
integer | null
this app's position (top 200), null = not ranked
note *
string

pairs with

coveragedraft metadata against the audit's scored phrasesrankconfirm real positions for the phrases you choosetrack_configregister the final target set for daily snapshots
endpoint https://mcp.openaso.ai/mcp · auth Authorization: Bearer <key> · get a key