confidence field in every API response captures that quality as a discrete
label, not a number:
There is no
0.0 – 1.0 numeric confidence score in the public contract. Consumers
should branch on the label (e.g. confidence === "high"), not compare against a
threshold.
What feeds the label
Confidence scopes the price-oracle confidence interval only — Pyth’s own publishedconf value relative to the price. It is not a blend of market depth, route
liquidity, or decoder health.
For each asset, the engine collects every Pyth feed the asset depends on:
- a
pyth_spotmarket feed, - a
pyth_*intrinsic feed (FX cross / redemption rate), - the numéraire feed behind a
jupiter_usdmarket (e.g. SOL/USD or USDC/USD) — a real Pyth dependency, since a broken numéraire feed would otherwise leave a Jupiter-quoted asset reportinghighon a broken price.
conf / price ratio into high / medium / low, and a
missing/stale/zero feed becomes unknown. The strictest label across all of the
asset’s feeds wins (unknown > low > medium > high), so a single degraded feed can
only ever make the verdict look less certain — never more.
The ratio buckets
No independent cross-check → MEDIUM cap
An asset with no Pyth feed anywhere — neither apyth_spot / jupiter_usd-numéraire
market nor a pyth_* intrinsic — has no independent oracle to cross-check its price. A
single DEX/quote source stands alone, so the engine cannot assert high: it caps the
label at medium.
Today this is exactly sUSD (a DexScreener Raydium pool plus a custom rate, with no
Pyth feed). Every other active asset has a Pyth dependency and is unaffected.
The MEDIUM cap ships in methodology 0.4.0 (ADR-0025 §2) and is branch-only — not
yet deployed. Until it ships, an asset with no Pyth feed can still report
high off its
single source.When the label is not high
A degraded confidence label does not change the state on its own. PEGGED with
confidence: "low" is still PEGGED — the published state is what the FSM saw. But you
should treat it as “PEGGED, but I wouldn’t bet money on it without re-fetching.”
Patterns that produce a non-high label:
- Wide Pyth confidence intervals. During volatile or thin-publisher windows, Pyth’s
published interval widens, pushing
conf / priceinto themediumorlowbucket. - Source staleness. If a feed goes stale past its per-feed staleness window, that
feed resolves to
unknownand (being strictest) collapses the asset’s label tounknown. - Decode / mechanism failure. When a protocol upgrades and our pinned decoder no longer matches the on-chain layout, the engine skips the recompute and holds the last published state rather than emitting a fresh verdict on degraded inputs. Worst case — we don’t know the truth about the asset’s intrinsic.
How to use it
confidence label before acting. A signed-but-low-confidence webhook is a
hint to act conservatively, not an immediate trigger.
Confidence label per use case
There is no universal answer. Calibrate against your downstream’s blast radius.
What happens at unknown
When a feed is missing or stale, the engine does not flip the asset to a separate
state. It reports confidence: "unknown", skips the recompute on degraded inputs, and
holds the last published state. The published state is whatever the FSM last saw when the
signal was healthy — read it alongside confidence and treat an unknown print
conservatively.
If confidence stays at unknown for >15 minutes, treat it as a real problem at the
source and go investigate. The status page at
pegana.xyz/status shows which sources are healthy.