{"openapi":"3.0.0","paths":{"/v1/address/{address}/portfolio":{"get":{"operationId":"getPortfolioHistory","parameters":[{"name":"address","required":true,"in":"path","description":"The wallet address","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioResponseDto"}}}}},"summary":"Returns per-event token balance history for a given address.","tags":["Address"]}},"/v1/address/{address}/portfolio/daily":{"get":{"operationId":"getPortfolioDaily","parameters":[{"name":"address","required":true,"in":"path","description":"The wallet address","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","description":"First day to include, inclusive","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"to","required":false,"in":"query","description":"Last day to include, inclusive","schema":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioDailyResponseDto"}}}}},"summary":"Returns end-of-day balances and dollar values per token per chain for a given address. Days are New York calendar days; only closed days are included.","tags":["Address"]}},"/health":{"get":{"operationId":"getHealth","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHealthServicesResponse"}}}}},"tags":["Health"]}},"/health/ready":{"get":{"operationId":"getReadiness","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHealthServicesResponse"}}}}},"tags":["Health"]}},"/v1/leaderboard/{season}":{"get":{"operationId":"getLeaderboard","parameters":[{"name":"season","required":true,"in":"path","description":"Season, as \"s\" followed by the season number","schema":{"example":"s2","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardResponse"}}}}},"summary":"Returns the top 100 wallets by points for a season, with the multiplier schedule","tags":["Leaderboard"]}},"/v1/leaderboard/{season}/{address}":{"get":{"operationId":"getLeaderboardForAddress","parameters":[{"name":"address","required":true,"in":"path","description":"The wallet address","schema":{"type":"string"}},{"name":"season","required":true,"in":"path","description":"Season, as \"s\" followed by the season number","schema":{"example":"s2","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardAddressResponse"}}}}},"summary":"Returns a wallet's rank, points and per-position breakdown","tags":["Leaderboard"]}},"/v1/leaderboard/{season}/{address}/history":{"get":{"operationId":"getLeaderboardHistoryForAddress","parameters":[{"name":"address","required":true,"in":"path","description":"The wallet address","schema":{"type":"string"}},{"name":"season","required":true,"in":"path","description":"Season, as \"s\" followed by the season number","schema":{"example":"s2","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardHistoryResponse"}}}}},"summary":"Returns a wallet's daily balances and points for a season","tags":["Leaderboard"]}},"/v1/yuty":{"get":{"operationId":"getYutyApy","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YutyApyV2Response"}}}}},"summary":"Returns yUTY APY","tags":["yUty"]}},"/v1":{"get":{"operationId":"getEcosystemDetails","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EcosystemResponse"}}}}},"summary":"Returns ecosystem-level data for UTY and yUTY tokens","tags":["Ecosystem"]}},"/v1/uty":{"get":{"operationId":"getUtyTotalSupply","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UtyTotalSupplyResponse"}}}}},"summary":"Returns UTY total supply","tags":["Uty"]}},"/v1/transactions/{address}":{"get":{"description":"Returns up to 500 lifecycle rows ordered newest-first. Each request\ntargets a single chain via the required `chainId` query parameter:\n`8453` (Base, hub), `43114` (Avalanche, spoke), or `747474` (Katana, spoke).\nThe query parameter filters by `requestedOnChainId` — the chain where\nthe activity was initiated.\n\nEvery row carries a `protocol`: `YieldPoint`, `Euler` or `Pendle`.\n\nYieldPoint rows have three `kind` values: `mint` (USDC → UTY), `deposit`\n(UTY → yUTY), and `withdrawal`. yUTY withdrawals follow a cooldown →\nclaimable → claimed lifecycle; UTY withdrawals are born at `claimed`\n(instant path).\n\nEuler rows are the wallet's activity on YieldPoint's Euler vaults, one row\nper on-chain event, always `completed`, Base only: `deposit_usdc`,\n`withdrawal_usdc` (USDC lent to or withdrawn from the Euler USDC vault),\n`deposit_yuty`, `withdrawal_yuty` (yUTY put into or taken out of the Euler\nyUTY vault, the vault used as collateral), `borrow_usdc`, `repay_usdc`\n(USDC debt on the Euler USDC vault) and `liquidation` (the wallet was\nliquidated: its debt moved to the liquidator as `debtTransferred` and the\nseized eyUTY as `sent`, null when the seized collateral was another\nvault; no USDC changed hands, and any remaining debt Euler socialised in\nthe same transaction is written off and not listed). Activity in the wallet's\nEuler sub-accounts is attributed to the wallet; `account` and\n`accountIndex` say which sub-account acted.\n\nPendle rows are the wallet's activity on the Pendle yUTY market, one row\nper token leg, always `completed`, Base only: `buy_pt`, `sell_pt`,\n`buy_yt`, `sell_yt`, `add_lp`, `remove_lp`, `mint_pt`, `mint_yt`,\n`redeem_pt`, `redeem_yt`.\n\nOn Euler and Pendle rows `sent` or `received` is null when the row moved\none token only (a borrow, a repay, every Pendle leg: what the router\ncharged or paid is not indexed). One transaction can yield several rows\n(a Pendle zap that keeps YT mints LP and YT, the YT row is `buy_yt`; an\nEuler multiply deposits collateral and borrows), so match rows by `id`,\nor by `hash` and `kind`. Some same-hash pairs move no USDC:\n`withdrawal_usdc` plus `repay_usdc` is a repay with shares; a wallet that\nliquidates someone else gets a `borrow_usdc` for the debt it took over,\nand the collateral it seized arrives as a plain eyUTY transfer that is\nnot listed; a debt pull between two accounts emits a `repay_usdc` and a\n`borrow_usdc`. Plain wallet-to-wallet moves of PT, YT or LP are not\nlisted.\n\nEach row carries both `requestedOnChainId` (where the activity was\ninitiated) and `claimedOnChainId` (where the claim was settled — the\nhub for \"claim all on Base\", the spoke for OFT bridge-back). These can\ndiffer: a request initiated on Avalanche can be claimed on Base, or\nbridged back to Katana. Calling per chain is the canonical way to\nrender a multi-chain history; the API does not aggregate across chains\nin a single response.","operationId":"getTransactionsHistoryForAddress","parameters":[{"name":"address","required":true,"in":"path","description":"0x-prefixed 40-character wallet address (any case).","schema":{"type":"string"}},{"name":"chainId","required":true,"in":"query","description":"Supported: 8453 (Base), 43114 (Avalanche), 747474 (Katana)","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionHistoryResponse"}}}},"400":{"description":"Returned when `address` is malformed or `chainId` is missing, not an integer, sent as an array, or not one of {8453, 43114, 747474}.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"summary":"Returns multi-chain transaction history for a given wallet address.","tags":["Transactions"]}}},"info":{"title":"YieldPoint API","description":"","version":"1.1.0","contact":{}},"tags":[],"servers":[{"url":"https://api.yieldpoint.io"}],"components":{"schemas":{"PortfolioResponseDto":{"type":"object","additionalProperties":{"type":"object","properties":{"uty":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}},"yuty":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}},"pendleSy":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}},"eulerYuty":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}},"eulerUsdc":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}},"pendleYt":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}},"pendleLp":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}},"pendlePt":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"},"balance":{"type":"number","description":"Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."}},"required":["date","timestamp","balance"]}}},"required":["uty","yuty","pendleSy","eulerYuty","eulerUsdc","pendleYt","pendleLp","pendlePt"]}},"PortfolioDailyResponseDto":{"type":"object","properties":{"asOf":{"description":"Last closed New York day in the daily portfolio table","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","nullable":true},"days":{"type":"array","items":{"type":"object","properties":{"date":{"description":"New York calendar day, YYYY-MM-DD","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"totalValueUsd":{"type":"number","description":"Gross: sum of valueUsd over every position on this day"},"eulerDebtUsd":{"type":"number","description":"USDC borrowed on the Euler USDC vault, accrued to the end of the day as Euler's debtOf reports it and summed across the wallet's Euler sub-accounts; 0 when the wallet has no Euler debt. USDC is 1.00 USD."},"netValueUsd":{"type":"number","description":"totalValueUsd − eulerDebtUsd"},"positions":{"type":"array","items":{"type":"object","properties":{"token":{"type":"string","enum":["uty","yuty","pendleSy","eulerYuty","eulerUsdc","pendleYt","pendleLp","pendlePt"]},"chainId":{"type":"number"},"balance":{"type":"number","description":"End-of-day Balance in the token's own units (formatted decimal). For eulerYuty and eulerUsdc this is vault shares, not underlying; multiply by usdPerToken on the daily route for underlying USD."},"usdPerToken":{"type":"number","description":"The day's USD rate per unit of balance, set by the indexer's valuation rules: UTY 1.00; yUTY the vault rate; eulerYuty one yUTY per share at the yUTY rate; eulerUsdc USDC per share including interest; pendlePt 1.00 (par in UTY, exact at maturity 2026-12-17); pendleYt 1.00 (one UTY of notional, overstated, zero at maturity; a PT plus a YT is always one UTY); pendleLp the pool's SY share per LP token at the yUTY rate; pendleSy the yUTY rate."},"valueUsd":{"type":"number","description":"balance × usdPerToken, underlying USD"}},"required":["token","chainId","balance","usdPerToken","valueUsd"]}}},"required":["date","totalValueUsd","eulerDebtUsd","netValueUsd","positions"]},"description":"Oldest first"}},"required":["asOf","days"]},"GetHealthServicesResponse":{"type":"object","properties":{"status":{"type":"string","enum":["error","ok","shutting_down"]},"info":{"type":"object","additionalProperties":{"type":"object","properties":{"status":{"type":"string","enum":["up","down"]},"details":{"type":"object","additionalProperties":{}}},"required":["status"]},"nullable":true},"error":{"type":"object","additionalProperties":{"type":"object","properties":{"status":{"type":"string","enum":["up","down"]},"details":{"type":"object","additionalProperties":{}}},"required":["status"]},"nullable":true},"details":{"type":"object","additionalProperties":{"type":"object","properties":{"status":{"type":"string","enum":["up","down"]},"details":{"type":"object","additionalProperties":{}}},"required":["status"]},"nullable":true}},"required":["status"]},"LeaderboardResponse":{"type":"object","properties":{"season":{"type":"number"},"asOf":{"type":"string","description":"Last closed New York day in the points tables","nullable":true},"totalParticipants":{"type":"number","description":"Number of ranked wallets"},"multipliers":{"type":"array","items":{"type":"object","properties":{"position":{"type":"string","enum":["hold_uty","hold_yuty","euler_collateral","euler_lend","pendle_yt","pendle_lp","pendle_pt"]},"multiplier":{"type":"number"},"firstDay":{"type":"string","description":"New York calendar day, YYYY-MM-DD"},"lastDay":{"type":"string","description":"null while the window is open-ended","nullable":true}},"required":["position","multiplier","firstDay","lastDay"]},"description":"Multiplier schedule, one row per window, ordered by position then firstDay. Empty for seasons without a schedule."},"entries":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"number"},"user":{"type":"string"},"totalPoints":{"type":"number"},"dailyRate":{"type":"number","description":"Points earned on asOf"}},"required":["rank","user","totalPoints","dailyRate"]},"description":"Top 100 by rank"}},"required":["season","asOf","totalParticipants","multipliers","entries"]},"LeaderboardAddressResponse":{"type":"object","properties":{"season":{"type":"number"},"asOf":{"type":"string","description":"Last closed New York day in the points tables","nullable":true},"totalParticipants":{"type":"number","description":"Number of ranked wallets"},"user":{"type":"string"},"rank":{"type":"number","nullable":true,"description":"null when the wallet has no points"},"totalPoints":{"type":"number"},"dailyRate":{"type":"number"},"breakdown":{"type":"array","items":{"type":"object","properties":{"position":{"type":"string","enum":["hold_uty","hold_yuty","euler_collateral","euler_lend","pendle_yt","pendle_lp","pendle_pt"]},"multiplier":{"type":"number","description":"Multiplier in force on asOf"},"valueUsd":{"type":"number","description":"Position value on asOf, summed across chains"},"dailyPoints":{"type":"number","description":"Points earned on asOf"},"totalPoints":{"type":"number","description":"Points earned over the season"}},"required":["position","multiplier","valueUsd","dailyPoints","totalPoints"]}}},"required":["season","asOf","totalParticipants","user","rank","totalPoints","dailyRate","breakdown"]},"LeaderboardHistoryResponse":{"type":"object","properties":{"season":{"type":"number"},"user":{"type":"string"},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"New York calendar day, YYYY-MM-DD"},"points":{"type":"number"},"valueUsd":{"type":"number"},"cumulativePoints":{"type":"number"},"positions":{"type":"array","items":{"type":"object","properties":{"position":{"type":"string","enum":["hold_uty","hold_yuty","euler_collateral","euler_lend","pendle_yt","pendle_lp","pendle_pt"]},"chainId":{"type":"number"},"balance":{"type":"number"},"valueUsd":{"type":"number"},"multiplier":{"type":"number"},"points":{"type":"number"}},"required":["position","chainId","balance","valueUsd","multiplier","points"]}}},"required":["date","points","valueUsd","cumulativePoints","positions"]},"description":"Oldest first"}},"required":["season","user","days"]},"YutyApyV2Response":{"type":"object","properties":{"tokenSymbol":{"type":"string"},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"apy":{"type":"number","nullable":true},"apy30":{"type":"number","nullable":true},"tvl":{"type":"string","nullable":true},"vaultHistory":{"type":"array","items":{"type":"object","properties":{"totalAssets":{"type":"number"},"totalSupply":{"type":"number"},"timestamp":{"type":"number"},"price":{"type":"number"},"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"apy7d":{"type":"number"},"apy30d":{"type":"number"},"apy7dMovingAverage":{"type":"number"},"apy30dMovingAverage":{"type":"number"}},"required":["totalAssets","totalSupply","timestamp","price","date","apy7d","apy30d","apy7dMovingAverage","apy30dMovingAverage"]},"nullable":true}},"required":["tokenSymbol","address","apy","apy30","tvl","vaultHistory"]},"EcosystemResponse":{"type":"object","properties":{"uty":{"type":"object","properties":{"tokenSymbol":{"type":"string"},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"totalSupply":{"type":"string","nullable":true},"tvl":{"type":"string","nullable":true}},"required":["tokenSymbol","address"]},"yuty":{"type":"object","properties":{"tokenSymbol":{"type":"string"},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"apy":{"type":"number","nullable":true},"apy30":{"type":"number","nullable":true},"tvl":{"type":"string","nullable":true}},"required":["tokenSymbol","address"]},"cacheExpiry":{"type":"object","properties":{"timestamp":{"type":"number"},"date":{"type":"string"}},"required":["timestamp","date"]}},"required":["uty","yuty"]},"UtyTotalSupplyResponse":{"type":"object","properties":{"tokenSymbol":{"type":"string"},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"totalSupply":{"type":"string","nullable":true,"description":"Raw wei value as a string"},"vaultHistory":{"type":"array","items":{"type":"object","properties":{"totalSupply":{"type":"number"},"date":{"type":"string","description":"Date in format YYYY-MM-DD"},"timestamp":{"type":"number","description":"Unix timestamp in seconds"}},"required":["totalSupply","date","timestamp"]},"nullable":true}},"required":["tokenSymbol","address","totalSupply","vaultHistory"]},"TransactionHistoryResponse":{"type":"array","items":{"discriminator":{"propertyName":"protocol"},"oneOf":[{"type":"object","properties":{"protocol":{"type":"string","enum":["YieldPoint"],"description":"Protocol the row belongs to. `YieldPoint` rows follow the vault lifecycle. `Euler` and `Pendle` rows are one row per on-chain event on YieldPoint's Euler vaults and the Pendle yUTY market, always `completed`, Base (8453) only."},"id":{"type":"string","description":"Stable composite key. Mint/deposit rows: `<kind>:<chainId>:<vault>:<hash>:<eventId>`. Withdrawal lifecycle rows: `withdrawal:<vault>:<hubRequestId>` (hub vault request id is the canonical identity for both hub-direct and composer-routed redemptions). UTY instant withdrawal rows reuse the mint/deposit format. Euler and Pendle rows: `<kind>:8453:<vault or market>:<hash>:<eventId>`; several rows can share a hash, so match rows by `id`, or by `hash` and `kind`."},"vault":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Most-recent on-chain tx hash for this row. On cross-chain rows this is the spoke-side arrival; see `hubTx` for the hub-side leg."},"blockNumber":{"type":"number"},"timestamp":{"type":"number","description":"Unix seconds of the most-recent event for this row. On withdrawal lifecycle rows this is the latest of (request, request_closed, claim) — not the original request time. See `requestedAt` for the request time."},"requestedOnChainId":{"type":"number","description":"Chain where this activity was initiated. For hub-direct redemptions and Base mints/deposits this is `8453`. For composer-routed redemptions this is the spoke chain (`43114` Avalanche or `747474` Katana) derived from the composer's RedeemRequested.dst_eid. Matches the `chainId` query parameter on the listed row."},"claimedOnChainId":{"type":"number","nullable":true,"description":"Chain where the claim landed. `8453` when the user redeemed directly on Base (receiver=user); the spoke chain when the composer bridged UTY back via OFT (receiver=composer, dst_eid → chainId). Null while the request is still in cooldown or claimable. For mint/deposit and UTY instant withdrawal rows this equals `requestedOnChainId` (atomic, no separate claim step)."},"kind":{"type":"string","enum":["mint","deposit","withdrawal"],"description":"Row kind. `mint` = UTY vault deposit (USDC → UTY). `deposit` = yUTY vault deposit (UTY → yUTY). `withdrawal` = yUTY async redemption lifecycle or UTY instant redemption."},"product":{"type":"string","enum":["UTY","yUTY"]},"direction":{"type":"object","properties":{"from":{"type":"string","enum":["USDC","UTY","yUTY"]},"to":{"type":"string","enum":["USDC","UTY","yUTY"]}},"required":["from","to"]},"sent":{"type":"object","properties":{"value":{"type":"string","nullable":true,"description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display. Null when the value is not yet known on-chain — e.g., the shares-burned side of a UTY cooldown row before its WithdrawalRequest struct has been read."},"token":{"type":"string","enum":["USDC","UTY","yUTY"]},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"description":"Input side of the swap — the token the user is giving / has given. For mint: USDC paid in. For deposit: UTY paid in. For withdrawal: shares burned (UTY for UTY-vault redemptions, yUTY for yUTY-vault redemptions). On UTY cooldown rows the `value` is null until the WithdrawalRequest struct is read on-chain by the API enrichment pass."},"received":{"type":"object","properties":{"value":{"type":"string","nullable":true,"description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display. Null when the value is not yet known on-chain — e.g., the shares-burned side of a UTY cooldown row before its WithdrawalRequest struct has been read."},"token":{"type":"string","enum":["USDC","UTY","yUTY"]},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"description":"Output side of the swap — the token the user is receiving / has received. For mint: UTY shares minted. For deposit: yUTY shares minted. For withdrawal: asset paid out (USDC for UTY redemptions, UTY for yUTY redemptions). On in-flight withdrawal rows the `value` reflects the asset snapshot at request time; on claimed rows it reflects the actual settled amount."},"status":{"type":"string","enum":["completed","locked","cooldown","claimable","claimed"],"description":"Lifecycle status. `completed` only on mint rows. `locked` only on deposit rows. `cooldown` → `claimable` → `claimed` is the yUTY withdrawal lifecycle; UTY instant withdrawals are born at `claimed`."},"requestId":{"type":"number","nullable":true,"description":"Vault request id. Null on UTY instant withdrawals (no request was created). Absent on mint and deposit rows."},"requestedAt":{"type":"number","description":"Unix seconds when the redemption request was created. Required on every withdrawal row, including UTY instant (where it equals claimedAt)."},"cooldownEndsAt":{"type":"number","nullable":true,"description":"Unix seconds when the bonding period ends. Null on UTY instant withdrawals (no cooldown)."},"claimedAt":{"type":"number","nullable":true,"description":"Unix seconds when the claim settled. Null while status is cooldown or claimable."},"claimedHash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","nullable":true,"description":"Tx hash of the settling Withdraw event. Null while status is cooldown or claimable."},"hubTx":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hub-side (Base) tx hash. Populated on cross-chain rows where requestedOnChainId or claimedOnChainId is a spoke (43114, 747474)."},"hubTimestamp":{"type":"number","description":"Unix seconds of the hub-side event. Paired with hubTx on cross-chain rows."},"hubBlockNumber":{"type":"number","description":"Hub-side block number. Paired with hubTx on cross-chain rows."}},"required":["protocol","id","vault","hash","blockNumber","timestamp","requestedOnChainId","claimedOnChainId","kind","product","direction","sent","received","status"]},{"type":"object","properties":{"protocol":{"type":"string","enum":["Euler"],"description":"Protocol the row belongs to. `YieldPoint` rows follow the vault lifecycle. `Euler` and `Pendle` rows are one row per on-chain event on YieldPoint's Euler vaults and the Pendle yUTY market, always `completed`, Base (8453) only."},"id":{"type":"string","description":"Stable composite key. Mint/deposit rows: `<kind>:<chainId>:<vault>:<hash>:<eventId>`. Withdrawal lifecycle rows: `withdrawal:<vault>:<hubRequestId>` (hub vault request id is the canonical identity for both hub-direct and composer-routed redemptions). UTY instant withdrawal rows reuse the mint/deposit format. Euler and Pendle rows: `<kind>:8453:<vault or market>:<hash>:<eventId>`; several rows can share a hash, so match rows by `id`, or by `hash` and `kind`."},"vault":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Most-recent on-chain tx hash for this row. On cross-chain rows this is the spoke-side arrival; see `hubTx` for the hub-side leg."},"blockNumber":{"type":"number"},"timestamp":{"type":"number","description":"Unix seconds of the most-recent event for this row. On withdrawal lifecycle rows this is the latest of (request, request_closed, claim) — not the original request time. See `requestedAt` for the request time."},"requestedOnChainId":{"type":"number","description":"Always `8453`: Euler and Pendle activity is Base only."},"claimedOnChainId":{"type":"number","description":"Always `8453`: the row is atomic, nothing to claim later."},"direction":{"type":"object","properties":{"from":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index.","nullable":true},"to":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index.","nullable":true}},"required":["from","to"],"description":"`from` is the token the wallet paid and `to` the token it received. A side is null when the wallet moved no token that way (a plain repay has no `to`) or when the paid token could not be established. On every borrow `from` is `yUTY`, the collateral the loan is backed by, even when no yUTY moved in that transaction."},"sent":{"type":"object","properties":{"value":{"type":"string","description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display."},"token":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index."},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"nullable":true,"description":"The token the wallet paid in this transaction: the yUTY behind a merged Borrow, the collateral of a liquidation, or what the wallet paid Pendle (from its own transfers, or from the transaction receipt when the token is one YieldPoint does not index). Null when the wallet paid nothing in that transaction (a borrow against collateral posted earlier, the PT-leg row of a dual-token remove, the YT row of a mint pair) or when two tokens left the wallet and neither can be named as the price."},"received":{"type":"object","properties":{"value":{"type":"string","description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display."},"token":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index."},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"nullable":true,"description":"The token the wallet received in this transaction: the USDC of a borrow, the yUTY of a merged Repay or of a Pendle sell, remove or redeem (from its own transfers, or from the transaction receipt). Null when the wallet received nothing in that transaction (a plain repay, a liquidation, the PT-leg row of a dual-token add, the YT row of a redeem pair) or when two tokens arrived and neither can be named."},"status":{"type":"string","enum":["completed"],"description":"Always `completed`: nothing on Euler or Pendle has a bonding period."},"kind":{"type":"string","enum":["deposit_usdc","withdrawal_usdc","deposit_yuty","withdrawal_yuty","borrow_usdc","repay_usdc","multiply_yuty","liquidation"],"description":"Euler row kind. `deposit_usdc` / `withdrawal_usdc` = USDC lent to or withdrawn from the Euler USDC vault (eUSDC shares). `deposit_yuty` / `withdrawal_yuty` = yUTY put into or taken out of the Euler yUTY vault, the vault used as collateral (eyUTY shares). `borrow_usdc` / `repay_usdc` = USDC debt taken or repaid on the Euler USDC vault. `multiply_yuty` = an Euler Multiply: yUTY posted, USDC borrowed and swapped to more yUTY, all of it posted as collateral, in one transaction; the wallet never holds the USDC (`debt`). `liquidation` = the wallet was liquidated: its debt and collateral moved to the liquidator."},"product":{"type":"string","enum":["Euler USDC vault","Euler yUTY vault"],"description":"Which Euler vault the row is on. The USDC vault holds lent USDC and issues the debt; the yUTY vault holds yUTY used as collateral."},"account":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"accountIndex":{"type":"integer","minimum":0,"maximum":255,"description":"Sub-account index, 0 to 255. 0 is the wallet itself."},"liquidator":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"`liquidation` only: the account that liquidated the wallet."},"debtTransferred":{"type":"object","properties":{"value":{"type":"string","description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display."},"token":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index."},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"description":"`liquidation` only: the USDC debt moved from the wallet to the liquidator. No USDC changed hands; Euler transfers the debt and the seized collateral (`sent`) to the liquidator in one step. Debt Euler socialised in the same transaction, when the wallet had no collateral left, is written off, not included here, and has no row."},"debt":{"type":"object","properties":{"value":{"type":"string","description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display."},"token":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index."},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"description":"`multiply_yuty` only: the USDC Euler borrowed on the wallet's behalf and swapped into the extra collateral. The wallet never held it; `sent` is the yUTY the wallet paid and `received` every eyUTY share the transaction minted to the wallet."}},"required":["protocol","id","vault","hash","blockNumber","timestamp","requestedOnChainId","claimedOnChainId","direction","sent","received","status","kind","product","account","accountIndex"]},{"type":"object","properties":{"protocol":{"type":"string","enum":["Pendle"],"description":"Protocol the row belongs to. `YieldPoint` rows follow the vault lifecycle. `Euler` and `Pendle` rows are one row per on-chain event on YieldPoint's Euler vaults and the Pendle yUTY market, always `completed`, Base (8453) only."},"id":{"type":"string","description":"Stable composite key. Mint/deposit rows: `<kind>:<chainId>:<vault>:<hash>:<eventId>`. Withdrawal lifecycle rows: `withdrawal:<vault>:<hubRequestId>` (hub vault request id is the canonical identity for both hub-direct and composer-routed redemptions). UTY instant withdrawal rows reuse the mint/deposit format. Euler and Pendle rows: `<kind>:8453:<vault or market>:<hash>:<eventId>`; several rows can share a hash, so match rows by `id`, or by `hash` and `kind`."},"vault":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Most-recent on-chain tx hash for this row. On cross-chain rows this is the spoke-side arrival; see `hubTx` for the hub-side leg."},"blockNumber":{"type":"number"},"timestamp":{"type":"number","description":"Unix seconds of the most-recent event for this row. On withdrawal lifecycle rows this is the latest of (request, request_closed, claim) — not the original request time. See `requestedAt` for the request time."},"requestedOnChainId":{"type":"number","description":"Always `8453`: Euler and Pendle activity is Base only."},"claimedOnChainId":{"type":"number","description":"Always `8453`: the row is atomic, nothing to claim later."},"direction":{"type":"object","properties":{"from":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index.","nullable":true},"to":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index.","nullable":true}},"required":["from","to"],"description":"`from` is the token the wallet paid and `to` the token it received. A side is null when the wallet moved no token that way (a plain repay has no `to`) or when the paid token could not be established. On every borrow `from` is `yUTY`, the collateral the loan is backed by, even when no yUTY moved in that transaction."},"sent":{"type":"object","properties":{"value":{"type":"string","description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display."},"token":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index."},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"nullable":true,"description":"The token the wallet paid in this transaction: the yUTY behind a merged Borrow, the collateral of a liquidation, or what the wallet paid Pendle (from its own transfers, or from the transaction receipt when the token is one YieldPoint does not index). Null when the wallet paid nothing in that transaction (a borrow against collateral posted earlier, the PT-leg row of a dual-token remove, the YT row of a mint pair) or when two tokens left the wallet and neither can be named as the price."},"received":{"type":"object","properties":{"value":{"type":"string","description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display."},"token":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index."},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"nullable":true,"description":"The token the wallet received in this transaction: the USDC of a borrow, the yUTY of a merged Repay or of a Pendle sell, remove or redeem (from its own transfers, or from the transaction receipt). Null when the wallet received nothing in that transaction (a plain repay, a liquidation, the PT-leg row of a dual-token add, the YT row of a redeem pair) or when two tokens arrived and neither can be named."},"status":{"type":"string","enum":["completed"],"description":"Always `completed`: nothing on Euler or Pendle has a bonding period."},"kind":{"type":"string","enum":["buy_pt","sell_pt","buy_yt","sell_yt","add_lp","remove_lp","mint_pt","mint_yt","redeem_pt","redeem_yt"],"description":"Pendle row kind on the yUTY market. `buy_*` / `sell_*` = PT or YT traded with the market or router. `add_lp` / `remove_lp` = liquidity added or removed (a dual-token add or remove also yields a PT-leg row of the same kind). `mint_pt` + `mint_yt` = PT and YT minted together (two rows, one hash). `redeem_pt` + `redeem_yt` = PT and YT redeemed together before expiry (two rows, one hash); a PT redeemed alone at or after expiry is `redeem_pt`."},"product":{"type":"string","enum":["Pendle yUTY market"]},"alsoReceived":{"type":"object","properties":{"value":{"type":"string","description":"Raw integer amount as a base-10 string. Divide by 10^decimals for display."},"token":{"type":"string","minLength":1,"maxLength":32,"description":"Token label. One of `USDC`, `UTY`, `yUTY`, `eUSDC`, `eyUTY`, `LP-yUTY`, `PT-yUTY`, `YT-yUTY`, or the on-chain symbol of a token the wallet paid Pendle with that YieldPoint does not index."},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"decimals":{"type":"number"}},"required":["value","token","address","decimals"],"description":"`add_lp` only: the YT-yUTY a keep-YT zap minted to the wallet in the same transaction as the LP. One payment, two tokens received."}},"required":["protocol","id","vault","hash","blockNumber","timestamp","requestedOnChainId","claimedOnChainId","direction","sent","received","status","kind","product"]}]}},"ErrorResponse":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"traceId":{"type":"string","nullable":true},"validation":{"type":"array","items":{"type":"string"},"nullable":true}},"required":["error","message"]}}}}