Skip to main content
Autonomous trading has a data problem, and it is not access. Anyone can get a websocket. The problem is that every market API ships data shaped for a human with a charting library, and agents are not humans. The contract below is what the engine ships instead.

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.exhaustive says 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 trimmed funding response for Bitcoin, pulled from the production gateway on 2026-07-16:
Read it the way an agent does. The rate is the 84th percentile of its own 90-day, 180-observation baseline and the 76th of the last year, so “positioning is stretched long, but not historically so” falls out of the payload with zero inference. The spread across the four venues is ordinary; one venue is hot, and it is named. Funding settles at 16:00, the next read is scheduled for 16:05, and nothing needed a charting library.

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:
What the price action can prove (a down structure, a break seven bars ago) is served. What it cannot prove is named, input by input, and the confidence block counts the evidence. A model reading this quotes the gap; it does not invent a funding rate.

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.

Where the contract applies

Everywhere. The same contract feeds the HTTP API, the MCP tools, and the chat analyst. A number you read in chat obeys the same freshness and refusal rules as one your agent fetches at 3 a.m. Coverage says what exists; the operations return it.