Vaults Data API
Vaults Data API
Welcome to the Bonzo Vaults Data API. The Vaults API exposes real-time and historical data for the Bonzo Yield Vaults product β a family of automated yield strategies that deploy user deposits into liquidity pools, lending markets, and other on-chain venues on the Hedera network. It is intended for third parties building dashboards, portfolio trackers, analytics platforms, bots, and any other tooling that needs programmatic access to vault state, performance, and user positions.
Bonzo Vaults ships in two flavors, each with its own data service:
Dual-Asset DEX Vaults β concentrated-liquidity vaults that hold a pair of assets and auto-compound trading fees and incentive rewards. These are powered by Beefy-style strategy contracts and serve liquidity to venues like SaucerSwap.
Single-Asset DEX Vaults β ICHI vaults that accept a single deposit token and internally manage a paired position. Users only ever deposit and withdraw the deposit token; the vault handles the rest.
Both services share the same overall shape β the same routing conventions, the same query patterns, and the same general response objects β but they expose data unique to each strategy class. This page documents both as a single, unified surface so an integrator can read across them with minimal friction.
Key Features
Real-Time Vault Data β TVL, APY/APR breakdowns, share prices, fees, and harvest history, refreshed continuously.
User Position Tracking β per-vault and aggregate position views, including yield, P&L, and historical snapshots.
Historical Charts β APY, TVL, share price, portfolio performance, and harvest-fee timeseries for any timeframe.
Platform Analytics β protocol-wide TVL, fees, revenue, and snapshot summaries.
Public Endpoints β no authentication required for any of the read endpoints documented below.
Hedera-native Identifiers β every contract is exposed with both its EVM-style address (
0xβ¦) and its Hedera entity ID (0.0.β¦) for compatibility with HashScan, the Hedera mirror node, and EVM tools.
Base URLs
The two vault types are served from two separate base URLs. Pick the one that matches the vault you are working with:
Dual-Asset DEX Vaults (Beefy-style)
https://mainnet-vaults.bonzo.finance
Single-Asset DEX Vaults (ICHI)
https://mainnet-single-asset.bonzo.finance
All endpoints below are prefixed with /v1/api/β¦. The health endpoint lives at /v1/health and a service-info endpoint is exposed at /.
A vault's id is unique within its own service. A dual-asset vault ID will not resolve against the single-asset service and vice versa. Treat the two services as independent data sources keyed by (baseUrl, vaultId).
Common Concepts
The same handful of objects show up across nearly every endpoint. Read this section once and the rest of the page becomes a thin reference.
Networks and identifiers
Both APIs run against Hedera mainnet (chainType: "hedera_mainnet", network: "Hedera"). Each contract appears with two identifiers:
contractAddressβ EVM 20-byte address, e.g.0xcfba07324bd207C3ED41416a9a36f8184F9a2134.contractIdβ Hedera native entity ID, e.g.0.0.10164550.
Use whichever one matches your tooling. Tokens follow the same convention via address and contractId fields on each asset object.
Asset and pair-token objects
Every vault carries an array of underlying assets. The shape is consistent across both services:
Single-asset vaults additionally surface a pairToken β the secondary token the vault rebalances against β using the same shape.
TVL, APY, and APR
tvl / TVL
Total Value Locked in the vault, USD. Returned as a string for precision and (on the single-asset API) also as a number under TVL.
apy
Net annualized yield, expressed as a decimal β e.g. 0.157 is 15.7%. Note: the single-asset API returns APY as a percent number (e.g. 16.379β¦).
apy30d
30-day rolling APY (single-asset API).
daily
1-day yield estimate (decimal on dual-asset, percent number on single-asset).
harvestApy7d, harvestApy30d
Realized APY measured from the vault's own harvest history over the trailing window (dual-asset only).
vaultApr, vaultApy, tradingApr, rewardApr, clmApy
Component APRs that roll into apy. Useful when displaying a breakdown.
apySource
Which input drove the headline APY: "harvest", "price", "manual", etc.
confidence
Confidence scoring object on dual-asset vaults: { score, level: "low" | "medium" | "high", reasons: string[] }.
Share price and user position math
Vault deposits are tokenized as shares. A user's underlying balance is shares Γ sharePrice, and yield is the change in that quantity since their entries.
sharePriceis returned in raw on-chain precision;sharePriceUsdis the USD-normalized version.userPosition.deposited/depositedUSDcapture cost basis.userPosition.currentValueandcurrentValueInUSDcapture the present mark-to-market value.userPosition.yieldis realized + unrealized yield since deposit.userPosition.pnl = { amount, percentage }is convenience math:currentValue β deposited.
Harvests
A harvest is the periodic on-chain operation that compounds collected fees and incentive rewards back into the vault. Harvest events are the primary fuel for realized APY measurements and for fee-attribution endpoints. Both APIs expose a lastHarvest timestamp on each vault, and both expose harvest-fee timeseries per user under /charts/users/:address/harvest-fees.
Service Info & Health
Both services expose a service banner at the root and a liveness probe at /v1/health.
GET /
Returns the service identity and a directory of mounted route prefixes.
GET /v1/health
Liveness check. Returns 200 OK with current uptime and version when the service is healthy.
Dual-Asset DEX Vaults
Base URL: https://mainnet-vaults.bonzo.finance
Dual-asset vaults hold a pair of assets β typically a SaucerSwap concentrated-liquidity LP β and auto-rebalance the position while compounding trading fees and emissions. Each vault has both a vault contract and a separate strategy contract.
List Vaults
GET /v1/api/vaults
Returns the full set of dual-asset vaults along with summary metrics.
Query Parameters
protocol
string
Filter by protocol (e.g. SaucerSwap).
strategy
string
Filter by strategy name.
vaultType
string
Filter by vault type β single, concentratedLiquidity.
minTvl
number
Minimum TVL filter, USD.
minApy
number
Minimum APY filter (decimal, e.g. 0.05 = 5%).
sortBy
tvl | apy | name
Sort field.
sortOrder
asc | desc
Sort direction.
limit
number
Page size.
offset
number
Page offset.
afterTransaction
boolean
When true, bypasses the cache. Use after a deposit/withdraw to pull fresh state.
Response
Each VaultSummary includes (abbreviated):
Get Vault by ID
GET /v1/api/vaults/:id
Returns the full detail object for a single vault. Same shape as a VaultSummary plus richer breakdowns.
Path Parameters
id
string
Vault ID (the id field returned from GET /vaults).
Query Parameters
afterTransaction
boolean
Bypass cache.
List a User's Positions
GET /v1/api/vaults/user-positions?account=0xβ¦
Lightweight, fast endpoint that returns every dual-asset vault and the caller's position in each. Designed for "My Vaults" dashboards. Yield/PnL math is omitted in this response for performance β call the per-vault detail endpoint below to get those.
Query Parameters
account
string
yes
EVM address of the user.
protocol, strategy, vaultType, minValue
filters
no
Same semantics as the list endpoint.
sortBy
deposited | currentValue | shares
no
Sort field.
sortOrder
asc | desc
no
Sort direction.
limit, offset
number
no
Pagination.
afterTransaction
boolean
no
Bypass cache.
Response
Get a User's Position in a Specific Vault
GET /v1/api/vaults/user-positions/:id?account=0xβ¦
Returns the full position record β including yield breakdown and P&L β for a single vault.
Charts & Analytics
All chart endpoints share a timeframe query parameter that accepts 1D, 1W, 1M, 3M, 1Y, ALL, or EVERY (full snapshot history at native resolution). Defaults vary per endpoint.
GET /v1/api/charts/vaults/:id/historical-rate
APY/TVL timeseries for a vault, broken down by harvest-window and SaucerSwap fee/LARI APR sources.
GET /v1/api/charts/vaults/:id/metrics-history
Vault-level metrics history β TVL, APY, share price (and per-token share price), total assets, daily yield, and unique user count.
GET /v1/api/charts/vaults/:id/portfolio-performance?account=0xβ¦
User-specific P&L chart for a single vault.
GET /v1/api/charts/vaults/:id/risk?days=30
Volatility, max drawdown, Sharpe ratio, and 95% VaR computed over the last days (1β365, default 30).
GET /v1/api/charts/users/:address/positions
Snapshot history of all of a user's positions across vaults. Optionally filter to a single vaultId.
GET /v1/api/charts/users/:address/:vaultId/position-history
Same shape as above, scoped to a single vault, with both raw and USD-denominated token balances.
GET /v1/api/charts/users/:address/harvest-fees
Harvest-fee attribution timeseries for a user. Optionally scoped by vaultId, timeframe, or an explicit startDate/endDate (ISO 8601). Returns per-harvest fee splits across both pair tokens plus running cumulative totals.
GET /v1/api/charts/users/:address/harvest-fees/summary
Aggregate-only version of the above β total fees collected, harvest count, average fee per harvest, first/last harvest. Useful for "lifetime earnings" tiles.
GET /v1/api/charts/vaults/:id/harvest-fees/users
Leaderboard endpoint β every user's cumulative harvest fees in a given vault, ordered descending. Supports startDate, endDate, and limit (1β1000, default 100).
GET /v1/api/charts/analytics/overview
Snapshot of the platform: TVL, vault count, average APY, total users, total yield generated.
GET /v1/api/charts/analytics/platform-stats/latest
Most recent daily snapshot of platform-wide totals and revenue split.
GET /v1/api/charts/analytics/platform-stats/history?timeframe=3M
Historical timeseries of the same shape, one record per day, for charting protocol-level metrics.
GET /v1/api/charts/prices?tokens=HBAR,USDC,SAUCE
Spot prices for any comma-separated list of token symbols, returned with their oracle source and capture timestamp.
User Action History
GET /v1/api/users/actions?address=0xβ¦
On-chain action history for a user β deposits, withdrawals, and harvests β joined to vault metadata.
Query Parameters
address
string
yes
User EVM address.
vaultId
string
no
Filter to a single vault.
sortBy
timestamp | action | blockNumber
no
Default timestamp.
sortOrder
asc | desc
no
Default desc.
limit
number
no
1β100, default 50.
offset
number
no
Default 0.
Single-Asset DEX Vaults
Base URL: https://mainnet-single-asset.bonzo.finance
Single-asset vaults are ICHI vaults on Hedera. The user deposits a single token (e.g. HBAR or USDC) and the vault internally manages a paired position. The deposited token is referred to as asset[0] and the secondary token as pairToken / asset[1]. Many fields below mirror the dual-asset surface; the differences are noted inline.
On the single-asset API, apy, apy30d, and daily are returned as percent numbers (e.g. 16.379 means 16.379%), not decimals. Convert accordingly on the consumer side.
List Vaults
GET /v1/api/vaults
Returns the set of single-asset (ICHI) vaults along with summary metrics.
Query Parameters
protocol
string
Filter by protocol (e.g. SaucerSwap).
vaultType
single | concentratedLiquidity | ICHI
Vault type filter.
minTvl, minApy
number
Threshold filters.
sortBy
tvl | apy | name
Sort field.
sortOrder
asc | desc
Sort direction.
limit, offset
number
Pagination (default limit=50).
afterTransaction
boolean
Bypass cache.
Response
Each VaultSummary includes:
Get Vault by ID
GET /v1/api/vaults/:id
Returns the full detail object for a single ICHI vault. Same shape as a list VaultSummary plus an optional userPosition block when account is supplied.
Query Parameters
account
string
EVM address β when supplied, the response includes the caller's userPosition.
afterTransaction
boolean
Bypass cache.
List a User's Positions
GET /v1/api/vaults/user-positions?account=0xβ¦
Returns every single-asset vault position held by a user, with summary totals.
UserPositionSummary includes all the same fields as the embedded userPosition object on the vault detail response, plus vaultId, vaultName, apy, and depositedUsd.
Get a User's Position in a Specific Vault
GET /v1/api/vaults/user-positions/:id?account=0xβ¦
GET /v1/api/vaults/:id/users/:address
Two equivalent paths for the same data β pick whichever fits your routing style. Returns a single UserPositionSummary or 404 if the user has no position in the vault.
Charts & Analytics
GET /v1/api/charts/vault-tvl-apy/:id?timeframe=1M
TVL and APY timeseries for a single vault. Returns apy as a percent number (matching the vault detail convention).
GET /v1/api/charts/tvl?timeframe=1M
GET /v1/api/charts/apy?timeframe=1M
Platform-wide TVL and APY timeseries respectively.
GET /v1/api/charts/portfolio/:address?timeframe=1M
User portfolio P&L chart β same shape as the dual-asset portfolio-performance endpoint:
GET /v1/api/charts/user/:address/positions?timeframe=1M&vaultId=β¦
Per-user, per-vault position snapshots over time. vaultId filters to a single vault.
GET /v1/api/charts/vault-performance/:id
30-day "Hold vs Vault" comparison series for a vault. Returns five strategy lines: hold deposit token, hold 50/50, Uniswap-style V2 LP, vault, vault with fees. Useful for "is my vault actually beating the alternative?" charts.
GET /v1/api/charts/users/:address/harvest-fees
Same fee-attribution shape as the dual-asset harvest-fees endpoint, plus an extra depositTokenSymbol and totalFeesCollectedInDepositToken field that re-prices total fees into the user's deposit token (helpful for single-asset UX). Supports vaultId, timeframe, startDate, endDate.
GET /v1/api/charts/analytics/overview
Platform-level summary. The single-asset service returns pre-formatted strings (e.g. "$634.83K", "6.39%"):
GET /v1/api/charts/analytics/global-stats
Latest snapshot + cumulative totals for fees and revenue.
GET /v1/api/charts/analytics/global-stats/series?timeframe=1D
Time-series version of global-stats for charting protocol fees, revenue, and TVL.
GET /v1/api/charts/analytics/platform-stats/latest
GET /v1/api/charts/analytics/platform-stats/history?timeframe=EVERY
Identical shape to the dual-asset endpoints of the same name (see Dual-Asset Charts & Analytics), tracking per-day totals, revenue, fees, and withdrawals across all single-asset vaults.
User Token Balances
GET /v1/api/users/balances?address=0xβ¦&tokenList=HBAR,USDC,0xβ¦
Returns the user's wallet balances and USD valuations for an arbitrary list of tokens. tokenList accepts either symbols or contract addresses, comma-separated.
User Action History
GET /v1/api/users/actions
Same purpose as the dual-asset version β deposits and withdrawals β with a slightly richer per-action payload that captures both raw token amounts and the deposit-token normalization that ICHI vaults expose.
Query Parameters
address
string
one of address/vaultId is required
User EVM address.
vaultId
string
one of address/vaultId is required
Filter to a vault.
action
deposit | withdraw
no
Action type.
limit
number
no
1β1000, default 100.
offset
number
no
Default 0.
sortBy, sortOrder
string
no
Default timestamp desc.
Pool Liquidity
The single-asset service exposes the underlying SaucerSwap pool's liquidity directly β useful for estimating slippage or sizing deposits.
GET /v1/api/pools/liquidity?tokenAContractId=0.0.X&tokenBContractId=0.0.Y
Look up a pool by its token pair using Hedera contract IDs.
GET /v1/api/pools/:poolId/liquidity
Look up a pool by its pool contract ID directly.
Both return:
Error Handling
Every error response across both services follows the same envelope:
Common HTTP statuses you should plan for:
200
Success.
400
Bad Request β a required parameter is missing or fails validation.
401
Unauthorized β only relevant to the (non-public) /admin routes.
404
Not Found β vault or user position does not exist.
409
Conflict β only emitted by admin endpoints.
429
Rate Limit Exceeded.
500
Internal Server Error β including upstream RPC/oracle failures.
Both services currently return 500 (rather than 404) when a vault id is not a valid Mongo ObjectId β e.g. requesting /v1/api/vaults/foo will surface an internal cast error. Treat any non-200 response on a detail lookup as "not available" and re-derive the ID from the list endpoint.
Rate Limiting
Each service applies a default IP-based rate limit of 100 requests per 15 minutes to public routes. Exceeding the limit returns 429 with a standard Retry-After-style payload. There is no authentication tier today β well-behaved clients should:
Cache list responses (TTL β 30s aligns with the server's own cache headers).
Batch users instead of polling per-user every render.
Use the
afterTransaction=trueflag only when you actually need fresh state after a write.
Best Practices
Use
user-positionsfor "My Vaults" views. It's an order of magnitude faster than calling vault detail per row, because it skips the full yield/PnL pass.Hit
user-positions/:idonly for the vault the user is interacting with. That is where the full breakdown lives.Refresh state with
?afterTransaction=trueimmediately after a deposit/withdraw, and otherwise let the 30-second cache do its job.Convert APY units before displaying. Dual-asset returns decimals (
0.157); single-asset returns percents (16.379). Normalize at your ingestion layer.Use
chartType: "ICHI"to detect single-asset vaults in any context where a position can come from either service.Snapshot
confidence.levelalongside any APY you display. Alowconfidence reading withprice_fallbackreasons should be visually distinguished from ahighconfidence harvest-derived APY.Always read both
contractAddressandcontractId. The EVM address is foreth_*RPCs and EVM tools; the contract ID is for HashScan and the Hedera mirror node.Implement exponential backoff on 5xx and 429. Both services are tolerant to bursts but will rate limit aggressive crawlers.
Example: End-to-End Integration
The following snippet pulls a unified "all of my vault positions" view across both services, sorts by current value, and prints a summary.
Drilling into a single position once the user clicks a row:
Support
For questions, integration help, or to report a discrepancy in the data, drop into the #developers channel in the Bonzo Discord or open an issue on the Bonzo docs repo. The Vaults team monitors both during normal business hours.
Last updated