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 producer marked the underlying TVL reading as 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 producer-side 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 cron tick. 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.
Authorizations
Path Parameters
Vault contract address
^0x[a-fA-F0-9]{40}$Query Parameters
Blockchain network where the vault is deployed
eth, arb, base, opt, pol, bsc Window length to return. Defaults to 30d when omitted.
7d, 30d, 60d, 3m 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
Response-shape version token. Bumped any time the wire payload shape changes — pin if you are building a regression harness against this endpoint.
"s3"
Back-compat alias: true iff stale_reason !== 'fresh'. Prefer stale_reason for new integrations.
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.
fresh, pipeline_lag, all_filtered, no_samples_yet Resolved value of the range query parameter expressed in days (7 / 30 / 60 / 90).
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.
0
UTC-midnight timestamp of the first point in series. null when series is empty.
UTC-midnight timestamp of the last point in series. null when series is empty.
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.
Per-point time series, ordered by ascending ts.
