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.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
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):
apy-before
apy-after
History: samples, not pagination
Before — authenticated paginated request:
history-before
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.
