{"openapi":"3.1.0","info":{"title":"Euler Data API (V3)","version":"3.0.0","description":"API specification for Euler Data v3. This spec defines the current\nresource-oriented contract for the platform, with emphasis on consistent\nschemas, predictable REST semantics, caching, observability, and a uniform\ndeveloper experience.\n\nMigration notes\n- Euler Data v3 is not a path-for-path clone of v1/v2. Some endpoints map\n  directly, some require multiple v3 calls, and some legacy aggregates were\n  intentionally removed.\n- The live [migration guide](/v3/docs/migration) explains how legacy v1/v2\n  endpoints and payloads map into the v3 resource model.\n- Important semantic changes:\n  - Vault base APY and rewards APY are exposed separately in v3.\n  - Account positions are flattened into account-vault rows instead of the\n    legacy nested sub-account shape.\n  - All supported API paths live under `/v3`; legacy paths return `410`.\n  - Summary endpoints prefer smaller, focused resources over large\n    BFF-style payloads.\n\nBase path: /v3\n\nConventions\n- JSON field naming: camelCase\n- Addresses: accept lowercase or checksum; responses are EIP-55 checksummed\n- Public APY values (`*Apy`, `apy*`): percent numbers with 6 decimal places (e.g., 5.123456 = 5.123456%)\n- Contract interest-rate fields (`borrowAPY`, `supplyAPY` in `interestRates`): decimal strings in contract fraction units\n- Ratios (utilization, LTV, etc.): numbers with 6 decimal places\n- Response timestamps: ISO-8601 strings (UTC). Some legacy fields still expose unix\n  seconds for compatibility and include `*Iso` companions.\n- Query time ranges: unix seconds (from/to)\n\nUnit policy\n- v3 separates market metadata from contract verdicts by both name and type.\n- Market-normalized USD prices and USD values are JSON numbers. These are values\n  derived from off-chain pricing, cached price snapshots, or API-level market math.\n  This includes `/v3/prices`, token price routes, vault/earn/protocol USD totals,\n  portfolio market values, and vault holder `assetsUsd`.\n- Contract-derived oracle and account-liquidity prices/values are exact strings.\n  These preserve the integer value used by contracts, normalized to 18 decimals\n  for API exposure. Oracle prices are quoted in the vault unit of account, which\n  can be USD, ETH, or another asset. Account-liquidity USD-suffixed fields remain\n  18-decimal contract verdict values. This includes `/v3/oracles/prices`, liquidation\n  prices, account liquidity values, liability values, and collateral verdict values.\n- On-chain token quantities are bigint strings in their native unit scale. This\n  includes amounts, balances, shares, assets, borrows, reward amounts, liquidation\n  repay/yield amounts, and block numbers.\n- Caps are also bigint strings, but EVK caps are exposed as resolved underlying\n  asset-unit amounts rather than packed contract config words.\n- LTV config values use canonical basis-point strings. Legacy decimal aliases\n  may remain on config-history payloads for compatibility when explicitly named.\n\nRate limiting\n- Optional API keys for higher limits\n- Default limits are configurable; current defaults: free tier 100 req/min (IP-based)\n  and authenticated 1000 req/min (per API key), 60s window.\n- By default, proxy headers are not trusted for IP identity unless explicitly enabled.\n- Redis failures default to fail-closed (503) for strict enforcement; fail-open is opt-in.\n- RateLimit-* (IETF draft-6) and legacy X-RateLimit-* headers are returned.\n\nCaching\n- Cache-Control headers are returned for cacheable endpoints.\n- Defaults (may be adjusted in config):\n  - Prices: 300s\n  - APYs: 600s\n  - Rewards: 900s\n  - General responses: 60s (short 30s, long 300s)\n\nErrors\n- All errors use a standard envelope: { error: { code, message, requestId, details? } }\n- Domain error codes are documented in this spec.\n- Request bodies larger than 1 MiB are rejected before route parsing with `413 PAYLOAD_TOO_LARGE`.\n"},"servers":[{"url":"/","description":"Current environment"}],"security":[],"tags":[{"name":"Protocol","description":"Protocol-wide summary endpoints and aggregate metrics. In v3, these endpoints are explicitly summary-oriented and should be treated as lightweight rollups rather than replacements for full vault list payloads."},{"name":"Health","description":"Liveness, readiness, and dashboard-friendly platform status checks. Use these for operational monitoring, not for reconstructing full portfolio state."},{"name":"Auth","description":"Authentication and authorization conventions used across the API, including API keys, admin secrets, and rate-limit behavior."},{"name":"Curator","description":"Curator-managed metadata such as labels, descriptions, and visibility controls. This is the operator-owned customization surface in v3."},{"name":"Usage","description":"API usage and API key analytics. These endpoints are intended for operators and consumers tracking traffic, rate limits, and key-level activity."},{"name":"Chains","description":"Chain inventory and per-chain protocol summaries. These replace ad-hoc chain-level aggregates from legacy APIs with explicit, cacheable resources."},{"name":"Vaults","description":"Canonical vault resources, vault history, holders, borrowers, and open-interest views. In v3, vault detail is decomposed into focused endpoints instead of one large legacy response."},{"name":"Accounts","description":"Account activity, discovered positions, and sub-account relationships. Legacy nested account payloads are flattened into account-vault rows in v3."},{"name":"Tokens","description":"Token metadata, protocol classifications, and related static reference data used throughout the API."},{"name":"Prices","description":"Current and historical token prices. Prices follow v3 source priority rules and return the canonical merged value rather than exposing raw provider-specific reads by default."},{"name":"APYs","description":"Base and intrinsic APY surfaces. In v3, APY families are split into dedicated endpoints instead of being embedded inconsistently across larger payloads."},{"name":"Rewards","description":"Reward campaign APRs and per-account reward breakdowns. Rewards APY is intentionally separate from base vault APY in v3; combine them client-side when you need a legacy-style total supply APY."},{"name":"Oracles","description":"Oracle routing, adapter, and price-source inspection endpoints. These expose pricing/oracle internals that were previously harder to inspect externally."},{"name":"Earn","description":"Euler Earn vault resources and historical data. These endpoints are separate from EVK vaults and should be modeled independently in client code."},{"name":"Liquidations","description":"Liquidation events and related historical views used for risk analysis and monitoring."},{"name":"TermsOfUse","description":"Terms-of-use signature state and audit endpoints."},{"name":"EVC","description":"Ethereum Vault Connector account event resources. These are separate from account position snapshots and are intended for event-level inspection."},{"name":"PublicAllocator","description":"Public allocator event resources for allocator-level activity and history."},{"name":"FeeFlow","description":"Fee-flow event resources and fee-related historical activity."},{"name":"GraphQL","description":"Controlled GraphQL passthrough endpoints for indexer-backed data exploration and compatibility workflows."}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key authentication (optional; higher rate limits)."},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API key","description":"Alternative to X-API-Key using Authorization: Bearer <key>"},"AdminSecret":{"type":"apiKey","in":"header","name":"X-Admin-Secret","description":"Admin secret (server-to-server) for API key management."}},"headers":{"X-Request-Id":{"description":"Request identifier for tracing.","schema":{"type":"string"}},"Cache-Control":{"description":"Cache policy for this response.","schema":{"type":"string"}}},"parameters":{"ChainIdParam":{"name":"chainId","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated list of chain IDs (single value allowed).","example":"1,10,8453"},"ChainIdPath":{"name":"chainId","in":"path","required":true,"schema":{"type":"integer"}},"AddressPath":{"name":"address","in":"path","required":true,"schema":{"type":"string"}},"OffsetParam":{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}},"LimitParam":{"name":"limit","in":"query","required":false,"description":"Requested page size. Values above the endpoint cap are clamped; the default shared cap is 100.","schema":{"type":"integer","default":20,"maximum":100}},"TokenLimitParam":{"name":"limit","in":"query","required":false,"description":"Requested token page size. Values above 500 are clamped.","schema":{"type":"integer","default":20,"maximum":500}},"FieldsParam":{"name":"fields","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated list of fields to include."},"IncludeParam":{"name":"include","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated list of related resources to expand. Unknown values are ignored."},"SortParam":{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Sort field, prefix with '-' for descending."},"FromParam":{"name":"from","in":"query","required":false,"schema":{"type":"integer"},"description":"Unix timestamp (seconds)."},"ToParam":{"name":"to","in":"query","required":false,"schema":{"type":"integer"},"description":"Unix timestamp (seconds)."},"StartTimestampParam":{"name":"startTimestamp","in":"query","required":false,"schema":{"type":"integer"},"description":"Start of time range (unix seconds)."},"EndTimestampParam":{"name":"endTimestamp","in":"query","required":false,"schema":{"type":"integer"},"description":"End of time range (unix seconds)."},"BlockNumberParam":{"name":"blockNumber","in":"query","required":false,"schema":{"type":"string"},"description":"Block number (string to avoid precision limits)."}},"schemas":{"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId"],"properties":{"code":{"type":"string","description":"Domain error code. Examples:\n- INVALID_ADDRESS\n- CHAIN_NOT_SUPPORTED\n- VAULT_NOT_FOUND\n- TOKEN_NOT_FOUND\n- ACCOUNT_NOT_FOUND\n- VALIDATION_ERROR\n- RATE_LIMIT_EXCEEDED\n- UNAUTHORIZED\n- FORBIDDEN\n- INTERNAL_ERROR\n"},"message":{"type":"string"},"requestId":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}},"HealthResponse":{"type":"object","required":["status","version","uptime","timestamp"],"properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"version":{"type":"string"},"uptime":{"type":"integer"},"timestamp":{"type":"string","format":"date-time"}}},"DetailedHealthResponse":{"allOf":[{"$ref":"#/components/schemas/HealthResponse"},{"type":"object","required":["checks"],"properties":{"checks":{"type":"object","properties":{"database":{"type":"object","properties":{"status":{"type":"string","enum":["ok","error"]},"latency":{"type":"number"},"error":{"type":"string"}}},"redis":{"type":"object","properties":{"status":{"type":"string","enum":["ok","error"]},"latency":{"type":"number"},"error":{"type":"string"}}},"indexer":{"type":"object","properties":{"status":{"type":"string","enum":["ok","syncing","error"]},"blocksBehind":{"type":"integer"},"syncProgress":{"type":"number"},"latency":{"type":"number"},"error":{"type":"string"}}}}}}}]},"PaginationMeta":{"type":"object","properties":{"total":{"type":"integer","description":"Exact total count when the endpoint provides one."},"hasMore":{"type":"boolean","description":"Indicates whether another page exists beyond the current page."},"offset":{"type":"integer"},"limit":{"type":"integer","description":"Echoed page size after endpoint-side clamping."},"timestamp":{"type":"string","format":"date-time"},"chainId":{"type":"string","description":"Comma-separated chain IDs for multi-chain responses."}}},"Chain":{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"string","nullable":true,"description":"Optional chain health status."}}},"ProtocolStats":{"type":"object","description":"EVK lending aggregates across the selected chains, with Earn TVL reported separately.","properties":{"totalSuppliedUsd":{"type":"number","description":"Total EVK lending supply in USD. This is the sum of vault `cash + totalBorrows` valued in USD and excludes Earn vault assets."},"totalBorrowedUsd":{"type":"number","description":"Total EVK lending borrows in USD across the selected chains."},"earnTotalAssetsUsd":{"type":"number","description":"Total Earn vault assets in USD. Reported separately and not included in `totalSuppliedUsd` or `utilization`."},"utilization":{"type":"number","description":"EVK lending utilization, computed as `totalBorrowedUsd / totalSuppliedUsd`. Earn assets are excluded from the denominator."},"vaultCount":{"type":"integer"},"chainCount":{"type":"integer"}}},"ChainStats":{"allOf":[{"$ref":"#/components/schemas/ProtocolStats"},{"type":"object","required":["chainId"],"properties":{"chainId":{"type":"integer","description":"Chain ID for the returned chain-scoped aggregate."}}}]},"AssetRef":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"name":{"type":"string","nullable":true}}},"OraclePriceRaw":{"type":"object","description":"Exact oracle quote values returned by contracts, represented as raw integer strings in the oracle unit-of-account scale.","properties":{"queryFailure":{"type":"boolean"},"queryFailureReason":{"type":"string"},"amountIn":{"type":"string","description":"Raw input amount passed to the oracle."},"amountOutMid":{"type":"string","description":"Raw midpoint oracle output amount."},"amountOutBid":{"type":"string","description":"Raw bid-side oracle output amount."},"amountOutAsk":{"type":"string","description":"Raw ask-side oracle output amount."},"timestamp":{"type":"string","format":"date-time"}}},"VaultFees":{"type":"object","properties":{"interestFee":{"type":"number","description":"Interest fee ratio number."},"accumulatedFeesShares":{"type":"string","description":"Raw accumulated fee shares as a bigint string."},"accumulatedFeesAssets":{"type":"string","description":"Raw accumulated fee assets as a bigint string."},"governorFeeReceiver":{"type":"string"},"protocolFeeReceiver":{"type":"string"},"protocolFeeShare":{"type":"number","description":"Protocol fee share ratio number."}}},"VaultHookedOperations":{"type":"object","properties":{"deposit":{"type":"boolean"},"mint":{"type":"boolean"},"withdraw":{"type":"boolean"},"redeem":{"type":"boolean"},"transfer":{"type":"boolean"},"skim":{"type":"boolean"},"borrow":{"type":"boolean"},"repay":{"type":"boolean"},"repayWithShares":{"type":"boolean"},"pullDebt":{"type":"boolean"},"convertFees":{"type":"boolean"},"liquidate":{"type":"boolean"},"flashloan":{"type":"boolean"},"touch":{"type":"boolean"},"vaultStatusCheck":{"type":"boolean"}}},"VaultHooks":{"type":"object","properties":{"hookedOperations":{"$ref":"#/components/schemas/VaultHookedOperations"},"hookTarget":{"type":"string"}}},"VaultCaps":{"type":"object","properties":{"supplyCap":{"type":"string","description":"Resolved supply cap as a bigint string in underlying asset units."},"borrowCap":{"type":"string","description":"Resolved borrow cap as a bigint string in underlying asset units."}}},"VaultLiquidation":{"type":"object","properties":{"maxLiquidationDiscount":{"type":"number"},"liquidationCoolOffTime":{"type":"integer"},"socializeDebt":{"type":"boolean"}}},"VaultInterestRates":{"type":"object","description":"Contract interest-rate values formatted as decimal strings in fraction units, not public percent APY numbers.","properties":{"borrowSPY":{"type":"string","description":"Borrow rate per second as an exact decimal string."},"borrowAPY":{"type":"string","description":"Borrow APY as an exact decimal fraction string; `1` means 100%."},"supplyAPY":{"type":"string","description":"Supply APY as an exact decimal fraction string; `1` means 100%."}}},"VaultInterestRateModel":{"type":"object","properties":{"address":{"type":"string"},"type":{"type":"string","enum":["unknown","kink","adaptive_curve","kinky","fixed_cyclical_binary"]},"data":{"type":"object","nullable":true,"additionalProperties":{"type":"string"}}}},"SubAccount":{"type":"object","required":["chainId","owner","addressPrefix","blockNumber","timestamp"],"properties":{"chainId":{"type":"integer"},"owner":{"type":"string"},"addressPrefix":{"type":"string"},"blockNumber":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"OracleAdapterPythDetail":{"type":"object","properties":{"pyth":{"type":"string"},"base":{"type":"string"},"quote":{"type":"string"},"feedId":{"type":"string"},"maxStaleness":{"type":"string"},"maxConfWidth":{"type":"string"}}},"OracleAdapterChainlinkDetail":{"type":"object","properties":{"oracle":{"type":"string"}}},"OracleAdapterEntry":{"type":"object","properties":{"oracle":{"type":"string"},"name":{"type":"string"},"base":{"type":"string"},"quote":{"type":"string"},"pythDetail":{"allOf":[{"$ref":"#/components/schemas/OracleAdapterPythDetail"}],"nullable":true},"chainlinkDetail":{"allOf":[{"$ref":"#/components/schemas/OracleAdapterChainlinkDetail"}],"nullable":true}}},"OracleResolvedVault":{"type":"object","properties":{"vault":{"type":"string"},"quote":{"type":"string"},"asset":{"type":"string"},"resolvedAssets":{"type":"array","items":{"type":"string"}}}},"OracleInfo":{"type":"object","properties":{"oracle":{"type":"string"},"name":{"type":"string"},"adapters":{"type":"array","items":{"$ref":"#/components/schemas/OracleAdapterEntry"}},"resolvedVaults":{"type":"array","items":{"$ref":"#/components/schemas/OracleResolvedVault"}}}},"Vault":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"vaultType":{"type":"string","enum":["evk"],"description":"Vault family for the `/v3/evk/vaults` EVK surface."},"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"shares":{"$ref":"#/components/schemas/AssetRef"},"asset":{"$ref":"#/components/schemas/AssetRef"},"totalAssets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"totalBorrows":{"type":"string","description":"Raw borrowed asset amount as a bigint string."},"totalSupplyUsd":{"type":"number","description":"Market USD number for total supplied assets."},"totalBorrowsUsd":{"type":"number","description":"Market USD number for total borrowed assets."},"utilization":{"type":"number","description":"Utilization ratio number, computed from market-normalized totals."},"supplyApy":{"type":"number","description":"Public supply APY as a percent number."},"borrowApy":{"type":"number","description":"Public borrow APY as a percent number."},"createdAt":{"type":"string","format":"date-time"}}},"VaultResolveEntry":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"found":{"type":"boolean"},"vaultType":{"type":["string","null"],"enum":["evk","earn","securitize",null]},"factory":{"type":["string","null"]},"resource":{"type":["string","null"]},"snapshotTimestamp":{"type":"string","format":"date-time"}}},"VaultDetails":{"allOf":[{"$ref":"#/components/schemas/Vault"},{"type":"object","properties":{"dToken":{"type":"string"},"oracle":{"$ref":"#/components/schemas/OracleInfo"},"unitOfAccount":{"$ref":"#/components/schemas/AssetRef"},"creator":{"type":"string"},"governor":{"type":"string","description":"Latest governor admin if available; falls back to creator."},"governorAdmin":{"type":"string","description":"Latest governor admin if available; falls back to creator."},"supplyCap":{"type":"string","description":"Resolved supply cap as a bigint string in underlying asset units."},"borrowCap":{"type":"string","description":"Resolved borrow cap as a bigint string in underlying asset units."},"totalShares":{"type":"string","description":"Raw vault share supply as a bigint string."},"totalBorrowed":{"type":"string","description":"Raw borrowed asset amount as a bigint string."},"totalCash":{"type":"string","description":"Raw cash amount as a bigint string."},"cash":{"type":"string","description":"Raw cash amount as a bigint string."},"interestRate":{"type":"string","description":"Raw contract interest-rate value as a bigint string."},"interestAccumulator":{"type":"string","description":"Raw contract interest accumulator as a bigint string."},"accumulatedFees":{"type":"string","description":"Raw accumulated fee amount as a bigint string."},"balanceTracker":{"type":"string"},"fees":{"$ref":"#/components/schemas/VaultFees"},"hooks":{"$ref":"#/components/schemas/VaultHooks"},"caps":{"$ref":"#/components/schemas/VaultCaps"},"liquidation":{"$ref":"#/components/schemas/VaultLiquidation"},"interestRates":{"$ref":"#/components/schemas/VaultInterestRates"},"interestRateModel":{"$ref":"#/components/schemas/VaultInterestRateModel"},"evcCompatibleAsset":{"type":"boolean"},"oraclePriceRaw":{"$ref":"#/components/schemas/OraclePriceRaw"},"timestamp":{"type":"string","format":"date-time"},"exchangeRate":{"type":"string","nullable":true,"description":"Raw exchange rate as a bigint string."},"createdAtBlock":{"type":"string","description":"Block number as a bigint string."}}}]},"VaultApyPoint":{"type":"object","properties":{"supplyApy":{"type":"number","nullable":true,"description":"Percent number with 6 decimal places."},"borrowApy":{"type":"number","description":"Percent number with 6 decimal places."},"timestamp":{"type":"string","format":"date-time"}}},"VaultApy":{"type":"object","properties":{"current":{"$ref":"#/components/schemas/VaultApyPoint"},"history":{"type":"array","items":{"$ref":"#/components/schemas/VaultApyPoint"}}}},"VaultApyMeta":{"type":"object","properties":{"chainId":{"type":"string"},"vault":{"type":"string"},"resolution":{"type":"string","enum":["1h","1d"]},"startTimestamp":{"type":"string","format":"date-time"},"endTimestamp":{"type":"string","format":"date-time"},"timestamp":{"type":"string","format":"date-time"}}},"VaultTotalsPoint":{"type":"object","properties":{"totalAssets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"totalBorrows":{"type":"string","description":"Raw borrowed asset amount as a bigint string."},"cash":{"type":"string","nullable":true,"description":"Raw cash amount as a bigint string."},"utilization":{"type":"number","nullable":true,"description":"Utilization ratio number."},"supplyApy":{"type":"number","nullable":true,"description":"Public supply APY as a percent number."},"borrowApy":{"type":"number","nullable":true,"description":"Public borrow APY as a percent number."},"timestamp":{"type":"string","format":"date-time"}}},"VaultTotals":{"type":"object","properties":{"current":{"$ref":"#/components/schemas/VaultTotalsPoint"},"history":{"type":"array","items":{"$ref":"#/components/schemas/VaultTotalsPoint"}}}},"VaultTotalsMeta":{"allOf":[{"$ref":"#/components/schemas/VaultApyMeta"},{"type":"object","properties":{"note":{"type":"string"}}}]},"VaultTotalsFreshness":{"type":"object","properties":{"mode":{"type":"string","enum":["fresh","cached"]},"forceFreshRequested":{"type":"boolean"},"refreshTriggered":{"type":"boolean"},"refreshCompleted":{"type":"boolean"},"timedOut":{"type":"boolean"},"rateLimited":{"type":"boolean"},"fallbackReason":{"type":"string","nullable":true},"waitedMs":{"type":"integer"},"latestSnapshotTimestamp":{"type":"string","format":"date-time"},"ageSeconds":{"type":"integer"}}},"OracleRouterConfig":{"type":"object","properties":{"asset0":{"type":"string"},"asset1":{"type":"string"},"oracle":{"type":"string"},"blockNumber":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"txHash":{"type":"string"}}},"OracleRouterVault":{"type":"object","properties":{"vault":{"type":"string"},"asset":{"type":"string"},"blockNumber":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"txHash":{"type":"string"}}},"OracleRouterState":{"type":"object","properties":{"chainId":{"type":"integer"},"router":{"type":"string"},"deployer":{"type":"string"},"deployedAt":{"type":"string","format":"date-time"},"configs":{"type":"array","items":{"$ref":"#/components/schemas/OracleRouterConfig"}},"vaults":{"type":"array","items":{"$ref":"#/components/schemas/OracleRouterVault"}}}},"CollateralConfigWithPrice":{"allOf":[{"$ref":"#/components/schemas/CollateralConfig"},{"type":"object","properties":{"price":{"allOf":[{"$ref":"#/components/schemas/Price"}],"nullable":true}}}]},"VaultCollateralDetail":{"allOf":[{"$ref":"#/components/schemas/CollateralConfig"},{"type":"object","properties":{"oraclePriceRaw":{"allOf":[{"$ref":"#/components/schemas/OraclePriceRaw"}],"nullable":true}}}]},"VaultIncludePrices":{"type":"object","properties":{"asset":{"allOf":[{"$ref":"#/components/schemas/Price"}],"nullable":true},"collaterals":{"type":"array","items":{"$ref":"#/components/schemas/CollateralConfigWithPrice"}}}},"VaultDetailsWithIncludes":{"allOf":[{"$ref":"#/components/schemas/VaultDetails"},{"type":"object","properties":{"collaterals":{"type":"array","items":{"$ref":"#/components/schemas/VaultCollateralDetail"},"nullable":true},"apy":{"allOf":[{"$ref":"#/components/schemas/VaultApy"}],"nullable":true},"totals":{"allOf":[{"$ref":"#/components/schemas/VaultTotals"}],"nullable":true},"prices":{"allOf":[{"$ref":"#/components/schemas/VaultIncludePrices"}],"nullable":true}}}]},"VaultDetailResponse":{"type":"object","description":"Single-vault detail response shape for `GET /v3/evk/vaults/{chainId}/{address}`.","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"vaultType":{"type":"string","enum":["evk"],"description":"Vault family for the `/v3/evk/vaults` EVK surface."},"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"shares":{"$ref":"#/components/schemas/AssetRef"},"asset":{"$ref":"#/components/schemas/AssetRef"},"dToken":{"type":"string"},"oracle":{"$ref":"#/components/schemas/OracleInfo"},"unitOfAccount":{"$ref":"#/components/schemas/AssetRef"},"creator":{"type":"string"},"governor":{"type":"string","description":"Latest governor admin if available; falls back to creator."},"governorAdmin":{"type":"string","description":"Latest governor admin if available; falls back to creator."},"supplyCap":{"type":"string","description":"Resolved supply cap as a bigint string in underlying asset units."},"borrowCap":{"type":"string","description":"Resolved borrow cap as a bigint string in underlying asset units."},"totalShares":{"type":"string","description":"Raw vault share supply as a bigint string."},"totalAssets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"totalBorrowed":{"type":"string","description":"Raw borrowed asset amount as a bigint string."},"totalCash":{"type":"string","description":"Raw cash amount as a bigint string."},"cash":{"type":"string","description":"Raw cash amount as a bigint string."},"interestRate":{"type":"string","description":"Raw contract interest-rate value as a bigint string."},"interestAccumulator":{"type":"string","description":"Raw contract interest accumulator as a bigint string."},"accumulatedFees":{"type":"string","description":"Raw accumulated fee amount as a bigint string."},"balanceTracker":{"type":"string"},"fees":{"$ref":"#/components/schemas/VaultFees"},"hooks":{"$ref":"#/components/schemas/VaultHooks"},"caps":{"$ref":"#/components/schemas/VaultCaps"},"liquidation":{"$ref":"#/components/schemas/VaultLiquidation"},"interestRates":{"$ref":"#/components/schemas/VaultInterestRates"},"interestRateModel":{"$ref":"#/components/schemas/VaultInterestRateModel"},"evcCompatibleAsset":{"type":"boolean"},"oraclePriceRaw":{"$ref":"#/components/schemas/OraclePriceRaw"},"timestamp":{"type":"string","format":"date-time"},"exchangeRate":{"type":"string","nullable":true,"description":"Raw exchange rate as a bigint string."},"totalSupplyUsd":{"type":"number","description":"Market USD number for total supplied assets."},"totalBorrowsUsd":{"type":"number","description":"Market USD number for total borrowed assets."},"utilization":{"type":"number","description":"Utilization ratio number."},"supplyApy":{"type":"number","description":"Public supply APY as a percent number."},"borrowApy":{"type":"number","description":"Public borrow APY as a percent number."},"snapshotTimestamp":{"type":"string","format":"date-time"},"createdAtBlock":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"VaultDetailResponseWithIncludes":{"allOf":[{"$ref":"#/components/schemas/VaultDetailResponse"},{"type":"object","properties":{"collaterals":{"type":"array","items":{"$ref":"#/components/schemas/VaultCollateralDetail"},"nullable":true},"apy":{"allOf":[{"$ref":"#/components/schemas/VaultApy"}],"nullable":true},"totals":{"allOf":[{"$ref":"#/components/schemas/VaultTotals"}],"nullable":true},"prices":{"allOf":[{"$ref":"#/components/schemas/VaultIncludePrices"}],"nullable":true}}}]},"EvkVaultBatchRequest":{"type":"object","required":["chainId","addresses"],"properties":{"chainId":{"type":"integer"},"addresses":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"string","maxLength":42},"description":"Ordered list of EVK vault addresses to fetch."},"include":{"type":"array","items":{"type":"string","enum":["collaterals"]},"description":"Optional related resources to expand for every returned vault."}}},"EvkVaultBatchMeta":{"type":"object","properties":{"count":{"type":"integer"},"requested":{"type":"integer"},"notFound":{"type":"array","items":{"type":"string"}},"timestamp":{"type":"string","format":"date-time"},"chainId":{"type":"string"}}},"EvkVaultBatchResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VaultDetailsWithIncludes"}},"meta":{"$ref":"#/components/schemas/EvkVaultBatchMeta"}}},"EarnVaultSummary":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"asset":{"$ref":"#/components/schemas/AssetRef"},"totalAssets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"totalShares":{"type":"string","description":"Raw vault share supply as a bigint string."},"lostAssets":{"type":"string","description":"Raw lost asset amount as a bigint string."},"exchangeRate":{"type":"string","description":"Raw exchange rate as a bigint string."},"totalSupplyUsd":{"type":"number","description":"Market USD number for total Earn vault assets."},"availableAssets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"availableAssetsUsd":{"type":"number","description":"Market USD number for currently available assets."},"supplyApy":{"type":"number","nullable":true,"description":"Public supply APY as a percent number."},"apyCurrent":{"type":"number","nullable":true,"description":"Current public APY as a percent number."},"apy7d":{"type":"number","nullable":true,"description":"Seven-day public APY as a percent number."},"apy30d":{"type":"number","nullable":true,"description":"Thirty-day public APY as a percent number."},"apy90d":{"type":"number","nullable":true,"description":"Ninety-day public APY as a percent number."},"utilization":{"type":"number","description":"Utilization ratio number."},"strategyCount":{"type":"integer"},"snapshotTimestamp":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"EarnVaultBatchRequest":{"type":"object","required":["chainId","addresses"],"properties":{"chainId":{"type":"integer"},"addresses":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"string","maxLength":42}},"include":{"type":"array","items":{"type":"string","enum":["strategies"]},"description":"Optional related resources to expand for every returned vault."}}},"EarnVaultBatchMeta":{"type":"object","properties":{"count":{"type":"integer"},"requested":{"type":"integer"},"notFound":{"type":"array","items":{"type":"string"}},"timestamp":{"type":"string","format":"date-time"},"chainId":{"type":"string"}}},"EarnVaultBatchItem":{"allOf":[{"$ref":"#/components/schemas/EarnVaultSummary"},{"type":"object","properties":{"strategies":{"type":"array","items":{"$ref":"#/components/schemas/EarnStrategy"}}}}]},"EarnVaultBatchResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EarnVaultBatchItem"}},"meta":{"$ref":"#/components/schemas/EarnVaultBatchMeta"}}},"EarnVaultDetails":{"allOf":[{"$ref":"#/components/schemas/EarnVaultSummary"},{"type":"object","properties":{"totalShares":{"type":"string","description":"Raw vault share supply as a bigint string."},"lostAssets":{"type":"string","description":"Raw lost asset amount as a bigint string."},"exchangeRate":{"type":"string","description":"Raw exchange rate as a bigint string."},"strategies":{"type":"array","items":{"$ref":"#/components/schemas/EarnStrategy"}},"governance":{"$ref":"#/components/schemas/EarnVaultGovernance"},"management":{"$ref":"#/components/schemas/EarnVaultManagement"}}}]},"EarnStrategy":{"type":"object","properties":{"address":{"type":"string"},"vaultType":{"type":"string","enum":["evk","earn","securitize","unknown"]},"symbol":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"decimals":{"type":"integer","nullable":true},"suppliedAssets":{"type":"string","description":"Raw underlying asset amount supplied to the strategy."},"withdrawnAssets":{"type":"string","description":"Raw underlying asset amount withdrawn from the strategy."},"allocatedAssets":{"type":"string","description":"Raw underlying asset amount allocated to the strategy."},"allocatedAssetsUsd":{"type":"number","description":"Market USD number for assets allocated to this strategy."},"availableAssets":{"type":"string","description":"Raw underlying asset amount available from the strategy."},"inSupplyQueue":{"type":"boolean"},"inWithdrawQueue":{"type":"boolean"},"supplyQueueIndex":{"type":"integer","nullable":true},"withdrawQueueIndex":{"type":"integer","nullable":true},"allocationCap":{"$ref":"#/components/schemas/EarnStrategyAllocationCap"},"removableAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["active","inactive","pending_removal"]},"lastRebalancedAt":{"type":"string","format":"date-time","nullable":true}}},"EarnVaultManagement":{"type":"object","properties":{"owner":{"type":"string"},"curator":{"type":"string"},"guardian":{"type":"string"},"feeRecipient":{"type":"string"},"timelockSeconds":{"type":"integer","description":"Timelock duration in seconds."},"performanceFee":{"type":"string","description":"Raw contract performance fee value as a bigint string."}}},"EarnVaultGovernance":{"type":"object","properties":{"owner":{"type":"string"},"creator":{"type":"string"},"curator":{"type":"string"},"guardian":{"type":"string"},"feeReceiver":{"type":"string"},"timelock":{"type":"integer","description":"Timelock duration in seconds."},"pendingTimelock":{"type":"integer","description":"Pending timelock duration in seconds."},"pendingTimelockValidAt":{"type":"string","format":"date-time"},"pendingGuardian":{"type":"string"},"pendingGuardianValidAt":{"type":"string","format":"date-time"}}},"EarnStrategyAllocationCap":{"type":"object","properties":{"current":{"type":"string","description":"Raw allocation cap as a bigint string in underlying asset units."},"pending":{"type":"string","description":"Pending raw allocation cap as a bigint string in underlying asset units."},"pendingValidAt":{"type":"string","format":"date-time"}}},"EarnIncludePrices":{"type":"object","properties":{"asset":{"allOf":[{"$ref":"#/components/schemas/Price"}],"nullable":true}}},"EarnVaultDetailsWithIncludes":{"allOf":[{"$ref":"#/components/schemas/EarnVaultDetails"},{"type":"object","properties":{"apy":{"allOf":[{"$ref":"#/components/schemas/VaultApy"}],"nullable":true},"totals":{"allOf":[{"$ref":"#/components/schemas/VaultTotals"}],"nullable":true},"prices":{"allOf":[{"$ref":"#/components/schemas/EarnIncludePrices"}],"nullable":true}}}]},"VaultPosition":{"type":"object","properties":{"account":{"type":"string"},"shares":{"type":"string","description":"Raw vault share amount as a bigint string."},"assets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"assetsUsd":{"type":"number","nullable":true,"description":"Market USD number computed from `assets` and the token price endpoint."},"lastUpdatedBlock":{"type":"string"}}},"AccountLiquidityValue":{"type":"object","description":"Contract-derived account-liquidity value in unit-of-account terms; each field is a raw 18-decimal bigint string.","properties":{"borrowing":{"type":"string","description":"Borrowing value, raw 18-decimal bigint string."},"liquidation":{"type":"string","description":"Liquidation value, raw 18-decimal bigint string."},"oracleMid":{"type":"string","description":"Oracle midpoint value, raw 18-decimal bigint string."}}},"AccountPositionLiquidity":{"type":"object","nullable":true,"properties":{"vaultAddress":{"type":"string"},"unitOfAccount":{"type":"string"},"daysToLiquidation":{"oneOf":[{"type":"integer"},{"type":"string","enum":["Infinity","MoreThanAYear"]}]},"liabilityValue":{"$ref":"#/components/schemas/AccountLiquidityValue"},"totalCollateralValue":{"$ref":"#/components/schemas/AccountLiquidityValue"},"collaterals":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"value":{"$ref":"#/components/schemas/AccountLiquidityValue"},"marketPriceUsd":{"type":"number","description":"Market USD price number for the collateral asset."},"valueUsd":{"type":"number","description":"Market USD value number for this collateral."}}}},"liabilityValueUsd":{"type":"string","description":"Contract-derived liability value, raw 18-decimal bigint string."},"totalCollateralValueUsd":{"type":"string","description":"Contract-derived collateral value, raw 18-decimal bigint string."}}},"AccountPosition":{"type":"object","properties":{"chainId":{"type":"integer"},"account":{"type":"string"},"vault":{"type":"string"},"vaultType":{"type":"string","enum":["evk","earn","securitize"]},"asset":{"type":"string","nullable":true},"shares":{"type":"string","nullable":true,"description":"Raw vault share amount as a bigint string."},"assets":{"type":"string","nullable":true,"description":"Raw underlying asset amount as a bigint string."},"borrowed":{"type":"string","nullable":true,"description":"Raw borrowed asset amount as a bigint string."},"assetsValue":{"type":"string","nullable":true,"description":"Contract-derived account-liquidity asset value, raw 18-decimal bigint string."},"debtValue":{"type":"string","nullable":true,"description":"Contract-derived account-liquidity debt value, raw 18-decimal bigint string."},"isCollateral":{"type":"boolean","nullable":true},"balanceForwarderEnabled":{"type":"boolean","nullable":true},"isController":{"type":"boolean","nullable":true},"liquidity":{"$ref":"#/components/schemas/AccountPositionLiquidity"},"subAccount":{"type":"object","nullable":true,"properties":{"owner":{"type":"string","nullable":true},"timestamp":{"type":"string","format":"date-time","nullable":true},"lastAccountStatusCheckTimestamp":{"type":"string","format":"date-time","nullable":true},"enabledControllers":{"type":"array","nullable":true,"items":{"type":"string"}},"enabledCollaterals":{"type":"array","nullable":true,"items":{"type":"string"}},"isLockdownMode":{"type":"boolean","nullable":true},"isPermitDisabledMode":{"type":"boolean","nullable":true}}},"snapshot":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time","nullable":true},"ageSeconds":{"type":"integer","nullable":true},"source":{"type":"string","nullable":true},"method":{"type":"string","nullable":true}}}}},"AccountPortfolioResponse":{"type":"object","properties":{"chainId":{"type":"integer"},"owner":{"type":"string"},"portfolio":{"type":"object","properties":{"savings":{"type":"array","items":{"$ref":"#/components/schemas/PortfolioSavingsPosition"}},"borrows":{"type":"array","items":{"$ref":"#/components/schemas/PortfolioBorrowPosition"}},"positions":{"type":"array","items":{"$ref":"#/components/schemas/SerializedPortfolioAccountPosition"}},"managedLending":{"type":"array","items":{"$ref":"#/components/schemas/PortfolioSavingsPosition"}},"directLending":{"type":"array","items":{"$ref":"#/components/schemas/PortfolioSavingsPosition"}},"totals":{"type":"object","properties":{"suppliedValueUsd":{"type":"number","description":"Market USD number for total supplied value."},"borrowedValueUsd":{"type":"number","description":"Market USD number for total borrowed value."},"netAssetValueUsd":{"type":"number","description":"Market USD number for supplied minus borrowed value."},"netApy":{"type":"number","description":"Public net APY as a percent number."},"roe":{"type":"number","description":"Return-on-equity ratio number."},"apyBreakdown":{"$ref":"#/components/schemas/YieldApyBreakdown"},"roeBreakdown":{"$ref":"#/components/schemas/YieldApyBreakdown"}}}}},"account":{"type":"object","nullable":true,"additionalProperties":true},"errors":{"type":"array","items":{"$ref":"#/components/schemas/DataIssue"}},"freshness":{"type":"object","properties":{"latestSnapshotTimestamp":{"type":"integer","nullable":true},"ageSeconds":{"type":"integer","nullable":true},"timestamp":{"type":"string","format":"date-time"},"mode":{"type":"string","enum":["fresh","cached"]},"forceFreshRequested":{"type":"boolean"},"refreshTriggered":{"type":"boolean"},"refreshCompleted":{"type":"boolean"},"timedOut":{"type":"boolean"},"rateLimited":{"type":"boolean"},"fallbackReason":{"type":"string","nullable":true},"waitedMs":{"type":"integer"}}}}},"PortfolioSavingsPosition":{"type":"object","properties":{"position":{"$ref":"#/components/schemas/SerializedPortfolioAccountPosition"},"vault":{"$ref":"#/components/schemas/SerializedPortfolioVault"},"subAccount":{"type":"string"},"shares":{"type":"string","description":"Raw vault share amount as a bigint string."},"assets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"suppliedValueUsd":{"type":"number","description":"Market USD value number for this savings position."},"apy":{"type":"number","description":"Public APY as a percent number."},"apyBreakdown":{"$ref":"#/components/schemas/YieldApyBreakdown"}}},"PortfolioBorrowPosition":{"type":"object","properties":{"borrow":{"$ref":"#/components/schemas/SerializedPortfolioAccountPosition"},"collaterals":{"type":"array","items":{"$ref":"#/components/schemas/SerializedPortfolioAccountPosition"}},"collateral":{"$ref":"#/components/schemas/SerializedPortfolioAccountPosition"},"borrowVault":{"$ref":"#/components/schemas/SerializedPortfolioVault"},"collateralVault":{"$ref":"#/components/schemas/SerializedPortfolioVault"},"collateralVaults":{"type":"array","items":{"type":"string"}},"subAccount":{"type":"string"},"healthFactor":{"type":"string"},"userLTV":{"type":"string","description":"Contract-derived account LTV ratio, raw 18-decimal bigint string."},"currentLTV":{"type":"string","description":"Contract-derived current LTV ratio, raw 18-decimal bigint string."},"borrowed":{"type":"string","description":"Raw borrowed asset amount as a bigint string."},"supplied":{"type":"string","description":"Raw supplied asset amount as a bigint string."},"price":{"type":"string","description":"Contract-derived borrow/collateral price ratio, raw 18-decimal bigint string."},"borrowLiquidationPriceUsd":{"type":"string","description":"Contract-derived liquidation price, raw 18-decimal bigint string."},"collateralLiquidationPricesUsd":{"type":"object","description":"Contract-derived liquidation prices keyed by collateral address, raw 18-decimal bigint strings.","additionalProperties":{"type":"string"}},"borrowLTV":{"type":"number","description":"Borrow LTV ratio number."},"liquidationLTV":{"type":"number","description":"Liquidation LTV ratio number."},"accountLiquidationLTV":{"type":"string","description":"Contract-derived account liquidation LTV ratio, raw 18-decimal bigint string."},"liabilityValueBorrowing":{"type":"string","description":"Contract-derived liability value for borrowing, raw 18-decimal bigint string."},"liabilityValueLiquidation":{"type":"string","description":"Contract-derived liability value for liquidation, raw 18-decimal bigint string."},"liabilityValueUsd":{"type":"string","description":"Contract-derived liability value, raw 18-decimal bigint string."},"totalCollateralValueUsd":{"type":"string","description":"Contract-derived total collateral value, raw 18-decimal bigint string."},"collateralValueLiquidation":{"type":"string","description":"Contract-derived collateral liquidation value, raw 18-decimal bigint string."},"timeToLiquidation":{"oneOf":[{"type":"integer"},{"type":"string","enum":["Infinity","MoreThanAYear"]}]},"multiplier":{"type":"number","description":"Leverage multiplier ratio number."},"netApy":{"type":"number","description":"Public net APY as a percent number."},"roe":{"type":"number","description":"Return-on-equity ratio number."},"apyBreakdown":{"$ref":"#/components/schemas/YieldApyBreakdown"},"roeBreakdown":{"$ref":"#/components/schemas/YieldApyBreakdown"}}},"YieldApyBreakdown":{"type":"object","properties":{"lending":{"type":"number","description":"Lending APY contribution as a percent number."},"borrowing":{"type":"number","description":"Borrowing APY contribution as a percent number."},"rewards":{"type":"number","description":"Rewards APY contribution as a percent number."},"intrinsicApy":{"type":"number","description":"Intrinsic APY contribution as a percent number."},"total":{"type":"number","description":"Total APY as a percent number."}}},"SerializedPortfolioAccountPosition":{"type":"object","properties":{"account":{"type":"string"},"vaultAddress":{"type":"string"},"vault":{"$ref":"#/components/schemas/SerializedPortfolioVault"},"asset":{"type":"string"},"shares":{"type":"string","description":"Raw vault share amount as a bigint string."},"assets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"borrowed":{"type":"string","description":"Raw borrowed asset amount as a bigint string."},"isController":{"type":"boolean"},"isCollateral":{"type":"boolean"},"balanceForwarderEnabled":{"type":"boolean"},"marketPriceUsd":{"type":"number","description":"Market USD price number for this position's asset."},"suppliedValueUsd":{"type":"number","description":"Market USD value number for this supplied position."},"borrowedValueUsd":{"type":"number","description":"Market USD value number for this borrowed position."},"liquidity":{"$ref":"#/components/schemas/AccountPositionLiquidity"},"borrowLiquidationPriceUsd":{"type":"string","description":"Contract-derived liquidation price, raw 18-decimal bigint string."},"collateralLiquidationPricesUsd":{"type":"object","description":"Contract-derived liquidation prices keyed by collateral address, raw 18-decimal bigint strings.","additionalProperties":{"type":"string"}}}},"SerializedPortfolioVault":{"type":"object","properties":{"address":{"type":"string"},"type":{"type":"string","enum":["evk","earn","securitize","unknown"]},"asset":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"name":{"type":"string"}}},"shares":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"name":{"type":"string"}}},"supplyApy":{"type":"number","description":"Public supply APY as a percent number."},"borrowApy":{"type":"number","description":"Public borrow APY as a percent number."},"supplyApy1h":{"type":"number","description":"One-hour public supply APY as a percent number."},"strategyCount":{"type":"integer"}}},"DataIssue":{"type":"object","properties":{"code":{"type":"string"},"severity":{"type":"string","enum":["info","warning","error"]},"message":{"type":"string"},"paths":{"type":"array","items":{"type":"string"}},"entityId":{"type":"string"},"source":{"type":"string"},"originalValue":{},"normalizedValue":{}}},"AccountActivity":{"type":"object","properties":{"type":{"type":"string"},"chainId":{"type":"integer"},"vault":{"type":"string"},"assets":{"type":"string","description":"Raw underlying asset amount as a bigint string."},"shares":{"type":"string","description":"Raw vault share amount as a bigint string."},"txHash":{"type":"string"},"blockNumber":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"Token":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"logoURI":{"type":"string","description":"Preferred token image URI. Served from the Euler token image CDN with an hourly cache-busting query param."},"priceUsd":{"type":"number","description":"Market USD price number when token list responses include a price."},"metadata":{"$ref":"#/components/schemas/TokenMetadata"},"groups":{"type":"array","items":{"type":"string"},"description":"Asset group associations (e.g., pendle-pt, pendle-lp)."}}},"TokenMetadata":{"type":"object","description":"Protocol integration metadata for a token.","properties":{"isPendlePT":{"type":"boolean"},"isPendleLP":{"type":"boolean"},"pendleMarket":{"type":"string","nullable":true}},"additionalProperties":true},"Price":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"priceUsd":{"type":"number","description":"Market-normalized USD price number. If `source` is `oracle`, this endpoint still exposes the v3 market-price number; use `/v3/oracles/prices` for exact contract-derived oracle values."},"source":{"type":"string"},"confidence":{"type":"number","nullable":true},"blockNumber":{"type":"string","nullable":true},"timestamp":{"type":"string","format":"date-time"}}},"IntrinsicApy":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"symbol":{"type":"string"},"apy":{"type":"number","description":"Percent number with 6 decimal places."},"provider":{"type":"string"},"source":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RewardsApy":{"type":"object","properties":{"chainId":{"type":"integer"},"vault":{"type":"string"},"campaigns":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string"},"apr":{"type":"number","description":"Reward APR contribution as a public percent number."},"rewardToken":{"$ref":"#/components/schemas/AssetRef"},"source":{"type":"string","enum":["merkl","direct"]},"startTimestamp":{"type":"string","format":"date-time"},"endTimestamp":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["active","upcoming","ended"],"description":"Campaign status. 'active' = ongoing, 'upcoming' = not yet started, 'ended' = past."},"campaignType":{"type":"string"},"collateralAsset":{"type":"string"},"requiresCb1Verification":{"type":"boolean"}}}},"totalApr":{"type":"number","description":"Sum of currently active reward APR contributions as a public percent number."}}},"RewardsApyHistoryPoint":{"type":"object","properties":{"chainId":{"type":"integer"},"vault":{"type":"string"},"rewardsApy":{"type":"number","description":"Rewards APY as a public percent number."},"timestamp":{"type":"string","format":"date-time","description":"Bucket timestamp as an ISO-8601 UTC string."}}},"RewardBreakdown":{"type":"object","properties":{"chainId":{"type":"integer"},"vault":{"type":"string"},"recipient":{"type":"string"},"rewardToken":{"type":"string"},"amount":{"type":"string","description":"Raw reward token amount as a bigint string."},"campaignId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"OracleAdapter":{"type":"object","properties":{"chainId":{"type":"integer"},"asset0":{"type":"string"},"asset1":{"type":"string"},"adapter":{"type":"string","description":"Preferred public field name for the whitelisted oracle adapter address."},"element":{"type":"string","description":"Legacy internal field name for the adapter address.","deprecated":true},"addedAt":{"type":"string","format":"date-time"},"addedAtBlock":{"type":"string"},"txHash":{"type":"string"}}},"IntrinsicApyHistoryPoint":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"apy":{"type":"number","description":"Intrinsic APY as a percent number."},"provider":{"type":"string"},"apyDuration":{"type":"number","description":"Duration in seconds used to compute the APY."}}},"IntrinsicApyHistoryMeta":{"type":"object","properties":{"chainId":{"type":"string"},"asset":{"type":"string"},"symbol":{"type":"string"},"resolution":{"type":"string","enum":["1h","1d"]},"startTimestamp":{"type":"string","format":"date-time"},"endTimestamp":{"type":"string","format":"date-time"},"timestamp":{"type":"string","format":"date-time"}}},"SwapPool":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"token0":{"type":"string"},"token1":{"type":"string"},"tvlUsd":{"type":"number","description":"Market USD total value locked number."}}},"CollateralConfig":{"type":"object","description":"Current LTV configuration for a collateral vault","properties":{"collateral":{"type":"string","description":"Collateral vault address"},"vaultType":{"type":"string","enum":["evk","earn","securitize"],"description":"Vault family for the collateral address"},"collateralName":{"type":"string","description":"Collateral vault name"},"collateralSymbol":{"type":"string","description":"Collateral vault symbol"},"asset":{"type":"string","description":"Underlying asset address of the collateral vault"},"assetSymbol":{"type":"string","description":"Underlying asset symbol"},"assetDecimals":{"type":"integer","description":"Underlying asset decimals"},"borrowLTV":{"type":"string","description":"Maximum LTV for borrowing (basis points as string, e.g., \"8500\" = 85%)"},"liquidationLTV":{"type":"string","description":"LTV at which liquidation can occur (basis points as string)"},"initialLiquidationLTV":{"type":"string","description":"Initial liquidation LTV before ramping"},"targetTimestamp":{"type":"string","format":"date-time","nullable":true,"description":"ISO timestamp when LTV ramp completes"},"rampDuration":{"type":"integer","description":"Duration of LTV ramp in seconds"}}},"LtvHistoryItem":{"type":"object","description":"Historical LTV configuration change","properties":{"collateral":{"type":"string","description":"Collateral vault address"},"borrowLTV":{"type":"string","description":"Borrow LTV (basis points as string)"},"liquidationLTV":{"type":"string","description":"Liquidation LTV (basis points as string)"},"initialLiquidationLTV":{"type":"string","description":"Initial liquidation LTV before ramping"},"borrowLtv":{"type":"number","description":"Legacy decimal alias for `borrowLTV`."},"liquidationLtv":{"type":"number","description":"Legacy decimal alias for `liquidationLTV`."},"initialLiquidationLtv":{"type":"number","description":"Legacy decimal alias for `initialLiquidationLTV`."},"targetTimestamp":{"type":"string","format":"date-time","nullable":true,"description":"ISO timestamp when LTV ramp completes"},"rampDuration":{"type":"integer","description":"Duration of LTV ramp in seconds"},"blockNumber":{"type":"string","description":"Block number of the change"},"timestamp":{"type":"string","format":"date-time","description":"Timestamp of the change"},"txHash":{"type":"string","description":"Transaction hash"},"logIndex":{"type":"integer","description":"Log index within the transaction receipt."}}},"CapHistoryItem":{"type":"object","description":"Historical cap configuration change","properties":{"supplyCap":{"type":"string","description":"Resolved supply cap as a bigint string in underlying asset units."},"borrowCap":{"type":"string","description":"Resolved borrow cap as a bigint string in underlying asset units."},"blockNumber":{"type":"string","description":"Block number of the change"},"timestamp":{"type":"string","format":"date-time","description":"Timestamp of the change"},"txHash":{"type":"string","description":"Transaction hash"},"logIndex":{"type":"integer","description":"Log index within the transaction receipt."}}},"VaultCapHealthItem":{"type":"object","description":"Vault cap-usage health row","properties":{"chainId":{"type":"integer","description":"Chain ID"},"vault":{"type":"string","description":"Vault address"},"capUsage":{"type":"number","description":"Maximum of `supplyCapUsage` and `borrowCapUsage`"},"supplyCap":{"type":"string","description":"Supply cap in resolved asset units"},"supplyCapUsage":{"type":"number","description":"Current supply-cap usage ratio"},"borrowCap":{"type":"string","description":"Borrow cap in resolved asset units"},"borrowCapUsage":{"type":"number","description":"Current borrow-cap usage ratio"},"totalAssets":{"type":"string","description":"Current total supplied assets"},"totalBorrows":{"type":"string","description":"Current total borrowed assets"},"thresholdExceeded":{"type":"boolean","description":"Whether `capUsage` meets or exceeds the requested threshold"}}},"IrmHistoryItem":{"type":"object","description":"Historical interest rate model change","properties":{"interestRateModel":{"type":"string","description":"Interest rate model contract address"},"blockNumber":{"type":"string","description":"Block number of the change"},"timestamp":{"type":"string","format":"date-time","description":"Timestamp of the change"},"txHash":{"type":"string","description":"Transaction hash"},"logIndex":{"type":"integer","description":"Log index within the transaction receipt."}}},"ConfigHistoryItem":{"type":"object","description":"Generic configuration change event","properties":{"type":{"type":"string","enum":["caps","ltv","irm","governor","feeReceiver","hookConfig","interestFee","configFlags"],"description":"Type of configuration change"},"data":{"type":"object","additionalProperties":true,"description":"The configuration values that changed (varies by type). For `ltv` events, canonical basis-point string fields such as `borrowLTV` may be accompanied by legacy decimal aliases."},"blockNumber":{"type":"string","description":"Block number of the change"},"timestamp":{"type":"string","format":"date-time","description":"Timestamp of the change"},"txHash":{"type":"string","description":"Transaction hash"},"logIndex":{"type":"integer","description":"Log index within the transaction receipt."}}},"ApiKeyCreateRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"ownerEmail":{"type":"string","format":"email"},"keyType":{"type":"string","enum":["standard","curator"],"default":"standard"},"scopeMode":{"type":"string","enum":["all_vaults","allowlist"]},"vaultAllowlist":{"type":"array","items":{"type":"object","required":["chainId","vaultAddress"],"properties":{"chainId":{"type":"integer"},"vaultAddress":{"type":"string"}}}},"rateLimit":{"type":"integer"},"expiresInDays":{"type":"integer"}}},"ApiKeyCreateResponse":{"type":"object","required":["message","key","keyPrefix","id","name","keyType","rateLimit"],"properties":{"message":{"type":"string"},"key":{"type":"string"},"keyPrefix":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"keyType":{"type":"string","enum":["standard","curator"]},"scopeMode":{"type":"string","enum":["all_vaults","allowlist"],"nullable":true},"vaultAllowlist":{"type":"array","items":{"type":"object","required":["chainId","vaultAddress"],"properties":{"chainId":{"type":"integer"},"vaultAddress":{"type":"string"}}}},"rateLimit":{"type":"integer"},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"ApiKeyResponse":{"type":"object","required":["id","name","keyType","rateLimit","isActive","createdAt"],"properties":{"id":{"type":"string"},"keyPrefix":{"type":"string"},"name":{"type":"string"},"ownerEmail":{"type":"string","nullable":true},"keyType":{"type":"string","enum":["standard","curator"]},"scopeMode":{"type":"string","enum":["all_vaults","allowlist"],"nullable":true},"vaultAllowlist":{"type":"array","items":{"type":"object","required":["chainId","vaultAddress"],"properties":{"chainId":{"type":"integer"},"vaultAddress":{"type":"string"}}}},"rateLimit":{"type":"integer"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"ApiKeyUsageResponse":{"type":"object","required":["period","summary","endpoints"],"properties":{"period":{"type":"object","required":["days","since"],"properties":{"days":{"type":"integer"},"since":{"type":"string","format":"date-time"}}},"summary":{"type":"object","required":["totalRequests","avgResponseTimeMs","errorCount"],"properties":{"totalRequests":{"type":"integer"},"avgResponseTimeMs":{"type":"integer"},"errorCount":{"type":"integer"}}},"endpoints":{"type":"array","items":{"type":"object","required":["endpoint","method","count","avgResponseTime"],"properties":{"endpoint":{"type":"string"},"method":{"type":"string"},"count":{"type":"integer"},"avgResponseTime":{"type":"integer"}}}}}},"UsageStatsResponse":{"type":"object","required":["identifier","key","stats","rateLimit"],"properties":{"identifier":{"type":"string"},"key":{"type":"object","required":["id","prefix","name","rateLimit","createdAt","lastUsedAt"],"properties":{"id":{"type":"string"},"prefix":{"type":"string"},"name":{"type":"string"},"rateLimit":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true}}},"stats":{"type":"object","required":["daily","weekly","topEndpoints"],"properties":{"daily":{"type":"object","required":["totalRequests","avgResponseTimeMs","errorCount"],"properties":{"totalRequests":{"type":"integer"},"avgResponseTimeMs":{"type":"integer"},"errorCount":{"type":"integer"}}},"weekly":{"type":"object","required":["totalRequests","avgResponseTimeMs","errorCount"],"properties":{"totalRequests":{"type":"integer"},"avgResponseTimeMs":{"type":"integer"},"errorCount":{"type":"integer"}}},"topEndpoints":{"type":"array","items":{"type":"object","required":["path","method","count","avgResponseTimeMs"],"properties":{"path":{"type":"string"},"method":{"type":"string"},"count":{"type":"integer"},"avgResponseTimeMs":{"type":"integer"}}}}}},"rateLimit":{"type":"object","required":["limit","window"],"properties":{"limit":{"type":"integer"},"window":{"type":"string"}}}}},"CuratorInfo":{"type":"object","required":["apiKeyId","name","keyPrefix"],"properties":{"apiKeyId":{"type":"string"},"name":{"type":"string"},"keyPrefix":{"type":"string"}}},"CuratorVaultLabel":{"type":"object","required":["chainId","vaultAddress","curator","displayName","updatedAt"],"properties":{"chainId":{"type":"integer"},"vaultAddress":{"type":"string"},"curator":{"$ref":"#/components/schemas/CuratorInfo"},"displayName":{"type":"string","minLength":1,"maxLength":120,"pattern":"^[^\\u0000-\\u001F\\u007F-\\u009F<>]+$","description":"Plain text only; clients must render as text, not HTML or Markdown."},"description":{"type":"string","nullable":true,"maxLength":1024,"pattern":"^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown. Tabs and line breaks are allowed."},"productCategory":{"type":"string","nullable":true,"maxLength":120,"pattern":"^[^\\u0000-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown."},"riskTier":{"type":"string","nullable":true,"maxLength":64,"pattern":"^[^\\u0000-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown."},"strategyDescription":{"type":"string","nullable":true,"maxLength":2048,"pattern":"^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown. Tabs and line breaks are allowed."},"updatedAt":{"type":"string","format":"date-time"}}},"VaultVisibility":{"type":"object","required":["chainId","vaultAddress","status","checks","source","evaluatedAt"],"properties":{"chainId":{"type":"integer"},"vaultAddress":{"type":"string"},"status":{"type":"string","enum":["visible","warning","hidden","pending_review"]},"checks":{"type":"object","additionalProperties":true},"source":{"type":"string"},"evaluatedAt":{"type":"string","format":"date-time","nullable":true}}}},"responses":{"Error400":{"description":"Bad request","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error401":{"description":"Unauthorized","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error403":{"description":"Forbidden","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error404":{"description":"Not found","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error405":{"description":"Method not allowed","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Allow":{"description":"Supported methods for this endpoint.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error413":{"description":"Request body too large","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until next request is allowed.","schema":{"type":"integer"}},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error500":{"description":"Internal server error","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error501":{"description":"Not implemented","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error502":{"description":"Upstream dependency failure","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error503":{"description":"Service unavailable","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/v3":{"get":{"tags":["Protocol"],"summary":"Service metadata","x-status":"implemented","responses":{"200":{"description":"Service metadata","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"docs":{"type":"string"},"openapi":{"type":"string"},"health":{"type":"string"}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getRoot"}},"/v3/openapi.json":{"get":{"tags":["Protocol"],"summary":"OpenAPI document","x-status":"implemented","responses":{"200":{"description":"OpenAPI document"}},"operationId":"getOpenapiJson"}},"/v3/docs":{"get":{"tags":["Protocol"],"summary":"Developer documentation UI","x-status":"implemented","responses":{"200":{"description":"Documentation UI"}},"operationId":"getDocs"}},"/v3/health":{"get":{"tags":["Health"],"summary":"Basic health check","x-status":"implemented","responses":{"200":{"description":"OK","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/HealthResponse"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getHealth"}},"/v3/health/detailed":{"get":{"tags":["Health"],"summary":"Dependency health check","x-status":"implemented","responses":{"200":{"description":"OK","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/DetailedHealthResponse"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getHealthDetailed"}},"/v3/health/live":{"get":{"tags":["Health"],"summary":"Liveness probe","x-status":"implemented","responses":{"200":{"description":"OK","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["ok"]}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getHealthLive"}},"/v3/health/ready":{"get":{"tags":["Health"],"summary":"Readiness probe","x-status":"implemented","responses":{"200":{"description":"Ready","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["ready"]}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"503":{"description":"Not ready","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["status","reasons","checks"],"properties":{"status":{"type":"string","enum":["not_ready"]},"reasons":{"type":"array","items":{"type":"string"}},"checks":{"type":"object","properties":{"database":{"type":"string","enum":["ok","error"]},"redis":{"type":"string","enum":["ok","error"]}}}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getHealthReady"}},"/v3/metrics":{"get":{"tags":["Health"],"summary":"Prometheus metrics endpoint","description":"Internal observability endpoint for Prometheus scraping.","x-status":"implemented","security":[{"AdminSecret":[]}],"responses":{"200":{"description":"Prometheus metrics text payload","content":{"text/plain":{"schema":{"type":"string"}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"}},"operationId":"getMetrics"}},"/v3/usage/stats":{"get":{"tags":["Usage"],"summary":"Usage statistics for the authenticated API key","x-status":"implemented","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"responses":{"200":{"description":"Usage statistics","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UsageStatsResponse"}}}}}},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getUsageStats"}},"/v3/admin/api-keys":{"post":{"tags":["Auth"],"summary":"Create an API key (admin)","x-status":"implemented","security":[{"AdminSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}}},"responses":{"201":{"description":"API key created","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"413":{"$ref":"#/components/responses/Error413"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"postAdminApiKeys"},"get":{"tags":["Auth"],"summary":"List API keys (admin)","x-status":"implemented","security":[{"AdminSecret":[]}],"responses":{"200":{"description":"API keys","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyResponse"}}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getAdminApiKeys"}},"/v3/admin/api-keys/{id}":{"get":{"tags":["Auth"],"summary":"Get API key by id (admin)","x-status":"implemented","security":[{"AdminSecret":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"API key","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyResponse"}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getAdminApiKeysById"},"patch":{"tags":["Auth"],"summary":"Update API key (admin)","x-status":"implemented","security":[{"AdminSecret":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"rateLimit":{"type":"integer"},"isActive":{"type":"boolean"},"keyType":{"type":"string","enum":["standard","curator"]},"scopeMode":{"type":"string","enum":["all_vaults","allowlist"]},"vaultAllowlist":{"type":"array","items":{"type":"object","required":["chainId","vaultAddress"],"properties":{"chainId":{"type":"integer"},"vaultAddress":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"Updated","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"413":{"$ref":"#/components/responses/Error413"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"patchAdminApiKeysById"},"delete":{"tags":["Auth"],"summary":"Revoke API key (admin)","x-status":"implemented","security":[{"AdminSecret":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Revoked","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"deleteAdminApiKeysById"}},"/v3/admin/api-keys/{id}/usage":{"get":{"tags":["Auth"],"summary":"Usage stats for an API key (admin)","x-status":"implemented","security":[{"AdminSecret":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Usage stats","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyUsageResponse"}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getAdminApiKeysByIdUsage"}},"/v3/curator/vaults":{"get":{"tags":["Curator"],"summary":"List vaults labeled by the authenticated curator","x-status":"implemented","x-cache-ttl":30,"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Curator-labeled vaults","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OracleRouterState"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getCuratorVaults"}},"/v3/curator/vaults/{chainId}/{address}/labels":{"put":{"tags":["Curator"],"summary":"Submit or update curator label for a vault","x-status":"implemented","x-cache-ttl":0,"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["displayName"],"properties":{"displayName":{"type":"string","minLength":1,"maxLength":120,"pattern":"^[^\\u0000-\\u001F\\u007F-\\u009F<>]+$","description":"Plain text only; clients must render as text, not HTML or Markdown."},"description":{"type":"string","maxLength":1024,"pattern":"^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown. Tabs and line breaks are allowed."},"productCategory":{"type":"string","maxLength":120,"pattern":"^[^\\u0000-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown."},"riskTier":{"type":"string","maxLength":64,"pattern":"^[^\\u0000-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown."},"strategyDescription":{"type":"string","maxLength":2048,"pattern":"^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F<>]*$","description":"Plain text only; clients must render as text, not HTML or Markdown. Tabs and line breaks are allowed."}}}}}},"responses":{"200":{"description":"Curator label upserted","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CuratorVaultLabel"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"413":{"$ref":"#/components/responses/Error413"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"putCuratorVaultsByChainIdByAddressLabels"}},"/v3/protocol/stats":{"get":{"tags":["Protocol"],"summary":"Protocol-wide EVK lending stats across chains","description":"Returns EVK lending aggregates across the selected chains. `earnTotalAssetsUsd` is reported separately and is not part of `totalSuppliedUsd` or `utilization`.","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"}],"responses":{"200":{"description":"Protocol stats","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ProtocolStats"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getProtocolStats"}},"/v3/chains":{"get":{"tags":["Chains"],"summary":"List supported chains","x-status":"implemented","x-cache-ttl":300,"responses":{"200":{"description":"Chains","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Chain"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getChains"}},"/v3/chains/{chainId}/stats":{"get":{"tags":["Chains"],"summary":"Chain-level stats","description":"Returns chain-scoped EVK lending aggregates. `earnTotalAssetsUsd` is reported separately and is not part of `totalSuppliedUsd` or `utilization`.","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"}],"responses":{"200":{"description":"Chain stats","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ChainStats"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getChainsByChainIdStats"}},"/v3/chains/{chainId}/borrowable-vaults":{"get":{"tags":["Chains"],"summary":"Borrowable vaults for a chain","deprecated":true,"description":"Legacy location for this collection.","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"}],"responses":{"200":{"description":"Borrowable vaults","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getChainsByChainIdBorrowableVaults"}},"/v3/evk/vaults":{"get":{"tags":["Vaults"],"summary":"List vaults","description":"Returns a list of vaults.\nNotes:\n  - `fields` and `sort` are accepted but currently ignored.\n  - `minTvl`/`maxTvl` apply to `totalSupplyUsd` where `totalSupplyUsd = (cash + totalBorrows) * price`.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"$ref":"#/components/parameters/FieldsParam"},{"$ref":"#/components/parameters/SortParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"},{"name":"asset","in":"query","required":false,"schema":{"type":"string"}},{"name":"minTvl","in":"query","required":false,"schema":{"type":"number"}},{"name":"maxTvl","in":"query","required":false,"schema":{"type":"number"}},{"name":"visibility","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated visibility filter (`visible,warning,hidden,pending_review`)."}],"responses":{"200":{"description":"Vault list","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Vault"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaults"}},"/v3/evk/vaults/batch":{"post":{"tags":["Vaults"],"summary":"Batch vault details","description":"Returns canonical EVK vault detail entities for an explicit address set.\nUse this to avoid high client-side fanout when you already know the vault\naddresses you want to render.\n\nNotes:\n  - Request order is preserved for found vaults.\n  - `meta.notFound` returns requested addresses that were not resolved.\n  - `include=[\"collaterals\"]` expands collateral detail for every returned vault.\n  - The request cap is 1000 vault addresses and 256 KiB of JSON body.\n","x-status":"implemented","x-cache-ttl":60,"operationId":"postEvkVaultBatch","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvkVaultBatchRequest"}}}},"responses":{"200":{"description":"Batched EVK vault details","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvkVaultBatchResponse"}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"413":{"$ref":"#/components/responses/Error413"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}}}},"/v3/resolve/vaults":{"get":{"tags":["Vaults"],"summary":"Resolve a vault address to its family","description":"Resolve a single `(chainId, address)` pair to `vaultType`, `factory`, and the canonical resource path when one exists.","x-status":"implemented","x-cache-ttl":60,"operationId":"getVaultResolve","parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"address","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resolved vault family","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/VaultResolveEntry"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"404":{"description":"Vault not found"}}},"post":{"tags":["Vaults"],"summary":"Resolve multiple vault addresses to their families","description":"Bulk resolver for SDK/meta-routing use cases. Supports up to 500 addresses per request.","x-status":"implemented","x-cache-ttl":60,"operationId":"postVaultResolve","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["chainId","addresses"],"properties":{"chainId":{"type":"integer"},"addresses":{"type":"array","minItems":1,"maxItems":500,"items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Resolved vault families","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VaultResolveEntry"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"413":{"$ref":"#/components/responses/Error413"}}}},"/v3/evk/vaults/health/utilization":{"get":{"tags":["Vaults"],"summary":"Vault utilization health","description":"Lists vaults ordered by utilization severity (descending).\n- `chainId` is required.\n- If `threshold` is omitted, returns all vaults.\n- Threshold filter is inclusive (`utilization >= threshold`).\n- `onlyOverThreshold` is accepted for compatibility and currently does not alter filtering.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"threshold","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":1}},{"name":"onlyOverThreshold","in":"query","required":false,"schema":{"type":"boolean"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault utilization health list","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SubAccount"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getVaultsHealthUtilization"}},"/v3/evk/vaults/health/caps":{"get":{"tags":["Vaults"],"summary":"Vault cap usage health","description":"Lists vaults ordered by cap-usage severity (descending).\nCap usage is computed as `max(supplyCapUsage, borrowCapUsage)`, and the\nresponse includes both supply-cap and borrow-cap fields.\n- `chainId` is required.\n- If `threshold` is omitted, returns all vaults.\n- Threshold filter is inclusive (`capUsage >= threshold`).\n- `onlyOverThreshold` is accepted for compatibility and currently does not alter filtering.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"threshold","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":1}},{"name":"onlyOverThreshold","in":"query","required":false,"schema":{"type":"boolean"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault cap health list","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VaultCapHealthItem"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getVaultsHealthCaps"}},"/v3/evk/vaults/{chainId}/{address}":{"get":{"tags":["Vaults"],"summary":"Vault details","description":"Returns vault detail. Optional `include` expands related resources in a single response.\nSupported values: `collaterals`, `apy`, `totals`, `prices`.\nThe single-vault detail response uses `totalBorrowed` as the canonical borrow-total field.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/IncludeParam"},{"$ref":"#/components/parameters/FieldsParam"}],"responses":{"200":{"description":"Vault details","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/VaultDetailResponseWithIncludes"}}}}}}},"operationId":"getVaultsByChainIdByAddress"}},"/v3/evk/vaults/{chainId}/{address}/labels":{"get":{"tags":["Vaults"],"summary":"Public curator labels for a vault","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"}],"responses":{"200":{"description":"Curator-submitted labels for this vault","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CuratorVaultLabel"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getVaultsByChainIdByAddressLabels"}},"/v3/evk/vaults/{chainId}/{address}/visibility":{"get":{"tags":["Vaults"],"summary":"Deterministic visibility status for a vault","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"}],"responses":{"200":{"description":"Current visibility status and check results","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/VaultVisibility"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getVaultsByChainIdByAddressVisibility"}},"/v3/evk/vaults/{chainId}/{address}/apy":{"get":{"tags":["APYs"],"summary":"Vault APY (current + historical)","x-status":"implemented","x-cache-ttl":600,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","enum":["1h","1d"],"default":"1d"},"description":"Defaults to `1d`. If omitted, uses last 30 days for `1d` and last 7 days for `1h`."},{"$ref":"#/components/parameters/SortParam"}],"responses":{"200":{"description":"Vault APY","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/VaultApy"},"meta":{"$ref":"#/components/schemas/VaultApyMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressApy"}},"/v3/evk/vaults/{chainId}/{address}/positions":{"get":{"tags":["Vaults"],"summary":"Positions in a vault","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"},{"name":"addressPrefix","in":"query","required":false,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{8}$"},"description":"Optional 4-byte account prefix filter (`0x` + 8 hex chars)."},{"name":"blockNumber","in":"query","required":false,"schema":{"type":"string"},"description":"Not supported for this endpoint. If provided, returns 400."}],"responses":{"200":{"description":"Vault positions","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VaultPosition"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressPositions"}},"/v3/accounts/{address}/portfolio":{"get":{"tags":["Accounts"],"summary":"Account portfolio","description":"Returns a position-first portfolio view for an owner on a single chain.\nThe backend builds SDK Account and Portfolio entities from internal V3\naccount, vault, price, and label data sources; it does not recursively\ncall `/v3/accounts/{address}/positions`. When `forceFresh=true`, the\nendpoint enqueues or promotes account snapshot refresh work and waits\nbriefly for refreshed snapshots before falling back to the current\nindexed portfolio view. Freshness metadata indicates whether the refresh\ncompleted, timed out, or was rate-limited.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/AddressPath"},{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"},"description":"Chain ID. Exactly one chain is required."},{"name":"labeledVaultsOnly","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter positions to the product-facing labeled vault universe."},{"name":"includeAccount","in":"query","required":false,"schema":{"type":"boolean"},"description":"Include the backing SDK account-shaped payload for debugging and migration."},{"name":"forceFresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"When true, enqueue or promote account snapshot refresh for discovered tuples.\nThe endpoint waits briefly for refreshed snapshots before falling back to\nthe current indexed portfolio view. Inspect `data.freshness` for completion,\ntimeout, rate-limit, and fallback metadata.\n"}],"responses":{"200":{"description":"Account portfolio","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AccountPortfolioResponse"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"}},"operationId":"getAccountsByAddressPortfolio"}},"/v3/accounts/{address}/positions":{"get":{"tags":["Accounts"],"summary":"Account positions across chains","description":"Returns paginated account positions across the selected chain scope.\nUses `meta.hasMore` for pagination continuation on the hot path rather than an exact `meta.total`.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/ChainIdParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"},{"name":"forceFresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"When true, trigger bounded synchronous account snapshot refresh for the returned tuples.\nOn timeout/failure, response safely falls back to stored snapshots and indicates cached mode in freshness metadata.\n"}],"responses":{"200":{"description":"Account positions","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AccountPosition"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"freshness":{"type":"object","properties":{"latestSnapshotTimestamp":{"type":"string","format":"date-time","nullable":true},"ageSeconds":{"type":"integer","nullable":true},"timestamp":{"type":"string","format":"date-time"},"mode":{"type":"string","enum":["fresh","cached"]},"forceFreshRequested":{"type":"boolean"},"refreshTriggered":{"type":"boolean"},"refreshCompleted":{"type":"boolean"},"timedOut":{"type":"boolean"},"rateLimited":{"type":"boolean"},"fallbackReason":{"type":"string","nullable":true},"waitedMs":{"type":"integer"}}}}}}}}},"operationId":"getAccountsByAddressPositions"}},"/v3/accounts/{address}/activity":{"get":{"tags":["Accounts"],"summary":"Account vault activity discovery","description":"Discovers vault tuples an account interacts with (shares and/or controller-enabled debt),\nincluding sub-accounts when available.\nUses `meta.hasMore` for pagination continuation on the hot path rather than an exact `meta.total`.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/ChainIdParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Account activity","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AccountActivity"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getAccountsByAddressActivity"}},"/v3/tokens":{"get":{"tags":["Tokens"],"summary":"Token list","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"address","in":"query","required":false,"description":"Filter by a token address. May be repeated. Combine with chainId for the fastest lookup path. Counts toward the 100-address filter cap. When address filters are present and limit is omitted, the default limit is the requested address count capped at 100.","schema":{"type":"string","example":"0x0000000000085d4780B73119b644AE5ecd22b376"}},{"name":"addresses","in":"query","required":false,"description":"Filter by comma-separated token addresses. May be repeated. Maximum 100 addresses. Combine with chainId for the fastest lookup path. When address filters are present and limit is omitted, the default limit is the requested address count capped at 100.","schema":{"type":"string","example":"0x0000000000085d4780B73119b644AE5ecd22b376,0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a"}},{"$ref":"#/components/parameters/FieldsParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/TokenLimitParam"},{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Filter by token classification. Comma-separated values: base, debt, unitOfAccount, oracleAsset, reward, swapAsset","schema":{"type":"string","example":"base,debt"}}],"responses":{"200":{"description":"Tokens","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"example":{"data":[{"chainId":1,"address":"0x000000000085d4780B73119b644AE5ecd22b376","name":"TrueUSD","symbol":"TUSD","decimals":18,"logoURI":"https://token-images.euler.finance/1/0x000000000085d4780B73119b644AE5ecd22b376?v=492516"}],"meta":{"total":1874,"offset":0,"limit":1,"timestamp":"2026-03-30T13:04:02.594Z","chainId":"1"}},"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Token"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getTokens"}},"/v3/tokens/{chainId}/{address}/price":{"get":{"tags":["Prices"],"summary":"Token price","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"}],"responses":{"200":{"description":"Token price","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Price"},"meta":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"}}}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getTokensByChainIdByAddressPrice"}},"/v3/prices":{"get":{"tags":["Prices"],"summary":"Batch prices for tokens","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"addresses","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated token addresses (max 100)."},{"name":"assets","in":"query","required":false,"deprecated":true,"schema":{"type":"string"},"description":"Deprecated alias for `addresses`."}],"responses":{"200":{"description":"Prices","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Price"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getPrices"}},"/v3/prices/history":{"get":{"tags":["Prices"],"summary":"Historical prices","description":"Historical prices for explicit token addresses over a bounded time range.\nRequired query params: `chainId`, `addresses`, `from`, `to`.\nMaximum allowed window is 30 days per request.\n","x-status":"implemented","x-cache-ttl":300,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"addresses","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated token addresses."},{"name":"assets","in":"query","required":false,"deprecated":true,"schema":{"type":"string"},"description":"Deprecated alias for `addresses`."},{"name":"from","in":"query","required":true,"schema":{"type":"integer"},"description":"Inclusive start of the history window as a unix timestamp in seconds (UTC)."},{"name":"to","in":"query","required":true,"schema":{"type":"integer"},"description":"Inclusive end of the history window as a unix timestamp in seconds (UTC)."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Historical prices","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Price"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getPricesHistory"}},"/v3/apys/intrinsic":{"get":{"tags":["APYs"],"summary":"Intrinsic APYs","x-status":"implemented","x-cache-ttl":600,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"assets","in":"query","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/FieldsParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Intrinsic APYs","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IntrinsicApy"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getApysIntrinsic"}},"/v3/apys/intrinsic/history":{"get":{"tags":["APYs"],"summary":"Intrinsic APY history","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"asset","in":"query","required":true,"schema":{"type":"string"},"description":"Asset address to query."},{"name":"resolution","in":"query","required":true,"schema":{"type":"string","enum":["1h","1d"]},"description":"Bucket size for aggregation."},{"$ref":"#/components/parameters/StartTimestampParam"},{"$ref":"#/components/parameters/EndTimestampParam"}],"responses":{"200":{"description":"Intrinsic APY history","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IntrinsicApyHistoryPoint"}},"meta":{"$ref":"#/components/schemas/IntrinsicApyHistoryMeta"}}}}}}},"operationId":"getApysIntrinsicHistory"}},"/v3/apys/rewards":{"get":{"tags":["Rewards"],"summary":"Rewards APYs","x-status":"implemented","x-cache-ttl":900,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"vault","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Rewards APYs","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RewardsApy"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getApysRewards"}},"/v3/apys/rewards/history":{"get":{"tags":["Rewards"],"summary":"Rewards APY history","description":"Rewards APY history for a required time range.\nRequired query params: `chainId`, `from`, `to`.\nOptional filters: `vault`, `resolution`, `offset`, `limit`.\nMaximum allowed window is 30 days per request.\n","x-status":"implemented","x-cache-ttl":300,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","enum":["1h","1d"],"default":"1d"}},{"name":"vault","in":"query","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Rewards APY history","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RewardsApyHistoryPoint"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getApysRewardsHistory"}},"/v3/oracles/prices":{"get":{"tags":["Oracles"],"summary":"Vault-scoped oracle prices","description":"Supports exact mode (`chainId + vault + asset`) and list mode (`chainId` + pagination).\n- Exact mode requires the full key.\n- Exact mode returns `200` with `price: null` when the tuple is known but currently unpriced.\n- Non-null `price` values are exact contract-derived prices encoded as 18-decimal bigint strings in `unitOfAccount` terms.\n- Exact mode returns `404` only when the `(chainId, vault, asset)` tuple is unknown.\n- Partial exact key requests return `400`.\n- List mode returns flat rows sorted by `vault ASC, asset ASC`.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"vault","in":"query","required":false,"schema":{"type":"string"}},{"name":"asset","in":"query","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Oracle prices","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"chainId":{"type":"integer"},"vault":{"type":"string"},"asset":{"type":"string"},"price":{"type":"string","nullable":true},"unitOfAccount":{"type":"string","nullable":true},"unitOfAccountDecimals":{"type":"integer","nullable":true},"source":{"type":"string","nullable":true},"timestamp":{"type":"string","format":"date-time","nullable":true}}},{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"vault":{"type":"string"},"asset":{"type":"string"},"price":{"type":"string","nullable":true},"unitOfAccount":{"type":"string","nullable":true},"unitOfAccountDecimals":{"type":"integer","nullable":true},"source":{"type":"string","nullable":true},"timestamp":{"type":"string","format":"date-time","nullable":true}}}}]},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"502":{"$ref":"#/components/responses/Error502"}},"operationId":"getOraclesPrices"}},"/v3/oracles/routers":{"get":{"tags":["Oracles"],"summary":"Oracle router state","description":"Router state list.\n- `chainId` is required.\n- Optional filters: `vault`, `adapter`, `offset`, `limit`.\n","x-status":"implemented","x-cache-ttl":300,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"vault","in":"query","required":false,"schema":{"type":"string"}},{"name":"adapter","in":"query","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Router states","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RewardBreakdown"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getOraclesRouters"}},"/v3/earn/vaults":{"get":{"tags":["Earn"],"summary":"Earn vaults","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Earn vaults","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EarnVaultSummary"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getEarnVaults"}},"/v3/earn/vaults/batch":{"post":{"tags":["Earn"],"summary":"Earn vault batch","description":"Returns earn vault summaries for explicit addresses on one chain.\nPass `include: [\"strategies\"]` to add the same strategy objects\nreturned by earn vault detail.\nResponse preserves request order after address deduplication.\nRequest cap: 1000 vault addresses and 256 KiB of JSON body.\n","x-status":"implemented","x-cache-ttl":60,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarnVaultBatchRequest"}}}},"responses":{"200":{"description":"Earn vault batch","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarnVaultBatchResponse"}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"413":{"$ref":"#/components/responses/Error413"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"postEarnVaultBatch"}},"/v3/earn/vaults/{chainId}/{address}":{"get":{"tags":["Earn"],"summary":"Earn vault detail","description":"Returns earn vault detail. Optional `include` expands related resources.\nSupported values: `apy`, `totals`, `prices`.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/IncludeParam"}],"responses":{"200":{"description":"Earn vault detail","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EarnVaultDetailsWithIncludes"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getEarnVaultsByChainIdByAddress"}},"/v3/earn/vaults/{chainId}/{address}/events":{"get":{"tags":["Earn"],"summary":"Unified Euler Earn vault event timeline","description":"Unified stream of user, interest/reallocation, and governance earn-vault events.\nRequires a bounded time window (`from` + `to`), max 30 days.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated event type filter. Unknown values return 400."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Earn vault events","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"type":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"blockNumber":{"type":"string"},"txHash":{"type":"string"},"payload":{"type":"object"}}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getEarnVaultsByChainIdByAddressEvents"}},"/v3/liquidations":{"get":{"tags":["Liquidations"],"summary":"Liquidation events","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"vault","in":"query","required":false,"schema":{"type":"string"}},{"name":"violator","in":"query","required":false,"schema":{"type":"string"}},{"name":"liquidator","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"$ref":"#/components/parameters/SortParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Liquidations","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getLiquidations"}},"/v3/evk/vaults/{chainId}/{address}/config-history":{"get":{"tags":["Vaults"],"summary":"Vault configuration history","description":"Returns a unified timeline of all configuration changes for this vault,\nincluding caps, LTV, IRM, governor, fee receiver, hook config, and other settings.\nFor specific config types, use the dedicated endpoints (cap-history, ltv-history, irm-history).\n","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["caps","ltv","irm","governor","feeReceiver","hookConfig","interestFee","configFlags"]},"description":"Filter by configuration change type"}],"responses":{"200":{"description":"Vault config history","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConfigHistoryItem"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressConfigHistory"}},"/v3/evk/vaults/{chainId}/{address}/collaterals":{"get":{"tags":["Vaults"],"summary":"Current accepted collaterals with LTV configurations","description":"Returns the list of vaults accepted as collateral for this vault,\nalong with their current LTV configurations. Use this to understand\nwhat assets can be used as collateral when borrowing from this vault.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"}],"responses":{"200":{"description":"Accepted collaterals with LTV configs","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CollateralConfig"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"404":{"$ref":"#/components/responses/Error404"}},"operationId":"getVaultsByChainIdByAddressCollaterals"}},"/v3/evk/vaults/{chainId}/{address}/ltv-history":{"get":{"tags":["Vaults"],"summary":"Vault LTV history","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"name":"collateral","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by collateral vault address"},{"$ref":"#/components/parameters/FromParam"},{"$ref":"#/components/parameters/ToParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault LTV history","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LtvHistoryItem"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressLtvHistory"}},"/v3/evk/vaults/{chainId}/{address}/cap-history":{"get":{"tags":["Vaults"],"summary":"Vault cap history (supply/borrow)","description":"Returns historical changes to supply and borrow caps for this vault.","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault cap history","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CapHistoryItem"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressCapHistory"}},"/v3/evk/vaults/{chainId}/{address}/irm-history":{"get":{"tags":["Vaults"],"summary":"Vault interest rate model history","description":"Returns historical changes to the interest rate model for this vault.","x-status":"implemented","x-cache-ttl":300,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/FromParam"},{"$ref":"#/components/parameters/ToParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault IRM history","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IrmHistoryItem"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressIrmHistory"}},"/v3/evk/vaults/{chainId}/{address}/events":{"get":{"tags":["Vaults"],"summary":"Unified core vault event timeline","description":"Unified stream of deposit, withdraw, borrow, repay, and transfer events for one vault.\nRequires a bounded time window (`from` + `to`), max 30 days.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/FromParam"},{"$ref":"#/components/parameters/ToParam"},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated event type filter. Unknown values return 400."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault events","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"type":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"blockNumber":{"type":"string"},"txHash":{"type":"string"},"payload":{"type":"object"}}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getVaultsByChainIdByAddressEvents"}},"/v3/evk/vaults/{chainId}/{address}/totals":{"get":{"tags":["Vaults"],"summary":"Vault totals with historical series","description":"Returns totalAssets, totalBorrows, utilization, APY from dynamic snapshots. Historical values are raw amounts - compose with /v3/prices for USD conversion.","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","enum":["1h","1d"],"default":"1d"}},{"$ref":"#/components/parameters/FromParam"},{"$ref":"#/components/parameters/ToParam"},{"name":"forceFresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"When true, trigger bounded synchronous vault dynamic refresh before reading totals.\nOn timeout/failure, response safely falls back to stored snapshots and indicates cached mode in freshness metadata.\n"}],"responses":{"200":{"description":"Vault totals with current + historical data","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/VaultTotals"},"meta":{"$ref":"#/components/schemas/VaultTotalsMeta"},"freshness":{"$ref":"#/components/schemas/VaultTotalsFreshness"}}}}}}},"operationId":"getVaultsByChainIdByAddressTotals"}},"/v3/evk/vaults/{chainId}/{address}/holders":{"get":{"tags":["Vaults"],"summary":"Vault share holders","description":"Returns all holders with non-zero share balances via transfer aggregation (raw holder set). This endpoint does not unwrap Euler Earn depositors and therefore aligns with legacy behavior when `resolveEulerEarn=false`. Supports 4-byte `addressPrefix` filter for wallet-scoped scans. Balance values are integer strings in raw mode; when resolve flags are enabled, balances may be proportional decimal strings.","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"name":"addressPrefix","in":"query","required":false,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{8}$"},"description":"Optional 4-byte account prefix filter (`0x` + 8 hex chars)."},{"name":"resolveEulerEarn","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"When true, expands Euler Earn vault-holder addresses into underlying depositors (v1 parity mode)."},{"name":"resolveSubAccounts","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"When true, aggregates sub-account holders into their owner addresses."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault share holders","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"holder":{"type":"string"},"balance":{"type":"string","description":"Numeric string; integer in raw mode, may be decimal when resolve flags are enabled."},"lastTransferBlock":{"type":"string"},"lastTransferTimestamp":{"type":"string"}}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressHolders"}},"/v3/evk/vaults/{chainId}/{address}/debt-holders":{"get":{"tags":["Vaults"],"summary":"Vault debt holder candidates","description":"Returns addresses that have the vault enabled as a controller. Optimistic set - some may have zero debt.","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdPath"},{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Vault debt holder candidates","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"account":{"type":"string"},"enabledAtBlock":{"type":"string"},"enabledAtTimestamp":{"type":"string"}}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsByChainIdByAddressDebtHolders"}},"/v3/evk/vaults/open-interest":{"get":{"tags":["Vaults"],"summary":"Open interest across vaults","description":"Event-based aggregation of total borrows and borrower counts. Uses MV-backed query path (`open_interest_mv`) with safe fallback to raw aggregation when unavailable. Prices should be composed separately via /v3/prices.","x-status":"implemented","x-cache-ttl":300,"parameters":[{"name":"chainId","in":"query","required":true,"description":"Chain ID (required)","schema":{"type":"string"}},{"name":"vault","in":"query","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Open interest data","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"vault":{"type":"string"},"asset":{"type":"string"},"totalBorrows":{"type":"string"},"borrowerCount":{"type":"integer"},"timestamp":{"type":"string","format":"date-time"}}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getVaultsOpenInterest"}},"/v3/evk/vaults/open-interest/by-collateral":{"get":{"tags":["Vaults"],"summary":"Collateral-covered debt by collateral vault","description":"Collateral-covered USD borrow exposure as a nested map keyed by borrow vault, then collateral vault. Underwater debt is capped at current attributable collateral value, so this endpoint is not gross open interest. The expensive account-level debt/collateral composition is worker-computed and stored in a latest projection table; the request path only reads that projection. Redis may cache this response, but PostgreSQL projection rows are the source of truth.\n","x-status":"implemented","x-cache-ttl":300,"parameters":[{"name":"chainId","in":"query","required":true,"description":"Chain ID (required)","schema":{"type":"string"}}],"responses":{"200":{"description":"Collateral-covered borrow exposure map","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"number","format":"double","description":"USD collateral-covered debt attributable to this collateral vault"}},"description":"Borrow-vault to collateral-vault USD collateral-covered exposure map"},"meta":{"allOf":[{"$ref":"#/components/schemas/PaginationMeta"},{"type":"object","properties":{"refreshedAt":{"type":["string","null"],"format":"date-time"},"calculationTimestamp":{"type":["string","null"],"format":"date-time"},"priceTimestamp":{"type":["string","null"],"format":"date-time"},"ageSeconds":{"type":["integer","null"]}}}]}}}}}}},"operationId":"getVaultsOpenInterestByCollateral"}},"/v3/evk/vaults/bad-debt":{"get":{"tags":["Vaults"],"summary":"Bad debt by borrow vault","description":"Borrow-vault aggregate of asset-value bad debt. Rows include only underwater account/borrow-vault positions where gross debt value exceeds the current value of enabled collateral considered for that debt position. Healthy accounts are omitted and no chain-level bad-debt total is exposed. Values use asset-value insolvency, not risk-adjusted LTV shortfall.\n","x-status":"implemented","x-cache-ttl":300,"parameters":[{"name":"chainId","in":"query","required":true,"description":"Chain ID (required)","schema":{"type":"string"}},{"name":"borrowVault","in":"query","required":false,"description":"Optional borrow vault/controller address filter","schema":{"type":"string"}},{"name":"minBadDebtUsd","in":"query","required":false,"description":"Minimum bad debt USD threshold. Defaults to 0.","schema":{"type":"number","minimum":0,"default":0}},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Borrow-vault bad-debt rows","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"borrowVault":{"type":"string"},"borrowAsset":{"type":"string"},"accountCount":{"type":"integer","description":"Number of underwater accounts contributing to this borrow-vault row."},"debtUsd":{"type":"number","format":"double","description":"Gross USD debt for underwater account/borrow-vault positions."},"collateralUsd":{"type":"number","format":"double","description":"Current enabled collateral value considered for those underwater positions."},"coveredDebtUsd":{"type":"number","format":"double","description":"Portion of debt covered by current collateral value."},"badDebtUsd":{"type":"number","format":"double","description":"Uncovered debt, equal to debtUsd minus coveredDebtUsd within tolerance."},"calculationTimestamp":{"type":"string","format":"date-time"},"priceTimestamp":{"type":["string","null"],"format":"date-time"},"refreshedAt":{"type":"string","format":"date-time"}}}},"meta":{"allOf":[{"$ref":"#/components/schemas/PaginationMeta"},{"type":"object","properties":{"refreshedAt":{"type":["string","null"],"format":"date-time"},"calculationTimestamp":{"type":["string","null"],"format":"date-time"},"priceTimestamp":{"type":["string","null"],"format":"date-time"},"ageSeconds":{"type":["integer","null"]}}}]}}}}}}},"operationId":"getVaultsBadDebt"}},"/v3/accounts/{address}/sub-accounts":{"get":{"tags":["Accounts"],"summary":"Sub-accounts for an EVC-enabled account","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/ChainIdParam"},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Sub-accounts","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SubAccount"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getAccountsByAddressSubAccounts"}},"/v3/evc/accounts/{address}/events":{"get":{"tags":["EVC"],"summary":"Unified EVC account event timeline","description":"Account-primary EVC event stream. `chainId`, `from`, and `to` are required.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/AddressPath"},{"name":"chainId","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated chain IDs."},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated event type filter. Unknown values return 400."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"EVC account events","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getEvcAccountsByAddressEvents"}},"/v3/public-allocator/events":{"get":{"tags":["PublicAllocator"],"summary":"Unified Public Allocator event timeline","description":"Unified stream of public allocator events. `chainId`, `from`, and `to` are required.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated chain IDs."},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated event type filter. Unknown values return 400."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Public allocator events","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getPublicAllocatorEvents"}},"/v3/fee-flow/events":{"get":{"tags":["FeeFlow"],"summary":"Unified fee-flow event timeline","description":"Unified stream of fee-flow events with current indexed coverage (`buy`).\n`chainId`, `from`, and `to` are required.\n","x-status":"implemented","x-cache-ttl":60,"parameters":[{"name":"chainId","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated chain IDs."},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated event type filter. Current supported value is `buy`. Unknown values return 400."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Fee-flow events","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"}},"operationId":"getFeeFlowEvents"}},"/v3/rewards/breakdown":{"get":{"tags":["Rewards"],"summary":"Per-user reward breakdowns","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"account","in":"query","required":true,"schema":{"type":"string"}},{"name":"vault","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Reward breakdowns","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}},"operationId":"getRewardsBreakdown"}},"/v3/terms-of-use/signatures":{"get":{"tags":["TermsOfUse"],"summary":"Terms-of-use signature history","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/ChainIdParam"},{"name":"address","in":"query","required":false,"schema":{"type":"string"},"description":"Optional signer/account filter."},{"$ref":"#/components/parameters/OffsetParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Terms-of-use signatures","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"signer":{"type":"string"},"account":{"type":"string"},"termsOfUseHash":{"type":"string"},"signedAt":{"type":"string","format":"date-time"},"message":{"type":"string"},"blockNumber":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"txHash":{"type":"string"}}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"}},"operationId":"getTermsOfUseSignatures"}},"/v3/terms-of-use/check/{address}":{"get":{"tags":["TermsOfUse"],"summary":"Check whether an address signed terms of use","x-status":"implemented","x-cache-ttl":60,"parameters":[{"$ref":"#/components/parameters/AddressPath"},{"$ref":"#/components/parameters/ChainIdParam"}],"responses":{"200":{"description":"Terms-of-use signature status","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"signed":{"type":"boolean"},"signature":{"type":"object","nullable":true}}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"404":{"$ref":"#/components/responses/Error404"}},"operationId":"getTermsOfUseCheckByAddress"}},"/v3/graphql":{"get":{"tags":["GraphQL"],"summary":"GraphQL endpoint (GET query mode)","x-status":"implemented","description":"Lightweight GET mode for development/debugging.\nDisabled in production; use POST `/v3/graphql` there.\nRequires `query` and optionally accepts `variables` (JSON string) and `operationName`.\nFor standard GraphQL usage, use POST `/v3/graphql`.\n","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"variables","in":"query","required":false,"schema":{"type":"string"},"description":"JSON-encoded variables object."},{"name":"operationName","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"GraphQL response","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/Error400"},"405":{"$ref":"#/components/responses/Error405"},"502":{"$ref":"#/components/responses/Error502"},"503":{"$ref":"#/components/responses/Error503"}},"operationId":"getGraphql"},"post":{"tags":["GraphQL"],"summary":"GraphQL endpoint","x-status":"implemented","description":"GraphQL endpoint (shared auth/rate limit with REST), proxied to the\nPonder GraphQL API.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"variables":{"type":"object"},"operationName":{"type":"string"}}}}}},"responses":{"200":{"description":"GraphQL response","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/Error400"},"413":{"$ref":"#/components/responses/Error413"},"502":{"$ref":"#/components/responses/Error502"},"503":{"$ref":"#/components/responses/Error503"}},"operationId":"postGraphql"}}}}