Skip to main content
GET
Get an asset by mint address

Path Parameters

mint
string
required

SPL mint address (base58) — the canonical on-chain identifier. Resolves to the same card as /v1/assets/{symbol}.

Response

Latest snapshot for the asset

anchor
enum<string>
required

Peg anchor — how to interpret the asset's fair value without knowing Pegana's internal taxonomy.

  • "USD" — fixed $1 target (fiat-backed, RWA, delta-neutral, CDP stablecoins). A discount from $1 IS the risk signal.
  • "FX" — fixed non-USD fiat exchange-rate peg (e.g. EURC→EUR, BRZ→BRL). Read peg_target for the specific currency. A discount from the FX rate IS the risk signal.
  • "NAV" — intrinsic redemption / net-asset value, NOT a fixed fiat rate (LSTs, yield-bearing stables, synthetic leverage). NAV itself moves; the discount is relative to it.

Derived from class, NOT from peg_target. A yield-bearing stable can have peg_target = "USD" yet anchor = "NAV" because its fair value legitimately accrues above $1 over time.

Available options:
USD,
FX,
NAV
calibration
enum<string>
required

Consumer-facing calibration label, provisional | calibrated — the self-describing form of monitoring_only (provisionalmonitoring_only=true), in the SAME vocabulary the dispatcher emits on the webhook canonical event. Always present.

Available options:
provisional,
calibrated
class
string
required
decimals
integer<int32>
required
mint
string
required
monitoring_only
boolean
required

True when the asset is actively monitored but excluded from the calibrated launch denominator. This is a calibration-status flag, not a health state: an asset can be PEGGED and monitoring_only=true.

name
string
required
peg_target
string
required
risk_side
enum<string>
required

Which direction of discount is the risk signal, so a consumer reading the raw signed number knows how to interpret it. Derived from anchor: "below" for USD/FX anchors (a discount from peg is the risk), "either" for NAV anchors (premium and discount are both meaningful).

Available options:
below,
either
symbol
string
required
circulating_supply
string | null

Circulating supply of the mint (rust_decimal, serialized as a JSON string), scaled by decimals. This is a SIZE/CONTEXT signal — NOT a peg-safety signal — and is NEVER an input to discount/state/ thresholds. Sourced from the on-chain SPL Mint account's supply field by the isolated token_supply indexer task on a slow (~10 min) cadence (migration 0065). No freshness bound is enforced on this field the way updated_at is for discount — supply changes slowly by nature. null until the mint has been observed at least once — serialized as null (like discount), not omitted.

confidence
null | enum<string>

Pyth oracle confidence bucket: high | medium | low | unknown. Scopes the PRICE-ORACLE confidence interval only (conf/price ratio), NOT market-quote / route-depth reliability. Omitted when no discount snapshot exists yet. Reflects the LATEST snapshot — an omitted value means "no current signal" and MUST NOT be rendered as a positive bucket; the client gates on updated_at freshness before showing it (hardening H1/H9).

Available options:
high,
medium,
low,
unknown
current_state_duration_secs
integer<int64> | null

Seconds the asset has resided in its CURRENT committed FSM band (engine band_since). Omitted until the engine has stamped it. Read with state; sustained is the thresholded view (Spec 03).

discount
string | null
intrinsic_usd
string | null
jitter_bps_24h
string | null

Peg-jitter scalar over the trailing 24h (BSRV-03): peak-to-trough dispersion of the discount, max(max_discount) - min(min_discount), in the same signed-fraction units as discount. A cheap stability measure (always >= 0) computed server-side once per scan instead of every client recomputing it from the averaged series_24h. Trailing 24h, independent of the current-snapshot freshness bound. Omitted when no discount_1m rows exist in the window.

market_cap
string | null

Market capitalization in USD = circulating_supply × market_usd — a SIZE/CONTEXT signal for gauging relative scale across assets, NOT a peg-safety signal and NEVER an input to discount/state/thresholds. None whenever either factor is missing (no circulating_supply observed yet, or no fresh market_usd snapshot). Serialized as null (like discount), not omitted.

market_usd
string | null
monitoring_reason
string | null

Human-readable reason for monitoring_only=true. Omitted for fully calibrated assets.

monitoring_since
string | null

YYYY-MM-DD date when the asset entered monitoring-only status. Omitted for fully calibrated assets.

