{
"message": "Payment service temporarily unavailable"
}
Vault Risk V3
Get risk data for a single vault
Returns the v3 Webacy-native vault decomposition: composite grade + per-category contributors, the dense categories criteria map, coverage disclosure, plus pass-through v2 metadata and risk. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). composite.score is floored from below by upstream_risk.
GET
/
v3
/
vaults
/
{address}
Get v3 vault risk detail (Webacy-native)
curl --request GET \ --url https://api.webacy.com/v3/vaults/{address} \ --header 'x-api-key: <api-key>'
{
"message": "Payment service temporarily unavailable"
}
Returns the full V3 risk decomposition for one vault — composite grade, per-category contributors, the dense criteria taxonomy, coverage disclosure, and the pass-through v2 risk envelope.
Understanding the version numbers. Three independent version axes show up on the V3 surface — they are not the same number:
API version v3 — the URL path (/v3/...) and the response schema_version (3.0).
framework_version — which criteria taxonomy was used. v1 today (the only supported value).
grading_scheme — which letter-grade band table is applied. v2 is the default (the standard 11-band scale); v1 is frozen and deprecated.
So the V3 API uses framework_version=v1 and grading_scheme=v2 by default. Seeing v1 on framework_version does not mean you’re on an older API.
The chain query parameter is required. Vault v3 covers 9 chains: eth, arb, base, opt, pol, bsc, avax, gnosis, sol.Chains outside this list return 400 "Invalid chain", even if accepted by a shared parameter enum.
This endpoint does not return a stale flag or generated_at. To assess freshness, use metadata.last_scored_at on the response, or read the v2 list / grades endpoints, which carry stale.Treat missing, stale, or errored data as unknown — never as safe. See Hard-gating and fail behavior.
Grading scheme to pin (default v1). Unknown values return 400 with the supported list.
Available options:
v1
Response
Webacy-native v3 vault detail.
Webacy-native v3 vault detail. metadata and risk are pass-through from the v2 vault response; composite/categories/coverage are the v3 additions. The three category-keyed maps are dense across all 7 WebacyCategory keys.
Headline grade block. POLARITY (load-bearing): score is 0–100, HIGHER = WORSE (A+ = 0, F = 100) — same direction as the v2 risk.score on the same response. score = max(Σ contributors·weight, upstream_risk): floored from below by the upstream pipeline risk.
How many criteria are live today vs defined by the framework — so what the grade reflects is on the wire, not just in docs. live / total describe the framework; on the RWA / stablecoin detail response measured_criteria / per_category[*].measured add the per-asset count of criteria that produced a measurement (assessed: true), excluding unverified ones.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Webacy Docs","colors":{"primary":"#00d66f","light":"#33cb8b","dark":"#279b71"},"logo":{"light":"https://mintcdn.com/webacy/PZHkbk8qJrPsQSaC/logo/light.png?fit=max\u0026auto=format\u0026n=PZHkbk8qJrPsQSaC\u0026q=85\u0026s=c1933879883f6b01ff46a6e51cfd687f","dark":"https://mintcdn.com/webacy/cDgYsLUzSZsNJNEk/logo/dark.svg?fit=max\u0026auto=format\u0026n=cDgYsLUzSZsNJNEk\u0026q=85\u0026s=e8da7717da0f291d63cc90a4cb4a91af"},"favicon":"https://mintcdn.com/webacy/LaWycqKCQaZgOW1n/favicon.ico?fit=max\u0026auto=format\u0026n=LaWycqKCQaZgOW1n\u0026q=85\u0026s=2a29ac070865d3fb96939b7c595406f9","api":{},"navbar":{"primary":{"type":"button","label":"Dashboard","href":"https://dapp.webacy.com"}},"footer":{"socials":{"x":"https://x.com/mywebacy","github":"https://github.com/Webacy-Prod"}},"contextual":{"options":["copy","claude","chatgpt","cursor"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"webacy","hasAudioNarration":false,"actualSubdomain":"webacy","customDomains":["docs.webacy.com"],"gitSource":{"type":"github","owner":"webacy-prod","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af62704872f0a825f98c69f","clientVersion":"0.0.4117","searchFilterCounts":[{"language":"default","tag":"Build","count":61},{"language":"default","tag":"API Reference","count":49},{"language":"default","tag":"Overview","count":29},{"language":"default","tag":"Glossary","count":25},{"language":"default","tag":"Risk Intelligence","count":21},{"language":"default","tag":"Learn","count":18},{"language":"default","tag":"Integrations","count":15},{"language":"default","tag":"Stablecoins","count":11},{"language":"default","tag":"Contract Security","count":9},{"language":"default","tag":"SDK","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".gb{display:inline-block;min-width:2.2em;padding:2px 9px;border-radius:6px;font-weight:700;font-size:0.85em;line-height:1.35;text-align:center;letter-spacing:0.02em;white-space:nowrap}.gb-a{background:#047857;color:#ffffff}.gb-b{background:#1d4ed8;color:#ffffff}.gb-c{background:#f59e0b;color:#1f2937}.gb-d{background:#c2410c;color:#ffffff}.gb-f{background:#b91c1c;color:#ffffff}"}],"page":{"pagePath":"api-reference/vault-risk-v3/get-vault-risk-detail-v3","slug":"/api-reference/vault-risk-v3/get-vault-risk-detail-v3","pageMetadata":{"title":"Get risk data for a single vault","openapi":"GET /v3/vaults/{address}","description":"Returns the v3 Webacy-native vault decomposition: `composite` grade + per-category `contributors`, the dense `categories` criteria map, `coverage` disclosure, plus pass-through v2 `metadata` and `risk`. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). `composite.score` is floored from below by `upstream_risk`.","href":"/api-reference/vault-risk-v3/get-vault-risk-detail-v3"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Returns the v3 Webacy-native vault decomposition: \", _jsx(_components.code, {\n children: \"composite\"\n }), \" grade + per-category \", _jsx(_components.code, {\n children: \"contributors\"\n }), \", the dense \", _jsx(_components.code, {\n children: \"categories\"\n }), \" criteria map, \", _jsx(_components.code, {\n children: \"coverage\"\n }), \" disclosure, plus pass-through v2 \", _jsx(_components.code, {\n children: \"metadata\"\n }), \" and \", _jsx(_components.code, {\n children: \"risk\"\n }), \". POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). \", _jsx(_components.code, {\n children: \"composite.score\"\n }), \" is floored from below by \", _jsx(_components.code, {\n children: \"upstream_risk\"\n }), \".\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Note,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Returns the full V3 risk decomposition for one vault — composite grade, per-category contributors, the dense criteria taxonomy, coverage disclosure, and the pass-through v2 `,_jsx(_components.code,{children:`risk`}),` envelope.`]}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Understanding the version numbers.`}),` Three independent version axes show up on the V3 surface — they are not the same number:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`API version `,_jsx(_components.code,{children:`v3`})]}),` — the URL path (`,_jsx(_components.code,{children:`/v3/...`}),`) and the response `,_jsx(_components.code,{children:`schema_version`}),` (`,_jsx(_components.code,{children:`3.0`}),`).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`framework_version`})}),` — which criteria taxonomy was used. `,_jsx(_components.code,{children:`v1`}),` today (the only supported value).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`grading_scheme`})}),` — which letter-grade band table is applied. `,_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`v2`}),` is the default`]}),` (the standard 11-band scale); `,_jsx(_components.code,{children:`v1`}),` is frozen and deprecated.`]}),`\n`]}),_jsxs(_components.p,{children:[`So the V3 API uses `,_jsx(_components.code,{children:`framework_version=v1`}),` and `,_jsx(_components.code,{children:`grading_scheme=v2`}),` by default. Seeing `,_jsx(_components.code,{children:`v1`}),` on `,_jsx(_components.code,{children:`framework_version`}),` does `,_jsx(_components.strong,{children:`not`}),` mean you’re on an older API.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`supported-chains`,children:`Supported chains`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`chain`}),` query parameter is required. Vault v3 covers `,_jsx(_components.strong,{children:`9 chains`}),`: `,_jsx(_components.code,{children:`eth`}),`, `,_jsx(_components.code,{children:`arb`}),`, `,_jsx(_components.code,{children:`base`}),`, `,_jsx(_components.code,{children:`opt`}),`, `,_jsx(_components.code,{children:`pol`}),`, `,_jsx(_components.code,{children:`bsc`}),`, `,_jsx(_components.code,{children:`avax`}),`, `,_jsx(_components.code,{children:`gnosis`}),`, `,_jsx(_components.code,{children:`sol`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Chains outside this list return `,_jsx(_components.code,{children:`400 \"Invalid chain\"`}),`, even if accepted by a shared parameter enum.`]}),`\n`,_jsx(Heading,{level:`2`,id:`assessing-freshness`,children:`Assessing freshness`}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[`This endpoint does `,_jsx(_components.strong,{children:`not`}),` return a `,_jsx(_components.code,{children:`stale`}),` flag or `,_jsx(_components.code,{children:`generated_at`}),`. To assess freshness, use `,_jsx(_components.code,{children:`metadata.last_scored_at`}),` on the response, or read the v2 list / grades endpoints, which carry `,_jsx(_components.code,{children:`stale`}),`.`]}),_jsxs(_components.p,{children:[`Treat missing, stale, or errored data as `,_jsx(_components.strong,{children:`unknown — never as safe`}),`. See `,_jsx(_components.a,{href:`/api-reference/introduction#hard-gating-and-fail-behavior`,children:`Hard-gating and fail behavior`}),`.`]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Get risk data for a single vault","openapi":"GET /v3/vaults/{address}","description":"Returns the v3 Webacy-native vault decomposition: `composite` grade + per-category `contributors`, the dense `categories` criteria map, `coverage` disclosure, plus pass-through v2 `metadata` and `risk`. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). `composite.score` is floored from below by `upstream_risk`.","href":"/api-reference/vault-risk-v3/get-vault-risk-detail-v3"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Supported chains","slug":"supported-chains","depth":2,"children":[]},{"title":"Assessing freshness","slug":"assessing-freshness","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Get v3 vault risk detail (Webacy-native)","description":"Returns the v3 Webacy-native vault decomposition: `composite` grade + per-category `contributors`, the dense `categories` criteria map, `coverage` disclosure, plus pass-through v2 `metadata` and `risk`. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). `composite.score` is floored from below by `upstream_risk`.","operationId":"getVaultRiskDetailV3","tags":["Vault Risk v3"],"security":["6bc1ab05-435f-4663-8c72-460a4c7b7f27"],"parameters":["8d094557-9632-4baa-b913-ed39416c7a50","a6a1e51b-bbbe-474d-bb16-deeecf8052eb","c77299d7-dd2a-433a-beb8-48e67d2ad705"],"responses":{"200":"e65fff35-a844-49c4-8ee5-15fb76401521","400":"c308d3ac-052b-4e58-921c-155f7c136127","402":"407df4af-1425-4e1f-bbbb-8d069e5388f0","403":"10da0083-dc0d-41c4-923e-6b66dd5f2184","404":"a1969a8e-dab5-4c13-9455-e98657e35a79","503":"cdea7e10-3a8d-4c31-a9c5-a73c3c29c1e9"},"method":"get","type":"path","servers":["383ee277-cc3e-4c5b-9060-26029d813c28","46e953d9-23d0-4ded-9dfe-145619c5b88e","1c0a4a80-cff4-4732-8bb4-c1d6ddfb5c04"],"path":"/v3/vaults/{address}","baseUrlOptions":["https://api.webacy.com","https://api-development.webacy.com","http://0.0.0.0:3030/api/v1/risk-score"],"title":"Get v3 vault risk detail (Webacy-native)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"8d094557-9632-4baa-b913-ed39416c7a50":{"name":"address","in":"path","required":true,"schema":{"type":"string","isRequired":true,"description":"Vault contract address.","uniqueKey":"","typeLabel":"string"},"description":"Vault contract address."},"a6a1e51b-bbbe-474d-bb16-deeecf8052eb":{"name":"chain","in":"query","required":true,"schema":{"type":"string","enum":["eth","base","bsc","pol","opt","arb","avax","sol","stellar","hedera","tron","sui","sei","btc","gnosis"],"isRequired":true,"description":"Chain identifier (e.g. eth, base, pol). Required.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"description":"Chain identifier (e.g. eth, base, pol). Required."},"c77299d7-dd2a-433a-beb8-48e67d2ad705":{"name":"grading_scheme","in":"query","required":false,"schema":{"type":"string","enum":["v1"],"default":"v1","isRequired":false,"description":"Grading scheme to pin (default v1). Unknown values return 400 with the supported list.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"description":"Grading scheme to pin (default v1). Unknown values return 400 with the supported list."}},"responses":{"e65fff35-a844-49c4-8ee5-15fb76401521":{"headers":{"x-credit-token":{"description":"Opaque bearer token for a prepaid x402 CU balance. Send it as `x-credit-token` to spend that balance. If the balance is insufficient and a payment for its verified payer settles, the same token is topped up and returned; otherwise the paid call returns a new independent token.","schema":{"type":"string"}},"x-credit-balance-cu":{"description":"CU remaining for the returned or presented credit token after this call.","schema":{"type":"integer","minimum":0,"example":480}},"X-Request-Id":{"description":"Server-issued id for this request, returned on every response, success or error. Quote it to Webacy support to find the request. On risk endpoints it equals the `check_id` body field.","schema":{"type":"string","format":"uuid","example":"3f1c2b9e-7a4d-4e1b-9c55-0d6a2f8e4b71"}}},"description":"Webacy-native v3 vault detail.","content":{"application/json":{"schema":{"type":"object","description":"Webacy-native v3 vault detail. `metadata` and `risk` are pass-through from the v2 vault response; `composite`/`categories`/`coverage` are the v3 additions. The three category-keyed maps are dense across all 7 WebacyCategory keys.","properties":{"schema_version":{"type":"string","example":"3.0","isRequired":true,"uniqueKey":"schema_version","typeLabel":"string"},"metadata":{"type":"object","description":"Pass-through v2 vault identity/market metadata.","additionalProperties":true,"properties":{"incentives":{"oneOf":[{"type":"object","description":"Third-party incentive campaigns on a vault from Merkl, matched by (chain, address). Returned as metadata.incentives on the vault list item and on v2/v3 vault detail; null when Merkl lists no live campaign for the vault. Never added into apy. APRs are decimal ratios. incentive_apr is the authoritative total; incentive_apr_liquid + incentive_apr_speculative is a best-effort split. Informational: no score depends on it. Example: real data for Steakhouse High Yield USDC Edition (base, 0xbeeff2490feffa212fac2f6553682c219e6a8845), 2026-10-15.","required":["incentive_source","incentive_as_of","merkl_opportunity_id","merkl_native_apr","merkl_total_apr","incentive_apr","incentive_apr_liquid","incentive_apr_speculative","incentive_share","incentive_share_basis","incentive_reward_tokens","incentive_reward_types","incentive_daily_rewards_usd","incentive_campaigns_total","incentive_streak_days","incentive_first_seen","incentive_current_end","incentive_median_campaign_days","incentive_funders","incentive_self_funded","incentive_campaigns_active","incentive_campaigns_active_count","incentive_apr_restricted","incentive_apr_liquid_restricted","incentive_apr_liquid_eligibility_unknown","incentive_apr_boosted","incentive_eligibility_hooks","incentive_apr_liquid_low_quality","incentive_reward_qualities","incentive_coverage_spans","yield_durability"],"properties":{"incentive_source":{"type":"string","enum":["merkl"],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_source","typeLabel":"enum\u003cstring>"},"incentive_as_of":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_as_of.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_as_of.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_as_of","typeLabel":"string\u003cdate-time> | null"},"merkl_opportunity_id":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_opportunity_id.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_opportunity_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_opportunity_id","typeLabel":"string | null"},"merkl_native_apr":{"oneOf":[{"type":"number","description":"Merkl's base APR (not our apy).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_native_apr.oneOf.0","typeLabel":"number"},{"type":"null","description":"Merkl's base APR (not our apy).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_native_apr.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_native_apr","typeLabel":"number | null"},"merkl_total_apr":{"oneOf":[{"type":"number","description":"Merkl's base + incentive APR.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_total_apr.oneOf.0","typeLabel":"number"},{"type":"null","description":"Merkl's base + incentive APR.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_total_apr.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.merkl_total_apr","typeLabel":"number | null"},"incentive_apr":{"type":"number","minimum":0,"description":"Total live incentive APR. Authoritative.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr","typeLabel":"number"},"incentive_apr_liquid":{"oneOf":[{"type":"number","description":"TOKEN-reward APR.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid.oneOf.0","typeLabel":"number"},{"type":"null","description":"TOKEN-reward APR.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid","typeLabel":"number | null"},"incentive_apr_speculative":{"oneOf":[{"type":"number","description":"POINT / PRETGE APR.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_speculative.oneOf.0","typeLabel":"number"},{"type":"null","description":"POINT / PRETGE APR.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_speculative.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_speculative","typeLabel":"number | null"},"incentive_share":{"oneOf":[{"type":"number","minimum":0,"maximum":1,"description":"incentive_apr / (base + incentive_apr). Null when no base is known.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_share.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"maximum":1,"description":"incentive_apr / (base + incentive_apr). Null when no base is known.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_share.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_share","typeLabel":"number | null"},"incentive_share_basis":{"oneOf":[{"type":"string","enum":["merkl_native","realized_share_price","merkl_total",null],"description":"Which base incentive_share was measured against: Merkl's base APR, our realized share-price APY (used when Merkl gives none), or Merkl's total (only when it exceeds the incentive).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_share_basis.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["merkl_native","realized_share_price","merkl_total",null],"description":"Which base incentive_share was measured against: Merkl's base APR, our realized share-price APY (used when Merkl gives none), or Merkl's total (only when it exceeds the incentive).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_share_basis.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_share_basis","typeLabel":"enum\u003cstring> | null"},"incentive_reward_tokens":{"type":"array","items":{"type":"object","description":"A reward token paid by a vault's Merkl campaigns. type: TOKEN = liquid reward token; POINT / PRETGE = points or a not-yet-launched token with no market value (never count as yield).","required":["symbol","chain","address","type"],"properties":{"symbol":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].symbol.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].symbol.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].symbol","typeLabel":"string | null"},"chain":{"oneOf":[{"type":"string","description":"Chain the reward token lives on: our slug, else the numeric chain id.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].chain.oneOf.0","typeLabel":"string"},{"type":"null","description":"Chain the reward token lives on: our slug, else the numeric chain id.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].chain.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].chain","typeLabel":"string | null"},"address":{"oneOf":[{"type":"string","description":"Token contract, lowercased for EVM.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].address.oneOf.0","typeLabel":"string"},{"type":"null","description":"Token contract, lowercased for EVM.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].address.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].address","typeLabel":"string | null"},"type":{"oneOf":[{"type":"string","description":"Merkl reward type (TOKEN | POINT | PRETGE; open set).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].type.oneOf.0","typeLabel":"string"},{"type":"null","description":"Merkl reward type (TOKEN | POINT | PRETGE; open set).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX].type","typeLabel":"string | null"}},"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_tokens","typeLabel":"object[]"},"incentive_reward_types":{"type":"array","items":{"type":"string","uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_types.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_types","typeLabel":"string[]"},"incentive_daily_rewards_usd":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_daily_rewards_usd.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_daily_rewards_usd.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_daily_rewards_usd","typeLabel":"number | null"},"incentive_campaigns_total":{"oneOf":[{"type":"integer","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_total.oneOf.0","typeLabel":"integer"},{"type":"null","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_total","typeLabel":"integer | null"},"incentive_streak_days":{"oneOf":[{"type":"number","description":"Unbroken campaign coverage up to incentive_as_of.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_streak_days.oneOf.0","typeLabel":"number"},{"type":"null","description":"Unbroken campaign coverage up to incentive_as_of.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_streak_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_streak_days","typeLabel":"number | null"},"incentive_first_seen":{"oneOf":[{"type":"string","format":"date","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_first_seen.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_first_seen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_first_seen","typeLabel":"string\u003cdate> | null"},"incentive_current_end":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_current_end.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_current_end.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_current_end","typeLabel":"string\u003cdate-time> | null"},"incentive_median_campaign_days":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_median_campaign_days.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_median_campaign_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_median_campaign_days","typeLabel":"number | null"},"incentive_funders":{"type":"array","items":{"type":"string","uniqueKey":"metadata.incentives.oneOf.0.incentive_funders.items.[INDEX]","typeLabel":"string"},"description":"Campaign-creator addresses.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_funders","typeLabel":"string[]"},"incentive_self_funded":{"oneOf":[{"type":"boolean","description":"Curator is a funder; null when the curator address is unknown.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_self_funded.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Curator is a funder; null when the curator address is unknown.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_self_funded.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_self_funded","typeLabel":"boolean | null"},"incentive_campaigns_active":{"type":"array","items":{"type":"object","description":"One live incentive campaign on a vault, as reported by Merkl. Rows are unique by campaign_id, soonest-ending first; campaigns that have already ended at request time are dropped.","required":["campaign_id","apr","symbol","chain","address","type","start","end","funder","curator_funded","amount_tokens","amount_usd_at_current_price","eligibility","boosted","hooks","reward_quality"],"properties":{"campaign_id":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].campaign_id.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].campaign_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].campaign_id","typeLabel":"string | null"},"apr":{"oneOf":[{"type":"number","description":"The campaign's own current APR (decimal), from Merkl's per-campaign breakdown. Use this, not the budget, to compute the share of yield a campaign provides.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].apr.oneOf.0","typeLabel":"number"},{"type":"null","description":"The campaign's own current APR (decimal), from Merkl's per-campaign breakdown. Use this, not the budget, to compute the share of yield a campaign provides.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].apr.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].apr","typeLabel":"number | null"},"symbol":{"oneOf":[{"type":"string","description":"Reward token symbol.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].symbol.oneOf.0","typeLabel":"string"},{"type":"null","description":"Reward token symbol.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].symbol.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].symbol","typeLabel":"string | null"},"chain":{"oneOf":[{"type":"string","description":"Chain the reward token lives on (can differ from the vault chain): our slug, else the numeric chain id.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].chain.oneOf.0","typeLabel":"string"},{"type":"null","description":"Chain the reward token lives on (can differ from the vault chain): our slug, else the numeric chain id.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].chain.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].chain","typeLabel":"string | null"},"address":{"oneOf":[{"type":"string","description":"Reward token contract, lowercased for EVM.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].address.oneOf.0","typeLabel":"string"},{"type":"null","description":"Reward token contract, lowercased for EVM.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].address.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].address","typeLabel":"string | null"},"type":{"oneOf":[{"type":"string","description":"TOKEN (liquid), POINT or PRETGE (no market value yet). Open set.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].type.oneOf.0","typeLabel":"string"},{"type":"null","description":"TOKEN (liquid), POINT or PRETGE (no market value yet). Open set.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].type","typeLabel":"string | null"},"start":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].start.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].start","typeLabel":"string\u003cdate-time> | null"},"end":{"type":"string","format":"date-time","description":"Campaign end. Never null; campaigns whose end has passed at request time are not returned.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].end","typeLabel":"string\u003cdate-time>"},"funder":{"oneOf":[{"type":"string","description":"Campaign creator address.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].funder.oneOf.0","typeLabel":"string"},{"type":"null","description":"Campaign creator address.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].funder.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].funder","typeLabel":"string | null"},"curator_funded":{"oneOf":[{"type":"boolean","description":"True when the funder is the vault's curator; null when the curator is unknown.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].curator_funded.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"True when the funder is the vault's curator; null when the curator is unknown.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].curator_funded.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].curator_funded","typeLabel":"boolean | null"},"amount_tokens":{"oneOf":[{"type":"number","description":"Campaign budget in reward tokens.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].amount_tokens.oneOf.0","typeLabel":"number"},{"type":"null","description":"Campaign budget in reward tokens.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].amount_tokens.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].amount_tokens","typeLabel":"number | null"},"amount_usd_at_current_price":{"oneOf":[{"type":"number","description":"Budget valued at today's reward-token price, not the price when the campaign was funded.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].amount_usd_at_current_price.oneOf.0","typeLabel":"number"},{"type":"null","description":"Budget valued at today's reward-token price, not the price when the campaign was funded.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].amount_usd_at_current_price.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].amount_usd_at_current_price","typeLabel":"number | null"},"eligibility":{"oneOf":[{"type":"string","enum":["open","conditional","restricted","unknown",null],"description":"Who can earn it: open (any depositor), conditional (some addresses excluded), restricted (only some depositors, e.g. Coinbase-verified or newly bridged funds, or paid to someone else), unknown (undocumented or unrecognised rule). Null on snapshots from before eligibility was published (not the same as open).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].eligibility.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["open","conditional","restricted","unknown",null],"description":"Who can earn it: open (any depositor), conditional (some addresses excluded), restricted (only some depositors, e.g. Coinbase-verified or newly bridged funds, or paid to someone else), unknown (undocumented or unrecognised rule). Null on snapshots from before eligibility was published (not the same as open).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].eligibility.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].eligibility","typeLabel":"enum\u003cstring> | null"},"boosted":{"oneOf":[{"type":"boolean","description":"Rewards vary per user (referrals, boosts); the APR is an average. Null when eligibility was not computed (snapshots from before eligibility was published).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].boosted.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Rewards vary per user (referrals, boosts); the APR is an average. Null when eligibility was not computed (snapshots from before eligibility was published).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].boosted.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].boosted","typeLabel":"boolean | null"},"hooks":{"type":"array","items":{"type":"string","uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].hooks.items.[INDEX]","typeLabel":"string"},"description":"Merkl eligibility hook names on the campaign, deduplicated and sorted alphabetically. Empty with a null eligibility means unknown (not computed), not open.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].hooks","typeLabel":"string[]"},"reward_quality":{"oneOf":[{"type":"string","enum":["stable","stable_depegging","volatile","unverified","unpriced",null],"description":"What the reward token is worth to a depositor. stable: a stablecoin we monitor, matched by chain and address (never by symbol). stable_depegging: one our depeg monitor had at critical as of incentive_as_of (the data run, not request time). volatile: any other verified, priced token, including stablecoins we do not monitor. unverified: Merkl has not verified the token. unpriced: no price. Null for POINT / PRETGE rewards and on snapshots from before reward quality was published.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].reward_quality.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["stable","stable_depegging","volatile","unverified","unpriced",null],"description":"What the reward token is worth to a depositor. stable: a stablecoin we monitor, matched by chain and address (never by symbol). stable_depegging: one our depeg monitor had at critical as of incentive_as_of (the data run, not request time). volatile: any other verified, priced token, including stablecoins we do not monitor. unverified: Merkl has not verified the token. unpriced: no price. Null for POINT / PRETGE rewards and on snapshots from before reward quality was published.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].reward_quality.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX].reward_quality","typeLabel":"enum\u003cstring> | null"}},"example":{"campaign_id":"0x0dfbe8e7a1680209e67767c903cf7947f24d8c688a4d750d41289fc393ee3861","apr":0.01,"symbol":"MORPHO","chain":"base","address":"0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842","type":"TOKEN","start":"2026-09-21T18:00:00Z","end":"2026-10-21T18:00:00Z","funder":"0xf057afeec22e220f47ad4220871364e9e828b2e9","curator_funded":null,"amount_tokens":199378.3625,"amount_usd_at_current_price":463024.22,"eligibility":"restricted","boosted":false,"hooks":["COINBASE_ATTESTATION","WHITELIST_CAMPAIGN"],"reward_quality":"volatile"},"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active.items.[INDEX]","typeLabel":"object"},"description":"Live campaigns, unique by campaign_id, soonest-ending first (up to 20); campaigns already ended at request time are dropped. Empty when unavailable.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active","typeLabel":"object[]"},"incentive_campaigns_active_count":{"oneOf":[{"type":"integer","minimum":0,"description":"Uncapped number of live campaigns as of incentive_as_of (the list is capped at 20 and drops campaigns that ended since).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active_count.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"Uncapped number of live campaigns as of incentive_as_of (the list is capped at 20 and drops campaigns that ended since).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active_count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_campaigns_active_count","typeLabel":"integer | null"},"incentive_apr_restricted":{"oneOf":[{"type":"number","description":"Incentive APR (all reward types) only some depositors can earn, or paid to someone else. A typical depositor gets incentive_apr minus this; that remainder still includes APR whose eligibility is unknown (incentive_apr_liquid_eligibility_unknown), which is not counted as restricted. 0 when computed and nothing is restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr (a feed error).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_restricted.oneOf.0","typeLabel":"number"},{"type":"null","description":"Incentive APR (all reward types) only some depositors can earn, or paid to someone else. A typical depositor gets incentive_apr minus this; that remainder still includes APR whose eligibility is unknown (incentive_apr_liquid_eligibility_unknown), which is not counted as restricted. 0 when computed and nothing is restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr (a feed error).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_restricted.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_restricted","typeLabel":"number | null"},"incentive_apr_liquid_restricted":{"oneOf":[{"type":"number","description":"The token-reward part of incentive_apr_restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_restricted.oneOf.0","typeLabel":"number"},{"type":"null","description":"The token-reward part of incentive_apr_restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_restricted.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_restricted","typeLabel":"number | null"},"incentive_apr_liquid_eligibility_unknown":{"oneOf":[{"type":"number","description":"Token-reward APR whose eligibility rule is undocumented or unrecognised. Separate from incentive_apr_liquid_restricted, not part of it. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_eligibility_unknown.oneOf.0","typeLabel":"number"},{"type":"null","description":"Token-reward APR whose eligibility rule is undocumented or unrecognised. Separate from incentive_apr_liquid_restricted, not part of it. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_eligibility_unknown.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_eligibility_unknown","typeLabel":"number | null"},"incentive_apr_boosted":{"oneOf":[{"type":"number","description":"APR from campaigns with per-user boosts (referrals, scores); the headline is an average. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_boosted.oneOf.0","typeLabel":"number"},{"type":"null","description":"APR from campaigns with per-user boosts (referrals, scores); the headline is an average. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_boosted.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_boosted","typeLabel":"number | null"},"incentive_eligibility_hooks":{"type":"array","items":{"type":"string","uniqueKey":"metadata.incentives.oneOf.0.incentive_eligibility_hooks.items.[INDEX]","typeLabel":"string"},"description":"Distinct Merkl eligibility hook names across the live campaigns (e.g. COINBASE_ATTESTATION, JUMPER), sorted. An empty list with a null incentive_apr_restricted means eligibility is unknown, not that the incentive is open.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_eligibility_hooks","typeLabel":"string[]"},"incentive_apr_liquid_low_quality":{"oneOf":[{"type":"number","description":"Open token-reward APR paid in a token with no reliable value: unverified on Merkl, no price, or a stablecoin our depeg monitor had at critical as of incentive_as_of. The durability score counts it as 0. Separate from incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown (each APR slice is counted in one of the three at most). Null means it was not computed (snapshots from before reward quality was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid, or if it plus incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown would exceed incentive_apr_liquid (the slices would then not be disjoint).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_low_quality.oneOf.0","typeLabel":"number"},{"type":"null","description":"Open token-reward APR paid in a token with no reliable value: unverified on Merkl, no price, or a stablecoin our depeg monitor had at critical as of incentive_as_of. The durability score counts it as 0. Separate from incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown (each APR slice is counted in one of the three at most). Null means it was not computed (snapshots from before reward quality was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid, or if it plus incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown would exceed incentive_apr_liquid (the slices would then not be disjoint).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_low_quality.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_apr_liquid_low_quality","typeLabel":"number | null"},"incentive_reward_qualities":{"type":"array","items":{"type":"string","enum":["stable","stable_depegging","volatile","unverified","unpriced"],"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_qualities.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Distinct reward_quality values across the vault's live campaigns as of incentive_as_of (the data run), sorted; see VaultIncentiveCampaign.reward_quality. Taken from the full campaign set, so it can include a quality whose campaign is not among the 20 listed rows or has ended since that run.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_reward_qualities","typeLabel":"enum\u003cstring>[]"},"incentive_coverage_spans":{"type":"array","items":{"type":"object","description":"A continuous run of campaign coverage over the last 365 days (back-to-back renewals merged, 1-day gap tolerance), sorted by start. The latest span can end in the future (the scheduled end of live coverage), and a scheduled renewal can start in the future; render the part after now as scheduled.","required":["start","end"],"properties":{"start":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_coverage_spans.items.[INDEX].start","typeLabel":"string\u003cdate-time>"},"end":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_coverage_spans.items.[INDEX].end","typeLabel":"string\u003cdate-time>"}},"example":{"start":"2026-06-11T15:00:00Z","end":"2026-11-12T16:00:00Z"},"uniqueKey":"metadata.incentives.oneOf.0.incentive_coverage_spans.items.[INDEX]","typeLabel":"object"},"description":"Merged campaign coverage over the last 365 days (up to 24), for a renewal timeline. Gaps are periods with no live campaign.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.incentive_coverage_spans","typeLabel":"object[]"},"yield_durability":{"oneOf":[{"type":"object","description":"How much of a vault's current yield a typical depositor can count on next month. Base yield counts as fully durable; only the incentive part is discounted: score = 100 × [(1 − share) + share × liquid_fraction × renewal × funding], where share is the incentive share of the yield an ordinary depositor can earn (campaigns gated to some depositors, e.g. Coinbase-verified only, are left out, so it can be below the headline incentive_share). When present, incentive_share is present too, except for tier no_incentive. Informational: no score or grade depends on it. Null when it could not be scored (base yield unknown) or before scores are published.","required":["score","tier","flags","drivers"],"properties":{"score":{"type":"number","minimum":0,"maximum":100,"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.score","typeLabel":"number"},"tier":{"type":"string","enum":["high","medium","low","no_incentive"],"description":"high: score ≥ 80; medium: 50 ≤ score \u003c 80; low: score \u003c 50; no_incentive: the live Merkl campaign currently pays 0%. Assigned by the data pipeline (the thresholds are a calibration setting).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.tier","typeLabel":"enum\u003cstring>"},"flags":{"type":"array","items":{"type":"string","uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.flags.items.[INDEX]","typeLabel":"string"},"description":"incentive_dependent (typical-depositor share ≥ 50%, the share in the score formula), short_streak (\u003c 30 days of unbroken campaigns), pretge_incentive / points_incentive (rewards with no market value yet), self_subsidised (curator funds its own campaign), low_quality_reward (some open token-reward APR is paid in an unverified, unpriced or critically depegging token, counted 0). Independent of the tier. Open set.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.flags","typeLabel":"string[]"},"drivers":{"type":"object","required":["method","liquid_fraction","renewal","funding"],"description":"The factors behind the score, each 0–1. The object is always present; each factor is null on a no_incentive vault.","properties":{"method":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.method.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.method.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.method","typeLabel":"string | null"},"liquid_fraction":{"oneOf":[{"type":"number","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.liquid_fraction.oneOf.0","typeLabel":"number"},{"type":"null","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.liquid_fraction.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.liquid_fraction","typeLabel":"number | null"},"renewal":{"oneOf":[{"type":"number","description":"0.25 + 0.65 × min(streak days / 365, 1).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.renewal.oneOf.0","typeLabel":"number"},{"type":"null","description":"0.25 + 0.65 × min(streak days / 365, 1).","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.renewal.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.renewal","typeLabel":"number | null"},"funding":{"oneOf":[{"type":"number","description":"0.85 when the curator funds its own campaign, else 1.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.funding.oneOf.0","typeLabel":"number"},{"type":"null","description":"0.85 when the curator funds its own campaign, else 1.","isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.funding.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers.funding","typeLabel":"number | null"}},"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0.drivers","typeLabel":"object"}},"example":{"score":87.3,"tier":"high","flags":[],"drivers":{"method":"yield_durability_v1","liquid_fraction":1,"renewal":0.4708,"funding":1}},"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.0","typeLabel":"object"},{"type":"null","description":"How much of a vault's current yield a typical depositor can count on next month. Base yield counts as fully durable; only the incentive part is discounted: score = 100 × [(1 − share) + share × liquid_fraction × renewal × funding], where share is the incentive share of the yield an ordinary depositor can earn (campaigns gated to some depositors, e.g. Coinbase-verified only, are left out, so it can be below the headline incentive_share). When present, incentive_share is present too, except for tier no_incentive. Informational: no score or grade depends on it. Null when it could not be scored (base yield unknown) or before scores are published.","required":["score","tier","flags","drivers"],"properties":{"score":{"type":"number","minimum":0,"maximum":100},"tier":{"type":"string","enum":["high","medium","low","no_incentive"],"description":"high: score ≥ 80; medium: 50 ≤ score \u003c 80; low: score \u003c 50; no_incentive: the live Merkl campaign currently pays 0%. Assigned by the data pipeline (the thresholds are a calibration setting)."},"flags":{"type":"array","items":{"type":"string"},"description":"incentive_dependent (typical-depositor share ≥ 50%, the share in the score formula), short_streak (\u003c 30 days of unbroken campaigns), pretge_incentive / points_incentive (rewards with no market value yet), self_subsidised (curator funds its own campaign), low_quality_reward (some open token-reward APR is paid in an unverified, unpriced or critically depegging token, counted 0). Independent of the tier. Open set."},"drivers":{"type":"object","required":["method","liquid_fraction","renewal","funding"],"description":"The factors behind the score, each 0–1. The object is always present; each factor is null on a no_incentive vault.","properties":{"method":{"oneOf":[{"type":"string"},{"type":"null"}]},"liquid_fraction":{"oneOf":[{"type":"number","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5."},{"type":"null","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5."}]},"renewal":{"oneOf":[{"type":"number","description":"0.25 + 0.65 × min(streak days / 365, 1)."},{"type":"null","description":"0.25 + 0.65 × min(streak days / 365, 1)."}]},"funding":{"oneOf":[{"type":"number","description":"0.85 when the curator funds its own campaign, else 1."},{"type":"null","description":"0.85 when the curator funds its own campaign, else 1."}]}}}},"example":{"score":87.3,"tier":"high","flags":[],"drivers":{"method":"yield_durability_v1","liquid_fraction":1,"renewal":0.4708,"funding":1}},"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.incentives.oneOf.0.yield_durability","typeLabel":"object | null"}},"example":{"incentive_source":"merkl","incentive_as_of":"2026-10-15T10:08:46Z","merkl_opportunity_id":"17828422272826478848","merkl_native_apr":0.03158116,"merkl_total_apr":0.05833998,"incentive_apr":0.02675882,"incentive_apr_liquid":0.02675882,"incentive_apr_speculative":0,"incentive_share":0.4587,"incentive_share_basis":"merkl_native","incentive_reward_tokens":[{"symbol":"MORPHO","chain":"base","address":"0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842","type":"TOKEN"},{"symbol":"USDC","chain":"base","address":"0xa0d7a0d7f0a3ce1336b90def568fa83b2db157a8","type":"TOKEN"}],"incentive_reward_types":["TOKEN"],"incentive_daily_rewards_usd":32572.11051119594,"incentive_campaigns_total":7,"incentive_streak_days":125,"incentive_first_seen":"2026-06-11","incentive_current_end":"2026-11-12T16:00:00Z","incentive_median_campaign_days":17.08,"incentive_funders":["0x7d0a9493edecf7112486319e0fdba72fc7a62468","0xf057afeec22e220f47ad4220871364e9e828b2e9"],"incentive_self_funded":null,"incentive_campaigns_active":[{"campaign_id":"0x0dfbe8e7a1680209e67767c903cf7947f24d8c688a4d750d41289fc393ee3861","apr":0.01,"symbol":"MORPHO","chain":"base","address":"0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842","type":"TOKEN","start":"2026-09-21T18:00:00Z","end":"2026-10-21T18:00:00Z","funder":"0xf057afeec22e220f47ad4220871364e9e828b2e9","curator_funded":null,"amount_tokens":199378.3625,"amount_usd_at_current_price":463024.22,"eligibility":"restricted","boosted":false,"hooks":["COINBASE_ATTESTATION","WHITELIST_CAMPAIGN"],"reward_quality":"volatile"},{"campaign_id":"13113589135788303413","apr":0.01675882,"symbol":"USDC","chain":"base","address":"0xa0d7a0d7f0a3ce1336b90def568fa83b2db157a8","type":"TOKEN","start":"2026-06-18T15:00:00Z","end":"2026-11-12T16:00:00Z","funder":"0x7d0a9493edecf7112486319e0fdba72fc7a62468","curator_funded":null,"amount_tokens":3075585.542121,"amount_usd_at_current_price":3075585.54,"eligibility":"restricted","boosted":false,"hooks":["WHITELIST_ADDRESSES","WHITELIST_CAMPAIGN"],"reward_quality":"volatile"}],"incentive_campaigns_active_count":2,"incentive_apr_restricted":0.02675882,"incentive_apr_liquid_restricted":0.02675882,"incentive_apr_liquid_eligibility_unknown":0,"incentive_apr_boosted":0,"incentive_eligibility_hooks":["COINBASE_ATTESTATION","WHITELIST_ADDRESSES","WHITELIST_CAMPAIGN"],"incentive_apr_liquid_low_quality":0,"incentive_reward_qualities":["volatile"],"incentive_coverage_spans":[{"start":"2026-06-11T15:00:00Z","end":"2026-11-12T16:00:00Z"}],"yield_durability":{"score":100,"tier":"high","flags":["restricted_incentive"],"drivers":{"method":"yield_durability_v1","liquid_fraction":0.5,"renewal":0.4726,"funding":1}}},"uniqueKey":"metadata.incentives.oneOf.0","typeLabel":"object"},{"type":"null","description":"Third-party incentive campaigns on a vault from Merkl, matched by (chain, address). Returned as metadata.incentives on the vault list item and on v2/v3 vault detail; null when Merkl lists no live campaign for the vault. Never added into apy. APRs are decimal ratios. incentive_apr is the authoritative total; incentive_apr_liquid + incentive_apr_speculative is a best-effort split. Informational: no score depends on it. Example: real data for Steakhouse High Yield USDC Edition (base, 0xbeeff2490feffa212fac2f6553682c219e6a8845), 2026-10-15.","required":["incentive_source","incentive_as_of","merkl_opportunity_id","merkl_native_apr","merkl_total_apr","incentive_apr","incentive_apr_liquid","incentive_apr_speculative","incentive_share","incentive_share_basis","incentive_reward_tokens","incentive_reward_types","incentive_daily_rewards_usd","incentive_campaigns_total","incentive_streak_days","incentive_first_seen","incentive_current_end","incentive_median_campaign_days","incentive_funders","incentive_self_funded","incentive_campaigns_active","incentive_campaigns_active_count","incentive_apr_restricted","incentive_apr_liquid_restricted","incentive_apr_liquid_eligibility_unknown","incentive_apr_boosted","incentive_eligibility_hooks","incentive_apr_liquid_low_quality","incentive_reward_qualities","incentive_coverage_spans","yield_durability"],"properties":{"incentive_source":{"type":"string","enum":["merkl"]},"incentive_as_of":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]},"merkl_opportunity_id":{"oneOf":[{"type":"string"},{"type":"null"}]},"merkl_native_apr":{"oneOf":[{"type":"number","description":"Merkl's base APR (not our apy)."},{"type":"null","description":"Merkl's base APR (not our apy)."}]},"merkl_total_apr":{"oneOf":[{"type":"number","description":"Merkl's base + incentive APR."},{"type":"null","description":"Merkl's base + incentive APR."}]},"incentive_apr":{"type":"number","minimum":0,"description":"Total live incentive APR. Authoritative."},"incentive_apr_liquid":{"oneOf":[{"type":"number","description":"TOKEN-reward APR."},{"type":"null","description":"TOKEN-reward APR."}]},"incentive_apr_speculative":{"oneOf":[{"type":"number","description":"POINT / PRETGE APR."},{"type":"null","description":"POINT / PRETGE APR."}]},"incentive_share":{"oneOf":[{"type":"number","minimum":0,"maximum":1,"description":"incentive_apr / (base + incentive_apr). Null when no base is known."},{"type":"null","minimum":0,"maximum":1,"description":"incentive_apr / (base + incentive_apr). Null when no base is known."}]},"incentive_share_basis":{"oneOf":[{"type":"string","enum":["merkl_native","realized_share_price","merkl_total",null],"description":"Which base incentive_share was measured against: Merkl's base APR, our realized share-price APY (used when Merkl gives none), or Merkl's total (only when it exceeds the incentive)."},{"type":"null","enum":["merkl_native","realized_share_price","merkl_total",null],"description":"Which base incentive_share was measured against: Merkl's base APR, our realized share-price APY (used when Merkl gives none), or Merkl's total (only when it exceeds the incentive)."}]},"incentive_reward_tokens":{"type":"array","items":{"type":"object","description":"A reward token paid by a vault's Merkl campaigns. type: TOKEN = liquid reward token; POINT / PRETGE = points or a not-yet-launched token with no market value (never count as yield).","required":["symbol","chain","address","type"],"properties":{"symbol":{"oneOf":[{"type":"string"},{"type":"null"}]},"chain":{"oneOf":[{"type":"string","description":"Chain the reward token lives on: our slug, else the numeric chain id."},{"type":"null","description":"Chain the reward token lives on: our slug, else the numeric chain id."}]},"address":{"oneOf":[{"type":"string","description":"Token contract, lowercased for EVM."},{"type":"null","description":"Token contract, lowercased for EVM."}]},"type":{"oneOf":[{"type":"string","description":"Merkl reward type (TOKEN | POINT | PRETGE; open set)."},{"type":"null","description":"Merkl reward type (TOKEN | POINT | PRETGE; open set)."}]}}}},"incentive_reward_types":{"type":"array","items":{"type":"string"}},"incentive_daily_rewards_usd":{"oneOf":[{"type":"number"},{"type":"null"}]},"incentive_campaigns_total":{"oneOf":[{"type":"integer"},{"type":"null"}]},"incentive_streak_days":{"oneOf":[{"type":"number","description":"Unbroken campaign coverage up to incentive_as_of."},{"type":"null","description":"Unbroken campaign coverage up to incentive_as_of."}]},"incentive_first_seen":{"oneOf":[{"type":"string","format":"date"},{"type":"null","format":"date"}]},"incentive_current_end":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]},"incentive_median_campaign_days":{"oneOf":[{"type":"number"},{"type":"null"}]},"incentive_funders":{"type":"array","items":{"type":"string"},"description":"Campaign-creator addresses."},"incentive_self_funded":{"oneOf":[{"type":"boolean","description":"Curator is a funder; null when the curator address is unknown."},{"type":"null","description":"Curator is a funder; null when the curator address is unknown."}]},"incentive_campaigns_active":{"type":"array","items":{"type":"object","description":"One live incentive campaign on a vault, as reported by Merkl. Rows are unique by campaign_id, soonest-ending first; campaigns that have already ended at request time are dropped.","required":["campaign_id","apr","symbol","chain","address","type","start","end","funder","curator_funded","amount_tokens","amount_usd_at_current_price","eligibility","boosted","hooks","reward_quality"],"properties":{"campaign_id":{"oneOf":[{"type":"string"},{"type":"null"}]},"apr":{"oneOf":[{"type":"number","description":"The campaign's own current APR (decimal), from Merkl's per-campaign breakdown. Use this, not the budget, to compute the share of yield a campaign provides."},{"type":"null","description":"The campaign's own current APR (decimal), from Merkl's per-campaign breakdown. Use this, not the budget, to compute the share of yield a campaign provides."}]},"symbol":{"oneOf":[{"type":"string","description":"Reward token symbol."},{"type":"null","description":"Reward token symbol."}]},"chain":{"oneOf":[{"type":"string","description":"Chain the reward token lives on (can differ from the vault chain): our slug, else the numeric chain id."},{"type":"null","description":"Chain the reward token lives on (can differ from the vault chain): our slug, else the numeric chain id."}]},"address":{"oneOf":[{"type":"string","description":"Reward token contract, lowercased for EVM."},{"type":"null","description":"Reward token contract, lowercased for EVM."}]},"type":{"oneOf":[{"type":"string","description":"TOKEN (liquid), POINT or PRETGE (no market value yet). Open set."},{"type":"null","description":"TOKEN (liquid), POINT or PRETGE (no market value yet). Open set."}]},"start":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]},"end":{"type":"string","format":"date-time","description":"Campaign end. Never null; campaigns whose end has passed at request time are not returned."},"funder":{"oneOf":[{"type":"string","description":"Campaign creator address."},{"type":"null","description":"Campaign creator address."}]},"curator_funded":{"oneOf":[{"type":"boolean","description":"True when the funder is the vault's curator; null when the curator is unknown."},{"type":"null","description":"True when the funder is the vault's curator; null when the curator is unknown."}]},"amount_tokens":{"oneOf":[{"type":"number","description":"Campaign budget in reward tokens."},{"type":"null","description":"Campaign budget in reward tokens."}]},"amount_usd_at_current_price":{"oneOf":[{"type":"number","description":"Budget valued at today's reward-token price, not the price when the campaign was funded."},{"type":"null","description":"Budget valued at today's reward-token price, not the price when the campaign was funded."}]},"eligibility":{"oneOf":[{"type":"string","enum":["open","conditional","restricted","unknown",null],"description":"Who can earn it: open (any depositor), conditional (some addresses excluded), restricted (only some depositors, e.g. Coinbase-verified or newly bridged funds, or paid to someone else), unknown (undocumented or unrecognised rule). Null on snapshots from before eligibility was published (not the same as open)."},{"type":"null","enum":["open","conditional","restricted","unknown",null],"description":"Who can earn it: open (any depositor), conditional (some addresses excluded), restricted (only some depositors, e.g. Coinbase-verified or newly bridged funds, or paid to someone else), unknown (undocumented or unrecognised rule). Null on snapshots from before eligibility was published (not the same as open)."}]},"boosted":{"oneOf":[{"type":"boolean","description":"Rewards vary per user (referrals, boosts); the APR is an average. Null when eligibility was not computed (snapshots from before eligibility was published)."},{"type":"null","description":"Rewards vary per user (referrals, boosts); the APR is an average. Null when eligibility was not computed (snapshots from before eligibility was published)."}]},"hooks":{"type":"array","items":{"type":"string"},"description":"Merkl eligibility hook names on the campaign, deduplicated and sorted alphabetically. Empty with a null eligibility means unknown (not computed), not open."},"reward_quality":{"oneOf":[{"type":"string","enum":["stable","stable_depegging","volatile","unverified","unpriced",null],"description":"What the reward token is worth to a depositor. stable: a stablecoin we monitor, matched by chain and address (never by symbol). stable_depegging: one our depeg monitor had at critical as of incentive_as_of (the data run, not request time). volatile: any other verified, priced token, including stablecoins we do not monitor. unverified: Merkl has not verified the token. unpriced: no price. Null for POINT / PRETGE rewards and on snapshots from before reward quality was published."},{"type":"null","enum":["stable","stable_depegging","volatile","unverified","unpriced",null],"description":"What the reward token is worth to a depositor. stable: a stablecoin we monitor, matched by chain and address (never by symbol). stable_depegging: one our depeg monitor had at critical as of incentive_as_of (the data run, not request time). volatile: any other verified, priced token, including stablecoins we do not monitor. unverified: Merkl has not verified the token. unpriced: no price. Null for POINT / PRETGE rewards and on snapshots from before reward quality was published."}]}},"example":{"campaign_id":"0x0dfbe8e7a1680209e67767c903cf7947f24d8c688a4d750d41289fc393ee3861","apr":0.01,"symbol":"MORPHO","chain":"base","address":"0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842","type":"TOKEN","start":"2026-09-21T18:00:00Z","end":"2026-10-21T18:00:00Z","funder":"0xf057afeec22e220f47ad4220871364e9e828b2e9","curator_funded":null,"amount_tokens":199378.3625,"amount_usd_at_current_price":463024.22,"eligibility":"restricted","boosted":false,"hooks":["COINBASE_ATTESTATION","WHITELIST_CAMPAIGN"],"reward_quality":"volatile"}},"description":"Live campaigns, unique by campaign_id, soonest-ending first (up to 20); campaigns already ended at request time are dropped. Empty when unavailable."},"incentive_campaigns_active_count":{"oneOf":[{"type":"integer","minimum":0,"description":"Uncapped number of live campaigns as of incentive_as_of (the list is capped at 20 and drops campaigns that ended since)."},{"type":"null","minimum":0,"description":"Uncapped number of live campaigns as of incentive_as_of (the list is capped at 20 and drops campaigns that ended since)."}]},"incentive_apr_restricted":{"oneOf":[{"type":"number","description":"Incentive APR (all reward types) only some depositors can earn, or paid to someone else. A typical depositor gets incentive_apr minus this; that remainder still includes APR whose eligibility is unknown (incentive_apr_liquid_eligibility_unknown), which is not counted as restricted. 0 when computed and nothing is restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr (a feed error)."},{"type":"null","description":"Incentive APR (all reward types) only some depositors can earn, or paid to someone else. A typical depositor gets incentive_apr minus this; that remainder still includes APR whose eligibility is unknown (incentive_apr_liquid_eligibility_unknown), which is not counted as restricted. 0 when computed and nothing is restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr (a feed error)."}]},"incentive_apr_liquid_restricted":{"oneOf":[{"type":"number","description":"The token-reward part of incentive_apr_restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid."},{"type":"null","description":"The token-reward part of incentive_apr_restricted. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid."}]},"incentive_apr_liquid_eligibility_unknown":{"oneOf":[{"type":"number","description":"Token-reward APR whose eligibility rule is undocumented or unrecognised. Separate from incentive_apr_liquid_restricted, not part of it. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0."},{"type":"null","description":"Token-reward APR whose eligibility rule is undocumented or unrecognised. Separate from incentive_apr_liquid_restricted, not part of it. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0."}]},"incentive_apr_boosted":{"oneOf":[{"type":"number","description":"APR from campaigns with per-user boosts (referrals, scores); the headline is an average. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0."},{"type":"null","description":"APR from campaigns with per-user boosts (referrals, scores); the headline is an average. Null means eligibility was not computed (snapshots from before eligibility was published, or the campaign history was unavailable); do not treat null as 0."}]},"incentive_eligibility_hooks":{"type":"array","items":{"type":"string"},"description":"Distinct Merkl eligibility hook names across the live campaigns (e.g. COINBASE_ATTESTATION, JUMPER), sorted. An empty list with a null incentive_apr_restricted means eligibility is unknown, not that the incentive is open."},"incentive_apr_liquid_low_quality":{"oneOf":[{"type":"number","description":"Open token-reward APR paid in a token with no reliable value: unverified on Merkl, no price, or a stablecoin our depeg monitor had at critical as of incentive_as_of. The durability score counts it as 0. Separate from incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown (each APR slice is counted in one of the three at most). Null means it was not computed (snapshots from before reward quality was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid, or if it plus incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown would exceed incentive_apr_liquid (the slices would then not be disjoint)."},{"type":"null","description":"Open token-reward APR paid in a token with no reliable value: unverified on Merkl, no price, or a stablecoin our depeg monitor had at critical as of incentive_as_of. The durability score counts it as 0. Separate from incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown (each APR slice is counted in one of the three at most). Null means it was not computed (snapshots from before reward quality was published, or the campaign history was unavailable); do not treat null as 0. Also null if it would exceed incentive_apr_liquid, or if it plus incentive_apr_liquid_restricted and incentive_apr_liquid_eligibility_unknown would exceed incentive_apr_liquid (the slices would then not be disjoint)."}]},"incentive_reward_qualities":{"type":"array","items":{"type":"string","enum":["stable","stable_depegging","volatile","unverified","unpriced"]},"description":"Distinct reward_quality values across the vault's live campaigns as of incentive_as_of (the data run), sorted; see VaultIncentiveCampaign.reward_quality. Taken from the full campaign set, so it can include a quality whose campaign is not among the 20 listed rows or has ended since that run."},"incentive_coverage_spans":{"type":"array","items":{"type":"object","description":"A continuous run of campaign coverage over the last 365 days (back-to-back renewals merged, 1-day gap tolerance), sorted by start. The latest span can end in the future (the scheduled end of live coverage), and a scheduled renewal can start in the future; render the part after now as scheduled.","required":["start","end"],"properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}},"example":{"start":"2026-06-11T15:00:00Z","end":"2026-11-12T16:00:00Z"}},"description":"Merged campaign coverage over the last 365 days (up to 24), for a renewal timeline. Gaps are periods with no live campaign."},"yield_durability":{"oneOf":[{"type":"object","description":"How much of a vault's current yield a typical depositor can count on next month. Base yield counts as fully durable; only the incentive part is discounted: score = 100 × [(1 − share) + share × liquid_fraction × renewal × funding], where share is the incentive share of the yield an ordinary depositor can earn (campaigns gated to some depositors, e.g. Coinbase-verified only, are left out, so it can be below the headline incentive_share). When present, incentive_share is present too, except for tier no_incentive. Informational: no score or grade depends on it. Null when it could not be scored (base yield unknown) or before scores are published.","required":["score","tier","flags","drivers"],"properties":{"score":{"type":"number","minimum":0,"maximum":100},"tier":{"type":"string","enum":["high","medium","low","no_incentive"],"description":"high: score ≥ 80; medium: 50 ≤ score \u003c 80; low: score \u003c 50; no_incentive: the live Merkl campaign currently pays 0%. Assigned by the data pipeline (the thresholds are a calibration setting)."},"flags":{"type":"array","items":{"type":"string"},"description":"incentive_dependent (typical-depositor share ≥ 50%, the share in the score formula), short_streak (\u003c 30 days of unbroken campaigns), pretge_incentive / points_incentive (rewards with no market value yet), self_subsidised (curator funds its own campaign), low_quality_reward (some open token-reward APR is paid in an unverified, unpriced or critically depegging token, counted 0). Independent of the tier. Open set."},"drivers":{"type":"object","required":["method","liquid_fraction","renewal","funding"],"description":"The factors behind the score, each 0–1. The object is always present; each factor is null on a no_incentive vault.","properties":{"method":{"oneOf":[{"type":"string"},{"type":"null"}]},"liquid_fraction":{"oneOf":[{"type":"number","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5."},{"type":"null","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5."}]},"renewal":{"oneOf":[{"type":"number","description":"0.25 + 0.65 × min(streak days / 365, 1)."},{"type":"null","description":"0.25 + 0.65 × min(streak days / 365, 1)."}]},"funding":{"oneOf":[{"type":"number","description":"0.85 when the curator funds its own campaign, else 1."},{"type":"null","description":"0.85 when the curator funds its own campaign, else 1."}]}}}},"example":{"score":87.3,"tier":"high","flags":[],"drivers":{"method":"yield_durability_v1","liquid_fraction":1,"renewal":0.4708,"funding":1}}},{"type":"null","description":"How much of a vault's current yield a typical depositor can count on next month. Base yield counts as fully durable; only the incentive part is discounted: score = 100 × [(1 − share) + share × liquid_fraction × renewal × funding], where share is the incentive share of the yield an ordinary depositor can earn (campaigns gated to some depositors, e.g. Coinbase-verified only, are left out, so it can be below the headline incentive_share). When present, incentive_share is present too, except for tier no_incentive. Informational: no score or grade depends on it. Null when it could not be scored (base yield unknown) or before scores are published.","required":["score","tier","flags","drivers"],"properties":{"score":{"type":"number","minimum":0,"maximum":100},"tier":{"type":"string","enum":["high","medium","low","no_incentive"],"description":"high: score ≥ 80; medium: 50 ≤ score \u003c 80; low: score \u003c 50; no_incentive: the live Merkl campaign currently pays 0%. Assigned by the data pipeline (the thresholds are a calibration setting)."},"flags":{"type":"array","items":{"type":"string"},"description":"incentive_dependent (typical-depositor share ≥ 50%, the share in the score formula), short_streak (\u003c 30 days of unbroken campaigns), pretge_incentive / points_incentive (rewards with no market value yet), self_subsidised (curator funds its own campaign), low_quality_reward (some open token-reward APR is paid in an unverified, unpriced or critically depegging token, counted 0). Independent of the tier. Open set."},"drivers":{"type":"object","required":["method","liquid_fraction","renewal","funding"],"description":"The factors behind the score, each 0–1. The object is always present; each factor is null on a no_incentive vault.","properties":{"method":{"oneOf":[{"type":"string"},{"type":"null"}]},"liquid_fraction":{"oneOf":[{"type":"number","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5."},{"type":"null","description":"TOKEN-reward share of the incentive APR; POINT / PRETGE count 0, unattributed APR counts 0.5."}]},"renewal":{"oneOf":[{"type":"number","description":"0.25 + 0.65 × min(streak days / 365, 1)."},{"type":"null","description":"0.25 + 0.65 × min(streak days / 365, 1)."}]},"funding":{"oneOf":[{"type":"number","description":"0.85 when the curator funds its own campaign, else 1."},{"type":"null","description":"0.85 when the curator funds its own campaign, else 1."}]}}}},"example":{"score":87.3,"tier":"high","flags":[],"drivers":{"method":"yield_durability_v1","liquid_fraction":1,"renewal":0.4708,"funding":1}}}]}},"example":{"incentive_source":"merkl","incentive_as_of":"2026-10-15T10:08:46Z","merkl_opportunity_id":"17828422272826478848","merkl_native_apr":0.03158116,"merkl_total_apr":0.05833998,"incentive_apr":0.02675882,"incentive_apr_liquid":0.02675882,"incentive_apr_speculative":0,"incentive_share":0.4587,"incentive_share_basis":"merkl_native","incentive_reward_tokens":[{"symbol":"MORPHO","chain":"base","address":"0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842","type":"TOKEN"},{"symbol":"USDC","chain":"base","address":"0xa0d7a0d7f0a3ce1336b90def568fa83b2db157a8","type":"TOKEN"}],"incentive_reward_types":["TOKEN"],"incentive_daily_rewards_usd":32572.11051119594,"incentive_campaigns_total":7,"incentive_streak_days":125,"incentive_first_seen":"2026-06-11","incentive_current_end":"2026-11-12T16:00:00Z","incentive_median_campaign_days":17.08,"incentive_funders":["0x7d0a9493edecf7112486319e0fdba72fc7a62468","0xf057afeec22e220f47ad4220871364e9e828b2e9"],"incentive_self_funded":null,"incentive_campaigns_active":[{"campaign_id":"0x0dfbe8e7a1680209e67767c903cf7947f24d8c688a4d750d41289fc393ee3861","apr":0.01,"symbol":"MORPHO","chain":"base","address":"0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842","type":"TOKEN","start":"2026-09-21T18:00:00Z","end":"2026-10-21T18:00:00Z","funder":"0xf057afeec22e220f47ad4220871364e9e828b2e9","curator_funded":null,"amount_tokens":199378.3625,"amount_usd_at_current_price":463024.22,"eligibility":"restricted","boosted":false,"hooks":["COINBASE_ATTESTATION","WHITELIST_CAMPAIGN"],"reward_quality":"volatile"},{"campaign_id":"13113589135788303413","apr":0.01675882,"symbol":"USDC","chain":"base","address":"0xa0d7a0d7f0a3ce1336b90def568fa83b2db157a8","type":"TOKEN","start":"2026-06-18T15:00:00Z","end":"2026-11-12T16:00:00Z","funder":"0x7d0a9493edecf7112486319e0fdba72fc7a62468","curator_funded":null,"amount_tokens":3075585.542121,"amount_usd_at_current_price":3075585.54,"eligibility":"restricted","boosted":false,"hooks":["WHITELIST_ADDRESSES","WHITELIST_CAMPAIGN"],"reward_quality":"volatile"}],"incentive_campaigns_active_count":2,"incentive_apr_restricted":0.02675882,"incentive_apr_liquid_restricted":0.02675882,"incentive_apr_liquid_eligibility_unknown":0,"incentive_apr_boosted":0,"incentive_eligibility_hooks":["COINBASE_ATTESTATION","WHITELIST_ADDRESSES","WHITELIST_CAMPAIGN"],"incentive_apr_liquid_low_quality":0,"incentive_reward_qualities":["volatile"],"incentive_coverage_spans":[{"start":"2026-06-11T15:00:00Z","end":"2026-11-12T16:00:00Z"}],"yield_durability":{"score":100,"tier":"high","flags":["restricted_incentive"],"drivers":{"method":"yield_durability_v1","liquid_fraction":0.5,"renewal":0.4726,"funding":1}}},"uniqueKey":"metadata.incentives.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.incentives","typeLabel":"object | null"},"deposit_status":{"oneOf":[{"type":"object","description":"Whether a new depositor can put money into the vault right now. Returned as metadata.deposit_status on the vault list item and on v2/v3 vault detail, and per deployment under metadata.deployments[].deposit_status (a multi-chain fund can be open on one chain and closed on another; the metadata value describes the representative deployment); null on snapshots before this field existed. Derived from the vault's own signals (pause or shutdown, fund status, protocol supply caps, an on-chain maxDeposit read); never guessed. Informational: no score or grade depends on it.","required":["status","source","reason","capacity_usd","permission"],"example":{"status":"open","source":"lagoon_max_cap","reason":"max_cap_headroom","capacity_usd":2272470.64,"permission":"permissionless"},"properties":{"status":{"type":"string","enum":["open","capped","paused","closed","unknown"],"description":"open; capped (at capacity); paused; closed (deliberately not accepting deposits: shutdown, retired, fund not yet open, supply cap set to zero); unknown (no reliable signal, e.g. Morpho Vault V2 caps are not read yet).","isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.status","typeLabel":"enum\u003cstring>"},"source":{"oneOf":[{"type":"string","description":"Signal that decided the status, e.g. euler_supply_cap, lagoon_max_cap, aave_supply_cap, centrifuge_fund_status, erc4626_max_deposit, yearn_emergency_shutdown. For an unknown status it names the signal that was inconclusive (e.g. euler_supply_cap with reason cap_unverified); null when no signal applied.","example":"lagoon_max_cap","isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.source.oneOf.0","typeLabel":"string"},{"type":"null","description":"Signal that decided the status, e.g. euler_supply_cap, lagoon_max_cap, aave_supply_cap, centrifuge_fund_status, erc4626_max_deposit, yearn_emergency_shutdown. For an unknown status it names the signal that was inconclusive (e.g. euler_supply_cap with reason cap_unverified); null when no signal applied.","example":"lagoon_max_cap","isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.source","typeLabel":"string | null"},"reason":{"oneOf":[{"type":"string","description":"Machine-readable detail, e.g. fund_upcoming, supply_cap_zero, shutdown, max_cap_headroom, no_max_cap, cap_headroom_99.8pct.","example":"max_cap_headroom","isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Machine-readable detail, e.g. fund_upcoming, supply_cap_zero, shutdown, max_cap_headroom, no_max_cap, cap_headroom_99.8pct.","example":"max_cap_headroom","isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.reason","typeLabel":"string | null"},"capacity_usd":{"oneOf":[{"type":"number","minimum":0,"description":"Remaining deposit capacity in USD when measurable; 0 when capped; null when unlimited or unknown.","example":2272470.64,"isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.capacity_usd.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Remaining deposit capacity in USD when measurable; 0 when capped; null when unlimited or unknown.","example":2272470.64,"isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.capacity_usd.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.capacity_usd","typeLabel":"number | null"},"permission":{"type":"string","enum":["permissionless","permissioned","unknown"],"description":"Who may deposit. permissionless only from a verified source (a Morpho Vault V2 deposit gate set to the zero address, or a Lagoon vault with whitelisting off); permissioned for KYC-gated pools (Centrifuge), allow-lists or a deposit gate contract.","isRequired":true,"uniqueKey":"metadata.deposit_status.oneOf.0.permission","typeLabel":"enum\u003cstring>"}},"uniqueKey":"metadata.deposit_status.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"metadata.deposit_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.deposit_status","typeLabel":"object | null"},"fees":{"oneOf":[{"type":"object","description":"Before-fees and after-fees APY for the vault, with the fee rates behind them. Returned as metadata.fees on the vault list item and on v2/v3 vault detail; null on snapshots before this field existed, and null when nothing is known about the vault's fees (so a non-null object always carries a rate, a figure or a known treatment). Both APY figures describe the same vault and window as metadata.apy, and are null whenever metadata.apy is null or is not the standard figure (e.g. a Centrifuge issuer APY). Entry and exit fees are reported in fee_model but are not in either APY. Never guessed: a rate the source does not give leaves apy_before_fees null. Informational: no score or grade depends on it.","required":["apy_after_fees","apy_before_fees","fee_gap_reason","fee_treatment","fee_model"],"properties":{"apy_after_fees":{"oneOf":[{"type":"number","description":"What a depositor earns after the vault's own fees (decimal, 0.042 = 4.2%).","example":0.0419,"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.apy_after_fees.oneOf.0","typeLabel":"number"},{"type":"null","description":"What a depositor earns after the vault's own fees (decimal, 0.042 = 4.2%).","example":0.0419,"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.apy_after_fees.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.apy_after_fees","typeLabel":"number | null"},"apy_before_fees":{"oneOf":[{"type":"number","description":"Gross yield before the vault's fees: apy_after_fees / (1 - performance fee) + management fee. Null when any rate is unknown or the fee does not apply to the whole yield.","example":0.0466,"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.apy_before_fees.oneOf.0","typeLabel":"number"},{"type":"null","description":"Gross yield before the vault's fees: apy_after_fees / (1 - performance fee) + management fee. Null when any rate is unknown or the fee does not apply to the whole yield.","example":0.0466,"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.apy_before_fees.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.apy_before_fees","typeLabel":"number | null"},"fee_gap_reason":{"oneOf":[{"type":"string","enum":["no_apy","treatment_unknown","apy_source_unclassified","fee_not_on_whole_yield","rate_unknown",null],"description":"Why apy_before_fees is null; null when it is present. New values may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.fee_gap_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["no_apy","treatment_unknown","apy_source_unclassified","fee_not_on_whole_yield","rate_unknown",null],"description":"Why apy_before_fees is null; null when it is present. New values may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.fee_gap_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.fee_gap_reason","typeLabel":"enum\u003cstring> | null"},"fee_treatment":{"type":"string","enum":["in_share_price","unknown"],"description":"in_share_price: the vault takes its fees inside the share price, so share-price yield is after fees. unknown: not established; no APY figures are given. New values may be added; treat an unrecognised value as unknown.","isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.fee_treatment","typeLabel":"enum\u003cstring>"},"fee_model":{"oneOf":[{"type":"object","description":"Fee rates in basis points (1000 = 10%) and where they came from; null when no rate is known.","properties":{"performance_bps":{"oneOf":[{"type":"number","example":1000,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.performance_bps.oneOf.0","typeLabel":"number"},{"type":"null","example":1000,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.performance_bps.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.performance_bps","typeLabel":"number | null"},"management_bps":{"oneOf":[{"type":"number","example":0,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.management_bps.oneOf.0","typeLabel":"number"},{"type":"null","example":0,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.management_bps.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.management_bps","typeLabel":"number | null"},"entry_bps":{"oneOf":[{"type":"number","example":null,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.entry_bps.oneOf.0","typeLabel":"number"},{"type":"null","example":null,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.entry_bps.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.entry_bps","typeLabel":"number | null"},"exit_bps":{"oneOf":[{"type":"number","example":null,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.exit_bps.oneOf.0","typeLabel":"number"},{"type":"null","example":null,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.exit_bps.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.exit_bps","typeLabel":"number | null"},"source":{"oneOf":[{"type":"string","example":"morpho_api","uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.source.oneOf.0","typeLabel":"string"},{"type":"null","example":"morpho_api","uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.source.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.source","typeLabel":"string | null"},"management_source":{"oneOf":[{"type":"string","description":"Where management_bps came from: the rate source, or protocol_design when the protocol has no management fee (the 0 is not an API read).","example":"protocol_design","uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.management_source.oneOf.0","typeLabel":"string"},{"type":"null","description":"Where management_bps came from: the rate source, or protocol_design when the protocol has no management fee (the 0 is not an API read).","example":"protocol_design","uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.management_source.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.management_source","typeLabel":"string | null"},"method":{"oneOf":[{"type":"string","example":"fee_model_v1","uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.method.oneOf.0","typeLabel":"string"},{"type":"null","example":"fee_model_v1","uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.method.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0.method","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.0","typeLabel":"object"},{"type":"null","description":"Fee rates in basis points (1000 = 10%) and where they came from; null when no rate is known.","properties":{"performance_bps":{"oneOf":[{"type":"number","example":1000},{"type":"null","example":1000}]},"management_bps":{"oneOf":[{"type":"number","example":0},{"type":"null","example":0}]},"entry_bps":{"oneOf":[{"type":"number","example":null},{"type":"null","example":null}]},"exit_bps":{"oneOf":[{"type":"number","example":null},{"type":"null","example":null}]},"source":{"oneOf":[{"type":"string","example":"morpho_api"},{"type":"null","example":"morpho_api"}]},"management_source":{"oneOf":[{"type":"string","description":"Where management_bps came from: the rate source, or protocol_design when the protocol has no management fee (the 0 is not an API read).","example":"protocol_design"},{"type":"null","description":"Where management_bps came from: the rate source, or protocol_design when the protocol has no management fee (the 0 is not an API read).","example":"protocol_design"}]},"method":{"oneOf":[{"type":"string","example":"fee_model_v1"},{"type":"null","example":"fee_model_v1"}]}},"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.fee_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.fees.oneOf.0.fee_model","typeLabel":"object | null"}},"uniqueKey":"metadata.fees.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"metadata.fees.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.fees","typeLabel":"object | null"},"flow_terms":{"oneOf":[{"type":"object","description":"Whether deposits and redemptions into the vault settle instantly or through a queue, the typical settlement wait and any lock-up. Returned as metadata.flow_terms on the vault list item and on v2/v3 vault detail; null on snapshots before this field existed, and null when nothing is known (both legs unknown, no source). Who may deposit is metadata.deposit_status.permission; how much fits is metadata.deposit_status. A sync redemption can still be limited by available liquidity or blocked (see withdrawal_state); an Euler vault with a withdraw or redeem hook reads redemption_flow unknown. Never guessed: a leg with no reliable source reads unknown. Informational: no score or grade depends on it.","required":["deposit_flow","redemption_flow","settlement_seconds","lockup_seconds","source"],"properties":{"deposit_flow":{"type":"string","enum":["sync","async","unknown"],"description":"sync: a deposit settles in the same transaction. async: a request the vault settles later. unknown: no reliable source.","isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.deposit_flow","typeLabel":"enum\u003cstring>"},"redemption_flow":{"type":"string","enum":["sync","async","unknown"],"description":"Same, for redemptions. New flow values may be added; treat an unrecognised value as unknown.","isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.redemption_flow","typeLabel":"enum\u003cstring>"},"settlement_seconds":{"oneOf":[{"type":"integer","description":"Typical wait for an async leg, in seconds; 0 when both legs are sync; null when not measured.","example":172800,"isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.settlement_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Typical wait for an async leg, in seconds; 0 when both legs are sync; null when not measured.","example":172800,"isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.settlement_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.settlement_seconds","typeLabel":"integer | null"},"lockup_seconds":{"oneOf":[{"type":"integer","description":"Minimum holding period in seconds; 0 where the protocol has none by design; null when not known.","example":null,"isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.lockup_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Minimum holding period in seconds; 0 where the protocol has none by design; null when not known.","example":null,"isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.lockup_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.lockup_seconds","typeLabel":"integer | null"},"source":{"oneOf":[{"type":"string","description":"Which source decided it: protocol_design, lagoon_api or erc165_supports_interface.","example":"lagoon_api","isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.source.oneOf.0","typeLabel":"string"},{"type":"null","description":"Which source decided it: protocol_design, lagoon_api or erc165_supports_interface.","example":"lagoon_api","isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.flow_terms.oneOf.0.source","typeLabel":"string | null"}},"uniqueKey":"metadata.flow_terms.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"metadata.flow_terms.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.flow_terms","typeLabel":"object | null"},"yield_risk":{"oneOf":[{"type":"object","description":"Risk-adjusted yield statistics over trailing 30/90/180/365-day windows, from the vault's daily on-chain share price. Returned as metadata.yield_risk on the vault list item and on v2/v3 vault detail; null when the snapshot has none (before this field existed, a vault without enough history, or stale statistics). For lending vaults, max_drawdown and days underwater are the informative risk measures; sharpe/sortino are published only where volatility reaches 1%. Informational: no score or grade depends on it.","required":["as_of","methodology_version","days_underwater","bad_prints_dropped","windows"],"properties":{"as_of":{"oneOf":[{"type":"string","format":"date","description":"Archive day the statistics are as of (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.as_of.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Archive day the statistics are as of (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.as_of.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.as_of","typeLabel":"string\u003cdate> | null"},"methodology_version":{"oneOf":[{"type":"string","description":"Methodology version of the statistics.","example":"yield-risk-v1.0.0","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.methodology_version.oneOf.0","typeLabel":"string"},{"type":"null","description":"Methodology version of the statistics.","example":"yield-risk-v1.0.0","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.methodology_version.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.methodology_version","typeLabel":"string | null"},"days_underwater":{"oneOf":[{"type":"integer","description":"Days since the share price was last at its running high (0 = at a high).","example":182,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.days_underwater.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Days since the share price was last at its running high (0 = at a high).","example":182,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.days_underwater.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.days_underwater","typeLabel":"integer | null"},"bad_prints_dropped":{"oneOf":[{"type":"integer","description":"One-day prints of more than 5% that the next day undid, dropped as data errors.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.bad_prints_dropped.oneOf.0","typeLabel":"integer"},{"type":"null","description":"One-day prints of more than 5% that the next day undid, dropped as data errors.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.bad_prints_dropped.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.bad_prints_dropped","typeLabel":"integer | null"},"windows":{"type":"object","required":["30d","90d","180d","365d"],"properties":{"30d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.status","typeLabel":"enum\u003cstring>"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.refusal_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.refusal_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.refusal_reason","typeLabel":"string | null"},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.start.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.start.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.start","typeLabel":"string\u003cdate> | null"},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.end.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.end.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.end","typeLabel":"string\u003cdate> | null"},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.observations.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.observations.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.observations","typeLabel":"integer | null"},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.coverage.oneOf.0","typeLabel":"number"},{"type":"null","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.coverage.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.coverage","typeLabel":"number | null"},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.realized_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.realized_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.realized_apy","typeLabel":"number | null"},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.realized_apy_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.realized_apy_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.realized_apy_null_reason","typeLabel":"string | null"},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.volatility.oneOf.0","typeLabel":"number"},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.volatility.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.volatility","typeLabel":"number | null"},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.max_drawdown.oneOf.0","typeLabel":"number"},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.max_drawdown.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.max_drawdown","typeLabel":"number | null"},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.days_underwater_max.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.days_underwater_max.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.days_underwater_max","typeLabel":"integer | null"},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.negative_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.negative_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.negative_days","typeLabel":"integer | null"},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.gap_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.gap_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.gap_days","typeLabel":"integer | null"},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.tbill_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.tbill_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.tbill_apy","typeLabel":"number | null"},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.excess_return.oneOf.0","typeLabel":"number"},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.excess_return.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.excess_return","typeLabel":"number | null"},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.sharpe.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.sharpe.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.sharpe","typeLabel":"number | null"},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.sortino.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.sortino.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.sortino","typeLabel":"number | null"},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.ratio_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.ratio_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0.ratio_null_reason","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.0","typeLabel":"object"},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.30d","typeLabel":"object | null"},"90d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.status","typeLabel":"enum\u003cstring>"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.refusal_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.refusal_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.refusal_reason","typeLabel":"string | null"},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.start.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.start.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.start","typeLabel":"string\u003cdate> | null"},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.end.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.end.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.end","typeLabel":"string\u003cdate> | null"},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.observations.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.observations.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.observations","typeLabel":"integer | null"},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.coverage.oneOf.0","typeLabel":"number"},{"type":"null","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.coverage.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.coverage","typeLabel":"number | null"},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.realized_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.realized_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.realized_apy","typeLabel":"number | null"},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.realized_apy_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.realized_apy_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.realized_apy_null_reason","typeLabel":"string | null"},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.volatility.oneOf.0","typeLabel":"number"},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.volatility.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.volatility","typeLabel":"number | null"},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.max_drawdown.oneOf.0","typeLabel":"number"},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.max_drawdown.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.max_drawdown","typeLabel":"number | null"},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.days_underwater_max.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.days_underwater_max.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.days_underwater_max","typeLabel":"integer | null"},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.negative_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.negative_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.negative_days","typeLabel":"integer | null"},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.gap_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.gap_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.gap_days","typeLabel":"integer | null"},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.tbill_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.tbill_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.tbill_apy","typeLabel":"number | null"},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.excess_return.oneOf.0","typeLabel":"number"},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.excess_return.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.excess_return","typeLabel":"number | null"},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.sharpe.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.sharpe.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.sharpe","typeLabel":"number | null"},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.sortino.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.sortino.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.sortino","typeLabel":"number | null"},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.ratio_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.ratio_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0.ratio_null_reason","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.0","typeLabel":"object"},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.90d","typeLabel":"object | null"},"180d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.status","typeLabel":"enum\u003cstring>"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.refusal_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.refusal_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.refusal_reason","typeLabel":"string | null"},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.start.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.start.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.start","typeLabel":"string\u003cdate> | null"},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.end.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.end.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.end","typeLabel":"string\u003cdate> | null"},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.observations.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.observations.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.observations","typeLabel":"integer | null"},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.coverage.oneOf.0","typeLabel":"number"},{"type":"null","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.coverage.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.coverage","typeLabel":"number | null"},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.realized_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.realized_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.realized_apy","typeLabel":"number | null"},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.realized_apy_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.realized_apy_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.realized_apy_null_reason","typeLabel":"string | null"},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.volatility.oneOf.0","typeLabel":"number"},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.volatility.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.volatility","typeLabel":"number | null"},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.max_drawdown.oneOf.0","typeLabel":"number"},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.max_drawdown.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.max_drawdown","typeLabel":"number | null"},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.days_underwater_max.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.days_underwater_max.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.days_underwater_max","typeLabel":"integer | null"},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.negative_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.negative_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.negative_days","typeLabel":"integer | null"},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.gap_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.gap_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.gap_days","typeLabel":"integer | null"},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.tbill_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.tbill_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.tbill_apy","typeLabel":"number | null"},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.excess_return.oneOf.0","typeLabel":"number"},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.excess_return.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.excess_return","typeLabel":"number | null"},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.sharpe.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.sharpe.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.sharpe","typeLabel":"number | null"},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.sortino.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.sortino.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.sortino","typeLabel":"number | null"},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.ratio_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.ratio_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0.ratio_null_reason","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.0","typeLabel":"object"},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.180d","typeLabel":"object | null"},"365d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.status","typeLabel":"enum\u003cstring>"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.refusal_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.refusal_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.refusal_reason","typeLabel":"string | null"},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.start.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.start.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.start","typeLabel":"string\u003cdate> | null"},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.end.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.end.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.end","typeLabel":"string\u003cdate> | null"},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.observations.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns observed in the window.","example":85,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.observations.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.observations","typeLabel":"integer | null"},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.coverage.oneOf.0","typeLabel":"number"},{"type":"null","description":"observations / window days.","example":0.9444,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.coverage.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.coverage","typeLabel":"number | null"},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.realized_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.realized_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.realized_apy","typeLabel":"number | null"},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.realized_apy_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.realized_apy_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.realized_apy_null_reason","typeLabel":"string | null"},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.volatility.oneOf.0","typeLabel":"number"},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.volatility.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.volatility","typeLabel":"number | null"},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.max_drawdown.oneOf.0","typeLabel":"number"},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.max_drawdown.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.max_drawdown","typeLabel":"number | null"},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.days_underwater_max.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.days_underwater_max.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.days_underwater_max","typeLabel":"integer | null"},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.negative_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Daily returns below zero.","example":2,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.negative_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.negative_days","typeLabel":"integer | null"},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.gap_days.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.gap_days.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.gap_days","typeLabel":"integer | null"},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.tbill_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.tbill_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.tbill_apy","typeLabel":"number | null"},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.excess_return.oneOf.0","typeLabel":"number"},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.excess_return.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.excess_return","typeLabel":"number | null"},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.sharpe.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.sharpe.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.sharpe","typeLabel":"number | null"},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.sortino.oneOf.0","typeLabel":"number"},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.sortino.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.sortino","typeLabel":"number | null"},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.ratio_null_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null,"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.ratio_null_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0.ratio_null_reason","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.0","typeLabel":"object"},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}},"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows.365d","typeLabel":"object | null"}},"description":"Each window, or null when no statistics were published for it.","isRequired":true,"uniqueKey":"metadata.yield_risk.oneOf.0.windows","typeLabel":"object"}},"uniqueKey":"metadata.yield_risk.oneOf.0","typeLabel":"object"},{"type":"null","description":"Risk-adjusted yield statistics over trailing 30/90/180/365-day windows, from the vault's daily on-chain share price. Returned as metadata.yield_risk on the vault list item and on v2/v3 vault detail; null when the snapshot has none (before this field existed, a vault without enough history, or stale statistics). For lending vaults, max_drawdown and days underwater are the informative risk measures; sharpe/sortino are published only where volatility reaches 1%. Informational: no score or grade depends on it.","required":["as_of","methodology_version","days_underwater","bad_prints_dropped","windows"],"properties":{"as_of":{"oneOf":[{"type":"string","format":"date","description":"Archive day the statistics are as of (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Archive day the statistics are as of (UTC).","example":"2026-11-04"}]},"methodology_version":{"oneOf":[{"type":"string","description":"Methodology version of the statistics.","example":"yield-risk-v1.0.0"},{"type":"null","description":"Methodology version of the statistics.","example":"yield-risk-v1.0.0"}]},"days_underwater":{"oneOf":[{"type":"integer","description":"Days since the share price was last at its running high (0 = at a high).","example":182},{"type":"null","description":"Days since the share price was last at its running high (0 = at a high).","example":182}]},"bad_prints_dropped":{"oneOf":[{"type":"integer","description":"One-day prints of more than 5% that the next day undid, dropped as data errors.","example":0},{"type":"null","description":"One-day prints of more than 5% that the next day undid, dropped as data errors.","example":0}]},"windows":{"type":"object","required":["30d","90d","180d","365d"],"properties":{"30d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}}]},"90d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}}]},"180d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}}]},"365d":{"oneOf":[{"type":"object","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}},{"type":"null","description":"One trailing window. status refused means the window was refused with refusal_reason and every statistic is null; a window is refused, never corrected. All figures are fractions in the vault's underlying units.","required":["status","refusal_reason","start","end","observations","coverage","realized_apy","realized_apy_null_reason","volatility","max_drawdown","days_underwater_max","negative_days","gap_days","tbill_apy","excess_return","sharpe","sortino","ratio_null_reason"],"properties":{"status":{"type":"string","enum":["ok","refused"],"example":"ok"},"refusal_reason":{"oneOf":[{"type":"string","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null},{"type":"null","description":"insufficient_history (under 90% of days with a return, or the series starts after the window), implausible_daily_gain (a daily gain above 5%: not lending accrual), realized_out_of_range (outside -95%..+50%). New reasons may be added.","example":null}]},"start":{"oneOf":[{"type":"string","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"},{"type":"null","format":"date","description":"First day of the window (UTC).","example":"2026-08-06"}]},"end":{"oneOf":[{"type":"string","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"},{"type":"null","format":"date","description":"Last day of the window (UTC).","example":"2026-11-04"}]},"observations":{"oneOf":[{"type":"integer","description":"Daily returns observed in the window.","example":85},{"type":"null","description":"Daily returns observed in the window.","example":85}]},"coverage":{"oneOf":[{"type":"number","description":"observations / window days.","example":0.9444},{"type":"null","description":"observations / window days.","example":0.9444}]},"realized_apy":{"oneOf":[{"type":"number","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574},{"type":"null","description":"Annualized realized yield over the calendar days the window's returns cover: (product of (1 + r)) ^ (365 / days covered) - 1.","example":-0.00167574}]},"realized_apy_null_reason":{"oneOf":[{"type":"string","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null},{"type":"null","description":"Why realized_apy is null in a measured window: realized_out_of_range (the figure was refused as implausible, e.g. a loss beyond -95% annualized, or the API dropped a value outside -100% to +100%; the risk statistics are still given). Null when realized_apy is set, and may be null when no figure was published at all.","example":null}]},"volatility":{"oneOf":[{"type":"number","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299},{"type":"null","description":"Sample standard deviation of single-day returns x sqrt(365).","example":0.19897299}]},"max_drawdown":{"oneOf":[{"type":"number","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973},{"type":"null","description":"Worst fall from a running high, 0 or negative.","example":-0.08252973}]},"days_underwater_max":{"oneOf":[{"type":"integer","description":"Longest run of days more than 1bp below the running high.","example":46},{"type":"null","description":"Longest run of days more than 1bp below the running high.","example":46}]},"negative_days":{"oneOf":[{"type":"integer","description":"Daily returns below zero.","example":2},{"type":"null","description":"Daily returns below zero.","example":2}]},"gap_days":{"oneOf":[{"type":"integer","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0},{"type":"null","description":"Archive days bridged inside the window: a missing day between two reads, spanned by one multi-day return so its move still counts.","example":0}]},"tbill_apy":{"oneOf":[{"type":"number","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575},{"type":"null","description":"3-month US Treasury bill APY on the window start (91-day compounding), as the Dollar Rate spread.","example":0.039575}]},"excess_return":{"oneOf":[{"type":"number","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036},{"type":"null","description":"realized_apy minus tbill_apy. Null for non-USD underlyings.","example":-0.04125036}]},"sharpe":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073},{"type":"null","description":"CAGR-based: excess_return / volatility. Null when volatility is under 1% (lending vaults accrue almost smoothly, so the ratio is not informative), for an underlying that does not target $1, or when realized_apy is null; see ratio_null_reason.","example":-0.2073}]},"sortino":{"oneOf":[{"type":"number","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239},{"type":"null","description":"CAGR-based: excess_return / downside semi-deviation of single-day returns below the bill's daily rate. Null under the same conditions as sharpe, or when the downside deviation is under 1% (ratio_null_reason downside_below_floor; sharpe can then still be set).","example":-0.239}]},"ratio_null_reason":{"oneOf":[{"type":"string","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null},{"type":"null","description":"Why sharpe/sortino are null: volatility_below_floor, downside_below_floor, not_usd_denominated, denomination_unknown, realized_out_of_range, tbill_unavailable.","example":null}]}}}]}},"description":"Each window, or null when no statistics were published for it."}},"uniqueKey":"metadata.yield_risk.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.yield_risk","typeLabel":"object | null"},"impairment_state":{"oneOf":[{"type":"object","description":"For a vault that has already realized a material loss (at least 3% of its net asset value, measured, not forecast): the loss and, where assessed, its recovery prospect on the S\u0026P Vault Risk Assessment impaired scale. CCC = impaired, a credible remediation is expected to restore a material part of assets within a reasonable time; CC = materially impaired, recovery depends on uncertain, legal or insolvency proceedings; D = permanently impaired, no credible path to recovery. A letter is published only from a sourced, curated assessment and is never guessed: an impaired vault without one has state null and state_reason recovery_not_assessed. Returned as metadata.impairment_state on the vault list item and on v2/v3 vault detail; null when the vault is not impaired (or the data predates this field). Informational and separate from the forward-looking score: the vault's score, tier and letter grade do not read it.","required":["impaired","state","state_label","state_reason","realized_loss_pct","realized_loss_usd","loss_usd_unavailable_reason","trigger","triggers","recovery_rationale","sources","event_date","assessment_as_of","as_of","method"],"properties":{"impaired":{"type":"boolean","enum":[true],"description":"Always true; a vault that is not impaired has impairment_state null.","example":true,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.impaired","typeLabel":"enum\u003cboolean>"},"state":{"oneOf":[{"type":"string","enum":["CCC","CC","D",null],"description":"Recovery prospect: CCC, CC or D (see the object description). Null when recovery has not been assessed. Treat any other value as not assessed.","example":"D","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.state.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["CCC","CC","D",null],"description":"Recovery prospect: CCC, CC or D (see the object description). Null when recovery has not been assessed. Treat any other value as not assessed.","example":"D","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.state.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.state","typeLabel":"enum\u003cstring> | null"},"state_label":{"oneOf":[{"type":"string","description":"Plain-language meaning of state; null when state is null.","example":"Permanently impaired: no credible path to recovery","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.state_label.oneOf.0","typeLabel":"string"},{"type":"null","description":"Plain-language meaning of state; null when state is null.","example":"Permanently impaired: no credible path to recovery","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.state_label.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.state_label","typeLabel":"string | null"},"state_reason":{"type":"string","enum":["curated","recovery_not_assessed"],"description":"curated when state comes from a sourced assessment; recovery_not_assessed otherwise.","example":"curated","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.state_reason","typeLabel":"enum\u003cstring>"},"realized_loss_pct":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"description":"The headline loss as published: the largest leg's loss as a percent of net asset value, capped at 100. Legs overlap, so this is the largest, not a sum. Taken from the record as published, not recomputed from triggers; null when out of range.","example":100,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.realized_loss_pct.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"maximum":100,"description":"The headline loss as published: the largest leg's loss as a percent of net asset value, capped at 100. Legs overlap, so this is the largest, not a sum. Taken from the record as published, not recomputed from triggers; null when out of range.","example":100,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.realized_loss_pct.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.realized_loss_pct","typeLabel":"number | null"},"realized_loss_usd":{"oneOf":[{"type":"number","minimum":0,"description":"The largest leg's loss in USD. Null when not available, with loss_usd_unavailable_reason; it is never estimated from TVL.","example":null,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.realized_loss_usd.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"The largest leg's loss in USD. Null when not available, with loss_usd_unavailable_reason; it is never estimated from TVL.","example":null,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.realized_loss_usd.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.realized_loss_usd","typeLabel":"number | null"},"loss_usd_unavailable_reason":{"oneOf":[{"type":"string","description":"Why the USD loss is withheld, e.g. book value inflated by interest accruing on a frozen lending market. Null when realized_loss_usd is published.","example":"book value inflated by interest accruing on a frozen market (TVL growing while nothing is withdrawable)","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.loss_usd_unavailable_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the USD loss is withheld, e.g. book value inflated by interest accruing on a frozen lending market. Null when realized_loss_usd is published.","example":"book value inflated by interest accruing on a frozen market (TVL growing while nothing is withdrawable)","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.loss_usd_unavailable_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.loss_usd_unavailable_reason","typeLabel":"string | null"},"trigger":{"oneOf":[{"type":"string","description":"The headline trigger as published: the kind of the largest leg (the one realized_loss_pct is taken from); same values as triggers[].trigger. Taken from the record as published, not recomputed from triggers.","example":"impaired_collateral","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.trigger.oneOf.0","typeLabel":"string"},{"type":"null","description":"The headline trigger as published: the kind of the largest leg (the one realized_loss_pct is taken from); same values as triggers[].trigger. Taken from the record as published, not recomputed from triggers.","example":"impaired_collateral","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.trigger.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.trigger","typeLabel":"string | null"},"triggers":{"type":"array","description":"Every material realized-loss leg, largest first.","items":{"type":"object","description":"One measured realized-loss leg. Legs can overlap (bad debt on a lending market is also the loss on its collateral), so they are never added together. Detail fields that a leg's kind does not carry are null.","required":["trigger","loss_pct","loss_usd","basis","token","collateral_symbol","exposure_usd","live_price_usd","share_price","share_price_source"],"properties":{"trigger":{"type":"string","description":"Kind of loss: recognized_bad_debt (bad debt the lending market has booked against this vault), unrecognized_bad_debt (collateral still marked by its oracle above its live price), share_price_writedown (the vault's share price below its 1.0 starting value), impaired_underlying (the vault's own deposit token has lost its peg), impaired_collateral (lending against, or holding, a token that has lost its peg). New kinds may be added; treat an unrecognised one as a realized loss of unspecified kind.","example":"impaired_collateral","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].trigger","typeLabel":"string"},"loss_pct":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"description":"Loss as a percent of the vault's net asset value, 0 to 100. A loss larger than the vault (e.g. bad debt exceeding net asset value) reads 100.","example":48.67,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].loss_pct.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"maximum":100,"description":"Loss as a percent of the vault's net asset value, 0 to 100. A loss larger than the vault (e.g. bad debt exceeding net asset value) reads 100.","example":48.67,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].loss_pct.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].loss_pct","typeLabel":"number | null"},"loss_usd":{"oneOf":[{"type":"number","minimum":0,"description":"Loss in USD; null when not available (see loss_usd_unavailable_reason on the parent object).","example":17448600.74,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].loss_usd.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Loss in USD; null when not available (see loss_usd_unavailable_reason on the parent object).","example":17448600.74,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].loss_usd.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].loss_usd","typeLabel":"number | null"},"basis":{"oneOf":[{"type":"string","description":"How the loss was measured, in plain text.","example":"holds curated impaired token: exposure x (1 - live/$1 peg)","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].basis.oneOf.0","typeLabel":"string"},{"type":"null","description":"How the loss was measured, in plain text.","example":"holds curated impaired token: exposure x (1 - live/$1 peg)","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].basis.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].basis","typeLabel":"string | null"},"token":{"oneOf":[{"type":"string","description":"The impaired token as chain:address, for impaired_underlying and impaired_collateral legs.","example":"eth:0x4ba01f22827018b4772cd326c7627fb4956a7c00","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].token.oneOf.0","typeLabel":"string"},{"type":"null","description":"The impaired token as chain:address, for impaired_underlying and impaired_collateral legs.","example":"eth:0x4ba01f22827018b4772cd326c7627fb4956a7c00","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].token.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].token","typeLabel":"string | null"},"collateral_symbol":{"oneOf":[{"type":"string","description":"Display symbol of the impaired token. A label only: identify the token by token, since symbols are shared between unrelated tokens.","example":"msUSD","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].collateral_symbol.oneOf.0","typeLabel":"string"},{"type":"null","description":"Display symbol of the impaired token. A label only: identify the token by token, since symbols are shared between unrelated tokens.","example":"msUSD","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].collateral_symbol.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].collateral_symbol","typeLabel":"string | null"},"exposure_usd":{"oneOf":[{"type":"number","minimum":0,"description":"USD the vault lends against, or holds in, the impaired token.","example":35847519.21,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].exposure_usd.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"USD the vault lends against, or holds in, the impaired token.","example":35847519.21,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].exposure_usd.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].exposure_usd","typeLabel":"number | null"},"live_price_usd":{"oneOf":[{"type":"number","minimum":0,"description":"Live USD price of the impaired token used to measure the loss.","example":0.513255,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].live_price_usd.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Live USD price of the impaired token used to measure the loss.","example":0.513255,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].live_price_usd.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].live_price_usd","typeLabel":"number | null"},"share_price":{"oneOf":[{"type":"number","minimum":0,"description":"The vault's share price, for a share_price_writedown leg.","example":null,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].share_price.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"The vault's share price, for a share_price_writedown leg.","example":null,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].share_price.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].share_price","typeLabel":"number | null"},"share_price_source":{"oneOf":[{"type":"string","description":"Where the share price was read, for a share_price_writedown leg.","example":null,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].share_price_source.oneOf.0","typeLabel":"string"},{"type":"null","description":"Where the share price was read, for a share_price_writedown leg.","example":null,"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].share_price_source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX].share_price_source","typeLabel":"string | null"}},"uniqueKey":"metadata.impairment_state.oneOf.0.triggers.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.triggers","typeLabel":"object[]"},"recovery_rationale":{"oneOf":[{"type":"string","description":"Why the recovery prospect is what it is. Curated assessments only; null otherwise.","example":"Elixir first said it intended to redeem deUSD 1:1 for USDC (November 2025), then settled at an approximately 80% recovery for lenders against deUSD/sdeUSD on Morpho and Euler, paid directly to depositor wallets by its payout contract (eth:0x26acdcb807aacb74afe07a58c9ae0e47e4a15e72) in exchange for releasing all claims. Checked on-chain 2026-11-10: every depositor in this vault at the snapshot was paid on 2026-03-17 (the four ordinary depositors received 78% of their position; the curator's fee wallet, whose shares are mostly fees minted on that accrual, received $9.3k). The settlement is complete and the claims are released, so the remaining ~22% has no path to recovery. The vault itself was never repaid: it still sits 100% in the frozen sdeUSD/USDC market, whose book value keeps accruing interest.","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.recovery_rationale.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the recovery prospect is what it is. Curated assessments only; null otherwise.","example":"Elixir first said it intended to redeem deUSD 1:1 for USDC (November 2025), then settled at an approximately 80% recovery for lenders against deUSD/sdeUSD on Morpho and Euler, paid directly to depositor wallets by its payout contract (eth:0x26acdcb807aacb74afe07a58c9ae0e47e4a15e72) in exchange for releasing all claims. Checked on-chain 2026-11-10: every depositor in this vault at the snapshot was paid on 2026-03-17 (the four ordinary depositors received 78% of their position; the curator's fee wallet, whose shares are mostly fees minted on that accrual, received $9.3k). The settlement is complete and the claims are released, so the remaining ~22% has no path to recovery. The vault itself was never repaid: it still sits 100% in the frozen sdeUSD/USDC market, whose book value keeps accruing interest.","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.recovery_rationale.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.recovery_rationale","typeLabel":"string | null"},"sources":{"type":"array","description":"Citations for the curated assessment; empty when recovery has not been assessed.","items":{"type":"object","description":"A citation supporting a curated recovery assessment.","required":["url","title","published","quote"],"properties":{"url":{"type":"string","format":"uri","description":"Link to the source (https only).","example":"https://www.bankless.com/read/news/elixir-launches-usdc-recovery-portal-for-lenders-impacted-by-stream-insolvency","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].url","typeLabel":"string\u003curi>"},"title":{"oneOf":[{"type":"string","description":"Title of the source.","example":"Elixir launches USDC recovery portal for lenders impacted by Stream insolvency (Bankless)","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].title.oneOf.0","typeLabel":"string"},{"type":"null","description":"Title of the source.","example":"Elixir launches USDC recovery portal for lenders impacted by Stream insolvency (Bankless)","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].title.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].title","typeLabel":"string | null"},"published":{"oneOf":[{"type":"string","format":"date","description":"Publication date of the source (YYYY-MM-DD).","example":"2026-03-17","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].published.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Publication date of the source (YYYY-MM-DD).","example":"2026-03-17","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].published.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].published","typeLabel":"string\u003cdate> | null"},"quote":{"oneOf":[{"type":"string","description":"Verbatim quote from the source that supports the assessment.","example":"an approximately 80% recovery rate for users who lent against its deUSD and sdeUSD","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].quote.oneOf.0","typeLabel":"string"},{"type":"null","description":"Verbatim quote from the source that supports the assessment.","example":"an approximately 80% recovery rate for users who lent against its deUSD and sdeUSD","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].quote.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX].quote","typeLabel":"string | null"}},"uniqueKey":"metadata.impairment_state.oneOf.0.sources.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.sources","typeLabel":"object[]"},"event_date":{"oneOf":[{"type":"string","format":"date","description":"Date of the loss event (YYYY-MM-DD), for curated assessments.","example":"2025-11-06","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.event_date.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Date of the loss event (YYYY-MM-DD), for curated assessments.","example":"2025-11-06","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.event_date.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.event_date","typeLabel":"string\u003cdate> | null"},"assessment_as_of":{"oneOf":[{"type":"string","format":"date","description":"Date the curated assessment was last checked (YYYY-MM-DD).","example":"2026-11-10","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.assessment_as_of.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Date the curated assessment was last checked (YYYY-MM-DD).","example":"2026-11-10","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.assessment_as_of.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.assessment_as_of","typeLabel":"string\u003cdate> | null"},"as_of":{"oneOf":[{"type":"string","format":"date-time","description":"When the impairment was computed (ISO 8601, UTC).","example":"2026-11-10T17:19:39Z","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.as_of.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the impairment was computed (ISO 8601, UTC).","example":"2026-11-10T17:19:39Z","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.as_of.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.as_of","typeLabel":"string\u003cdate-time> | null"},"method":{"oneOf":[{"type":"string","description":"Version of the impairment method.","example":"impairment_state_v1","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.method.oneOf.0","typeLabel":"string"},{"type":"null","description":"Version of the impairment method.","example":"impairment_state_v1","isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.method.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.impairment_state.oneOf.0.method","typeLabel":"string | null"}},"uniqueKey":"metadata.impairment_state.oneOf.0","typeLabel":"object"},{"type":"null","description":"For a vault that has already realized a material loss (at least 3% of its net asset value, measured, not forecast): the loss and, where assessed, its recovery prospect on the S\u0026P Vault Risk Assessment impaired scale. CCC = impaired, a credible remediation is expected to restore a material part of assets within a reasonable time; CC = materially impaired, recovery depends on uncertain, legal or insolvency proceedings; D = permanently impaired, no credible path to recovery. A letter is published only from a sourced, curated assessment and is never guessed: an impaired vault without one has state null and state_reason recovery_not_assessed. Returned as metadata.impairment_state on the vault list item and on v2/v3 vault detail; null when the vault is not impaired (or the data predates this field). Informational and separate from the forward-looking score: the vault's score, tier and letter grade do not read it.","required":["impaired","state","state_label","state_reason","realized_loss_pct","realized_loss_usd","loss_usd_unavailable_reason","trigger","triggers","recovery_rationale","sources","event_date","assessment_as_of","as_of","method"],"properties":{"impaired":{"type":"boolean","enum":[true],"description":"Always true; a vault that is not impaired has impairment_state null.","example":true},"state":{"oneOf":[{"type":"string","enum":["CCC","CC","D",null],"description":"Recovery prospect: CCC, CC or D (see the object description). Null when recovery has not been assessed. Treat any other value as not assessed.","example":"D"},{"type":"null","enum":["CCC","CC","D",null],"description":"Recovery prospect: CCC, CC or D (see the object description). Null when recovery has not been assessed. Treat any other value as not assessed.","example":"D"}]},"state_label":{"oneOf":[{"type":"string","description":"Plain-language meaning of state; null when state is null.","example":"Permanently impaired: no credible path to recovery"},{"type":"null","description":"Plain-language meaning of state; null when state is null.","example":"Permanently impaired: no credible path to recovery"}]},"state_reason":{"type":"string","enum":["curated","recovery_not_assessed"],"description":"curated when state comes from a sourced assessment; recovery_not_assessed otherwise.","example":"curated"},"realized_loss_pct":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"description":"The headline loss as published: the largest leg's loss as a percent of net asset value, capped at 100. Legs overlap, so this is the largest, not a sum. Taken from the record as published, not recomputed from triggers; null when out of range.","example":100},{"type":"null","minimum":0,"maximum":100,"description":"The headline loss as published: the largest leg's loss as a percent of net asset value, capped at 100. Legs overlap, so this is the largest, not a sum. Taken from the record as published, not recomputed from triggers; null when out of range.","example":100}]},"realized_loss_usd":{"oneOf":[{"type":"number","minimum":0,"description":"The largest leg's loss in USD. Null when not available, with loss_usd_unavailable_reason; it is never estimated from TVL.","example":null},{"type":"null","minimum":0,"description":"The largest leg's loss in USD. Null when not available, with loss_usd_unavailable_reason; it is never estimated from TVL.","example":null}]},"loss_usd_unavailable_reason":{"oneOf":[{"type":"string","description":"Why the USD loss is withheld, e.g. book value inflated by interest accruing on a frozen lending market. Null when realized_loss_usd is published.","example":"book value inflated by interest accruing on a frozen market (TVL growing while nothing is withdrawable)"},{"type":"null","description":"Why the USD loss is withheld, e.g. book value inflated by interest accruing on a frozen lending market. Null when realized_loss_usd is published.","example":"book value inflated by interest accruing on a frozen market (TVL growing while nothing is withdrawable)"}]},"trigger":{"oneOf":[{"type":"string","description":"The headline trigger as published: the kind of the largest leg (the one realized_loss_pct is taken from); same values as triggers[].trigger. Taken from the record as published, not recomputed from triggers.","example":"impaired_collateral"},{"type":"null","description":"The headline trigger as published: the kind of the largest leg (the one realized_loss_pct is taken from); same values as triggers[].trigger. Taken from the record as published, not recomputed from triggers.","example":"impaired_collateral"}]},"triggers":{"type":"array","description":"Every material realized-loss leg, largest first.","items":{"type":"object","description":"One measured realized-loss leg. Legs can overlap (bad debt on a lending market is also the loss on its collateral), so they are never added together. Detail fields that a leg's kind does not carry are null.","required":["trigger","loss_pct","loss_usd","basis","token","collateral_symbol","exposure_usd","live_price_usd","share_price","share_price_source"],"properties":{"trigger":{"type":"string","description":"Kind of loss: recognized_bad_debt (bad debt the lending market has booked against this vault), unrecognized_bad_debt (collateral still marked by its oracle above its live price), share_price_writedown (the vault's share price below its 1.0 starting value), impaired_underlying (the vault's own deposit token has lost its peg), impaired_collateral (lending against, or holding, a token that has lost its peg). New kinds may be added; treat an unrecognised one as a realized loss of unspecified kind.","example":"impaired_collateral"},"loss_pct":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"description":"Loss as a percent of the vault's net asset value, 0 to 100. A loss larger than the vault (e.g. bad debt exceeding net asset value) reads 100.","example":48.67},{"type":"null","minimum":0,"maximum":100,"description":"Loss as a percent of the vault's net asset value, 0 to 100. A loss larger than the vault (e.g. bad debt exceeding net asset value) reads 100.","example":48.67}]},"loss_usd":{"oneOf":[{"type":"number","minimum":0,"description":"Loss in USD; null when not available (see loss_usd_unavailable_reason on the parent object).","example":17448600.74},{"type":"null","minimum":0,"description":"Loss in USD; null when not available (see loss_usd_unavailable_reason on the parent object).","example":17448600.74}]},"basis":{"oneOf":[{"type":"string","description":"How the loss was measured, in plain text.","example":"holds curated impaired token: exposure x (1 - live/$1 peg)"},{"type":"null","description":"How the loss was measured, in plain text.","example":"holds curated impaired token: exposure x (1 - live/$1 peg)"}]},"token":{"oneOf":[{"type":"string","description":"The impaired token as chain:address, for impaired_underlying and impaired_collateral legs.","example":"eth:0x4ba01f22827018b4772cd326c7627fb4956a7c00"},{"type":"null","description":"The impaired token as chain:address, for impaired_underlying and impaired_collateral legs.","example":"eth:0x4ba01f22827018b4772cd326c7627fb4956a7c00"}]},"collateral_symbol":{"oneOf":[{"type":"string","description":"Display symbol of the impaired token. A label only: identify the token by token, since symbols are shared between unrelated tokens.","example":"msUSD"},{"type":"null","description":"Display symbol of the impaired token. A label only: identify the token by token, since symbols are shared between unrelated tokens.","example":"msUSD"}]},"exposure_usd":{"oneOf":[{"type":"number","minimum":0,"description":"USD the vault lends against, or holds in, the impaired token.","example":35847519.21},{"type":"null","minimum":0,"description":"USD the vault lends against, or holds in, the impaired token.","example":35847519.21}]},"live_price_usd":{"oneOf":[{"type":"number","minimum":0,"description":"Live USD price of the impaired token used to measure the loss.","example":0.513255},{"type":"null","minimum":0,"description":"Live USD price of the impaired token used to measure the loss.","example":0.513255}]},"share_price":{"oneOf":[{"type":"number","minimum":0,"description":"The vault's share price, for a share_price_writedown leg.","example":null},{"type":"null","minimum":0,"description":"The vault's share price, for a share_price_writedown leg.","example":null}]},"share_price_source":{"oneOf":[{"type":"string","description":"Where the share price was read, for a share_price_writedown leg.","example":null},{"type":"null","description":"Where the share price was read, for a share_price_writedown leg.","example":null}]}}}},"recovery_rationale":{"oneOf":[{"type":"string","description":"Why the recovery prospect is what it is. Curated assessments only; null otherwise.","example":"Elixir first said it intended to redeem deUSD 1:1 for USDC (November 2025), then settled at an approximately 80% recovery for lenders against deUSD/sdeUSD on Morpho and Euler, paid directly to depositor wallets by its payout contract (eth:0x26acdcb807aacb74afe07a58c9ae0e47e4a15e72) in exchange for releasing all claims. Checked on-chain 2026-11-10: every depositor in this vault at the snapshot was paid on 2026-03-17 (the four ordinary depositors received 78% of their position; the curator's fee wallet, whose shares are mostly fees minted on that accrual, received $9.3k). The settlement is complete and the claims are released, so the remaining ~22% has no path to recovery. The vault itself was never repaid: it still sits 100% in the frozen sdeUSD/USDC market, whose book value keeps accruing interest."},{"type":"null","description":"Why the recovery prospect is what it is. Curated assessments only; null otherwise.","example":"Elixir first said it intended to redeem deUSD 1:1 for USDC (November 2025), then settled at an approximately 80% recovery for lenders against deUSD/sdeUSD on Morpho and Euler, paid directly to depositor wallets by its payout contract (eth:0x26acdcb807aacb74afe07a58c9ae0e47e4a15e72) in exchange for releasing all claims. Checked on-chain 2026-11-10: every depositor in this vault at the snapshot was paid on 2026-03-17 (the four ordinary depositors received 78% of their position; the curator's fee wallet, whose shares are mostly fees minted on that accrual, received $9.3k). The settlement is complete and the claims are released, so the remaining ~22% has no path to recovery. The vault itself was never repaid: it still sits 100% in the frozen sdeUSD/USDC market, whose book value keeps accruing interest."}]},"sources":{"type":"array","description":"Citations for the curated assessment; empty when recovery has not been assessed.","items":{"type":"object","description":"A citation supporting a curated recovery assessment.","required":["url","title","published","quote"],"properties":{"url":{"type":"string","format":"uri","description":"Link to the source (https only).","example":"https://www.bankless.com/read/news/elixir-launches-usdc-recovery-portal-for-lenders-impacted-by-stream-insolvency"},"title":{"oneOf":[{"type":"string","description":"Title of the source.","example":"Elixir launches USDC recovery portal for lenders impacted by Stream insolvency (Bankless)"},{"type":"null","description":"Title of the source.","example":"Elixir launches USDC recovery portal for lenders impacted by Stream insolvency (Bankless)"}]},"published":{"oneOf":[{"type":"string","format":"date","description":"Publication date of the source (YYYY-MM-DD).","example":"2026-03-17"},{"type":"null","format":"date","description":"Publication date of the source (YYYY-MM-DD).","example":"2026-03-17"}]},"quote":{"oneOf":[{"type":"string","description":"Verbatim quote from the source that supports the assessment.","example":"an approximately 80% recovery rate for users who lent against its deUSD and sdeUSD"},{"type":"null","description":"Verbatim quote from the source that supports the assessment.","example":"an approximately 80% recovery rate for users who lent against its deUSD and sdeUSD"}]}}}},"event_date":{"oneOf":[{"type":"string","format":"date","description":"Date of the loss event (YYYY-MM-DD), for curated assessments.","example":"2025-11-06"},{"type":"null","format":"date","description":"Date of the loss event (YYYY-MM-DD), for curated assessments.","example":"2025-11-06"}]},"assessment_as_of":{"oneOf":[{"type":"string","format":"date","description":"Date the curated assessment was last checked (YYYY-MM-DD).","example":"2026-11-10"},{"type":"null","format":"date","description":"Date the curated assessment was last checked (YYYY-MM-DD).","example":"2026-11-10"}]},"as_of":{"oneOf":[{"type":"string","format":"date-time","description":"When the impairment was computed (ISO 8601, UTC).","example":"2026-11-10T17:19:39Z"},{"type":"null","format":"date-time","description":"When the impairment was computed (ISO 8601, UTC).","example":"2026-11-10T17:19:39Z"}]},"method":{"oneOf":[{"type":"string","description":"Version of the impairment method.","example":"impairment_state_v1"},{"type":"null","description":"Version of the impairment method.","example":"impairment_state_v1"}]}},"uniqueKey":"metadata.impairment_state.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.impairment_state","typeLabel":"object | null"},"strategy_class":{"oneOf":[{"type":"string","enum":["crypto_backed_lending","rwa_collateral_lending","tokenized_fund","yield_aggregator","staking_restaking","unclassified"],"description":"The vault's strategy: crypto_backed_lending, rwa_collateral_lending, tokenized_fund, yield_aggregator, staking_restaking or unclassified. New classes may be added; treat an unrecognised value as unclassified. Never guessed: a vault no rule decides reads unclassified. Null on snapshots before this field existed (then all six strategy fields are null). Informational: no score or grade depends on it.","example":"tokenized_fund","uniqueKey":"metadata.strategy_class.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["crypto_backed_lending","rwa_collateral_lending","tokenized_fund","yield_aggregator","staking_restaking","unclassified"],"description":"The vault's strategy: crypto_backed_lending, rwa_collateral_lending, tokenized_fund, yield_aggregator, staking_restaking or unclassified. New classes may be added; treat an unrecognised value as unclassified. Never guessed: a vault no rule decides reads unclassified. Null on snapshots before this field existed (then all six strategy fields are null). Informational: no score or grade depends on it.","example":"tokenized_fund","uniqueKey":"metadata.strategy_class.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.strategy_class","typeLabel":"enum\u003cstring> | null"},"strategy_class_source":{"oneOf":[{"type":"string","description":"Which rule decided it: curated_override, collateral_allocations, protocol_default or none.","example":"protocol_default","uniqueKey":"metadata.strategy_class_source.oneOf.0","typeLabel":"string"},{"type":"null","description":"Which rule decided it: curated_override, collateral_allocations, protocol_default or none.","example":"protocol_default","uniqueKey":"metadata.strategy_class_source.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.strategy_class_source","typeLabel":"string | null"},"strategy_class_note":{"oneOf":[{"type":"string","description":"Why: the RWA share and collateral, the protocol rule, or the override reason.","example":"lagoon vaults","uniqueKey":"metadata.strategy_class_note.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why: the RWA share and collateral, the protocol rule, or the override reason.","example":"lagoon vaults","uniqueKey":"metadata.strategy_class_note.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.strategy_class_note","typeLabel":"string | null"},"strategy_rwa_collateral_pct":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"description":"For a lending vault, the percentage (0-100) of supply lent against a named collateral that is lent against curated RWA collateral. Null when no allocation names a collateral.","example":null,"uniqueKey":"metadata.strategy_rwa_collateral_pct.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"maximum":100,"description":"For a lending vault, the percentage (0-100) of supply lent against a named collateral that is lent against curated RWA collateral. Null when no allocation names a collateral.","example":null,"uniqueKey":"metadata.strategy_rwa_collateral_pct.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.strategy_rwa_collateral_pct","typeLabel":"number | null"},"lending_methodology_applies":{"oneOf":[{"type":"boolean","description":"True for crypto_backed_lending and rwa_collateral_lending. False means the grade comes from the lending model for a vault outside it (S\u0026P's Vault Risk Assessment covers collateral-based lending vaults only); read the grade with lending_methodology_note. Null when strategy_class is null.","example":false,"uniqueKey":"metadata.lending_methodology_applies.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"True for crypto_backed_lending and rwa_collateral_lending. False means the grade comes from the lending model for a vault outside it (S\u0026P's Vault Risk Assessment covers collateral-based lending vaults only); read the grade with lending_methodology_note. Null when strategy_class is null.","example":false,"uniqueKey":"metadata.lending_methodology_applies.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.lending_methodology_applies","typeLabel":"boolean | null"},"lending_methodology_note":{"oneOf":[{"type":"string","description":"The caveat when lending_methodology_applies is false; null when it applies.","example":"Outside the lending methodology (S\u0026P VRA covers collateral-based lending vaults); this grade uses the lending model and should be read with that caveat","uniqueKey":"metadata.lending_methodology_note.oneOf.0","typeLabel":"string"},{"type":"null","description":"The caveat when lending_methodology_applies is false; null when it applies.","example":"Outside the lending methodology (S\u0026P VRA covers collateral-based lending vaults); this grade uses the lending model and should be read with that caveat","uniqueKey":"metadata.lending_methodology_note.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.lending_methodology_note","typeLabel":"string | null"},"under_review":{"oneOf":[{"type":"object","description":"Whether the vault's grade is under review because of an active incident, as a rating agency marks a rating Under Review. Returned as metadata.under_review on the vault list item and on v2/v3 vault detail; null on snapshots before this field existed. A review opens when an incident signal starts (impaired collateral, critical depeg, bad debt, NAV loss, liquidity lock, exploit) and closes 24h after its signals stop, after 14 days, or by an analyst. The grade itself is unchanged: read it as provisional while active is true. Informational: no score or grade depends on it.","required":["active","reasons","since"],"properties":{"active":{"type":"boolean","description":"True while a review is open.","example":true,"isRequired":true,"uniqueKey":"metadata.under_review.oneOf.0.active","typeLabel":"boolean"},"reasons":{"type":"array","items":{"type":"string","uniqueKey":"metadata.under_review.oneOf.0.reasons.items.[INDEX]","typeLabel":"string"},"description":"Why the review is open, e.g. impaired_collateral, collateral_depeg, underlying_depeg, bad_debt, nav_loss, redemption_run. New reasons may be added. Empty when active is false.","example":["impaired_collateral"],"isRequired":true,"uniqueKey":"metadata.under_review.oneOf.0.reasons","typeLabel":"string[]"},"since":{"oneOf":[{"type":"string","format":"date-time","description":"When the open review started (UTC). Null when active is false.","example":"2026-11-02T06:00:00Z","isRequired":true,"uniqueKey":"metadata.under_review.oneOf.0.since.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the open review started (UTC). Null when active is false.","example":"2026-11-02T06:00:00Z","isRequired":true,"uniqueKey":"metadata.under_review.oneOf.0.since.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.under_review.oneOf.0.since","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"metadata.under_review.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"metadata.under_review.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.under_review","typeLabel":"object | null"},"realized_apr_windows":{"oneOf":[{"type":"object","description":"Simple (non-compounded) annualized return per trailing window, keyed like realized_apy_windows (realized_7d, realized_30d, realized_90d), as decimal ratios. A window the share-price history cannot cover is omitted. Null when not measured for this vault.","additionalProperties":{"type":"number","uniqueKey":"metadata.realized_apr_windows.oneOf.0.additionalProperties","typeLabel":"number"},"example":{"realized_7d":0.06166769,"realized_30d":0.06275126,"realized_90d":0.0596941},"uniqueKey":"metadata.realized_apr_windows.oneOf.0","typeLabel":"object"},{"type":"null","description":"Simple (non-compounded) annualized return per trailing window, keyed like realized_apy_windows (realized_7d, realized_30d, realized_90d), as decimal ratios. A window the share-price history cannot cover is omitted. Null when not measured for this vault.","additionalProperties":{"type":"number","uniqueKey":"metadata.realized_apr_windows.oneOf.1.additionalProperties","typeLabel":"number"},"example":{"realized_7d":0.06166769,"realized_30d":0.06275126,"realized_90d":0.0596941},"uniqueKey":"metadata.realized_apr_windows.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.realized_apr_windows","typeLabel":"object | null"},"apy_consensus":{"oneOf":[{"type":"object","description":"Whether the realized APY measured from on-chain share-price reads agrees with Trading Strategy's realized APY for the same window. Returned as metadata.apy_consensus on the vault list item and on v2/v3 vault detail. Present only when the realized figure comes from on-chain reads; null otherwise and on snapshots before this field existed. The published metadata.apy is the on-chain figure in every status, including disputed. Informational: no score or grade depends on it.","required":["status","measure","ts_apy","diff_bp"],"properties":{"status":{"type":"string","enum":["agree","disputed","ts_unavailable"],"description":"agree: the two figures are within tolerance. disputed: they differ by more than the tolerance. ts_unavailable: Trading Strategy has no figure for this window, so nothing was compared.","isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.status","typeLabel":"enum\u003cstring>"},"measure":{"oneOf":[{"type":"string","enum":["realized_7d","realized_30d","realized_90d",null],"description":"The realized window both figures cover: realized_7d, realized_30d or realized_90d. Null if the snapshot names none.","example":"realized_90d","isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.measure.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["realized_7d","realized_30d","realized_90d",null],"description":"The realized window both figures cover: realized_7d, realized_30d or realized_90d. Null if the snapshot names none.","example":"realized_90d","isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.measure.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.measure","typeLabel":"enum\u003cstring> | null"},"ts_apy":{"oneOf":[{"type":"number","description":"Trading Strategy's realized APY for the same window, as a decimal ratio (0.068 = 6.8%). Always null when status is ts_unavailable.","example":0.06826576,"isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.ts_apy.oneOf.0","typeLabel":"number"},{"type":"null","description":"Trading Strategy's realized APY for the same window, as a decimal ratio (0.068 = 6.8%). Always null when status is ts_unavailable.","example":0.06826576,"isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.ts_apy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.ts_apy","typeLabel":"number | null"},"diff_bp":{"oneOf":[{"type":"number","description":"On-chain realized APY minus ts_apy, in basis points (one decimal place); negative when the on-chain figure is lower. Always null when status is ts_unavailable.","example":-72.2,"isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.diff_bp.oneOf.0","typeLabel":"number"},{"type":"null","description":"On-chain realized APY minus ts_apy, in basis points (one decimal place); negative when the on-chain figure is lower. Always null when status is ts_unavailable.","example":-72.2,"isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.diff_bp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.apy_consensus.oneOf.0.diff_bp","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"metadata.apy_consensus.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"metadata.apy_consensus.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.apy_consensus","typeLabel":"object | null"},"apy_backup_for":{"oneOf":[{"type":"string","description":"onchain when the vault's realized yields (realized_apy_windows, and metadata.apy when it is a realized window) come from Trading Strategy, the backup source, because the on-chain share-price read had a data gap; null otherwise. On such a row apy_consensus is null, since there is no on-chain figure to compare. New values may be added.","example":"onchain","uniqueKey":"metadata.apy_backup_for.oneOf.0","typeLabel":"string"},{"type":"null","description":"onchain when the vault's realized yields (realized_apy_windows, and metadata.apy when it is a realized window) come from Trading Strategy, the backup source, because the on-chain share-price read had a data gap; null otherwise. On such a row apy_consensus is null, since there is no on-chain figure to compare. New values may be added.","example":"onchain","uniqueKey":"metadata.apy_backup_for.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.apy_backup_for","typeLabel":"string | null"},"deployments":{"type":"array","description":"One entry per chain deployment of the fund. Each carries its own deposit_status, since a multi-chain fund can be open on one chain and closed on another.","items":{"type":"object","additionalProperties":true,"properties":{"chain":{"type":"string","uniqueKey":"metadata.deployments.items.[INDEX].chain","typeLabel":"string"},"address":{"type":"string","uniqueKey":"metadata.deployments.items.[INDEX].address","typeLabel":"string"},"deposit_status":{"oneOf":[{"type":"object","description":"Whether a new depositor can put money into the vault right now. Returned as metadata.deposit_status on the vault list item and on v2/v3 vault detail, and per deployment under metadata.deployments[].deposit_status (a multi-chain fund can be open on one chain and closed on another; the metadata value describes the representative deployment); null on snapshots before this field existed. Derived from the vault's own signals (pause or shutdown, fund status, protocol supply caps, an on-chain maxDeposit read); never guessed. Informational: no score or grade depends on it.","required":["status","source","reason","capacity_usd","permission"],"example":{"status":"open","source":"lagoon_max_cap","reason":"max_cap_headroom","capacity_usd":2272470.64,"permission":"permissionless"},"properties":{"status":{"type":"string","enum":["open","capped","paused","closed","unknown"],"description":"open; capped (at capacity); paused; closed (deliberately not accepting deposits: shutdown, retired, fund not yet open, supply cap set to zero); unknown (no reliable signal, e.g. Morpho Vault V2 caps are not read yet).","isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.status","typeLabel":"enum\u003cstring>"},"source":{"oneOf":[{"type":"string","description":"Signal that decided the status, e.g. euler_supply_cap, lagoon_max_cap, aave_supply_cap, centrifuge_fund_status, erc4626_max_deposit, yearn_emergency_shutdown. For an unknown status it names the signal that was inconclusive (e.g. euler_supply_cap with reason cap_unverified); null when no signal applied.","example":"lagoon_max_cap","isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.source.oneOf.0","typeLabel":"string"},{"type":"null","description":"Signal that decided the status, e.g. euler_supply_cap, lagoon_max_cap, aave_supply_cap, centrifuge_fund_status, erc4626_max_deposit, yearn_emergency_shutdown. For an unknown status it names the signal that was inconclusive (e.g. euler_supply_cap with reason cap_unverified); null when no signal applied.","example":"lagoon_max_cap","isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.source","typeLabel":"string | null"},"reason":{"oneOf":[{"type":"string","description":"Machine-readable detail, e.g. fund_upcoming, supply_cap_zero, shutdown, max_cap_headroom, no_max_cap, cap_headroom_99.8pct.","example":"max_cap_headroom","isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Machine-readable detail, e.g. fund_upcoming, supply_cap_zero, shutdown, max_cap_headroom, no_max_cap, cap_headroom_99.8pct.","example":"max_cap_headroom","isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.reason","typeLabel":"string | null"},"capacity_usd":{"oneOf":[{"type":"number","minimum":0,"description":"Remaining deposit capacity in USD when measurable; 0 when capped; null when unlimited or unknown.","example":2272470.64,"isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.capacity_usd.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Remaining deposit capacity in USD when measurable; 0 when capped; null when unlimited or unknown.","example":2272470.64,"isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.capacity_usd.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.capacity_usd","typeLabel":"number | null"},"permission":{"type":"string","enum":["permissionless","permissioned","unknown"],"description":"Who may deposit. permissionless only from a verified source (a Morpho Vault V2 deposit gate set to the zero address, or a Lagoon vault with whitelisting off); permissioned for KYC-gated pools (Centrifuge), allow-lists or a deposit gate contract.","isRequired":true,"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0.permission","typeLabel":"enum\u003cstring>"}},"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"metadata.deployments.items.[INDEX].deposit_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata.deployments.items.[INDEX].deposit_status","typeLabel":"object | null"}},"uniqueKey":"metadata.deployments.items.[INDEX]","typeLabel":"object"},"uniqueKey":"metadata.deployments","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"metadata","typeLabel":"object"},"composite":{"type":"object","description":"Headline grade block. POLARITY (load-bearing): `score` is 0–100, HIGHER = WORSE (A+ = 0, F = 100) — same direction as the v2 `risk.score` on the same response. `score = max(Σ contributors·weight, upstream_risk)`: floored from below by the upstream pipeline risk.","properties":{"grading_scheme":{"type":"string","example":"v1","isRequired":true,"uniqueKey":"composite.grading_scheme","typeLabel":"string"},"grade":{"oneOf":[{"type":"string","description":"Letter grade. `null` only for an unrated vault (`rated: false`).","enum":["A+","A","A-","B+","B","B-","C","C-","D","E","F"],"isRequired":true,"uniqueKey":"composite.grade.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Letter grade. `null` only for an unrated vault (`rated: false`).","enum":["A+","A","A-","B+","B","B-","C","C-","D","E","F"],"isRequired":true,"uniqueKey":"composite.grade.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"composite.grade","typeLabel":"enum\u003cstring> | null"},"stars":{"oneOf":[{"type":"integer","description":"1–5 stars. `null` only for an unrated vault (`rated: false`).","minimum":1,"maximum":5,"isRequired":true,"uniqueKey":"composite.stars.oneOf.0","typeLabel":"integer"},{"type":"null","description":"1–5 stars. `null` only for an unrated vault (`rated: false`).","minimum":1,"maximum":5,"isRequired":true,"uniqueKey":"composite.stars.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"composite.stars","typeLabel":"integer | null"},"score":{"oneOf":[{"type":"number","description":"0–100, higher = worse; rounded to one decimal. `null` only for an unrated vault (`rated: false`).","isRequired":true,"uniqueKey":"composite.score.oneOf.0","typeLabel":"number"},{"type":"null","description":"0–100, higher = worse; rounded to one decimal. `null` only for an unrated vault (`rated: false`).","isRequired":true,"uniqueKey":"composite.score.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"composite.score","typeLabel":"number | null"},"contributors":{"type":"object","description":"Dense map: every WebacyCategory key is present.","additionalProperties":{"type":"object","description":"One row of `composite.contributors`: a category's resolved score and its weight under the current grading scheme.","properties":{"score":{"type":"number","description":"0–100, higher = worse. Integer.","isRequired":true,"uniqueKey":"composite.contributors.additionalProperties.score","typeLabel":"number"},"weight":{"type":"number","description":"Effective category weight. Sums to 1 across categories, except under a renormalising preview scheme when no positively weighted category is assessed, where every weight is 0. Under the default and other served grading schemes this is the scheme's declared weight. Under the preview schemes that renormalise, a category with `assessed: false` carries 0 and the remaining weights are rescaled proportionally.","isRequired":true,"uniqueKey":"composite.contributors.additionalProperties.weight","typeLabel":"number"},"weighted_contribution":{"type":"number","description":"Points this category adds to the framework composite — `score × weight`, rounded to one decimal. The rounded sum across contributors approximates the framework composite (each contribution is rounded independently).","uniqueKey":"composite.contributors.additionalProperties.weighted_contribution","typeLabel":"number"}},"required":["score","weight"],"uniqueKey":"composite.contributors.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"composite.contributors","typeLabel":"object"},"upstream_risk":{"oneOf":[{"type":"number","description":"Verbatim upstream pipeline risk (0–100, higher = worse). Acts as a lower bound on `score`. `null` when there is no upstream score (data-only vaults, e.g. Kamino on Solana awaiting native scoring) — in that case no upstream floor is applied. Guard against null before formatting.","isRequired":true,"uniqueKey":"composite.upstream_risk.oneOf.0","typeLabel":"number"},{"type":"null","description":"Verbatim upstream pipeline risk (0–100, higher = worse). Acts as a lower bound on `score`. `null` when there is no upstream score (data-only vaults, e.g. Kamino on Solana awaiting native scoring) — in that case no upstream floor is applied. Guard against null before formatting.","isRequired":true,"uniqueKey":"composite.upstream_risk.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"composite.upstream_risk","typeLabel":"number | null"},"clamped_by_upstream":{"type":"boolean","description":"true iff upstream_risk exceeded the framework composite and pulled `score` up.","isRequired":true,"uniqueKey":"composite.clamped_by_upstream","typeLabel":"boolean"},"score_source":{"type":"string","enum":["framework","upstream","floor","unrated"],"description":"What set the emitted `score`: `framework` when the v3 weighted composite won, `upstream` when the pipeline floor did (equivalent to `clamped_by_upstream`), `floor` when a hard guardrail floor did (a critical red flag such as a critical depeg, an exit recommendation or effectively-locked liquidity), or `unrated` for an unrated vault (`rated: false`), which has no score. When `upstream` or `floor`, `drivers` can be empty even on a bad grade.","uniqueKey":"composite.score_source","typeLabel":"enum\u003cstring>"},"rated":{"type":"boolean","description":"Vault composites only. `false` when the vault has not been assessed (no upstream risk score and no guardrail floor): `grade`, `score` and `stars` are `null` and `score_source` is `unrated`. Render it as Unrated, never as a grade. `true` for every graded vault. Not present on RWA or stablecoin composites.","uniqueKey":"composite.rated","typeLabel":"boolean"},"drivers":{"type":"array","description":"Ranked subcategory drivers of the grade (descending by `weighted_contribution`), each with the warn/fail criteria and evidence that drove it. Detail endpoints only (`GET /v3/vaults/{address}`, `GET /v3/rwa/{address}`); batch/list omit it. Read with `drivers_complete`: an empty `[]` is only a clean grade when `drivers_complete` is true.","items":{"type":"object","description":"One ranked subcategory driver of the grade (descending by `weighted_contribution`), with the warn/fail criteria that drove it. NOTE: for RWA, `criteria` are descriptive context, not a numeric decomposition of `score` (RWA category scores come from inverted v2 pillars, not criterion penalties).","properties":{"category":{"type":"string","example":"market_liquidity","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].category","typeLabel":"string"},"category_name":{"type":"string","example":"Market \u0026 liquidity","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].category_name","typeLabel":"string"},"score":{"type":"number","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].score","typeLabel":"number"},"weight":{"type":"number","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].weight","typeLabel":"number"},"weighted_contribution":{"type":"number","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].weighted_contribution","typeLabel":"number"},"criteria":{"type":"array","items":{"type":"object","description":"One non-pass criterion inside a composite driver — the specific warn/fail check that pulled a subcategory's score up, with the evidence behind it.","properties":{"key":{"type":"string","example":"large_holder_concentration","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].criteria.items.[INDEX].key","typeLabel":"string"},"name":{"type":"string","example":"Large-holder concentration bounded","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].criteria.items.[INDEX].name","typeLabel":"string"},"status":{"type":"string","enum":["warn","fail"],"isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].criteria.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"assessed":{"type":"boolean","description":"`false` = an unverified missing-data `warn` listed for completeness, not a finding driving the grade.","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].criteria.items.[INDEX].assessed","typeLabel":"boolean"},"evidence":{"type":"object","description":"Underlying values behind the verdict, when available.","additionalProperties":true,"example":{"hci_10":0.34},"uniqueKey":"composite.drivers.items.[INDEX].criteria.items.[INDEX].evidence","typeLabel":"object"}},"required":["key","name","status","assessed"],"uniqueKey":"composite.drivers.items.[INDEX].criteria.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].criteria","typeLabel":"object[]"},"reasons":{"type":"array","items":{"type":"object","description":"One plain-language reason behind a category score.","properties":{"key":{"type":"string","description":"The criterion key; or `baseline` when an RWA category's underlying risk-model pillar alone rates it medium risk or worse; or `credit` for an RWA audit or trusted-issuer credit that lowered a score that has other reasons.","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX].key","typeLabel":"string"},"status":{"type":"string","enum":["pass","warn","fail"],"description":"The criterion's status. `pass` only on a `credit`. A `baseline` reads `warn` at medium (≥ 25) and `fail` at high (≥ 50).","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"Short, vendor-neutral, sentence-case reason, e.g. \"Owner is an EOA (not a multisig)\" or \"Very low utilisation (idle capital)\". Vault reasons are phrased for the risk flag that fired (schema 3.11; earlier versions served the flag name).","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX].text","typeLabel":"string"},"points":{"oneOf":[{"type":"number","description":"What this reason adds to `score`. Vaults: exact, 25 per fail and 10 per warn, before the 100 cap. RWA: `null` for a failing criterion (failures fold in jointly), 0 for a measured warn, the pillar value for a `baseline` that set the score (0 when failures set it), negative for `credit`. Summing reasons reproduces the score for vaults only; an RWA score is max(baseline, failures) minus credits.","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX].points.oneOf.0","typeLabel":"number"},{"type":"null","description":"What this reason adds to `score`. Vaults: exact, 25 per fail and 10 per warn, before the 100 cap. RWA: `null` for a failing criterion (failures fold in jointly), 0 for a measured warn, the pillar value for a `baseline` that set the score (0 when failures set it), negative for `credit`. Summing reasons reproduces the score for vaults only; an RWA score is max(baseline, failures) minus credits.","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX].points.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX].points","typeLabel":"number | null"},"assessed":{"type":"boolean","description":"Same as the criterion's `assessed`; always true for `baseline` and `credit`.","isRequired":true,"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX].assessed","typeLabel":"boolean"}},"required":["key","status","text","points","assessed"],"uniqueKey":"composite.drivers.items.[INDEX].reasons.items.[INDEX]","typeLabel":"object"},"description":"Detail responses only (schema 3.10). The same plain-language reasons as `categories[category].reasons` (the whole list, including an RWA `credit`), so a driver and its category give one explanation. Optional: absent where the categories carry no `reasons`; `[]` where the category has nothing to explain.","uniqueKey":"composite.drivers.items.[INDEX].reasons","typeLabel":"object[]"}},"required":["category","category_name","score","weight","weighted_contribution","criteria"],"uniqueKey":"composite.drivers.items.[INDEX]","typeLabel":"object"},"uniqueKey":"composite.drivers","typeLabel":"object[]"},"drivers_complete":{"type":"boolean","description":"Whether `drivers` is the complete explanation of the grade. `true` (framework-sourced) ⇒ `drivers` fully attribute it and `[]` means a genuinely clean grade. `false` (upstream-clamped) ⇒ `drivers` reflect only the framework sub-signal and can be empty even on a bad grade — render `upstream_risk`, not \"no risk\". Detail endpoints only, alongside `drivers`.","uniqueKey":"composite.drivers_complete","typeLabel":"boolean"}},"required":["grading_scheme","grade","stars","score","contributors","upstream_risk","clamped_by_upstream"],"isRequired":true,"uniqueKey":"composite","typeLabel":"object"},"categories":{"type":"object","additionalProperties":{"type":"object","description":"A Webacy-native category. `score` is 0–100, HIGHER = WORSE (risk-magnitude; A+ = 0, F = 100). Categories with no live criteria emit `{ score: 0, assessed: false, criteria: {} }`.","properties":{"score":{"type":"number","description":"0–100, higher = worse. Integer in practice. Read with `assessed`: a not-assessed category serves 0, which then means \"not assessed\", not \"no risk\".","isRequired":true,"uniqueKey":"categories.additionalProperties.score","typeLabel":"number"},"assessed":{"type":"boolean","description":"`false` when nothing in the category was measured (no criterion with `assessed: true` and no upstream pillar behind the score). Under the default and other served grading schemes the composite still averages it in at its declared weight (grades unchanged). Under the preview schemes that renormalise, it is dropped from the weighted average and its contributor carries `weight: 0`.","isRequired":true,"uniqueKey":"categories.additionalProperties.assessed","typeLabel":"boolean"},"criteria":{"type":"object","additionalProperties":{"type":"object","description":"One graded criterion: pass/warn/fail verdict, human-readable label, provenance, and the underlying values behind the verdict.","properties":{"status":{"type":"string","enum":["pass","warn","fail"],"isRequired":true,"uniqueKey":"categories.additionalProperties.criteria.additionalProperties.status","typeLabel":"enum\u003cstring>"},"data_quality":{"type":"object","description":"Provenance envelope on every emitted v3 criterion. Vault criteria currently report vault-level freshness uniformly; RWA / stablecoin criteria report true per-source values.","properties":{"confidence":{"type":"number","description":"0–1 confidence in the underlying data point.","example":0.95,"isRequired":true,"uniqueKey":"categories.additionalProperties.criteria.additionalProperties.data_quality.confidence","typeLabel":"number"},"last_observed_at":{"type":"string","format":"date-time","description":"Upstream observation timestamp.","isRequired":true,"uniqueKey":"categories.additionalProperties.criteria.additionalProperties.data_quality.last_observed_at","typeLabel":"string\u003cdate-time>"},"source":{"type":"string","example":"rwa-grade-pipeline","isRequired":true,"uniqueKey":"categories.additionalProperties.criteria.additionalProperties.data_quality.source","typeLabel":"string"}},"required":["confidence","last_observed_at","source"],"isRequired":true,"uniqueKey":"categories.additionalProperties.criteria.additionalProperties.data_quality","typeLabel":"object"},"assessed":{"type":"boolean","description":"`false` when the verdict is a missing-data default, not a measurement: no source value was available, so nothing was measured and the criterion is not counted in `coverage.measured_criteria`. Such a criterion usually reads `warn` (\"unverified\"), but can read `pass` where the absence of a signal is the default verdict (e.g. a chain criterion with no current chain-risk data). `true` when a value drove `status`. Branch on this field, never on `status`.","isRequired":true,"uniqueKey":"categories.additionalProperties.criteria.additionalProperties.assessed","typeLabel":"boolean"},"name":{"type":"string","description":"Human-readable criterion label, mirrored from the framework taxonomy.","example":"Large-holder concentration bounded","uniqueKey":"categories.additionalProperties.criteria.additionalProperties.name","typeLabel":"string"},"evidence":{"type":"object","description":"Underlying values behind the verdict — the actual risk numbers (e.g. `{ hci_10: 0.34 }`, `{ looping_rate: 0.82 }`, `{ audit_count: 1, auditor_tier: \"mid\" }`). For tag-driven vault criteria with no numeric field, a non-pass verdict carries `{ triggered_by_tag: \u003ctag> }`. Omitted when no value is available.","additionalProperties":true,"example":{"hci_10":0.34},"uniqueKey":"categories.additionalProperties.criteria.additionalProperties.evidence","typeLabel":"object"}},"required":["status","data_quality","assessed"],"uniqueKey":"categories.additionalProperties.criteria.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"categories.additionalProperties.criteria","typeLabel":"object"},"tier":{"type":"string","enum":["unknown","low","medium","high","critical"],"description":"Detail responses only. Risk band of `score` with inclusive bounds: ≥ 75 critical, ≥ 50 high, ≥ 25 medium, else low. `unknown` when `assessed` is false or the vault is unrated.","uniqueKey":"categories.additionalProperties.tier","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Detail responses only. What the category measures (the methodology copy, also served by `/api/v3/framework`).","uniqueKey":"categories.additionalProperties.description","typeLabel":"string"},"reasons":{"type":"array","items":{"type":"object","description":"One plain-language reason behind a category score.","properties":{"key":{"type":"string","description":"The criterion key; or `baseline` when an RWA category's underlying risk-model pillar alone rates it medium risk or worse; or `credit` for an RWA audit or trusted-issuer credit that lowered a score that has other reasons.","isRequired":true,"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX].key","typeLabel":"string"},"status":{"type":"string","enum":["pass","warn","fail"],"description":"The criterion's status. `pass` only on a `credit`. A `baseline` reads `warn` at medium (≥ 25) and `fail` at high (≥ 50).","isRequired":true,"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"Short, vendor-neutral, sentence-case reason, e.g. \"Owner is an EOA (not a multisig)\" or \"Very low utilisation (idle capital)\". Vault reasons are phrased for the risk flag that fired (schema 3.11; earlier versions served the flag name).","isRequired":true,"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX].text","typeLabel":"string"},"points":{"oneOf":[{"type":"number","description":"What this reason adds to `score`. Vaults: exact, 25 per fail and 10 per warn, before the 100 cap. RWA: `null` for a failing criterion (failures fold in jointly), 0 for a measured warn, the pillar value for a `baseline` that set the score (0 when failures set it), negative for `credit`. Summing reasons reproduces the score for vaults only; an RWA score is max(baseline, failures) minus credits.","isRequired":true,"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX].points.oneOf.0","typeLabel":"number"},{"type":"null","description":"What this reason adds to `score`. Vaults: exact, 25 per fail and 10 per warn, before the 100 cap. RWA: `null` for a failing criterion (failures fold in jointly), 0 for a measured warn, the pillar value for a `baseline` that set the score (0 when failures set it), negative for `credit`. Summing reasons reproduces the score for vaults only; an RWA score is max(baseline, failures) minus credits.","isRequired":true,"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX].points.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX].points","typeLabel":"number | null"},"assessed":{"type":"boolean","description":"Same as the criterion's `assessed`; always true for `baseline` and `credit`.","isRequired":true,"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX].assessed","typeLabel":"boolean"}},"required":["key","status","text","points","assessed"],"uniqueKey":"categories.additionalProperties.reasons.items.[INDEX]","typeLabel":"object"},"description":"Detail responses only. Why the category scores what it does, biggest driver first. Empty for a clean or not-assessed category. Lists the non-pass criteria that were measured or that move the score; an unverified RWA criterion moves nothing and stays in `criteria` only.","uniqueKey":"categories.additionalProperties.reasons","typeLabel":"object[]"}},"required":["score","assessed","criteria"],"uniqueKey":"categories.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"categories","typeLabel":"object"},"coverage":{"type":"object","description":"How many criteria are live today vs defined by the framework — so what the grade reflects is on the wire, not just in docs. `live` / `total` describe the framework; on the RWA / stablecoin detail response `measured_criteria` / `per_category[*].measured` add the per-asset count of criteria that produced a measurement (`assessed: true`), excluding unverified ones.","properties":{"framework_version":{"type":"string","example":"v1","isRequired":true,"uniqueKey":"coverage.framework_version","typeLabel":"string"},"total_criteria":{"type":"integer","isRequired":true,"uniqueKey":"coverage.total_criteria","typeLabel":"integer"},"live_criteria":{"type":"integer","isRequired":true,"uniqueKey":"coverage.live_criteria","typeLabel":"integer"},"per_category":{"type":"object","additionalProperties":{"type":"object","properties":{"live":{"type":"integer","isRequired":true,"uniqueKey":"coverage.per_category.additionalProperties.live","typeLabel":"integer"},"total":{"type":"integer","isRequired":true,"uniqueKey":"coverage.per_category.additionalProperties.total","typeLabel":"integer"},"measured":{"type":"integer","description":"RWA / stablecoin detail only: how many of `live` produced a measurement for this asset (`assessed: true`); unverified criteria are excluded. Absent on taxonomy-only coverage.","uniqueKey":"coverage.per_category.additionalProperties.measured","typeLabel":"integer"}},"required":["live","total"],"uniqueKey":"coverage.per_category.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"coverage.per_category","typeLabel":"object"},"measured_criteria":{"type":"integer","description":"RWA / stablecoin detail only: Σ `per_category[*].measured` — live criteria measured for this asset.","uniqueKey":"coverage.measured_criteria","typeLabel":"integer"}},"required":["framework_version","total_criteria","live_criteria","per_category"],"isRequired":true,"uniqueKey":"coverage","typeLabel":"object"},"risk":{"type":"object","description":"Pass-through v2 risk envelope (overallRisk etc.).","additionalProperties":true,"isRequired":true,"uniqueKey":"risk","typeLabel":"object"}},"required":["schema_version","metadata","composite","categories","coverage","risk"],"uniqueKey":"","typeLabel":"object"},"example":{"schema_version":"3.0","metadata":{"address":"0xD50DA5F859811A91fD1876C9461fD39c23C747Ad","chain":"eth","name":"MEV Capital Resolv USR","symbol":"MC-USR","lender_concentration":{"hhi":0.18,"risk_band":"low","participant_count":42,"top10_share_pct":55.2,"top30_share_pct":78.1,"top_participants":[{"address":"0x1111111111111111111111111111111111111111","share_pct":12.3}]},"borrower_concentration":{"hhi":0.31,"risk_band":"medium","participant_count":17,"top10_share_pct":71.4,"top30_share_pct":92,"top_participants":[{"address":"0x2222222222222222222222222222222222222222","share_pct":22.6}]},"curator_concentration":{"hhi":0.29,"risk_band":"medium","market_count":12,"top10_share_pct":61,"top30_share_pct":88.4,"top_markets":[{"market_key":"8453-0x9103da5da5c9f9b6e4bda4b2f8f3f0e1d2c3b4a5","label":"cbBTC/USDC","share_pct":20.1}],"total_supply_usd":1234567890,"vault_count":8,"curator":"0x3333333333333333333333333333333333333333"},"protocol_dependency_concentration":{"hhi":0.42,"risk_band":"high","collateral_count":7,"top10_share_pct":88.1,"top30_share_pct":99,"top_collateral":[{"collateral":"eth:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","collateral_symbol":"WBTC","share_pct":61.2},{"collateral":"eth:0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","collateral_symbol":"WETH","share_pct":22}],"total_supply_usd":1250000000,"resolved_supply_usd":1180000000,"coverage_pct":94.4,"partial":false,"vault_count":24,"protocol":"morpho"},"incentives":null,"deposit_status":{"status":"open","source":"erc4626_max_deposit","reason":"cap_headroom_42.1pct","capacity_usd":1250000,"permission":"permissionless"},"fees":{"apy_after_fees":0.0419,"apy_before_fees":0.0466,"fee_gap_reason":null,"fee_treatment":"in_share_price","fee_model":{"performance_bps":1000,"management_bps":0,"entry_bps":null,"exit_bps":null,"source":"morpho_api","management_source":"protocol_design","method":"fee_model_v1"}},"realized_apr_windows":{"realized_7d":0.06079078,"realized_30d":0.0626949,"realized_90d":0.05970668},"apy_consensus":{"status":"disputed","measure":"realized_90d","ts_apy":0.06826576,"diff_bp":-72},"apy_backup_for":null,"flow_terms":{"deposit_flow":"async","redemption_flow":"async","settlement_seconds":172800,"lockup_seconds":null,"source":"lagoon_api"},"impairment_state":null,"yield_risk":{"as_of":"2026-11-04","methodology_version":"yield-risk-v1.0.0","days_underwater":182,"bad_prints_dropped":0,"windows":{"30d":{"status":"refused","refusal_reason":"insufficient_history","start":null,"end":null,"observations":25,"coverage":null,"realized_apy":null,"realized_apy_null_reason":null,"volatility":null,"max_drawdown":null,"days_underwater_max":null,"negative_days":null,"gap_days":null,"tbill_apy":null,"excess_return":null,"sharpe":null,"sortino":null,"ratio_null_reason":null},"90d":{"status":"ok","refusal_reason":null,"start":"2026-08-06","end":"2026-11-04","observations":85,"coverage":0.9444,"realized_apy":-0.00167574,"realized_apy_null_reason":null,"volatility":0.19897299,"max_drawdown":-0.08252973,"days_underwater_max":46,"negative_days":2,"gap_days":0,"tbill_apy":0.039575,"excess_return":-0.04125036,"sharpe":-0.2073,"sortino":-0.239,"ratio_null_reason":null},"180d":{"status":"ok","refusal_reason":null,"start":"2026-05-08","end":"2026-11-04","observations":175,"coverage":0.9722,"realized_apy":0.00109994,"realized_apy_null_reason":null,"volatility":0.13825246,"max_drawdown":-0.08252973,"days_underwater_max":46,"negative_days":2,"gap_days":0,"tbill_apy":0.037414,"excess_return":-0.03631429,"sharpe":-0.2627,"sortino":-0.3019,"ratio_null_reason":null},"365d":{"status":"ok","refusal_reason":null,"start":"2025-11-04","end":"2026-11-04","observations":360,"coverage":0.9863,"realized_apy":0.00852387,"realized_apy_null_reason":null,"volatility":0.10610133,"max_drawdown":-0.11623574,"days_underwater_max":182,"negative_days":4,"gap_days":0,"tbill_apy":0.040193,"excess_return":-0.03166863,"sharpe":-0.2985,"sortino":-0.3408,"ratio_null_reason":null}}},"strategy_class":"crypto_backed_lending","strategy_class_source":"collateral_allocations","strategy_class_note":"0% of supply lent against collateral is RWA collateral","strategy_rwa_collateral_pct":0,"lending_methodology_applies":true,"lending_methodology_note":null,"under_review":{"active":false,"reasons":[],"since":null}},"composite":{"grading_scheme":"v1","grade":"F","stars":1,"score":98.5,"contributors":{"smart_contract":{"score":0,"weight":0.2,"weighted_contribution":0},"operational_governance":{"score":0,"weight":0.2,"weighted_contribution":0},"asset_collateral":{"score":10,"weight":0.15,"weighted_contribution":1.5},"market_liquidity":{"score":35,"weight":0.2,"weighted_contribution":7},"counterparty":{"score":0,"weight":0.1,"weighted_contribution":0},"hack_exploit_history":{"score":0,"weight":0.15,"weighted_contribution":0},"chain_infrastructure":{"score":0,"weight":0,"weighted_contribution":0}},"upstream_risk":98.5,"clamped_by_upstream":true,"score_source":"upstream","drivers_complete":false,"drivers":[{"category":"market_liquidity","category_name":"Market \u0026 liquidity","score":35,"weight":0.2,"weighted_contribution":7,"criteria":[{"key":"large_holder_concentration","name":"Large-holder concentration bounded","status":"warn","evidence":{"hci_10":0.34}}]}]},"categories":{"smart_contract":{"score":0,"criteria":{"contract_verified":{"name":"Contract verified on explorer","status":"pass","data_quality":{"confidence":0.95,"last_observed_at":"2026-06-02T09:49:36Z","source":"rwa-grade-pipeline"}}}},"market_liquidity":{"score":35,"criteria":{"large_holder_concentration":{"name":"Large-holder concentration bounded","status":"warn","data_quality":{"confidence":0.95,"last_observed_at":"2026-06-02T09:49:36Z","source":"rwa-grade-pipeline"},"evidence":{"hci_10":0.34}}}}},"coverage":{"framework_version":"v1","total_criteria":42,"live_criteria":28,"per_category":{"smart_contract":{"live":6,"total":8}}},"risk":{"overallRisk":98.5}},"examples":{"Example":{"title":"Example","value":{"schema_version":"3.0","metadata":{"address":"0xD50DA5F859811A91fD1876C9461fD39c23C747Ad","chain":"eth","name":"MEV Capital Resolv USR","symbol":"MC-USR","lender_concentration":{"hhi":0.18,"risk_band":"low","participant_count":42,"top10_share_pct":55.2,"top30_share_pct":78.1,"top_participants":[{"address":"0x1111111111111111111111111111111111111111","share_pct":12.3}]},"borrower_concentration":{"hhi":0.31,"risk_band":"medium","participant_count":17,"top10_share_pct":71.4,"top30_share_pct":92,"top_participants":[{"address":"0x2222222222222222222222222222222222222222","share_pct":22.6}]},"curator_concentration":{"hhi":0.29,"risk_band":"medium","market_count":12,"top10_share_pct":61,"top30_share_pct":88.4,"top_markets":[{"market_key":"8453-0x9103da5da5c9f9b6e4bda4b2f8f3f0e1d2c3b4a5","label":"cbBTC/USDC","share_pct":20.1}],"total_supply_usd":1234567890,"vault_count":8,"curator":"0x3333333333333333333333333333333333333333"},"protocol_dependency_concentration":{"hhi":0.42,"risk_band":"high","collateral_count":7,"top10_share_pct":88.1,"top30_share_pct":99,"top_collateral":[{"collateral":"eth:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","collateral_symbol":"WBTC","share_pct":61.2},{"collateral":"eth:0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","collateral_symbol":"WETH","share_pct":22}],"total_supply_usd":1250000000,"resolved_supply_usd":1180000000,"coverage_pct":94.4,"partial":false,"vault_count":24,"protocol":"morpho"},"incentives":null,"deposit_status":{"status":"open","source":"erc4626_max_deposit","reason":"cap_headroom_42.1pct","capacity_usd":1250000,"permission":"permissionless"},"fees":{"apy_after_fees":0.0419,"apy_before_fees":0.0466,"fee_gap_reason":null,"fee_treatment":"in_share_price","fee_model":{"performance_bps":1000,"management_bps":0,"entry_bps":null,"exit_bps":null,"source":"morpho_api","management_source":"protocol_design","method":"fee_model_v1"}},"realized_apr_windows":{"realized_7d":0.06079078,"realized_30d":0.0626949,"realized_90d":0.05970668},"apy_consensus":{"status":"disputed","measure":"realized_90d","ts_apy":0.06826576,"diff_bp":-72},"apy_backup_for":null,"flow_terms":{"deposit_flow":"async","redemption_flow":"async","settlement_seconds":172800,"lockup_seconds":null,"source":"lagoon_api"},"impairment_state":null,"yield_risk":{"as_of":"2026-11-04","methodology_version":"yield-risk-v1.0.0","days_underwater":182,"bad_prints_dropped":0,"windows":{"30d":{"status":"refused","refusal_reason":"insufficient_history","start":null,"end":null,"observations":25,"coverage":null,"realized_apy":null,"realized_apy_null_reason":null,"volatility":null,"max_drawdown":null,"days_underwater_max":null,"negative_days":null,"gap_days":null,"tbill_apy":null,"excess_return":null,"sharpe":null,"sortino":null,"ratio_null_reason":null},"90d":{"status":"ok","refusal_reason":null,"start":"2026-08-06","end":"2026-11-04","observations":85,"coverage":0.9444,"realized_apy":-0.00167574,"realized_apy_null_reason":null,"volatility":0.19897299,"max_drawdown":-0.08252973,"days_underwater_max":46,"negative_days":2,"gap_days":0,"tbill_apy":0.039575,"excess_return":-0.04125036,"sharpe":-0.2073,"sortino":-0.239,"ratio_null_reason":null},"180d":{"status":"ok","refusal_reason":null,"start":"2026-05-08","end":"2026-11-04","observations":175,"coverage":0.9722,"realized_apy":0.00109994,"realized_apy_null_reason":null,"volatility":0.13825246,"max_drawdown":-0.08252973,"days_underwater_max":46,"negative_days":2,"gap_days":0,"tbill_apy":0.037414,"excess_return":-0.03631429,"sharpe":-0.2627,"sortino":-0.3019,"ratio_null_reason":null},"365d":{"status":"ok","refusal_reason":null,"start":"2025-11-04","end":"2026-11-04","observations":360,"coverage":0.9863,"realized_apy":0.00852387,"realized_apy_null_reason":null,"volatility":0.10610133,"max_drawdown":-0.11623574,"days_underwater_max":182,"negative_days":4,"gap_days":0,"tbill_apy":0.040193,"excess_return":-0.03166863,"sharpe":-0.2985,"sortino":-0.3408,"ratio_null_reason":null}}},"strategy_class":"crypto_backed_lending","strategy_class_source":"collateral_allocations","strategy_class_note":"0% of supply lent against collateral is RWA collateral","strategy_rwa_collateral_pct":0,"lending_methodology_applies":true,"lending_methodology_note":null,"under_review":{"active":false,"reasons":[],"since":null}},"composite":{"grading_scheme":"v1","grade":"F","stars":1,"score":98.5,"contributors":{"smart_contract":{"score":0,"weight":0.2,"weighted_contribution":0},"operational_governance":{"score":0,"weight":0.2,"weighted_contribution":0},"asset_collateral":{"score":10,"weight":0.15,"weighted_contribution":1.5},"market_liquidity":{"score":35,"weight":0.2,"weighted_contribution":7},"counterparty":{"score":0,"weight":0.1,"weighted_contribution":0},"hack_exploit_history":{"score":0,"weight":0.15,"weighted_contribution":0},"chain_infrastructure":{"score":0,"weight":0,"weighted_contribution":0}},"upstream_risk":98.5,"clamped_by_upstream":true,"score_source":"upstream","drivers_complete":false,"drivers":[{"category":"market_liquidity","category_name":"Market \u0026 liquidity","score":35,"weight":0.2,"weighted_contribution":7,"criteria":[{"key":"large_holder_concentration","name":"Large-holder concentration bounded","status":"warn","evidence":{"hci_10":0.34}}]}]},"categories":{"smart_contract":{"score":0,"criteria":{"contract_verified":{"name":"Contract verified on explorer","status":"pass","data_quality":{"confidence":0.95,"last_observed_at":"2026-06-02T09:49:36Z","source":"rwa-grade-pipeline"}}}},"market_liquidity":{"score":35,"criteria":{"large_holder_concentration":{"name":"Large-holder concentration bounded","status":"warn","data_quality":{"confidence":0.95,"last_observed_at":"2026-06-02T09:49:36Z","source":"rwa-grade-pipeline"},"evidence":{"hci_10":0.34}}}}},"coverage":{"framework_version":"v1","total_criteria":42,"live_criteria":28,"per_category":{"smart_contract":{"live":6,"total":8}}},"risk":{"overallRisk":98.5}}}},"exampleType":"examples"}},"exampleType":"examples"},"c308d3ac-052b-4e58-921c-155f7c136127":{"description":"Invalid address, chain, or grading_scheme.","headers":{"X-Request-Id":{"description":"Server-issued id for this request, returned on every response, success or error. Quote it to Webacy support to find the request. On risk endpoints it equals the `check_id` body field.","schema":{"type":"string","format":"uuid","example":"3f1c2b9e-7a4d-4e1b-9c55-0d6a2f8e4b71"}}},"content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"407df4af-1425-4e1f-bbbb-8d069e5388f0":{"description":"Keyless x402 payment required. Returned for a keyless caller (gateway entry `x-webacy-entry: x402`) with no prepaid CU balance or insufficient CU on the presented credit token. Identified by the base64 `PAYMENT-REQUIRED` response header; the body carries the x402 challenge (a USDC price on Base and a Stripe-minted deposit address). Pay it, then retry with the `PAYMENT-SIGNATURE` header to unlock the resource and receive a credit token. An authenticated api-key caller with a past_due/unpaid subscription may instead receive a different 402 (`Subscription payment required`, plain JSON, no `PAYMENT-REQUIRED` header).","headers":{"PAYMENT-REQUIRED":{"description":"Base64-encoded x402 challenge (network, asset, amount, payTo, resource.url). The edge rollout supplies the canonical public request path through a valid gateway claim; missing or invalid claims safely fall back to the public origin plus an internal path identifier. resource.url is not yet suitable for publishing to a public x402 discovery catalog (Coinbase's Bazaar): route-specific declarations and live paid validation are still pending.","schema":{"type":"string"}},"X-Request-Id":{"description":"Server-issued id for this request, returned on every response, success or error. Quote it to Webacy support to find the request. On risk endpoints it equals the `check_id` body field.","schema":{"type":"string","format":"uuid","example":"3f1c2b9e-7a4d-4e1b-9c55-0d6a2f8e4b71"}}},"content":{"application/json":{"example":{"x402Version":1,"error":"payment required"},"examples":{"Example":{"title":"Example","value":{"x402Version":1,"error":"payment required"}}},"exampleType":"examples"}},"exampleType":"examples"},"10da0083-dc0d-41c4-923e-6b66dd5f2184":{"description":"Missing or invalid x-api-key.","headers":{"X-Request-Id":{"description":"Server-issued id for this request, returned on every response, success or error. Quote it to Webacy support to find the request. On risk endpoints it equals the `check_id` body field.","schema":{"type":"string","format":"uuid","example":"3f1c2b9e-7a4d-4e1b-9c55-0d6a2f8e4b71"}}},"content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"a1969a8e-dab5-4c13-9455-e98657e35a79":{"description":"Vault not found.","headers":{"X-Request-Id":{"description":"Server-issued id for this request, returned on every response, success or error. Quote it to Webacy support to find the request. On risk endpoints it equals the `check_id` body field.","schema":{"type":"string","format":"uuid","example":"3f1c2b9e-7a4d-4e1b-9c55-0d6a2f8e4b71"}}},"content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"cdea7e10-3a8d-4c31-a9c5-a73c3c29c1e9":{"description":"x402 paywall fails CLOSED: if payment configuration is incomplete or invalid, the x402 route unexpectedly has no payment requirement, or the facilitator, credit store, or settlement is unavailable, a gated keyless request returns 503 (`Payment service temporarily unavailable`) rather than serving the resource unpaid.","content":{"application/json":{"example":{"message":"Payment service temporarily unavailable"},"examples":{"Example":{"title":"Example","value":{"message":"Payment service temporarily unavailable"}}},"exampleType":"examples"}},"headers":{"X-Request-Id":{"description":"Server-issued id for this request, returned on every response, success or error. Quote it to Webacy support to find the request. On risk endpoints it equals the `check_id` body field.","schema":{"type":"string","format":"uuid","example":"3f1c2b9e-7a4d-4e1b-9c55-0d6a2f8e4b71"}}},"exampleType":"examples"}},"security":{"6bc1ab05-435f-4663-8c72-460a4c7b7f27":{"api_key":{"type":"apiKey","in":"header","name":"x-api-key","scopes":[],"schemeName":"api_key"}}},"servers":{"383ee277-cc3e-4c5b-9060-26029d813c28":{"url":"https://api.webacy.com","description":"Webacy Risk Score API (Production)"},"46e953d9-23d0-4ded-9dfe-145619c5b88e":{"url":"https://api-development.webacy.com","description":"Webacy Risk Score API (Development)"},"1c0a4a80-cff4-4732-8bb4-c1d6ddfb5c04":{"url":"http://0.0.0.0:3030/api/v1/risk-score","description":"Webacy Risk Score API - Local"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-api-key","scopes":[],"schemeName":"api_key"},"schema":{"title":"x-api-key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"api_key","name":"x-api-key"}],"title":"api_key"}]},"originalFileLocation":"openapi.json"},"subdomain":"webacy","siteName":"Webacy Docs","title":"Get risk data for a single vault - Webacy Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-22T14:36:24.892Z","originalFileLocation":"api-reference/vault-risk-v3/get-vault-risk-detail-v3.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Returns the v3 Webacy-native vault decomposition: composite grade + per-category contributors, the dense categories criteria map, coverage disclosure, plus pass-through v2 metadata and risk. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). composite.score is floored from below by upstream_risk.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Webacy Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get risk data for a single vault - Webacy Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Returns the v3 Webacy-native vault decomposition: composite grade + per-category contributors, the dense categories criteria map, coverage disclosure, plus pass-through v2 metadata and risk. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). composite.score is floored from below by upstream_risk.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Webacy Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://webacy.mintlify.site/_mintlify/api/og/v2?division=Vault+Risk+V3\u0026amp;title=Get+risk+data+for+a+single+vault\u0026amp;description=Returns+the+v3+Webacy-native+vault+decomposition%3A+%60composite%60+grade+%2B+per-category+%60contributors%60%2C+the+dense+%60categories%60+criteria+map%2C+%60coverage%60+disclosure%2C+p\u0026amp;theme=256fd323fde43a5eeef07bf6\u0026amp;signature=dfe22b819f89ef2919a84081c3aa61f226db6bf651ead611ff3821a9e2fd0f0b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Get risk data for a single vault - Webacy Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Returns the v3 Webacy-native vault decomposition: composite grade + per-category contributors, the dense categories criteria map, coverage disclosure, plus pass-through v2 metadata and risk. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). composite.score is floored from below by upstream_risk.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://webacy.mintlify.site/_mintlify/api/og/v2?division=Vault+Risk+V3\u0026amp;title=Get+risk+data+for+a+single+vault\u0026amp;description=Returns+the+v3+Webacy-native+vault+decomposition%3A+%60composite%60+grade+%2B+per-category+%60contributors%60%2C+the+dense+%60categories%60+criteria+map%2C+%60coverage%60+disclosure%2C+p\u0026amp;theme=256fd323fde43a5eeef07bf6\u0026amp;signature=dfe22b819f89ef2919a84081c3aa61f226db6bf651ead611ff3821a9e2fd0f0b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/webacy/BDwg8pUd_cx6RnJh/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Webacy Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00d66f\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/vault-risk-v3/get-vault-risk-detail-v3.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.webacy.com/#organization\",\"name\":\"Webacy Docs\",\"url\":\"https://docs.webacy.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/webacy/PZHkbk8qJrPsQSaC/logo/light.png?fit=max\u0026auto=format\u0026n=PZHkbk8qJrPsQSaC\u0026q=85\u0026s=c1933879883f6b01ff46a6e51cfd687f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.webacy.com#website\",\"name\":\"Webacy Docs\",\"url\":\"https://docs.webacy.com\",\"publisher\":{\"@id\":\"https://docs.webacy.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3#webpage\",\"url\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3\",\"name\":\"Get risk data for a single vault\",\"description\":\"Returns the v3 Webacy-native vault decomposition: composite grade + per-category contributors, the dense categories criteria map, coverage disclosure, plus pass-through v2 metadata and risk. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). composite.score is floored from below by upstream_risk.\",\"dateModified\":\"2026-09-22T14:36:24.892Z\",\"isPartOf\":{\"@id\":\"https://docs.webacy.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Vault Risk V3\",\"item\":\"https://docs.webacy.com/api-reference/vault-risk-v3/v3-overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get risk data for a single vault\",\"item\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3#apireference\",\"headline\":\"Get risk data for a single vault\",\"name\":\"Get risk data for a single vault\",\"description\":\"Returns the v3 Webacy-native vault decomposition: composite grade + per-category contributors, the dense categories criteria map, coverage disclosure, plus pass-through v2 metadata and risk. POLARITY: scores are 0–100, higher = worse (A+ = 0, F = 100). composite.score is floored from below by upstream_risk.\",\"url\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3\",\"mainEntityOfPage\":{\"@id\":\"https://docs.webacy.com/api-reference/vault-risk-v3/get-vault-risk-detail-v3#webpage\"},\"dateModified\":\"2026-09-22T14:36:24.892Z\",\"publisher\":{\"@id\":\"https://docs.webacy.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.webacy.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Webacy Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Webacy Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/vault-risk-v3/get-vault-risk-detail-v3.md","siteName":"Webacy Docs","nav":{"global":null,"tabs":[{"tab":"Overview","pages":[{"title":"Overview","href":"/introduction"}]},{"tab":"Build","pages":[{"title":"Build","href":"/getting-started"}]},{"tab":"Learn","pages":[{"title":"Learn","href":"/use-cases-guides-walkthroughs"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"API Introduction","href":"/api-reference/introduction"},{"title":"Authenticate with the Webacy API using API keys","href":"/api-reference/authentication"},{"title":"Get current API usage","openapi":"GET /usage/current","href":"/api-reference/api-usage/get-current-api-usage"},{"title":"Get API usage for specified dates","openapi":"GET /usage","href":"/api-reference/api-usage/get-api-usage-for-specified-dates"},{"title":"Get current CU usage","openapi":"GET /usage/cu","href":"/api-reference/api-usage/get-current-cu-usage"},{"title":"Get daily CU usage","openapi":"GET /usage/cu/daily","href":"/api-reference/api-usage/get-daily-cu-usage"}]},{"group":"Stablecoins","pages":[{"title":"Depeg Monitor","href":"/api-reference/depeg-monitor"},{"title":"List pegged tokens — stablecoins \u0026 RWAs","openapi":"GET /rwa","href":"/api-reference/depeg-monitor/list-pegged-tokens-with-depeg-risk"},{"title":"Get risk detail for a single stablecoin","openapi":"GET /rwa/{address}","href":"/api-reference/depeg-monitor/get-depeg-risk-detail-for-a-pegged-token"},{"title":"List Stablecoins","openapi":"GET /v3/stablecoins","href":"/api-reference/stablecoins/list-stablecoins"},{"title":"List Stablecoin Grades","openapi":"GET /v3/stablecoins/grades","href":"/api-reference/stablecoins/get-stablecoin-grades"},{"title":"Get Stablecoin Risk Detail","openapi":"GET /v3/stablecoins/{address}","href":"/api-reference/stablecoins/get-stablecoin-detail"},{"title":"Holder Concentration Index API","href":"/api-reference/holder-concentration"},{"title":"List all stablecoin and rwa holder data","openapi":"GET /rwa/hci","href":"/api-reference/holder-concentration/list-holder-concentration-index"},{"title":"Get holder concentration history for one token","openapi":"GET /rwa/hci/history","href":"/api-reference/holder-concentration/get-holder-concentration-index-history"},{"title":"List stablecoin supply flows","openapi":"GET /rwa/supply","href":"/api-reference/supply-flows/list-supply-flows"},{"title":"Get supply-flow detail for one token","openapi":"GET /rwa/supply/{symbol}","href":"/api-reference/supply-flows/get-supply-flow-detail"}]},{"group":"RWA","pages":[{"title":"RWA Risk (v3)","href":"/api-reference/rwa-v3"},{"title":"Get risk detail for a single RWA","openapi":"GET /v3/rwa/{address}","href":"/api-reference/rwa-v3/get-rwa-risk-detail"},{"title":"List RWA \u0026 stablecoin grades","openapi":"GET /v3/rwa/grades","href":"/api-reference/rwa-v3/get-rwa-grades"},{"title":"Batch structural risk data for RWAs","openapi":"POST /v3/rwa/batch/structural-health","href":"/api-reference/rwa-v3/post-batch-structural-health"}]},{"group":"Vault Risk V3","pages":[{"title":"V3 Vault Risk API Overview","href":"/api-reference/vault-risk-v3/v3-overview"},{"title":"V3 Framework Methodology","description":"Learn how the Webacy V3 risk framework is structured, how composite vault scores are derived from category contributors, and why the taxonomy is API-driven.","href":"/api-reference/vault-risk-v3/framework-methodology"},{"title":"Get risk data for a single vault","openapi":"GET /v3/vaults/{address}","href":"/api-reference/vault-risk-v3/get-vault-risk-detail-v3"},{"title":"Batch vault ratings","openapi":"POST /v3/vaults/batch/grades","description":"Returns the v3 `composite` grade (letter + 0–100 risk score + per-category contributors) for up to 100 vaults in one request. Vault addresses travel in the POST body because the list is variable-length and may include non-EVM addresses; the endpoint is read-only. Per-vault failures are reported in-band as `{ ok: false, error_code }` (HTTP 200) so a single bad address never fails the whole batch. POLARITY: scores 0–100, higher = worse.","href":"/api-reference/vault-risk-v3/get-vault-grades-batch"},{"title":"Get vault risk data framework and taxonomy","openapi":"GET /v3/framework","href":"/api-reference/vault-risk-v3/get-framework"}]},{"group":"Vault History","pages":[{"title":"Get Vault TVL History","openapi":"GET /vaults/{address}/tvl-history","href":"/api-reference/vault-risk/get-vault-tvl-history"},{"title":"Get Vault Share Price History","openapi":"GET /vaults/{address}/share-price-history","href":"/api-reference/vault-risk/get-vault-share-price-history"}]},{"group":"Risk Intelligence","pages":[{"title":"Risk Due Diligence","href":"/api-reference/riskdd"},{"title":"Trading Due Diligence","href":"/api-reference/tradingdd"},{"title":"Risk intelligence for an address","openapi":"GET /addresses/{address}","href":"/api-reference/threat-risks/threat-considerations-for-an-address"},{"group":"Wallet","pages":[{"title":"Check if a wallet address is sanctioned","openapi":"GET /addresses/sanctioned/{walletAddress}","href":"/api-reference/sanction-checks/check-if-wallet-address-is-sanctioned"},{"title":"Detect address poisoning on a wallet address","openapi":"GET /addresses/{address}/poisoning","href":"/api-reference/address-poisoning/detect-address-poisoning-for-a-specific-wallet-address"},{"title":"Get open approvals with risk data on a wallet address","openapi":"GET /addresses/{address}/approvals","href":"/api-reference/approval-risks/approvals-with-threat-risks"},{"title":"Get the risk profile and exposure of a wallet address","openapi":"GET /quick-profile/{walletAddress}","href":"/api-reference/exposure-risk/understand-the-risk-profile-risk-exposure-of-an-address"}]},{"group":"Transaction","pages":[{"title":"Get risk details for a transaction hash","openapi":"GET /transactions/{txHash}","href":"/api-reference/transaction-risks/risk-details-for-a-transaction"},{"title":"Simulate a raw EVM transaction for security risks","openapi":"POST /scan/{fromAddress}/transactions","href":"/api-reference/transaction-scanning/scan-raw-evm-transaction-for-security-risks"},{"title":"Simulate an EIP-712 signed message for security risks","openapi":"POST /scan/{fromAddress}/eip712","href":"/api-reference/transaction-scanning/scan-eip-712-signed-message-for-security-risks"}]},{"group":"Token","pages":[{"title":"Get economic history for a token","openapi":"GET /tokens/{tokenAddress}","href":"/api-reference/token-analysis/get-token-economic-history"},{"title":"Get pools with risk assessment for a token","openapi":"GET /tokens/{tokenAddress}/pools","href":"/api-reference/token-analysis/get-token-pools-with-risk-assessment"},{"title":"Get trending tokens with risk analysis","openapi":"GET /tokens/trending","href":"/api-reference/token-analysis/get-trending-cryptocurrencies-with-risk-analysis"},{"title":"Get Solana token risk with security indicators","openapi":"GET /trading-lite/{address}","href":"/api-reference/trading-lite/get-simplified-token-analysis-with-security-indicators"},{"title":"Get detailed early holder analysis for a token","openapi":"GET /holder-analysis/{address}","href":"/api-reference/holder-analysis/get-detailed-early-holder-analysis-for-a-token"},{"title":"Get trending liquidity pools with risk data","openapi":"GET /tokens/pools/trending","href":"/api-reference/pool-analysis/get-trending-pools-with-risk-analysis"},{"title":"Get OHLCV and risk data for a liquidity pool","openapi":"GET /tokens/pools/{poolAddress}","href":"/api-reference/pool-analysis/get-pool-ohlcv-data-with-risk-assessment"}]},{"group":"Smart Contract","pages":[{"title":"Get full risk analysis for a contract address","openapi":"GET /contracts/{contractAddress}","href":"/api-reference/contract-risk/get-a-real-time-analysis-for-a-given-contract-address"},{"title":"Get only the source-code findings for a contract address","openapi":"GET /contracts/{contractAddress}/code-analysis","href":"/api-reference/contract-risk/get-source-code-analysis-for-a-contract"},{"title":"Get verified source code for a contract address","openapi":"GET /source-code/{contractAddress}","href":"/api-reference/contract-risk/get-verified-source-code-for-a-contract"}]},{"group":"URL","pages":[{"title":"Get risk analysis of a URL","openapi":"POST /url","href":"/api-reference/url-risks/project-url-risk-analysis"}]}]}]}]},"basePath":"","title":"Get risk data for a single vault - Webacy Docs","buildId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","deploymentId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DDP9JXtj.js","utils-8yQyvEtx.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CBCFR8Sn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-rQaXkUHa.js","snippetPresets-J5KpBTgV.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BVxVH4Cj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BxdQ2vIi.js","shallow-BjV2tFiD.js","getApiPlaygroundDisplay-C_55tL4O.js","CodeSnippet-C0JpiCOC.js","CodeSnippets-w9Ps7djG.js","Page-DTNSD-0M.js","getPastedJson-BDfB-H8d.js","icon-g-kUkkO9.js","MethodPill-v4l6fq0h.js","DuplicateIcon-CvLo-CfU.js","createIcon-165clrrV.js","DynamicMarkdown-D3RQ-fEj.js","SectionHeading-vvo-3yLf.js","axios-vUo_bRtp.js","Markdown-CMT1uFWQ.js","clsx-C8f2yC9R.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CI2D8R2Y.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-k78Wrw_e.js"]}