Euler Finance Labels API

The labeling system behind the Toolbox: entity and product profiles, vault labels, vault assessments, geo policies, and label publishing. The address that governs a vault is its governing address: the governor of an EVK or Securitize vault, the owner of an Earn vault. In this API "controller" always means the EVC controller, the liability vault an account has enabled through the Ethereum Vault Connector, never the address that governs a vault. **Errors on the `/v3/labels` routes.** Key on the status, `error.code` and `error.details.reason`; `error.message` is for people and may change. `details.cause` narrows a reason that has several causes. An error without a reason is the only one its route answers with that status and code. The labels routes never answer `SERVICE_DISABLED`. | Status | Code | `details.reason` | Meaning | |---|---|---|---| | 401 | UNAUTHORIZED | `invalid-session` | No active session of a kind the route accepts. | | 403 | FORBIDDEN | `authorization-denied` | The actor may not make this write. `details.cause`: `platform-admin-denied`, `missing-csrf` or `csrf-mismatch` on platform-only routes; `wrong-entity`, `insufficient-role`, `unsupported-actor`, `inactive-actor`, `malformed-actor` or `missing-actor` on entity, member, address, product and vault writes. | | 403 | FORBIDDEN | `missing-csrf`, `csrf-mismatch` | Entity-or-platform route, unsafe method: the CSRF header is missing or does not match. While a session changes under the request the reason can also be `missing-session`, `invalid-session`, `expired-session`, `entity-member-denied`, `entity-auth-disabled` or `platform-admin-denied`. | | 403 | FORBIDDEN | `entity-suspended` | The member's entity is suspended by the platform. | | 403 | FORBIDDEN | `entity-admin-required` | The route needs an entity admin; the session is an editor. | | 403 | FORBIDDEN | `entity-scope-denied` | A draft read of another entity's rows. | | 403 | FORBIDDEN | `self-demotion-denied`, `self-revoke-denied` | An entity admin demoting or revoking their own membership. | | 403 | FORBIDDEN | `published-row` | An entity member deleting a product the public has seen. | | 403 | FORBIDDEN | `ungoverned-locked` | An ungoverned vault or product is write-once for entity members. | | 403 | FORBIDDEN | `ownership-denied` | No entity address governs the vault; on a product, `details.addresses` lists the vaults the entity no longer governs. | | 403 | FORBIDDEN | `vault-not-claimable` | An escrow vault, or a vault type an entity cannot claim. | | 403 | FORBIDDEN | `no-governing-address` | The vault has no governor or owner on chain (`details.role`); only Euler can assign it. | | 403 | FORBIDDEN | `capability-denied`, `api-key-read-only`, `platform-session-required` | An API key without the capability, a key on a write a read grant cannot make, or an action only a platform session may take. | | 404 | NOT_FOUND | `unknown-vault` | The vault is not in indexed factory discovery. | | 404 | NOT_FOUND | `label-set-not-found`, `label-version-not-found`, `hold-not-found`, `resource-not-found` | Label set, version, hold and quarantine routes. | | 404 | NOT_FOUND | none | The entity, member, address, product, vault labels or listing override does not exist. On the label reads, a 404 with `details.labelSet` and `details.version` means the label set or version could not be resolved; only that 404 carries `details.labelSet`. | | 404 | CHAIN_NOT_SUPPORTED | none | A product or vault delete or transfer on a chain the deployment does not serve. | | 404 | CHAIN_CAPABILITY_DISABLED | none | A product or vault delete or transfer, or a listing override, on a served chain without labels; `details.chainIds` and `details.capability: labels`. A write naming such a chain in its body or path answers 422 naming `chainId`. | | 409 | CONFLICT | `duplicate` | The entity, address, product or vault labels already exist. | | 409 | CONFLICT | `already-member`, `email-unavailable` | Adding a member: the email is already an active member of this entity (`details.memberId`), or another entity holds it (only a platform session also gets `details.entityId` and `details.revokedAt`). | | 409 | CONFLICT | `address-taken` | The address is registered to another entity (`details.holderEntityId`). | | 409 | CONFLICT | `already-revoked`, `last-active-admin-denied` | The member is already revoked, or the change would leave the entity without an active admin. | | 409 | CONFLICT | `referenced` | Entity delete while products, claimed vaults or co-brands reference it (`details.references`). | | 409 | CONFLICT | `vault-type-mismatch`, `mixed-governance`, `invalid-membership` | The vault type differs from discovery (`details.actualType`), the product would mix governed and ungoverned vaults, or a vault type cannot belong to a product (`details.addresses`). | | 409 | CONFLICT | `already-quarantined`, `already-released`, `entity-hold` | Hold routes; an entity hold is released by resuming the entity. | | 409 | CONFLICT | `label-set-not-publishable`, `version-exists`, `publication-suspended`, `restore-conflict` | Publishing and restoring label versions. | | 412 | PRECONDITION_FAILED | none | `If-Match` names an older `updatedAt`; `details.updatedAt` is the current one. | | 412 | PRECONDITION_FAILED | `draft-changed` | A publish's `expectedDraftToken` no longer matches its dry run; `details.draftToken` is the current one. | | 412 | PRECONDITION_FAILED | `stale-review` | A hold or release whose `expectedContentHash` no longer matches the draft row; `details.contentHash` is the current one, and nothing is written. | | 503 | SERVICE_UNAVAILABLE | `publication-in-progress` | A publication holds the label set; retry after `Retry-After` (5 seconds). | | 503 | SERVICE_UNAVAILABLE | `ownership-unavailable`, `governance-unavailable`, `capability-check-unavailable` | On-chain ownership, product governance or an API key capability could not be checked. | | 400 | BAD_REQUEST, VALIDATION_ERROR, INVALID_ADDRESS, INVALID_CHAIN_ID | none | Malformed JSON or filter (`details.param`), a malformed `If-Match`, or a malformed address or chain id in the path. | | 422 | VALIDATION_ERROR | none | Body or query validation; `details.issues[]` names each `path`. | | 413, 415, 429 | PAYLOAD_TOO_LARGE, UNSUPPORTED_MEDIA_TYPE, RATE_LIMIT_EXCEEDED | none | A body over 1 MiB, a body that is not JSON, or a rate limit (`Retry-After`). |