oracle_degraded
null | object

Advisory, API-synthesized, OUT-OF-HASH "amber" annotation from the independent Pyth oracle leg — sits BELOW the hard Pyth-confidence gate (500bps -> UNKNOWN). Computed purely from data already on this row (see oracle_degraded.rs); NEVER a receipt input and NEVER touches discount/state/thresholds. Only ever populated on the single-asset detail endpoints (/v1/assets/{symbol} + by-mint) — the /v1/assets list has no oracle asof-join, so this is always omitted there. Omitted (not null) whenever the asset carries no subscribed oracle feed, the tick is already hard-gated to UNKNOWN, or nothing amber fired.

risk_score
integer<int32> | null

Derived 0-100 peg-risk score — a single sortable/thresholdable number for integrators, ALONGSIDE (never replacing) state. Anchored to the committed state so it never disagrees with the classification (PEGGED ≤ 24, DRIFT 25-49, DEPEG 50-74, CRITICAL 75-94, BLACK_SWAN 95-100), interpolated within the band by the effective discount magnitude. null when state is UNKNOWN/absent, no discount exists, or thresholds are the CDP CR-form — we never fabricate a score (ADR-0019). Deterministic + reproducible from the other published fields; NOT part of any receipt hash. See crates/api-rs/src/risk_score.rs.

Required range: x >= 0
series_24h
number<double>[] | null
sol_per_lst
string | null

Stake-pool SOL per share for Sanctum LSTs (rust_decimal, serialized as a JSON string). Omitted for non-LST assets. Reflects the LATEST intrinsic snapshot — read together with updated_at for freshness. NAV decomposition is intrinsic_usd = sol_per_lst × SOL/USD.

state
null | enum<string>

Class-aware peg state. Mirrors the engine PegState enum and the peg_state Postgres enum. Used for state, from_state, and to_state fields across the API.

The state is CLASS-AWARE: an LST reading a −1.4% discount (normal unstaking spread) is PEGGED, while a fiat stable at far less would be DRIFT. Trust this value directly rather than imposing a naive discount cut.

Available options:
PEGGED,
DRIFT,
DEPEG,
CRITICAL,
BLACK_SWAN,
UNKNOWN
state_reason
string | null

Advisory machine-readable reason for the snapshot's state. Explanatory only — never a verdict input and not part of any receipt hash.

Emitted today:

  • premium_sanity — engine NAV-sanity override: smoothed discount exceeded the premium-sanity bound, state forced to UNKNOWN (intrinsic anchor suspect).
  • stale_source — API layer: feed is >15 min stale, state collapsed to UNKNOWN; no fresh discount snapshot exists.

Reserved — not yet emitted (planned for depth-gate / oracle-crosscheck work): no_oracle_crosscheck | intrinsic_unavailable | shallow_market | nominal.

Omitted when null (most rows).

sustained
boolean | null

True when the asset has held a committed ALERTING band (DRIFT+) long enough to be a sustained episode (a slow mechanism depeg, not a blip). A PEGGED/UNKNOWN asset is never sustained. Omitted until computed.

thresholds
any

Per-asset alert thresholds, served verbatim from assets.thresholds JSONB (BSRV-01). Two shapes pass through unchanged: bps-keyed {"drift_bps","depeg_bps","critical_bps"} for most assets, and the CDP collateral-ratio form {"cr_drift","cr_depeg","cr_critical", "cr_black_swan"} for hyUSD. This is the AUTHORITATIVE source the client should key band-gauge / chart threshold lines / "closest to breaking" sort off — replacing any hand-maintained client table. The column is re-synced to the engine's calibrated assets.toml values by migration 0042_resync_asset_thresholds. Omitted only if the column is NULL (never, given the NOT NULL constraint) or fails to decode.

updated_at
string<date-time> | null
worst_abs_24h
string | null

Worst (largest-magnitude) absolute discount observed over the trailing 24h (BSRV-02), in the same signed-fraction units as discount (e.g. 0.0123 = 123 bps). Computed as max(greatest(abs(min_discount), abs(max_discount))) over the discount_1m aggregate — discount is signed, so the abs is required to catch the worst tick in EITHER direction. Trailing 24h, INDEPENDENT of the current-snapshot 15-min freshness bound on discount. Omitted when no discount_1m rows exist in the window.