{
"message": "Payment service temporarily unavailable"
}
Vault History
Get Vault TVL History
Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a quality_flag describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level latest aggregate so stat-tile consumers can render the current value without paging the full series.
Quality filtering (default): Samples flagged as capped, diverged, or spike are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, count will be smaller than days and filtered_count reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set includeFlagged=true to bypass the filter and receive the raw series with every sample’s quality_flag populated.
Envelope semantics:stale_reason disambiguates the four post-filter states (fresh, pipeline_lag, all_filtered, no_samples_yet); stale: boolean is preserved for back-compat (true iff stale_reason !== 'fresh'). schema_version is bumped any time the response shape changes — pin it if you’re building a regression harness.
Returns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with count: 0, latest: null, and stale_reason: 'no_samples_yet'. Cached for 5 minutes; the includeFlagged=true and default responses are cached in partitioned namespaces so they never cross-pollinate.
GET
/
vaults
/
{address}
/
tvl-history
Get Vault TVL History
curl --request GET \
--url https://api.webacy.com/vaults/{address}/tvl-history \
--header 'x-api-key: <api-key>'
When true, bypasses the default quality_flag allowlist filter and returns the full raw series including capped, diverged, and spike samples. Intended for power users and researchers — the default chart-friendly behavior (false) drops those samples so single-day pricing artifacts and divergence events do not show up as misleading peaks or troughs in the line. filtered_count is always 0 when this flag is true. The hoisted latest aggregate tracks the same filter: when false, latest is the most recent passing sample (quality_flag ∈ {ok, unknown}); when true, latest is the most recent sample in the raw series and may carry any quality_flag value.
Response
Daily TVL series with envelope and hoisted latest aggregate
Disambiguates the four post-filter states. fresh: latest passing sample is within 48 hours. pipeline_lag: latest passing sample is older than 48 hours. all_filtered: every sample in the window was dropped by the quality filter (see filtered_count). no_samples_yet: the vault is tracked but has no samples in the window.
Number of points returned in series. May be less than days after the quality filter drops flagged points; count + filtered_count reconciles to the raw window size.
Number of samples in the window that were excluded by the default quality_flag filter. Always 0 when includeFlagged=true or when no flagged samples were present.
Most recent point in the returned series, hoisted for stat-tile rendering. Tracks the same filter as series: when includeFlagged=false (default), this is the most recent passing sample, and latest.quality_flag is always ok or unknown; when includeFlagged=true, this is the most recent sample in the raw series and may carry any quality_flag value (including capped, diverged, or spike) if the absolute newest sample was flagged. null when no samples were available after filtering.
{"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":""},"chroma":{"liveDeploymentHistoryId":"6ae0b025eb5b4f30de3f5267","collectionId":"e55adb75-a5c3-4f8d-9b6a-6b17fd749004","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae0b025eb5b4f30de3f5267"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae10847967261e0640fdef4","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Build","count":60},{"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":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","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":"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":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"editor-nav-generations","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":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:.85em;line-height:1.35;text-align:center;letter-spacing:.02em;white-space:nowrap}.gb-a{background:#047857;color:#fff}.gb-b{background:#1d4ed8;color:#fff}.gb-c{background:#f59e0b;color:#1f2937}.gb-d{background:#c2410c;color:#fff}.gb-f{background:#b91c1c;color:#fff}"}],"page":{"pagePath":"api-reference/vault-risk/get-vault-tvl-history","slug":"/api-reference/vault-risk/get-vault-tvl-history","pageMetadata":{"title":"Get Vault TVL History","openapi":"GET /vaults/{address}/tvl-history","description":"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a `quality_flag` describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level `latest` aggregate so stat-tile consumers can render the current value without paging the full series.\n\n**Quality filtering (default):** Samples flagged as `capped`, `diverged`, or `spike` are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, `count` will be smaller than `days` and `filtered_count` reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set `includeFlagged=true` to bypass the filter and receive the raw series with every sample's `quality_flag` populated.\n\n**Envelope semantics:** `stale_reason` disambiguates the four post-filter states (`fresh`, `pipeline_lag`, `all_filtered`, `no_samples_yet`); `stale: boolean` is preserved for back-compat (`true` iff `stale_reason !== 'fresh'`). `schema_version` is bumped any time the response shape changes — pin it if you're building a regression harness.\n\nReturns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with `count: 0`, `latest: null`, and `stale_reason: 'no_samples_yet'`. Cached for 5 minutes; the `includeFlagged=true` and default responses are cached in partitioned namespaces so they never cross-pollinate.","href":"/api-reference/vault-risk/get-vault-tvl-history"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a \", _jsx(_components.code, {\n children: \"quality_flag\"\n }), \" describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level \", _jsx(_components.code, {\n children: \"latest\"\n }), \" aggregate so stat-tile consumers can render the current value without paging the full series.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Quality filtering (default):\"\n }), \" Samples flagged as \", _jsx(_components.code, {\n children: \"capped\"\n }), \", \", _jsx(_components.code, {\n children: \"diverged\"\n }), \", or \", _jsx(_components.code, {\n children: \"spike\"\n }), \" are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, \", _jsx(_components.code, {\n children: \"count\"\n }), \" will be smaller than \", _jsx(_components.code, {\n children: \"days\"\n }), \" and \", _jsx(_components.code, {\n children: \"filtered_count\"\n }), \" reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set \", _jsx(_components.code, {\n children: \"includeFlagged=true\"\n }), \" to bypass the filter and receive the raw series with every sample’s \", _jsx(_components.code, {\n children: \"quality_flag\"\n }), \" populated.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Envelope semantics:\"\n }), \" \", _jsx(_components.code, {\n children: \"stale_reason\"\n }), \" disambiguates the four post-filter states (\", _jsx(_components.code, {\n children: \"fresh\"\n }), \", \", _jsx(_components.code, {\n children: \"pipeline_lag\"\n }), \", \", _jsx(_components.code, {\n children: \"all_filtered\"\n }), \", \", _jsx(_components.code, {\n children: \"no_samples_yet\"\n }), \"); \", _jsx(_components.code, {\n children: \"stale: boolean\"\n }), \" is preserved for back-compat (\", _jsx(_components.code, {\n children: \"true\"\n }), \" iff \", _jsx(_components.code, {\n children: \"stale_reason !== 'fresh'\"\n }), \"). \", _jsx(_components.code, {\n children: \"schema_version\"\n }), \" is bumped any time the response shape changes — pin it if you’re building a regression harness.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Returns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with \", _jsx(_components.code, {\n children: \"count: 0\"\n }), \", \", _jsx(_components.code, {\n children: \"latest: null\"\n }), \", and \", _jsx(_components.code, {\n children: \"stale_reason: 'no_samples_yet'\"\n }), \". Cached for 5 minutes; the \", _jsx(_components.code, {\n children: \"includeFlagged=true\"\n }), \" and default responses are cached in partitioned namespaces so they never cross-pollinate.\"]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Get Vault TVL History","openapi":"GET /vaults/{address}/tvl-history","description":"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a `quality_flag` describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level `latest` aggregate so stat-tile consumers can render the current value without paging the full series.\n\n**Quality filtering (default):** Samples flagged as `capped`, `diverged`, or `spike` are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, `count` will be smaller than `days` and `filtered_count` reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set `includeFlagged=true` to bypass the filter and receive the raw series with every sample's `quality_flag` populated.\n\n**Envelope semantics:** `stale_reason` disambiguates the four post-filter states (`fresh`, `pipeline_lag`, `all_filtered`, `no_samples_yet`); `stale: boolean` is preserved for back-compat (`true` iff `stale_reason !== 'fresh'`). `schema_version` is bumped any time the response shape changes — pin it if you're building a regression harness.\n\nReturns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with `count: 0`, `latest: null`, and `stale_reason: 'no_samples_yet'`. Cached for 5 minutes; the `includeFlagged=true` and default responses are cached in partitioned namespaces so they never cross-pollinate.","href":"/api-reference/vault-risk/get-vault-tvl-history"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Get Vault TVL History","description":"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a `quality_flag` describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level `latest` aggregate so stat-tile consumers can render the current value without paging the full series.\n\n**Quality filtering (default):** Samples flagged as `capped`, `diverged`, or `spike` are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, `count` will be smaller than `days` and `filtered_count` reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set `includeFlagged=true` to bypass the filter and receive the raw series with every sample's `quality_flag` populated.\n\n**Envelope semantics:** `stale_reason` disambiguates the four post-filter states (`fresh`, `pipeline_lag`, `all_filtered`, `no_samples_yet`); `stale: boolean` is preserved for back-compat (`true` iff `stale_reason !== 'fresh'`). `schema_version` is bumped any time the response shape changes — pin it if you're building a regression harness.\n\nReturns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with `count: 0`, `latest: null`, and `stale_reason: 'no_samples_yet'`. Cached for 5 minutes; the `includeFlagged=true` and default responses are cached in partitioned namespaces so they never cross-pollinate.","operationId":"getVaultTvlHistory","tags":["Vault Risk"],"parameters":["c3210270-8c55-493f-bdbd-ce413cf2e91c","ec6ad556-0ce4-43ce-8635-c60f4a59f96f","84f4eaa6-63e5-441b-981b-8cde0806e52e","ed934cdd-1f02-4839-9730-4b682980291a"],"responses":{"200":"2661db85-39cb-46db-8c31-ac344aec1218","400":"b683a514-f12e-45f0-8b04-eb45c7f73ec1","401":"9d6a982a-8755-42dd-861d-3a44fa897fed","402":"9ea17988-25f8-4b5a-bef2-b607133e72c0","404":"d2ca62b2-607b-49ed-8663-1d706ac1dee9","503":"eeb326e8-101c-4e86-a5b4-2ca27643dd1e"},"security":["08c9c72d-b310-475a-9372-6ab37777244e"],"method":"get","type":"path","servers":["fc0b7da1-74c5-4274-8588-fe57c6e13f7a","da385d44-e63f-43f6-8880-a921d943fe71","8076712c-258a-4a8a-a8c8-798d8227b259"],"path":"/vaults/{address}/tvl-history","baseUrlOptions":["https://api.webacy.com","https://api-development.webacy.com","http://0.0.0.0:3030/api/v1/risk-score"],"title":"Get Vault TVL History","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"c3210270-8c55-493f-bdbd-ce413cf2e91c":{"name":"address","in":"path","required":true,"description":"Vault contract address","schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","isRequired":true,"description":"Vault contract address","uniqueKey":"","typeLabel":"string"},"example":"0x9d39a5de30e57443bff2a8307a4256c8797a3497"},"ec6ad556-0ce4-43ce-8635-c60f4a59f96f":{"name":"chain","in":"query","required":true,"description":"Blockchain network where the vault is deployed","schema":{"type":"string","enum":["eth","arb","base","opt","pol","bsc"],"isRequired":true,"description":"Blockchain network where the vault is deployed","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"eth"},"84f4eaa6-63e5-441b-981b-8cde0806e52e":{"name":"range","in":"query","required":false,"description":"Window length to return. Defaults to `30d` when omitted.","schema":{"type":"string","enum":["7d","30d","60d","3m"],"default":"30d","isRequired":false,"description":"Window length to return. Defaults to `30d` when omitted.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"30d"},"ed934cdd-1f02-4839-9730-4b682980291a":{"name":"includeFlagged","in":"query","required":false,"description":"When `true`, bypasses the default `quality_flag` allowlist filter and returns the full raw series including `capped`, `diverged`, and `spike` samples. Intended for power users and researchers — the default chart-friendly behavior (`false`) drops those samples so single-day pricing artifacts and divergence events do not show up as misleading peaks or troughs in the line. `filtered_count` is always `0` when this flag is `true`. The hoisted `latest` aggregate tracks the same filter: when `false`, `latest` is the most recent passing sample (`quality_flag` ∈ {`ok`, `unknown`}); when `true`, `latest` is the most recent sample in the raw series and may carry any `quality_flag` value.","schema":{"type":"boolean","default":false,"isRequired":false,"description":"When `true`, bypasses the default `quality_flag` allowlist filter and returns the full raw series including `capped`, `diverged`, and `spike` samples. Intended for power users and researchers — the default chart-friendly behavior (`false`) drops those samples so single-day pricing artifacts and divergence events do not show up as misleading peaks or troughs in the line. `filtered_count` is always `0` when this flag is `true`. The hoisted `latest` aggregate tracks the same filter: when `false`, `latest` is the most recent passing sample (`quality_flag` ∈ {`ok`, `unknown`}); when `true`, `latest` is the most recent sample in the raw series and may carry any `quality_flag` value.","uniqueKey":"","typeLabel":"boolean"},"example":false}},"responses":{"2661db85-39cb-46db-8c31-ac344aec1218":{"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}}},"description":"Daily TVL series with envelope and hoisted `latest` aggregate","content":{"application/json":{"schema":{"type":"object","required":["schema_version","stale","stale_reason","days","count","filtered_count","from","to","latest","series"],"properties":{"schema_version":{"type":"string","description":"Response-shape version token. Bumped any time the wire payload shape changes — pin if you are building a regression harness against this endpoint.","example":"s3","isRequired":true,"uniqueKey":"schema_version","typeLabel":"string"},"stale":{"type":"boolean","description":"Back-compat alias: `true` iff `stale_reason !== 'fresh'`. Prefer `stale_reason` for new integrations.","isRequired":true,"uniqueKey":"stale","typeLabel":"boolean"},"stale_reason":{"type":"string","enum":["fresh","pipeline_lag","all_filtered","no_samples_yet"],"description":"Disambiguates the four post-filter states. `fresh`: latest passing sample is within 48 hours. `pipeline_lag`: latest passing sample is older than 48 hours. `all_filtered`: every sample in the window was dropped by the quality filter (see `filtered_count`). `no_samples_yet`: the vault is tracked but has no samples in the window.","isRequired":true,"uniqueKey":"stale_reason","typeLabel":"enum\u003cstring>"},"days":{"type":"integer","description":"Resolved value of the `range` query parameter expressed in days (7 / 30 / 60 / 90).","isRequired":true,"uniqueKey":"days","typeLabel":"integer"},"count":{"type":"integer","description":"Number of points returned in `series`. May be less than `days` after the quality filter drops flagged points; `count + filtered_count` reconciles to the raw window size.","isRequired":true,"uniqueKey":"count","typeLabel":"integer"},"filtered_count":{"type":"integer","description":"Number of samples in the window that were excluded by the default `quality_flag` filter. Always `0` when `includeFlagged=true` or when no flagged samples were present.","example":0,"isRequired":true,"uniqueKey":"filtered_count","typeLabel":"integer"},"from":{"oneOf":[{"type":"string","format":"date-time","description":"UTC-midnight timestamp of the first point in `series`. `null` when `series` is empty.","isRequired":true,"uniqueKey":"from.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"UTC-midnight timestamp of the first point in `series`. `null` when `series` is empty.","isRequired":true,"uniqueKey":"from.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from","typeLabel":"string\u003cdate-time> | null"},"to":{"oneOf":[{"type":"string","format":"date-time","description":"UTC-midnight timestamp of the last point in `series`. `null` when `series` is empty.","isRequired":true,"uniqueKey":"to.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"UTC-midnight timestamp of the last point in `series`. `null` when `series` is empty.","isRequired":true,"uniqueKey":"to.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"to","typeLabel":"string\u003cdate-time> | null"},"latest":{"oneOf":[{"type":"object","description":"Most recent point in the returned `series`, hoisted for stat-tile rendering. Tracks the same filter as `series`: when `includeFlagged=false` (default), this is the most recent **passing** sample, and `latest.quality_flag` is always `ok` or `unknown`; when `includeFlagged=true`, this is the most recent sample in the raw series and may carry any `quality_flag` value (including `capped`, `diverged`, or `spike`) if the absolute newest sample was flagged. `null` when no samples were available after filtering.","required":["ts","tvl_usd","quality_flag"],"properties":{"ts":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"latest.oneOf.0.ts","typeLabel":"string\u003cdate-time>"},"tvl_usd":{"type":"number","isRequired":true,"uniqueKey":"latest.oneOf.0.tvl_usd","typeLabel":"number"},"quality_flag":{"type":"string","enum":["ok","capped","diverged","spike","unknown"],"description":"Data-quality classification of a vault TVL or share-price sample. `ok` — clean reading. `capped` — value clamped at a hard ceiling, treat as a lower bound. `diverged` — multi-source readings disagreed materially. `spike` — single-sample jump exceeded the 5× day-over-day threshold and likely reflects a pricing artifact. `unknown` — a sample that predates quality-flag derivation and has not been backfilled yet. The default response only ever carries `ok` / `unknown`; `capped` / `diverged` / `spike` rows surface only when `includeFlagged=true`.","isRequired":true,"uniqueKey":"latest.oneOf.0.quality_flag","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"latest.oneOf.0","typeLabel":"object"},{"type":"null","description":"Most recent point in the returned `series`, hoisted for stat-tile rendering. Tracks the same filter as `series`: when `includeFlagged=false` (default), this is the most recent **passing** sample, and `latest.quality_flag` is always `ok` or `unknown`; when `includeFlagged=true`, this is the most recent sample in the raw series and may carry any `quality_flag` value (including `capped`, `diverged`, or `spike`) if the absolute newest sample was flagged. `null` when no samples were available after filtering.","required":["ts","tvl_usd","quality_flag"],"properties":{"ts":{"type":"string","format":"date-time"},"tvl_usd":{"type":"number"},"quality_flag":{"type":"string","enum":["ok","capped","diverged","spike","unknown"],"description":"Data-quality classification of a vault TVL or share-price sample. `ok` — clean reading. `capped` — value clamped at a hard ceiling, treat as a lower bound. `diverged` — multi-source readings disagreed materially. `spike` — single-sample jump exceeded the 5× day-over-day threshold and likely reflects a pricing artifact. `unknown` — a sample that predates quality-flag derivation and has not been backfilled yet. The default response only ever carries `ok` / `unknown`; `capped` / `diverged` / `spike` rows surface only when `includeFlagged=true`."}},"isRequired":true,"uniqueKey":"latest.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"latest","typeLabel":"object | null"},"series":{"type":"array","description":"Per-point time series, ordered by ascending `ts`.","items":{"type":"object","required":["ts","tvl_usd","quality_flag"],"properties":{"ts":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"series.items.[INDEX].ts","typeLabel":"string\u003cdate-time>"},"tvl_usd":{"type":"number","isRequired":true,"uniqueKey":"series.items.[INDEX].tvl_usd","typeLabel":"number"},"quality_flag":{"type":"string","enum":["ok","capped","diverged","spike","unknown"],"description":"Data-quality classification of a vault TVL or share-price sample. `ok` — clean reading. `capped` — value clamped at a hard ceiling, treat as a lower bound. `diverged` — multi-source readings disagreed materially. `spike` — single-sample jump exceeded the 5× day-over-day threshold and likely reflects a pricing artifact. `unknown` — a sample that predates quality-flag derivation and has not been backfilled yet. The default response only ever carries `ok` / `unknown`; `capped` / `diverged` / `spike` rows surface only when `includeFlagged=true`.","isRequired":true,"uniqueKey":"series.items.[INDEX].quality_flag","typeLabel":"enum\u003cstring>"}},"uniqueKey":"series.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"series","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"schema_version":"s3","stale":false,"stale_reason":"fresh","days":30,"count":23,"filtered_count":6,"from":"2026-04-08T00:00:00.000Z","to":"2026-05-06T00:00:00.000Z","latest":{"ts":"2026-05-06T00:00:00.000Z","tvl_usd":2179522513.31,"quality_flag":"ok"},"series":[{"ts":"2026-04-08T00:00:00.000Z","tvl_usd":2122465748.18,"quality_flag":"ok"},{"ts":"2026-05-06T00:00:00.000Z","tvl_usd":2179522513.31,"quality_flag":"ok"}]},"examples":{"Example":{"title":"Example","value":{"schema_version":"s3","stale":false,"stale_reason":"fresh","days":30,"count":23,"filtered_count":6,"from":"2026-04-08T00:00:00.000Z","to":"2026-05-06T00:00:00.000Z","latest":{"ts":"2026-05-06T00:00:00.000Z","tvl_usd":2179522513.31,"quality_flag":"ok"},"series":[{"ts":"2026-04-08T00:00:00.000Z","tvl_usd":2122465748.18,"quality_flag":"ok"},{"ts":"2026-05-06T00:00:00.000Z","tvl_usd":2179522513.31,"quality_flag":"ok"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"b683a514-f12e-45f0-8b04-eb45c7f73ec1":{"description":"Invalid address format, missing chain parameter, or unsupported `range` value","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"9d6a982a-8755-42dd-861d-3a44fa897fed":{"description":"Authorization information is missing or invalid","content":{"application/json":{"example":{"message":"Unauthorized"},"examples":{"Example":{"title":"Example","value":{"message":"Unauthorized"}}},"exampleType":"examples"}},"exampleType":"examples"},"9ea17988-25f8-4b5a-bef2-b607133e72c0":{"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"}}},"content":{"application/json":{"example":{"x402Version":1,"error":"payment required"},"examples":{"Example":{"title":"Example","value":{"x402Version":1,"error":"payment required"}}},"exampleType":"examples"}},"exampleType":"examples"},"d2ca62b2-607b-49ed-8663-1d706ac1dee9":{"description":"Vault not in the verified-vaults catalog for the given address and chain","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"eeb326e8-101c-4e86-a5b4-2ca27643dd1e":{"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"}},"exampleType":"examples"}},"security":{"08c9c72d-b310-475a-9372-6ab37777244e":{"api_key":{"type":"apiKey","in":"header","name":"x-api-key","scopes":[],"schemeName":"api_key"}}},"servers":{"fc0b7da1-74c5-4274-8588-fe57c6e13f7a":{"url":"https://api.webacy.com","description":"Webacy Risk Score API (Production)"},"da385d44-e63f-43f6-8880-a921d943fe71":{"url":"https://api-development.webacy.com","description":"Webacy Risk Score API (Development)"},"8076712c-258a-4a8a-a8c8-798d8227b259":{"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 Vault TVL History - Webacy Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-01T19:56:23.250Z","originalFileLocation":"api-reference/vault-risk/get-vault-tvl-history.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 a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a quality_flag describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level latest aggregate so stat-tile consumers can render the current value without paging the full series. Quality filtering (default): Samples flagged as capped, diverged, or spike are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, count will be smaller than days and filtered_count reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set includeFlagged=true to bypass the filter and receive the raw series with every sample\u0026#x27;s quality_flag populated. Envelope semantics: stale_reason disambiguates the four post-filter states (fresh, pipeline_lag, all_filtered, no_samples_yet); stale: boolean is preserved for back-compat (true iff stale_reason !== \u0026#x27;fresh\u0026#x27;). schema_version is bumped any time the response shape changes — pin it if you\u0026#x27;re building a regression harness. Returns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with count: 0, latest: null, and stale_reason: \u0026#x27;no_samples_yet\u0026#x27;. Cached for 5 minutes; the includeFlagged=true and default responses are cached in partitioned namespaces so they never cross-pollinate.\">\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 Vault TVL History - Webacy Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a quality_flag describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level latest aggregate so stat-tile consumers can render the current value without paging the full series. Quality filtering (default): Samples flagged as capped, diverged, or spike are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, count will be smaller than days and filtered_count reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set includeFlagged=true to bypass the filter and receive the raw series with every sample\u0026#x27;s quality_flag populated. Envelope semantics: stale_reason disambiguates the four post-filter states (fresh, pipeline_lag, all_filtered, no_samples_yet); stale: boolean is preserved for back-compat (true iff stale_reason !== \u0026#x27;fresh\u0026#x27;). schema_version is bumped any time the response shape changes — pin it if you\u0026#x27;re building a regression harness. Returns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with count: 0, latest: null, and stale_reason: \u0026#x27;no_samples_yet\u0026#x27;. Cached for 5 minutes; the includeFlagged=true and default responses are cached in partitioned namespaces so they never cross-pollinate.\">\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/get-vault-tvl-history\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://webacy.mintlify.app/_mintlify/api/og/v2?division=Vault+History\u0026amp;title=Get+Vault+TVL+History\u0026amp;description=Returns+a+daily+time+series+of+total+value+locked+%28USD%29+for+a+single+ERC-4626+vault.+Each+point+is+a+UTC-midnight+sample+and+carries+a+%60quality_flag%60+describing\u0026amp;theme=13dc342d05893d147dc93219\u0026amp;signature=84df165ac1c53a39202a171137991998b21b5edaeb5aa545228fecaa5913adcd\">\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 Vault TVL History - Webacy Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a quality_flag describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level latest aggregate so stat-tile consumers can render the current value without paging the full series. Quality filtering (default): Samples flagged as capped, diverged, or spike are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, count will be smaller than days and filtered_count reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set includeFlagged=true to bypass the filter and receive the raw series with every sample\u0026#x27;s quality_flag populated. Envelope semantics: stale_reason disambiguates the four post-filter states (fresh, pipeline_lag, all_filtered, no_samples_yet); stale: boolean is preserved for back-compat (true iff stale_reason !== \u0026#x27;fresh\u0026#x27;). schema_version is bumped any time the response shape changes — pin it if you\u0026#x27;re building a regression harness. Returns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with count: 0, latest: null, and stale_reason: \u0026#x27;no_samples_yet\u0026#x27;. Cached for 5 minutes; the includeFlagged=true and default responses are cached in partitioned namespaces so they never cross-pollinate.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://webacy.mintlify.app/_mintlify/api/og/v2?division=Vault+History\u0026amp;title=Get+Vault+TVL+History\u0026amp;description=Returns+a+daily+time+series+of+total+value+locked+%28USD%29+for+a+single+ERC-4626+vault.+Each+point+is+a+UTC-midnight+sample+and+carries+a+%60quality_flag%60+describing\u0026amp;theme=13dc342d05893d147dc93219\u0026amp;signature=84df165ac1c53a39202a171137991998b21b5edaeb5aa545228fecaa5913adcd\">\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/get-vault-tvl-history\">\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/get-vault-tvl-history.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/get-vault-tvl-history#webpage\",\"url\":\"https://docs.webacy.com/api-reference/vault-risk/get-vault-tvl-history\",\"name\":\"Get Vault TVL History\",\"description\":\"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a quality_flag describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level latest aggregate so stat-tile consumers can render the current value without paging the full series. Quality filtering (default): Samples flagged as capped, diverged, or spike are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, count will be smaller than days and filtered_count reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set includeFlagged=true to bypass the filter and receive the raw series with every sample's quality_flag populated. Envelope semantics: stale_reason disambiguates the four post-filter states (fresh, pipeline_lag, all_filtered, no_samples_yet); stale: boolean is preserved for back-compat (true iff stale_reason !== 'fresh'). schema_version is bumped any time the response shape changes — pin it if you're building a regression harness. Returns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with count: 0, latest: null, and stale_reason: 'no_samples_yet'. Cached for 5 minutes; the includeFlagged=true and default responses are cached in partitioned namespaces so they never cross-pollinate.\",\"dateModified\":\"2026-10-01T19:56:23.250Z\",\"isPartOf\":{\"@id\":\"https://docs.webacy.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.webacy.com/api-reference/vault-risk/get-vault-tvl-history#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.webacy.com/api-reference/vault-risk/get-vault-tvl-history#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Webacy Docs\",\"item\":\"https://docs.webacy.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get Vault TVL History\",\"item\":\"https://docs.webacy.com/api-reference/vault-risk/get-vault-tvl-history\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.webacy.com/api-reference/vault-risk/get-vault-tvl-history#apireference\",\"headline\":\"Get Vault TVL History\",\"name\":\"Get Vault TVL History\",\"description\":\"Returns a daily time series of total value locked (USD) for a single ERC-4626 vault. Each point is a UTC-midnight sample and carries a quality_flag describing whether the underlying TVL reading was marked trustworthy. The response also hoists the most recent passing point to a top-level latest aggregate so stat-tile consumers can render the current value without paging the full series. Quality filtering (default): Samples flagged as capped, diverged, or spike are dropped from the response by default, so the chart line stays clean against upstream data-quality issues. When this happens, count will be smaller than days and filtered_count reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. Set includeFlagged=true to bypass the filter and receive the raw series with every sample's quality_flag populated. Envelope semantics: stale_reason disambiguates the four post-filter states (fresh, pipeline_lag, all_filtered, no_samples_yet); stale: boolean is preserved for back-compat (true iff stale_reason !== 'fresh'). schema_version is bumped any time the response shape changes — pin it if you're building a regression harness. Returns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with count: 0, latest: null, and stale_reason: 'no_samples_yet'. Cached for 5 minutes; the includeFlagged=true and default responses are cached in partitioned namespaces so they never cross-pollinate.\",\"url\":\"https://docs.webacy.com/api-reference/vault-risk/get-vault-tvl-history\",\"mainEntityOfPage\":{\"@id\":\"https://docs.webacy.com/api-reference/vault-risk/get-vault-tvl-history#webpage\"},\"dateModified\":\"2026-10-01T19:56:23.250Z\",\"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\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","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","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","href":"/api-reference/vault-risk-v3/get-vault-grades-batch"},{"title":"Get vault risk data framework and taxonomy","openapi":"GET /v3/framework","description":"Public methodology endpoint (no API key). Returns the full criteria taxonomy plus the supported framework / grading-scheme version lists. Unknown `framework_version` pins return 400 with the supported list. Cached 5 min.","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","description":"Returns a daily time series of share prices (USD) for a single ERC-4626 vault. Each point carries `apy_trailing_7d` — annualised against the sample 7 days earlier — which is `null` when the 7-day look-back sample is missing or the absolute APY exceeds 100 (clamped to suppress single-day pricing artifacts). Each point also carries a `quality_flag` describing whether the underlying share price was marked trustworthy. The hoisted `latest` aggregate additionally surfaces `apy_trailing_30d`, a smoother window intended for headline / stat-tile display.\n\n**Quality filtering (default):** Samples flagged as `capped`, `diverged`, or `spike` are dropped from the response by default so the chart line stays clean against single-day pricing artifacts and depeg-style divergences. When this happens, `count` will be smaller than `days` and `filtered_count` reports how many points were excluded — a visible kink in the chart line is expected and does not indicate a missed daily update. The 7-day look-back required to compute `apy_trailing_7d` is **not** subject to the filter and does **not** count toward `filtered_count`. Set `includeFlagged=true` to bypass the filter and receive the raw series with every sample's `quality_flag` populated.\n\n**Envelope semantics:** `stale_reason` disambiguates the four post-filter states (`fresh`, `pipeline_lag`, `all_filtered`, `no_samples_yet`); `stale: boolean` is preserved for back-compat (`true` iff `stale_reason !== 'fresh'`). `schema_version` is bumped any time the response shape changes — pin it if you're building a regression harness.\n\nReturns 404 when the vault is not in the verified-vaults catalog; tracked vaults with no samples yet still return 200 with `count: 0`, `latest: null`, and `stale_reason: 'no_samples_yet'`. Cached for 5 minutes; the `includeFlagged=true` and default responses are cached in partitioned namespaces so they never cross-pollinate.","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"}]}]}]}]},"title":"Get Vault TVL History - Webacy Docs","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-WRhTSUDL.js","utils-ChMov4Kr.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-_REmC2bI.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp6nVRCu.js","snippetPresets-DZadmXoU.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CY2WdoTl.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-DwYG-Q4l.js","shallow-BXQIGwv4.js","getApiPlaygroundDisplay-CK5nK5B9.js","CodeSnippet-TH4a2aGW.js","CodeSnippets-DwsQiOFS.js","Page-R3M_BF4L.js","getPastedJson-DD7kUzi_.js","icon-holE3QoJ.js","MethodPill-DUW0T8us.js","DuplicateIcon-CI_p4be-.js","createIcon-BdbRvavb.js","DynamicMarkdown-DN96a4Ur.js","SectionHeading-SCu36A9d.js","axios-vUo_bRtp.js","Markdown-CCeGv-zI.js","clsx-BGBGWFTt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-Cv_O2fky.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-2C5OB2eV.js"]}