Operations 23

GET /v3/labels/sets List label sets #
GET /v3/labels/sets/{labelSetId}/versions List published label versions #
POST /v3/labels/sets/{labelSetId}/versions Publish current labels #
GET /v3/labels/sets/{labelSetId}/publication Read publication state #
GET /v3/labels/sets/{labelSetId}/publication/summary Read the publication summary #
GET /v3/labels/sets/{labelSetId}/publication/versions List published label versions with attribution #
POST /v3/labels/sets/{labelSetId}/publication/suspend Suspend automatic publication #
POST /v3/labels/sets/{labelSetId}/publication/resume Resume automatic publication #
GET /v3/labels/sets/{labelSetId}/holds List active holds #
POST /v3/labels/sets/{labelSetId}/holds Quarantine a row #
DELETE /v3/labels/sets/{labelSetId}/holds/{holdId} Release a quarantine #
POST /v3/labels/sets/{labelSetId}/holds/{holdId}/release Release a quarantine with a reason #
GET /v3/labels/sets/{labelSetId}/changes List the label change log #
GET /v3/labels/products List curation products #
GET /v3/labels/products/{chainId}/{id} Get curation product #
GET /v3/labels/vaults List curation vault labels #
GET /v3/labels/vaults/{chainId}/{address} Get curation vault labels #
GET /v3/config-trust List config trust entries #
GET /v3/geo-policies List geo policies #
GET /v3/evk/vaults/{chainId}/{address}/assessment Get EVK vault assessment #
POST /v3/evk/vaults/{chainId}/{address}/assessment/preview Preview the Layer 1 verdict of a EVK vault, for the live configuration or a… #
POST /v3/earn/vaults/{chainId}/{address}/assessment/preview Preview the Layer 1 verdict of a Earn vault, for the live configuration or a… #
GET /v3/earn/vaults/{chainId}/{address}/assessment Get Earn vault assessment #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/euler:euler-labels-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

