API
YO Protocol API
Anyone can use the API to fetch historical information at the protocol or address-level.
Base URL: https://api-v2.yo.xyz/
The canonical vault contract, which is also the family’s share token and its registry key
The access-control contract governing the vault — what the withdraw path builds against; one address across every chain
Slug of the master family this feeder routes deposits into (a buffer-TVL share class, e.g. yousdt → "yousd"); null for standalone vaults
Address whose PoolBinding rows serve this family's pools — equals address except for mirroring families (yoTest → yoUSD-Edge's); key every pool↔binding join on this
No vault family with that slug
GET /v1/vaults/{slug} HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
{
"slug": "text",
"name": "text",
"address": "text",
"authority": "text",
"assets": {
"base": {
"chainId": 1,
"address": "text",
"symbol": "text",
"name": "text",
"decimals": 1,
"coingeckoId": "text"
},
"share": {
"chainId": 1,
"address": "text",
"symbol": "text",
"name": "text",
"decimals": 1,
"coingeckoId": "text"
}
},
"feederOf": "text",
"bindingDeclarationAddress": "text",
"chains": [
{
"chainId": 1,
"role": "settlement",
"assets": {
"base": {
"chainId": 1,
"address": "text",
"symbol": "text",
"name": "text",
"decimals": 1,
"coingeckoId": "text"
},
"share": {
"chainId": 1,
"address": "text",
"symbol": "text",
"name": "text",
"decimals": 1,
"coingeckoId": "text"
}
}
}
],
"stats": {
"updatedAt": "2026-01-01T00:00:00.000Z",
"importedFromLegacy": true,
"baseAsset": "text",
"baseAssetDecimals": 1,
"shareDecimals": 1,
"tvl": "text",
"idle": "text",
"invested": "text",
"pendingExits": "text",
"pendingRedemptionAssets": "text",
"totalShares": "text",
"assetsPerShare": "text",
"tvlUsd": 1,
"apy": 1,
"apy1d": 1,
"apy7d": 1,
"apy30d": 1,
"rewardApr": 1,
"chains": [
{
"chainId": 1,
"block": "text",
"idle": "text",
"invested": "text",
"pendingExits": "text",
"tvl": "text",
"shareSupply": "text"
}
],
"pools": [
{
"offchainId": "text",
"chainId": 1,
"name": "text",
"protocolName": "text",
"poolUrl": "text",
"description": "text",
"value": "text",
"allocationBps": 1,
"availableLiquidity": "text",
"apy1d": 1,
"apy7d": 1,
"apy30d": 1,
"mechanismApy": 1,
"riskScore": 1,
"status": "active",
"idleOnly": true
}
]
},
"exposure": {
"at": "2026-01-01T00:00:00.000Z",
"allocatedUsd": 1,
"uncollateralizedUsd": 1,
"uncollateralizedPct": 1,
"underlying": [
{
"chainId": 1,
"address": "text",
"symbol": "text",
"exposureUsd": 1,
"exposurePct": 1
}
],
"collateral": [
{
"chainId": 1,
"address": "text",
"symbol": "text",
"exposureUsd": 1,
"exposurePct": 1
}
]
}
}^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$dayPossible values: 1000The tick instant, UTC
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$Rate as a fraction, 0.045 = 4.5%
No vault family with that slug
GET /v1/vaults/{slug}/timeseries/apy HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
[
{
"at": "2026-01-01T00:00:00.000Z",
"value": 1
}
]^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$dayPossible values: 1000The tick instant, UTC
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$TVL in the family’s base asset
The tick’s own USD enrichment; null when no price was held at the time
No vault family with that slug
GET /v1/vaults/{slug}/timeseries/tvl HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
[
{
"at": "2026-01-01T00:00:00.000Z",
"value": "text",
"usd": 1
}
]Vault family slug, e.g. yousd; unknown slugs are a 404
Wallet address; matched as owner (deposits) or receiver (exits)
Narrows the fan-out to one chain
Only events newer than 1/7/30 days ago
Deposits worth at least $100k; requires family
The previous response’s nextCursor, verbatim
20Opaque token for the next page; null when this page is the last. Never build one — pass it back verbatim
GET /v1/history HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
{
"items": [
{
"type": "deposit",
"chainId": 1,
"vaultAddress": "text",
"user": "text",
"assets": "text",
"shares": "text",
"transactionHash": "text",
"blockTimestamp": 1
}
],
"nextCursor": "text",
"incompleteChains": [
{
"family": "text",
"chainId": 1,
"reason": "unconfigured"
}
]
}Vault family slug, e.g. yousd; unknown slugs are a 404
Chains at least one read on did not answer — no RPC url here, a failed multicall, or a single vault read that failed. The unreadable reads contribute no rows (never fake zeros); a chain named here may still carry rows from its other vaults
family names no vault family this build knows
GET /v1/users/{walletAddress}/pending-redeems HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
{
"redeems": [
{
"family": "text",
"chainId": 1,
"vault": "text",
"shares": "text",
"requestedAssets": "text",
"currentAssets": "text",
"shareDecimals": 1,
"baseAsset": "text",
"baseAssetDecimals": 1,
"baseAssetSymbol": "text"
}
],
"incompleteChains": [
1
]
}Vault family slug, e.g. yousd; unknown slugs are a 404
Checksummed wallet address
GET /v1/performance/{walletAddress} HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
{
"wallet": "text",
"families": [
{
"family": "text",
"baseAsset": "text",
"baseAssetDecimals": 1,
"baseAssetSymbol": "text",
"shareDecimals": 1,
"realized": "text",
"costBasis": "text",
"sharesBalance": "text",
"currentValue": "text",
"unrealized": "text",
"usd": {
"currentValueUsd": 1,
"unrealizedUsd": 1,
"realizedUsd": 1
},
"pricedAt": "text"
}
],
"totals": {
"currentValueUsd": 1,
"unrealizedUsd": 1,
"realizedUsd": 1,
"unpricedFamilies": [
"text"
]
}
}Last updated
