Objects
Wallet risk
A risk read of one wallet: every yield position it holds, scored against the latest daily screen, with exposure, what needs attention and an overview of everything else in the wallet.
wallet_riskFields
Read-only: balances come from public chain data at read_at and are cached for 10 minutes per address; instrument data comes from the daily screen (as_of). Works for EVM addresses, ENS names and Solana addresses.
Positions are deposits (receipt tokens and vault positions), Aave V3 and Spark loans, Morpho markets, Uniswap v3 liquidity and Pendle fixed-rate positions. Only positions in screened instruments count in the wallet score; loans are read by their health factor and liquidity positions are not screened.
holdings covers the rest: native coins and plain tokens that earn nothing, yield-bearing tokens outside our screen, balances under $1, and counts of unrecognised tokens and NFTs. On most chains every token is listed; on the others (holdings.discovery.tracked_only) the native coin and the tokens we track. holdings never changes the score.
- objectstring
Always "wallet_risk".
- addressstring
The wallet: an EIP-55 checksummed 0x address, or a Solana base58 public key.
The ENS name that was resolved, when you passed a name.
- chains_scannedstring[]
Chain ids that were read, same ids as venue.chain.id ("solana" for Solana).
- as_ofstring · ISO 8601
Time of the screen the instrument data comes from.
- read_atstring · ISO 8601
When the balances were read on-chain. Results are cached for 10 minutes per address.
- coverageobject
What the check covered this time.
- coverage.instruments_checkedinteger
Instruments with a known deposit token on the chains read.
- coverage.truncatedstring[]
Sources whose positions were capped because the wallet holds more than one check reads (Uniswap v3: 50 most recent NFTs per chain; Pendle: 60 tokens per chain; Morpho: 100 markets or vaults; Solana: 100 mints). Same ids as sources_unavailable.
- coverage.notestring
Plain-language note on what is and isn't covered.
- totalsobject
USD totals. value = earning + idle + other.
- totals.valuenumber · USD
Everything found in the wallet, net of debt.
- totals.earningnumber · USD
Positions in screened instruments: the ones that count in the score.
- totals.idlenumber · USD
Stablecoins held in the wallet, valued at $1, not earning.
- totals.othernumber · USD
Net value of loan accounts and Morpho markets, liquidity positions and positions without a screened instrument.
- totals.debtnumber · USD
Everything borrowed, already netted in value.
Wallet score, 0–100: value-weighted over screened positions; positions in instruments that failed the screen count as 0. null when nothing screened is deployed.
Band of the wallet score: low ≥ 80, moderate 60–79, high < 60.
Values:lowmoderatehighEvery position found, largest first. Positions under $1 are listed in holdings.small instead.
- idleobject[]
Idle stablecoins, largest first (also in holdings.not_earning).
- idle[].chainstring
Chain id.
- idle[].assetstring
Stablecoin symbol, e.g. "USDC".
- idle[].valuenumber · USD
Value at $1 per token.
- holdingsobject
Everything the wallet holds besides its yield positions, so a result never reads "nothing found" when the wallet has assets: plain assets not earning, yield-bearing tokens outside our screen, small balances, unrecognised tokens, NFTs and comparison options for idle assets.
- holdings.discoveryobject
How balances were found on each chain read.
- holdings.discovery.fullstring[]
Chains where every token the address holds was listed.
- holdings.discovery.tracked_onlystring[]
Chains where only the native coin and the tokens we track were read: no token list for that chain, or it was unavailable this time (then also in coverage.sources_unavailable as "token_index:<chain>").
- holdings.not_earningobject[]
Plain assets that earn nothing: native coins, stablecoins (the idle list too), wrapped ETH and BTC, other tokens with a reliable price. Largest first.
Chain id ("ethereum", "base"…, or "solana").
native for the chain's own coin (ETH, MON, SOL…), token otherwise.
Values:nativetokenSymbol, e.g. "ETH", "LINK".
Token name when known, e.g. "Chainlink".
Token contract (EVM, lower-case) or mint (Solana). null for the native coin and for positions.
Balance in token units.
USD value; null when there is no reliable price.
Asset class when known (stablecoin, ether, bitcoin, xrp); drives suggestions.
Values:stablecoinbitcoinetherxrpother- holdings.not_coveredobject[]
Tokens that look yield-bearing but are not instruments of our screen: they earn, but we don't score them. Largest first.
Chain id ("ethereum", "base"…, or "solana").
native for the chain's own coin (ETH, MON, SOL…), token otherwise.
Values:nativetokenSymbol, e.g. "ETH", "LINK", "pzETH".
Token name when known, e.g. "Chainlink".
Token contract (EVM, lower-case) or mint (Solana). null for the native coin and for positions.
Balance in token units.
USD value; null when there is no reliable price.
Asset class when known (stablecoin, ether, bitcoin, xrp); drives suggestions.
Values:stablecoinbitcoinetherxrpotherknown_yield_token: on our curated list of yield-bearing tokens (liquid staking and restaking tokens, savings tokens); name_pattern: its name says so ("Staked", "Restaked", "Vault", "Savings", "Yield").
Values:known_yield_tokenname_patternProtocol name when known, e.g. "Renzo".
- holdings.smallobject
Holdings and positions worth under $1 each, collapsed in the app.
- holdings.small.countinteger
How many.
- holdings.small.valuenumber · USD
Their total value.
- holdings.small.itemsobject[]
Up to 50, largest first.
Chain id ("ethereum", "base"…, or "solana").
native for the chain's own coin (ETH, MON, SOL…), token otherwise.
Values:nativetokenSymbol, e.g. "ETH", "LINK", or the instrument name for a position.
Token name when known, e.g. "Chainlink".
Token contract (EVM, lower-case) or mint (Solana). null for the native coin and for positions.
Balance in token units.
USD value; null when there is no reliable price.
Asset class when known (stablecoin, ether, bitcoin, xrp); drives suggestions.
Values:stablecoinbitcoinetherxrpotherFor a position under $1: its id ("wpos_…").
For a position under $1: its instrument failed our screen.
- holdings.unrecognizedobject
Tokens without a reliable price or identity, often spam airdrops: counted, never listed or valued.
- holdings.unrecognized.countinteger
How many.
- holdings.nftsobject
NFTs (ERC-721, ERC-1155, Solana NFTs) seen on chains with a full token list: counted only.
- holdings.nfts.countinteger
How many.
- holdings.suggestionsobject[]
For each asset class with at least $1 not earning (stablecoin, ether, bitcoin, xrp): instruments to compare with. Context, not advice.
- holdings.suggestions[].idle_valuenumber · USD
Value of that class not earning in the wallet.
Up to two passing low-band instruments of the class, highest yield first. Redacted (redacted: true) unless access is full.
- holdings.totalsobject
USD totals of the holdings.
- holdings.totals.walletnumber · USD
Every priced asset and position in the result, net of debt: totals.value plus the other assets not earning, not_covered and small (idle stablecoins are counted once).
- holdings.totals.not_earningnumber · USD
Sum of not_earning (idle stablecoins included).
- holdings.totals.not_coverednumber · USD
Sum of not_covered.
- holdings.totals.smallnumber · USD
Sum of small.
- exposureobject
Where the value sits.
- exposure.by_protocolobject[]
Shares of the earning value per protocol, largest first.
Protocol id, "prt_…".
Protocol name.
- exposure.by_protocol[].valuenumber · USD
Value in this protocol.
- exposure.by_chainobject[]
Shares of the whole wallet per chain, largest first.
- exposure.by_chain[].idstring
Chain id.
- exposure.by_chain[].namestring
Chain name.
- exposure.by_chain[].valuenumber · USD
Value on this chain.
- exposure.by_asset_classobject[]
Shares of the earning value per asset class, largest first.
- exposure.by_asset_class[].valuenumber · USD
Value in this class.
- alertsobject[]
What needs attention: critical first, then warning, then info.
- alerts[].codeenum
What happened. Critical: failed_screen, health_factor_critical (under 1.15). Warning: high_risk, exit_queued, exit_partial, health_factor_low (under 1.5), lp_out_of_range, pt_matured. Info: pt_maturing (within 7 days), incentive_dependent, protocol_concentration, chain_concentration, lp_not_screened, idle_capital.
Values:failed_screenhigh_riskexit_queuedexit_partialhealth_factor_criticalhealth_factor_lowlp_out_of_rangept_maturedpt_maturingincentive_dependentprotocol_concentrationchain_concentrationlp_not_screenedidle_capital The screened instrument concerned, for position alerts on screened instruments.
The position concerned (positions[].id), for position alerts.
For failed_screen: the hard rule the instrument failed.
Values:tvl_floorapy_floorapy_ceilingout_of_scopeimpermanent_lossrecent_incidentexit_blockedunaudited_smallunverified_yieldscore_floorFor concentration alerts: the protocol ("prt_…") or chain id.
- alerts[].titlestring
Short headline, in English.
- alerts[].detailstring
One or two sentences with the numbers, in English.
- comparisonsobject[]
For flagged positions: passing low-band instruments of the same asset class, for comparison. Context, not advice.
The flagged position's instrument.
Up to two instruments, highest yield first. Redacted (redacted: true) unless access is full.
- accessenum
full with an API key or a paid session; preview on the public check, which redacts comparison alternatives.
Values:fullpreview - disclaimerstring
Research, not financial advice.