euler-labels-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Euler Data API (V3) Labels API
  version: 3.0.0
  description: 'API specification for Euler Data v3. This spec defines the current

    resource-oriented contract for the platform, with emphasis on consistent

    schemas, predictable REST semantics, caching, observability, and a uniform

    developer experience. This public document covers unauthenticated endpoints and integrations that

    use API keys, including capability-scoped keys. Browser-session Toolbox

    operations, admin-secret operations, and the Prometheus endpoint are served

    separately and are intentionally omitted. Migration notes

    - Euler Data v3 is not a path-for-path clone of v1/v2. Some endpoints map

    directly, some require multiple v3 calls, and some legacy aggregates were

    intentionally removed. - The live migration guide explains how legacy v1/v2

    endpoints and payloads map into the v3 resource model. - Important semantic changes:

    - Vault base APY and rewards APY are exposed separately in v3. - Account positions are flattened into account-vault rows instead of the

    legacy nested sub-account shape. - All supported API paths live under `/v3`; legacy paths return `410`. - Summary endpoints prefer smaller, focused resources over large

    BFF-style payloads. Base path: /v3


    Conventions

    - JSON field naming: camelCase

    - Addresses: accept lowercase or checksum; responses are EIP-55 checksummed

    - Public APY values (`*Apy`, `apy*`): percent numbers with 6 decimal places (e.g., 5.123456 = 5.123456%)

    - Contract interest-rate fields (`borrowAPY`, `supplyAPY` in `interestRates`): decimal strings in contract fraction units

    - Ratios (utilization, LTV, etc.): numbers with 6 decimal places

    - Response timestamps: ISO-8601 strings (UTC). Some legacy fields still expose unix

    seconds for compatibility and include `*Iso` companions. - Query time ranges: unix seconds (from/to)


    Unit policy

    - v3 separates market metadata from contract verdicts by both name and type. - Market-normalized USD prices and USD values are JSON numbers. These are values

    derived from off-chain pricing, cached price snapshots, or API-level market math. This includes `/v3/prices`, token price routes, vault/earn/protocol USD totals,

    portfolio market values, portfolio USD liquidation/risk fields such as

    `liabilityValueUsd`, `totalCollateralValueUsd`, `borrowLiquidationPriceUsd`,

    and `collateralLiquidationPricesUsd`, and vault holder `assetsUsd`. - Contract-derived oracle and raw account-liquidity verdict values are exact strings. These preserve the integer value used by contracts, normalized to 18 decimals

    for API exposure. Oracle prices are quoted in the vault unit of account, which

    can be USD, ETH, or another asset. This includes `/v3/oracles/prices`, raw

    account-liquidity `liabilityValue` and `totalCollateralValue` objects,

    `liabilityValueBorrowing`, `liabilityValueLiquidation`, and collateral verdict

    values. - On-chain token quantities are bigint strings in their native unit scale. This

    includes amounts, balances, shares, assets, borrows, reward amounts, liquidation

    repay/yield amounts, and block numbers. - Caps are also bigint strings, but EVK caps are exposed as resolved underlying

    asset-unit amounts rather than packed contract config words; an unlimited EVK cap is

    type(uint256).max and `0` is a zero cap. The exceptions are

    cap-history and config-history, which carry the raw uint16 encodings. - LTV config values use canonical basis-point strings. Legacy decimal aliases

    may remain on config-history payloads for compatibility when explicitly named. Rate limiting

    - Optional API keys for higher limits

    - Standard limits are 1000 req/min for unauthenticated callers (IP-based)

    and 10000 req/min for authenticated callers (per API key), with a 60s window. Individual API keys can carry a custom limit. - By default, proxy headers are not trusted for IP identity unless explicitly enabled. - Redis failures default to fail-closed (503) for strict enforcement; fail-open is opt-in. - RateLimit-* (IETF draft-6) and legacy X-RateLimit-* headers are returned.'
servers:
- url: /
  description: Current environment
security: []
tags:


# --- truncated at 32 KB (175 KB total) ---
# Full source: https://artifacts.apis.io/euler/openapi/euler-labels-api-openapi.yml