openapi: 3.1.0 info: title: Euler Data API (V3) Accounts Vaults API 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, portfolio USD liquidation/risk fields such as\n `liabilityValueUsd`, `totalCollateralValueUsd`, `borrowLiquidationPriceUsd`,\n and `collateralLiquidationPricesUsd`, and vault holder `assetsUsd`.\n- Contract-derived oracle and raw account-liquidity verdict 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. This includes `/v3/oracles/prices`, raw\n account-liquidity `liabilityValue` and `totalCollateralValue` objects,\n `liabilityValueBorrowing`, `liabilityValueLiquidation`, and collateral verdict\n 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\nCORS\n- Public API responses use wildcard CORS, including preflight responses for unsafe methods.\n- Unsafe methods with request bodies must use a JSON media type.\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- JSON request bodies must use `Content-Type: application/json` or another `application/*+json` media type.\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: 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. paths: /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' '415': $ref: '#/components/responses/Error415' '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' '415': $ref: '#/components/responses/Error415' /v3/evk/vaults/health/utilization: get: tags: - Vaults summary: Vault utilization health description: 'Lists vaults ordered by utilization severity (descending). - `chainId` is required. - If `threshold` is omitted, returns all vaults. - Threshold filter is inclusive (`utilization >= threshold`). - `onlyOverThreshold` is accepted for compatibility and currently does not alter filtering. ' 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). Cap usage is computed as `max(supplyCapUsage, borrowCapUsage)`, and the response includes both supply-cap and borrow-cap fields. - `chainId` is required. - If `threshold` is omitted, returns all vaults. - Threshold filter is inclusive (`capUsage >= threshold`). - `onlyOverThreshold` is accepted for compatibility and currently does not alter filtering. ' 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. Supported values: `collaterals`, `apy`, `totals`, `prices`. The single-vault detail response uses `totalBorrowed` as the canonical borrow-total field. ' 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/PublicVaultLabel' 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}/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/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, including caps, LTV, IRM, governor, fee receiver, hook config, and other settings. For specific config types, use the dedicated endpoints (cap-history, ltv-history, irm-history). ' 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, along with their current LTV configurations. Use this to understand what assets can be used as collateral when borrowing from this vault. ' 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. Requires a bounded time window (`from` + `to`), max 30 days. ' 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. On timeout/failure, response safely falls back to stored snapshots and indicates cached mode in freshness metadata. ' 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. ' 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. ' 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 components: parameters: FromParam: name: from in: query required: false schema: type: integer description: Unix timestamp (seconds). SortParam: name: sort in: query required: false schema: type: string description: Sort field, prefix with '-' for descending. OffsetParam: name: offset in: query required: false schema: type: integer default: 0 ChainIdPath: name: chainId in: path required: true schema: type: integer AddressPath: name: address in: path required: true schema: type: string ChainIdParam: name: chainId in: query required: false schema: type: string description: Comma-separated list of chain IDs (single value allowed). example: 1,10,8453 ToParam: name: to in: query required: false schema: type: integer description: Unix timestamp (seconds). IncludeParam: name: include in: query required: false schema: type: string description: Comma-separated list of related resources to expand. Unknown values are ignored. 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 FieldsParam: name: fields in: query required: false schema: type: string description: Comma-separated list of fields to include. schemas: CollateralConfigWithPrice: allOf: - $ref: '#/components/schemas/CollateralConfig' - type: object properties: price: allOf: - $ref: '#/components/schemas/Price' nullable: true 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 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. 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 OracleDetailedInfo: type: object properties: oracle: type: string name: type: string oracleInfo: type: string VaultHooks: type: object properties: hookedOperations: $ref: '#/components/schemas/VaultHookedOperations' hookTarget: type: string 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 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 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. VaultApy: type: object properties: current: $ref: '#/components/schemas/VaultApyPoint' history: type: array items: $ref: '#/components/schemas/VaultApyPoint' 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 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. VaultIncludePrices: type: object properties: asset: allOf: - $ref: '#/components/schemas/Price' nullable: true collaterals: type: array items: $ref: '#/components/schemas/CollateralConfigWithPrice' 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 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 ErrorResponse: type: object required: - error properties: error: type: object required: - code - message - requestId properties: code: type: string description: 'Domain error code. Examples: - INVALID_ADDRESS - CHAIN_NOT_SUPPORTED - VAULT_NOT_FOUND - TOKEN_NOT_FOUND - ACCOUNT_NOT_FOUND - VALIDATION_ERROR - RATE_LIMIT_EXCEEDED - UNSUPPORTED_MEDIA_TYPE - UNAUTHORIZED - FORBIDDEN - INTERNAL_ERROR ' message: type: string requestId: type: string details: type: object additionalProperties: true OracleInfo: type: object properties: oracle: type: string name: type: string detailedInfo: $ref: '#/components/schemas/OracleDetailedInfo' adapters: type: array items: $ref: '#/components/schemas/OracleAdapterEntry' resolvedVaults: type: array items: $ref: '#/components/schemas/OracleResolvedVault' 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 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 VaultTotalsMeta: allOf: - $ref: '#/components/schemas/VaultApyMeta' - type: object properties: note: type: string VaultLiquidation: type: object properties: maxLiquidationDiscount: type: number liquidationCoolOffTime: type: integer socializeDebt: type: boolean VaultTotals: type: object properties: current: $ref: '#/components/schemas/VaultTotalsPoint' history: type: array items: $ref: '#/components/schemas/VaultTotalsPoint' OracleResolvedVault: type: object properties: vault: type: string quote: type: string asset: type: string resolvedAssets: type: array items: type: string 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 OracleAdapterPythDetail: type: object properties: pyth: type: string base: type: string quote: type: string feedId: type: string maxStaleness: type: string maxConfWidth: type: string VaultResolveEntry: type: object properties: chainId: type: integer address: type: string found: type: boolean vaultType: oneOf: - type: string enum: - evk - earn - securitize - type: 'null' factory: type: - string - 'null' resource: type: - string - 'null' snapshotTimestamp: type: string format: date-time 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 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%. OracleAdapterChainlinkDetail: type: object properties: oracle: type: string 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 VaultCollateralDetail: allOf: - $ref: '#/components/schemas/CollateralConfig' - type: object properties: oraclePriceRaw: allOf: - $ref: '#/components/schemas/OraclePriceRaw' nullable: true AssetRef: type: object properties: address: type: string symbol: type: string decimals: type: integer name: type: string nullable: true 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. 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 VaultInterestRateModel: type: object properties: address: type: string type: type: string enum: - unknown - kink - adaptive_curve - kinky - fixed_cyclical_binary - fixed_cyclical_binary_monthly data: type: object nullable: true additionalProperties: type: string 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 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. 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. 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. 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. PaginationMeta: type: object required: - timestamp 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. EvkVaultBatchResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/VaultDetailsWithIncludes' meta: $ref: '#/components/schemas/EvkVaultBatchMeta' PublicVaultLabel: type: object required: - chainId - vaultAddress - displayName - updatedAt properties: chainId: type: integer vaultAddress: type: string 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 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 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 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 responses: 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' Error415: description: Unsupported media type headers: 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' Error404: description: Not found headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Error400: description: Bad request headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' headers: X-Request-Id: description: Request identifier for tracing. schema: type: string Cache-Control: description: Cache policy for this response. schema: type: string 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 ' AdminSecret: type: apiKey in: header name: X-Admin-Secret description: Admin secret (server-to-server) for API key management. PlatformSession: type: apiKey in: cookie name: euler_platform_session description: Signed, httpOnly platform-operator browser session cookie. PlatformCsrf: type: apiKey in: header name: X-CSRF-Token description: Double-submit CSRF token required for unsafe cookie-authenticated methods.