Get one run's stage analytics
ONE run’s materialized stage-analytics document: where its trials fell out of the six-stage user-value chain (connection, discovery, selection, tool call, response, user value), overall and sliced marginally by intent, model and host.
The same document the suite listing returns, addressed by run. Use this rather than paging /eval-suites/{suiteId}/stage-analytics to reach a known run: that listing is newest-first, so walking it costs work proportional to how long ago the run finished and cannot answer once the run falls outside the pages read.
Counts are returned; RATES are not. A zero denominator is notMeasured, never 0, and every excluded observation is counted under a named class so a denominator can never shrink silently.
404 covers BOTH “this run has no document” and “this run is not visible to you”, and the two are deliberately not distinguished — separating them would confirm that a run exists in a project you cannot see. NOT backfilled either: a run that completed before this shipped has no document, and that absence means UNMEASURED, never a funnel of zeros.
Authorizations
MCPJam API key (sk_…). Create one at Settings → API keys. Guest sessions cannot use the API, and API keys cannot manage other API keys.
Path Parameters
ID of the hosted project that contains the server.
Eval run ID, as returned by POST /eval-runs.
Response
The run's complete stage-analytics document.
One RUN's materialized stage funnel. Counts are stored; rates are DERIVED by the SDK contract's helpers, so a zero denominator stays notMeasured and never renders as 0%. There is no top-level overall, latency or reasons object: the overall funnel is the overall slice (always present, always first), latency lives inside each stage tally and each setup row, and reasons live inside each stage tally.
1 The literal trial, carried rather than assumed. An eval iteration, a user-testing session and a swarm traversal share this stage vocabulary and are NOT the same unit; a consumer merging two documents must check this first.
trial 11How many iterations this materialization actually read.
x >= 0The analyzer the source chains were ACTUALLY derived at, not the version the reader understands. When included trials disagree this is the newest present.
x >= 1x >= 1provisional while a judge fanout is still pending — the counts may still move under the reader — and final once every applicable fanout has completed. There is no stale.
provisional, final x >= 0x >= 0Trials that contributed observations. Equals the overall slice's own count, and never exceeds totalTrials.
x >= 0How many observations each class removed from ONE denominator. A class that excluded nothing is OMITTED rather than written as 0 — absent and 0 mean the same thing here.
Every trial the materializer saw, included or not.
x >= 0The FINE-GRAINED reason a trial was excluded. Run-level only — the coarse six-class tally repeats on every stage of every slice, but 'we could not read the chain' and 'the chain was there and was refused' are different operator actions and are carried once, here.
Marginal slices in canonical order. Exactly one overall slice, always present and always first.
101Run-level setup facts, one row per phase that carried a signal. Never two rows for one phase.
2Present when the run is grouped for comparison (a matrix, a schedule).
1The run's authored-configuration revision. One of three identities a parity claim requires; ABSENCE BLOCKS parity rather than being assumed compatible.
1A digest over the comparable case set this run actually measured. Absence blocks parity, same rule.
1111When the run reached a terminal status, in epoch milliseconds. The field from/to filter on.
x >= 0The newest update stamp among those iterations — the staleness handle for a rebuild.
x >= 0Every DISTINCT analyzer version among included trials, ascending. Present ONLY when more than one contributed — a uniform document omits it. A mixed document is not comparable to anything.
2x >= 1Every distinct measurement schema version among included trials. Same rule as the analyzer versions.
2x >= 1Which dimensions hit a cap, and by how much. Present ONLY when a cap bit — a truncated slice array with no such record would read as 'these are all the models'.
3
