Page cover
For the complete documentation index, see llms.txt. This page is also available as Markdown.

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/

Get a snapshot of the current TVL, yield, and allocations for a vault.

get
Path parameters
slugstring · min: 1Required
Responses
200Success
application/json
slugstringRequired
namestringRequired
addressstringRequired

The canonical vault contract, which is also the family’s share token and its registry key

authoritystringRequired

The access-control contract governing the vault — what the withdraw path builds against; one address across every chain

feederOfstring · nullableRequired

Slug of the master family this feeder routes deposits into (a buffer-TVL share class, e.g. yousdt → "yousd"); null for standalone vaults

bindingDeclarationAddressstringRequired

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

get/v1/vaults/{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
      }
    ]
  }
}

Fetch the historical yield of a vault.

get
Path parameters
slugstring · min: 1Required
Query parameters
fromany ofOptional
string · date-timeOptionalPattern: ^(?:(?:\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)))$
or
string · dateOptionalPattern: ^(?:(?:\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])))$
toany ofOptional
string · date-timeOptionalPattern: ^(?:(?:\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)))$
or
string · dateOptionalPattern: ^(?:(?:\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])))$
intervalstring · enumOptionalDefault: dayPossible values:
limitinteger · min: 1 · max: 5000OptionalDefault: 1000
Responses
200Success
application/json
atstring · date-timeRequired

The tick instant, UTC

Pattern: ^(?:(?:\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))$
valuenumberRequired

Rate as a fraction, 0.045 = 4.5%

get/v1/vaults/{slug}/timeseries/apy
GET /v1/vaults/{slug}/timeseries/apy HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
[
  {
    "at": "2026-01-01T00:00:00.000Z",
    "value": 1
  }
]

Fetch the historical TVL of a vault.

get
Path parameters
slugstring · min: 1Required
Query parameters
fromany ofOptional
string · date-timeOptionalPattern: ^(?:(?:\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)))$
or
string · dateOptionalPattern: ^(?:(?:\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])))$
toany ofOptional
string · date-timeOptionalPattern: ^(?:(?:\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)))$
or
string · dateOptionalPattern: ^(?:(?:\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])))$
intervalstring · enumOptionalDefault: dayPossible values:
limitinteger · min: 1 · max: 5000OptionalDefault: 1000
Responses
200Success
application/json
atstring · date-timeRequired

The tick instant, UTC

Pattern: ^(?:(?:\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))$
valuestringRequired

TVL in the family’s base asset

usdnumber · nullableRequired

The tick’s own USD enrichment; null when no price was held at the time

get/v1/vaults/{slug}/timeseries/tvl
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
  }
]

Fetch vault activity, optionally filtered by vault, user, chain, type, or period.

get
Query parameters
familystring · min: 1Optional

Vault family slug, e.g. yousd; unknown slugs are a 404

userstringOptional

Wallet address; matched as owner (deposits) or receiver (exits)

chainIdinteger · max: 9007199254740991Optional

Narrows the fan-out to one chain

typestring · enumOptionalPossible values:
periodstring · enumOptional

Only events newer than 1/7/30 days ago

Possible values:
whalestringOptional

Deposits worth at least $100k; requires family

cursorstring · min: 1Optional

The previous response’s nextCursor, verbatim

limitinteger · min: 1 · max: 100OptionalDefault: 20
Responses
200Success
application/json
nextCursorstring · nullableRequired

Opaque token for the next page; null when this page is the last. Never build one — pass it back verbatim

get/v1/history
GET /v1/history HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
200Success
{
  "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"
    }
  ]
}

Fetch pending redemptions for a wallet, optionally filtered by vault.

get
Path parameters
walletAddressstringRequired
Query parameters
familystring · min: 1Optional

Vault family slug, e.g. yousd; unknown slugs are a 404

Responses
200Success
application/json
incompleteChainsinteger[]Required

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

get/v1/users/{walletAddress}/pending-redeems
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
  ]
}

Fetch the P&L of a wallet, optionally filtered by vault.

get
Path parameters
walletAddressstringRequired
Query parameters
familystring · min: 1Optional

Vault family slug, e.g. yousd; unknown slugs are a 404

Responses
200Success
application/json
walletstringRequired

Checksummed wallet address

get/v1/performance/{walletAddress}
GET /v1/performance/{walletAddress} HTTP/1.1
Host: api-v2.yo.xyz
Accept: */*
200Success
{
  "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