openapi: 3.1.0 info: title: Euler Data API (V3) Accounts Entities 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: Entities description: Platform-admin managed KYBed organization profiles used as backend-owned label and control-plane resources. paths: /v3/entities: get: tags: - Entities summary: List entity profiles description: Lists KYBed entity profiles. Requires an active platform-admin session. x-status: implemented security: - PlatformSession: [] parameters: - name: limit in: query schema: type: integer minimum: 1 maximum: 100 default: 20 - name: offset in: query schema: type: integer minimum: 0 default: 0 - name: query in: query schema: type: string description: Optional case-insensitive filter over entity id and name. responses: '200': description: Entity profile page. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: type: array items: $ref: '#/components/schemas/Entity' meta: $ref: '#/components/schemas/PaginationMeta' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Authenticated session exists, but platform-admin access is not active. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: listEntities post: tags: - Entities summary: Create entity profile description: Creates a KYBed entity profile. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EntityCreateRequest' responses: '201': description: Entity profile was created. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/Entity' meta: $ref: '#/components/schemas/PaginationMeta' '400': description: Malformed JSON request body. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Entity slug already exists. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Missing or invalid entity field. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: createEntity /v3/entities/{id}/members: get: tags: - Entities summary: List entity members description: Lists entity members for a KYBed entity. Requires an active platform-admin session. x-status: implemented security: - PlatformSession: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ - name: limit in: query schema: type: integer minimum: 1 maximum: 100 default: 20 - name: offset in: query schema: type: integer minimum: 0 default: 0 - name: query in: query schema: type: string description: Optional case-insensitive filter over member email and name. - name: includeRevoked in: query schema: type: boolean default: false description: Include revoked members when true. responses: '200': description: Entity member page. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: type: array items: $ref: '#/components/schemas/EntityMember' meta: $ref: '#/components/schemas/PaginationMeta' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Authenticated session exists, but platform-admin access is not active. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Invalid entity id. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: listEntityMembers post: tags: - Entities summary: Create entity member description: Creates or reactivates an entity member. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EntityMemberCreateRequest' responses: '201': description: Entity member was created or reactivated. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/EntityMember' meta: $ref: '#/components/schemas/PaginationMeta' '400': description: Malformed JSON request body. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Entity member email already exists. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Missing or invalid member field. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: createEntityMember /v3/entities/{id}/addresses: get: tags: - Entities summary: List entity governance addresses description: Lists chain-scoped governance addresses for a KYBed entity. Requires an active platform-admin session. x-status: implemented security: - PlatformSession: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ - name: limit in: query schema: type: integer minimum: 1 maximum: 100 default: 20 - name: offset in: query schema: type: integer minimum: 0 default: 0 - name: chainId in: query schema: type: integer minimum: 1 description: Optional supported chain ID filter. responses: '200': description: Entity governance address page. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: type: array items: $ref: '#/components/schemas/EntityAddress' meta: $ref: '#/components/schemas/PaginationMeta' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Authenticated session exists, but platform-admin access is not active. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile was not found or chain is unsupported. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Invalid entity id or chain filter. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: listEntityAddresses post: tags: - Entities summary: Create entity governance address description: Creates a chain-scoped governance address for a KYBed entity. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EntityAddressCreateRequest' responses: '201': description: Entity governance address was created. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/EntityAddress' meta: $ref: '#/components/schemas/PaginationMeta' '400': description: Malformed JSON request body. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile was not found or chain is unsupported. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Entity governance address already exists for the entity and chain. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Missing or invalid address field. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: createEntityAddress /v3/entities/{id}/addresses/{chainId}/{address}: delete: tags: - Entities summary: Delete entity governance address description: Deletes a chain-scoped governance address for a KYBed entity. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ - name: chainId in: path required: true schema: type: integer minimum: 1 description: Supported chain ID. - name: address in: path required: true schema: type: string pattern: ^0x[a-fA-F0-9]{40}$ description: Valid EVM address to remove. responses: '200': description: Entity governance address was deleted. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/EntityAddress' meta: $ref: '#/components/schemas/PaginationMeta' '400': description: Invalid chain ID or address route parameter. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile, governance address, or chain was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Invalid entity id. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: deleteEntityAddress /v3/entities/{id}/members/{memberId}: patch: tags: - Entities summary: Update entity member description: Updates mutable entity member fields. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ - name: memberId in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EntityMemberUpdateRequest' responses: '200': description: Entity member was updated. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/EntityMember' meta: $ref: '#/components/schemas/PaginationMeta' '400': description: Malformed JSON request body. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity member was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Entity member was already revoked. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Missing or invalid member field. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: updateEntityMember delete: tags: - Entities summary: Revoke entity member description: Soft-revokes an entity member. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ - name: memberId in: path required: true schema: type: string format: uuid responses: '200': description: Entity member was revoked. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/EntityMember' meta: $ref: '#/components/schemas/PaginationMeta' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity member was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Entity member was already revoked. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Invalid entity or member id. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: revokeEntityMember /v3/entities/{id}: get: tags: - Entities summary: Get entity profile description: Reads one KYBed entity profile. Requires an active platform-admin session. x-status: implemented security: - PlatformSession: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ responses: '200': description: Entity profile. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/Entity' meta: $ref: '#/components/schemas/PaginationMeta' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Authenticated session exists, but platform-admin access is not active. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Invalid entity id. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: getEntity patch: tags: - Entities summary: Update entity profile description: Updates mutable entity profile fields. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EntityUpdateRequest' responses: '200': description: Entity profile was updated. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/Entity' meta: $ref: '#/components/schemas/PaginationMeta' '400': description: Malformed JSON request body. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Missing or invalid entity field. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: updateEntity delete: tags: - Entities summary: Delete entity profile description: Deletes an entity profile row. Requires a platform-admin session and CSRF token. x-status: implemented security: - PlatformSession: [] PlatformCsrf: [] parameters: - name: id in: path required: true schema: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ responses: '200': description: Entity profile was deleted. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: type: object required: - data - meta properties: data: $ref: '#/components/schemas/Entity' meta: $ref: '#/components/schemas/PaginationMeta' '401': description: Missing, invalid, or expired platform-admin session. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Inactive platform-admin access, missing CSRF token, or mismatched CSRF token. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Entity profile was not found. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: Entity profile is still referenced by dependent resources. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '422': description: Invalid entity id. headers: X-Request-Id: $ref: '#/components/headers/X-Request-Id' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: deleteEntity components: schemas: EntityMemberCreateRequest: type: object additionalProperties: false required: - email properties: email: type: string format: email pattern: ^[^@\s]+@[^@\s]+\.[^@\s]+$ name: type: string pattern: \S nullable: true role: type: string enum: - admin - editor default: editor EntityCreateRequest: type: object additionalProperties: false required: - id - name properties: id: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ name: type: string pattern: \S logo: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true description: type: string nullable: true url: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialTwitter: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialYoutube: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialDiscord: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialTelegram: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialGithub: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true 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. EntityMember: type: object required: - id - entityId - email - name - role - createdAt - revokedAt properties: id: type: string format: uuid entityId: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ email: type: string format: email pattern: ^[^@\s]+@[^@\s]+\.[^@\s]+$ description: Normalized lowercase email address. name: type: string pattern: \S nullable: true role: type: string enum: - admin - editor createdAt: type: string format: date-time revokedAt: type: string format: date-time nullable: true Entity: type: object required: - id - name - logo - description - url - socialTwitter - socialYoutube - socialDiscord - socialTelegram - socialGithub - createdAt - updatedAt properties: id: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ description: Stable lowercase slug identifier. name: type: string pattern: \S logo: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true description: type: string nullable: true url: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialTwitter: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialYoutube: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialDiscord: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialTelegram: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialGithub: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time EntityUpdateRequest: type: object additionalProperties: false minProperties: 1 properties: name: type: string pattern: \S logo: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true description: type: string nullable: true url: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialTwitter: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialYoutube: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialDiscord: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialTelegram: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true socialGithub: type: string format: uri pattern: ^[Hh][Tt][Tt][Pp][Ss]?:// nullable: true EntityMemberUpdateRequest: type: object additionalProperties: false minProperties: 1 properties: name: type: string pattern: \S nullable: true role: type: string enum: - admin - editor EntityAddress: type: object required: - entityId - chainId - address - label properties: entityId: type: string pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$ chainId: type: integer minimum: 1 address: type: string pattern: ^0x[a-fA-F0-9]{40}$ description: EIP-55 checksummed governance address in API responses. label: type: string pattern: \S description: Human-readable governance address label. 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 EntityAddressCreateRequest: type: object additionalProperties: false required: - chainId - address - label properties: chainId: type: integer minimum: 1 address: type: string pattern: ^0x[a-fA-F0-9]{40}$ description: Valid EVM address. Lowercase or correctly checksummed mixed-case input is accepted. label: type: string pattern: \S description: Human-readable governance address label. headers: X-Request-Id: description: Request identifier for tracing. 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.