openaso

tools / audit

audit

read-only

ASO research bundle

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.(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)

example call

tools/call → audit
{
  "name": "audit",
  "arguments": {
    "appId": 6446901002
  }
}

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
endpoint https://openaso-806591819206.us-west1.run.app/mcp · auth Authorization: Bearer <key> · get a key