openaso

tools / revenue

revenue

read-only

Modeled revenue estimate

Roughly what does this app gross — said with honest error bars?

Apple publishes no revenue numbers for arbitrary apps. What it publishes is the top-grossing chart — and grossing rank maps to spend through a power law. revenue fits that curve (calibrated against published rank–revenue datapoints) and returns gross consumer spend bands in USD, daily and monthly, low/mid/high, scaled per storefront and per genre chart.

The tool is built to be quoted honestly. Bands span mid ÷ K to mid × K (K = 2 from the overall chart, 2.5 from a genre chart); apps on no consulted chart get only upperBoundDaily — they earn less than a rank-100 app, possibly far less. Every response carries the note that these are modeled estimates, that grossing reflects App Store billing only, and that developer proceeds run ~70–85% of gross.

This is the difference from panel-based market intelligence: not a confident-looking point estimate from an opaque pipeline, but a public-signal model that shows its input (topGrossing, via charts), its basis, and its spread.

See the live US top-grossing chart the model reads

worked example

Model ChatGPT's US gross from its grossing rank.

tools/call → revenue
{
  "name": "revenue",
  "arguments": {
    "appId": 6448311069,
    "countries": [
      "US"
    ]
  }
}
revenue → structuredContent (excerpt)
{
  "appId": 6448311069,
  "chartSize": 100,
  "currency": "USD",
  "storefronts": [
    {
      "country": "US",
      "appName": "ChatGPT",
      "genreName": "Productivity",
      "topGrossing": 1,
      "genreGrossing": 1,
      "estimate": {
        "basis": "overall-chart",
        "rankUsed": 1,
        "daily":   { "low": 2000000,  "mid": 4000000,   "high": 8000000 },
        "monthly": { "low": 61000000, "mid": 120000000, "high": 240000000 },
        "upperBoundDaily": null,
        "bandMultiplier": 2
      }
    }
  ],
  "note": "figures are MODELED estimates, not Apple data: …"
}

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

when to use it

description — as served to agents

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; at most 25 per call.(default ["US"])

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

pairs with

chartsthe grossing rank that feeds the modelappprice, genre and availability contextcompetitorspick whose revenue to model
endpoint https://mcp.openaso.ai/mcp · auth Authorization: Bearer <key> · get a key