tools / revenue
revenue
read-onlyModeled revenue estimate
Order-of-magnitude revenue estimate for an app, per storefront, MODELED from its public top-grossing chart rank (overall chart, falling back to the app's genre chart) — Apple publishes no revenue data for arbitrary apps, and grossing rank is the only public monetization signal. daily/monthly are gross consumer spend bands in USD (low/mid/high; developer proceeds ~70-85% of gross): a power-law fit calibrated on published rank-revenue datapoints, scaled per storefront and genre. Apps on no consulted chart (top 100) get only upperBoundDaily — they earn less than a rank-100 app, possibly far less. Treat bands as honest uncertainty, not precision: same-rank apps differ several-x when revenue is whale-driven, and subscription renewals move grossing rank without downloads. Costs one lookup plus up to two chart fetches per storefront (throttled ~1/s). Confirm chart movement over time with charts.
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"])
example call
tools/call → revenue
{ "name": "revenue", "arguments": { "appId": 6446901002 } }
output
appId *
integer
chartSize *
integer
currency *
"USD"
storefronts *
object[]
country *
string
available *
boolean
appName *
string | null
genreId *
integer | null
Apple primary genre id, e.g. 6014 = Games
genreName *
string | null
topGrossing *
integer | null
overall top-grossing position, null = not in top 100
genreGrossing *
integer | null
position on the app's own genre grossing chart, null = not in top 100 / no genre
estimate *
object | null
null when the app is not available in this storefront
basis *
"overall-chart" | "genre-chart" | "not-charted"
which rank fed the model; not-charted = upper bound only
rankUsed *
integer | null
the grossing rank the estimate is computed from
daily *
object | null
daily gross consumer spend band, USD; null when not-charted
low *
number
mid *
number
high *
number
monthly *
object | null
monthly gross consumer spend band, USD; null when not-charted
low *
number
mid *
number
high *
number
upperBoundDaily *
number | null
not-charted only: the rank-100 value of the narrowest consulted chart, padded to the band's high edge (bandMultiplier x the model midpoint) so "earns less than this" stays honest — possibly far less
countryMultiplier *
number
storefront scale vs US = 1.0
genreMultiplier *
number | null
genre-chart scale vs the overall chart; null unless a genre chart was consulted (it scales the genre-chart estimate, or the not-charted ceiling)
bandMultiplier *
number
band half-width K (low = mid/K, high = mid*K): 2 for overall-chart estimates, 2.5 when a genre multiplier is in play (it adds uncertainty)
note *
string
endpoint https://openaso-806591819206.us-west1.run.app/mcp · auth Authorization: Bearer <key> · get a key