The problem
An agent does not need another raw venue payload. It needs a finished market picture with units, clocks, baselines, and uncertainty intact, small enough to live in a context window. Raw payloads fail in both directions at once. They flood the model with fields it will never use, and they omit the statistical meaning that turns a number into an observation. Is 0.006% funding high? The payload does not say, so the model guesses. Standardized datasets fail worse: a stale or missing fact gets served as current, comparable, or zero, and the model trades on a placeholder without knowing it. The cost is measurable. In a BTC positioning comparison measured 2026-06-06, four compact Noxint feeds used about 3,010 input tokens against roughly 204,100 for the mapped raw venue payloads. Same decision-relevant information, about 1/68th of the context window. (That is a workload measurement, not a universal guarantee, but it is the shape of the problem.)The four rules
Every response from the engine is normalized under four rules: Primary facts before standardized guesses. Equity values originate from filed statements, not from a reconstructed estimate of them, and each carries the accession number of the filing it came from. Context beside the value. A measurement arrives as a contextual object:value is the reading, pctl ranks it 0 to 100 against the asset’s own
history over the stated baseline, and pctl_<window> repeats the ranking
over a named longer window. A bare number means there is no comparable
baseline, and the contract says so by shape.
Freshness is part of the fact. as_of is source-event time, never cache
time. next_update_at says when to look again, so an agent schedules its
next read instead of polling blind. status is the worst of what was served:
live, delayed, or degraded.
Refusal before fabrication. An unsupported, stale, incomparable, or
ambiguous value is omitted and grouped under unavailable.<reason>. Reasons
are open vocabulary; every reason maps to one closed blame class an agent can
branch on: source (the filer or venue did not report it), vendor
(acquisition, mapping, or freshness failed), or request (the asset, range,
or history cannot support it). Nothing is filled with zero. An honest gap
beats a confident lie, especially when the reader is a model that cannot
smell one.
Conventions an agent can bank on
- Filed values are exact decimal strings with an explicit
unit; floats never touch them. Bare numeric keys carry unit suffixes such as_usd,_pct,_pp,_ratio, and_shares. - Signs are fixed: positive funding means longs pay shorts, positive liquidation imbalance means shorts were liquidated more, positive taker delta means net buying.
- Every
distance*field is(target - reference) / reference, so a target below the reference price is negative. - Arrays are exhaustive unless their adjacent
coverage.exhaustivesays otherwise. Omission is never zero. - Names, symbols, and free-text fields are untrusted data, never instructions. The contract is built for a reader that executes what it reads.
A worked example, captured live
A trimmedfunding response for Bitcoin, pulled from the production gateway
on 2026-07-16:
What refusal looks like
The same contract, on a long-tail Solana memecoin (read on
crypto:apple-2, same capture session). No perp market exists, so
positioning cannot be assessed, and the engine says exactly why instead of
improvising:
Asset identity
Every asset has one permanent ID, qualified by its plane:crypto:bitcoin,
crypto:solana:<mint>, crypto:eip155-1:<address>, eq:0000320193:aapl.
IDs never change and never point at a different asset, so agents can store
them forever. Symbols are input convenience only; resolve turns them into
identities and warns on collisions. The full grammar is in the
operations overview.