Vaults
Endpoints for discovering the vaults that belong to your organization and inspecting state on a specific vault. The API uses a "tenant" to represent your organization. All endpoints are tenant-scoped — the tenant is resolved from your API key, and vaults outside your tenancy are not visible.
For authentication, base URL, request/response conventions, and the error envelope, see the API Reference. Create an API key first via Quick Start. Examples below assume the key is in $VEDA_API_KEY.
Concepts
A vault is a set of smart contracts — built on Veda's BoringVault architecture — that abstracts DeFi complexity via a risk manager (also referred to as a curator), and adds enterprise compliance controls. A vault generates yield by allocating depositor funds, per the curator's instructions, to trusted DeFi protocols using predefined yield strategies. Depositors receive vault receipt tokens that prove ownership of their deposited funds, and only depositors can withdraw — not Veda, not the curator.
A vault can be deployed on one or more chains; the same vault_address appears on each chain it's been deployed to. Its Manager contract on each chain holds that chain's current merkle root — a single onchain commitment to the allowlist of actions the curator (or a delegated strategist) is permitted to execute there. For how the allowlist works and how the underlying tree is structured, see Policy Manager & Merkle Trees.
Tenant denial returns 404, not 403. Asking for a vault that isn't part of your tenant returns 404 vault_not_found — the API does not distinguish "doesn't exist" from "exists but not yours."
1. List vaults
GET /v1/vaultsReturns the vaults that belong to the tenant on your API key, across every chain.
Query parameters
cursor
string
No
Opaque cursor from a previous response's page.next_cursor — omit on the first call.
Example request
curl https://api.veda.tech/v1/vaults \
-H "Authorization: Bearer $VEDA_API_KEY"Example response
chainsis the set of chains the vault is deployed on.linksis keyed by chain — each chain has its ownselfandrootsresource. The link strings are returned unversioned (no/v1/prefix); they're resource paths relative to the API host. Prepend/v1(or the base URL) when calling them.
Errors
401
unauthenticated
Missing, expired, or revoked API key
429
rate_limited
API key rate limit exceeded
See API Reference → Errors for the envelope and the shape of authentication / rate-limit responses.
2. Get the latest metrics snapshot
Returns the most recent metrics snapshot for a vault on a given chain. Snapshots are produced daily by the share-price runner and capture share price, total assets, total supply, per-protocol position breakdown, and asset prices — all at a specific block.
Path parameters
vault_address
string
The BoringVault contract address
Example request
Example response
as_ofis the ISO-8601 UTC timestamp of the snapshot's source block;block_numberis that block.snapshot_typeindicates the metric model used for this vault (e.g.yield_streaming). Type-specific fields (like theyield_streamingblock below) only appear when the correspondingsnapshot_typeis active.share_price,total_assets,total_supply, positionbalances, prices inprices, andyield_streaming.vested_amountare returned as strings to preserve full precision for assets whose values can fall outside safe float ranges.positionsis the per-protocol breakdown of vault holdings as ofblock_number. Each entry is{ protocol, asset, balance }. To value a position in the vault's base asset, look up its price atprices[chain][asset]and multiply:balance × price.pricesis a top-level chain → asset → string-price map. The base case is one chain (the vault's own); the structure leaves room for cross-chain holdings.base_assetis the asset thatshare_price,total_assets, andtotal_supplyare denominated in. May come back as"unknown"for snapshots where the base asset hasn't been resolved yet.yield_streamingis present only whensnapshot_typeisyield_streaming— see About yield streaming below for what these fields represent and why the vault uses this model.
About yield streaming
Yield-streaming vaults distribute earned yield linearly into the share price over a configurable vesting window, instead of applying it as a single rate jump. This defends against MEV and other value-extraction attacks on discrete rate updates — an attacker who front-runs a rate jump only captures the sliver of yield that has vested between their deposit and its execution, so the attack isn't profitable.
When snapshot_type is yield_streaming, the yield_streaming block on the response reports the current vesting tranche:
vested_amount(string, denominated inbase_asset) — the size of the yield tranche being streamed into the share price over the current window. This entire amount accrues intoshare_pricelinearly across the window.vesting_duration_seconds(int) — length of the vesting window in seconds. Production vaults typically use43200(12 hours).
Errors
401
unauthenticated
Missing, expired, or revoked API key
404
vault_not_found
Vault does not exist on this chain, or is not in your tenant
429
rate_limited
API key rate limit exceeded
3. List metrics snapshot history
Returns the history of metrics snapshots for a vault on a given chain — newest first. Each entry has the same shape as Get the latest metrics snapshot. Cursor-paginated.
Path parameters
vault_address
string
The BoringVault contract address
Query parameters
cursor
string
No
Opaque cursor from a previous response's page.next_cursor — omit on the first call.
Example request
Example response (abbreviated)
Errors
401
unauthenticated
Missing, expired, or revoked API key
404
vault_not_found
Vault does not exist on this chain, or is not in your tenant
429
rate_limited
API key rate limit exceeded
4. List roots set on a vault
Returns the roots that have been set on a vault on a given chain — both current and historical. Tenant-scoped: a vault outside your tenant (or a chain the vault isn't deployed on) returns 404 vault_not_found. Cursor-paginated. Default sort: active DESC — active roots first, then inactive.
Path parameters
vault_address
string
The BoringVault contract address
Query parameters
cursor
string
No
Opaque cursor from a previous response's page.next_cursor — omit on the first call.
Example request
Example response
One entry is returned per
(root_hash, strategist)pair — a vault that authorizes multiple strategists under the same root appears multiple times, once per strategist.
Errors
401
unauthenticated
Missing, expired, or revoked API key
404
vault_not_found
Vault does not exist on this chain, or is not in your tenant
429
rate_limited
API key rate limit exceeded
5. List daily data
Returns the daily share-price, APY, TVL, and base-asset accounting series for a vault over a date range. Cursor-paginated; the requested range is echoed back on meta so the response is self-describing.
This endpoint uses the camel-case path segment dailyData to match the upstream contract; the rest of the API uses snake_case in paths.
Path parameters
vault_address
string
The BoringVault contract address
Query parameters
from
string
No
Start of the range, ISO-8601 UTC (e.g. 2026-05-01T00:00:00Z). Omit to default to the earliest available day for the vault.
to
string
No
End of the range, ISO-8601 UTC (e.g. 2026-06-12T00:00:00Z). Omit to default to the latest available day for the vault.
cursor
string
No
Opaque cursor from a previous response's page.next_cursor — omit on the first call.
Calling the endpoint without from / to returns the full series for the vault, paginated. The meta block on the response reflects the effective range applied by the server, so you can tell what window the data actually covers even when you omit one or both params.
Example request
Example response
One entry per day in the requested range, in chronological order.
share_priceanddaily_apyare floats;total_assets,tvl_usd, andprice_usdare returned as strings to preserve full precision for assets whose value can fall outside safe float ranges.daily_apyis fractional —0.015506…means1.55%, not155%.meta.from/meta.toreport the effective range the server applied — either the values you supplied, or the defaults (earliest and latest available days) when omitted.
Errors
401
unauthenticated
Missing, expired, or revoked API key
404
vault_not_found
Vault does not exist on this chain, or is not in your tenant
422
validation_failed
from / to malformed, or to ≤ from
429
rate_limited
API key rate limit exceeded
Go on to next: Policy Manager & Merkle Trees — how a vault's allowlist is encoded as a merkle tree and committed onchain.
Last updated