Skip to main content

Public access: no integrator authentication

GET /v1/query/apy and GET /v1/query/apy-history are public, read-only endpoints. Unlike the removed vault-ID routes, they require no X-Pubkey, X-Timestamp, or X-Signature headers. Customer, account, transaction, and other protected endpoints still require authentication.
Identify an active top vault by its on-chain vault_address (required), not its former database vault_id. Supply chain_id when the same address is listed on multiple chains; sending it explicitly is recommended. Resolve the address/chain from your vault metadata rather than treating an old vault ID as an address.

Breaking migration: requests and fields

/v1/query/apy/{vault_id} and /v1/query/history/{vault_id} have been removed. Change request construction, response parsing, and chart assumptions together. This is not a URL-only rename or a numerical equivalence guarantee.

Latest APY

The old handler calculated APYs on demand from share-price history. The new handler reads precomputed hourly indexer snapshots. The nearest windows below are migration choices, not aliases with identical calculations. Before — authenticated request (a fresh signature must cover this exact path/query):
Illustrative old response, not a production observation:
apy-before
After — public request (substitute an active top vault’s real address):
Illustrative new response; independent values, not a conversion of the old example:
apy-after

History: samples, not pagination

Before — authenticated paginated request:
Illustrative old response:
history-before
After — public sampled request:
Illustrative new response:
history-after

Reading and sampling snapshots

APYs are decimal ratios, serialized as strings: "0.05" means 5%, not 0.05%. They annualize price-per-share changes over trailing windows, not returns earned by an account. A vault younger than a window uses its oldest available snapshot as the boundary; the response does not report that boundary’s age. Use timestamp and block_number to check freshness. The API divides the span from first to last matching snapshot into equal-width buckets of at least one hour, retaining the latest snapshot in each nonempty bucket. Empty buckets are omitted: no interpolation or gap filling. The newest matching snapshot is always included; points=1 returns only that snapshot. Count is a maximum, not a calendar frequency. For a vault with data starting in October, a January-to-December request samples the available October-to-December span. APYs are computed at snapshot time, not bucket averages or returns recalculated between selected points. Invalid bounds (pre-epoch dates or inverted ranges), unsupported order, out-of-range points, or an ambiguous address without chain_id return 400. Latest APY returns 404 if no indexed snapshot exists yet. See the generated latest APY and APY history references for exact schemas.