---
title: "List work items of one type"
method: GET
path: "/v3/work-items"
tags: ["Images", "Prices"]
---

# List work items of one type

`GET /v3/work-items`

## Request

- Base URL: `https://v3.euler.finance`
- URL: `https://v3.euler.finance/v3/work-items`
- Auth: API key in header `X-API-Key`

`token-logo-missing` requires `token-images:read` or an allowlisted Toolbox session. It returns in-scope assets (an asset of a vault the app shows, or of a collateral such a vault accepts) on enabled chains without a managed image, excluding applied removals and dismissals, with the worker's latest outcome, provider, attempt time and next retry time when available, and returns 503 until legacy occupancy is verified and source cutover is enabled. Scope inputs may be up to a minute old. With `state=reviewed` it lists dismissals instead.

`token-price-missing` requires `price-sources:read` or an allowlisted Toolbox session. It is computed on each read for every in-scope asset (an asset of a vault the app shows) that is not priced, ordered by priority, then by deposits in USD at the last price. Inputs other than reviews may be up to a minute old; a dismissal or resume shows on the next read. A proposed dismissal leaves the item outstanding until an admin approves it.

`asset-newly-exposed` requires `geo:read` or an allowlisted Toolbox session. It lists every asset a vault users can act on reaches, read from the exposure sweep (every 15 minutes): the assets of every EVK, Earn and Securitize vault that is not deprecated, verified or not, explorable or not; the assets of the collaterals the shown vaults accept; and what those are built on. Only ERC-20 tokens are listed: V3 first reads the metadata of an address it has none for, and lists it once it reads as a token (symbol and decimals); an address already listed stays until that read answers. A rule covers an asset when one of its asset selectors picks the asset, or picks a token the asset is built on; a rule limited to one product or vault leaves the item outstanding and is named in `rules`. Ordered by priority (exposure), then deposits in USD, then the newest exposure. `state` is, first match wins, `covered` (a rule applies on the whole chain), `reviewed` (a standing review), `unverified-only` (reached only through vaults the app does not show) or `new`. The default `outstanding` is `new` only, and only `new` items count in the open-items gauge; `unverified-only` items are listed and reviewable with their own `state`.

Each `asset-newly-exposed` item carries `coverage`, an onboarding checklist of five decisions: logo, price, category (`tags`), intrinsic APY (`yield`) and geo. A piece is settled when it has its data, an automatic match, or an applied "none" review; a settled piece is never a need. `needs` keeps the items with a need in any of the named pieces: not settled, no open proposal, in scope and not paused. Each piece has its write path, with no route of its own: logo: `POST /v3/changes/uploads` then a `token-images` `fill` (or a verified `fill` with `trustedSource`, or a PT `derive`) on `POST /v3/changes`; "none": `POST /v3/work-items/token-logo-missing/{id}/dismiss` with `no-logo-available`. price: a `price-sources` change on `POST /v3/changes` (key `<source>/<chainId>:<address>`); "none": `POST /v3/work-items/token-price-missing/{id}/dismiss` with `onchain-only` or `no-price-source`. tags: a `token-tags` change on `POST /v3/changes` (key `<tag>:<ruleType>:<value>`; the `addresses` rule type tags one token, value `<chainId>:<address>`); "none": `POST /v3/work-items/token-category-missing/{id}/dismiss` with `no-category`. yield: a `yield-sources` change (key `<source>/<chainId>:<address>`) or a `yield-pools` change (key `<chainId>:<address>`) on `POST /v3/changes`; "none": `POST /v3/work-items/token-intrinsic-apy-missing/{id}/dismiss` with `no-intrinsic-apy`. geo: the `/v3/geo-policies` routes or a `geo` change on `POST /v3/changes`; "none": `POST /v3/work-items/asset-newly-exposed/{id}/dismiss` with `no-rule-needed`. `token-category-missing` and `token-intrinsic-apy-missing` have no list of their own: this route returns 400 for them.

For every type, `review.proposedBy` and `review.decidedBy` are null for API-key readers. A missing or unknown `type` returns 400 before any capability check.

## Query parameters

- `type` 'token-logo-missing' | 'token-price-missing' | 'asset-newly-exposed', required
- `state` 'outstanding' | 'reviewed' | 'all' | 'unpriced' | 'aging' | 'sources-disagree' | 'source-stopped' | 'onchain-only' | 'new' | 'unverified-only' | 'covered'
- `needs` string
- `chainId` integer
- `limit` integer
- `offset` integer

## Response `200`

Work items of the requested type

- union
  - PriceCoverageWorkItemList
    - `data` PriceCoverageWorkItem[], required
      - `id` string, required: Opaque work item ID, `<chainId>:<lowercase token address>`.
      - `chainId` integer, required
      - `asset` object, required
        - `address` string, required: Lowercase token address.
        - `symbol` string, nullable, required
        - `decimals` integer, required
      - `state` 'unpriced' | 'aging' | 'sources-disagree' | 'source-stopped' | 'onchain-only' | 'reviewed' | 'priced', required: `reviewed` while an applied `no-price-source` review or stop-for-now review stands (see `review.kind`). Otherwise, first match wins: `unpriced` (no eligible price within 24 hours, or never), `sources-disagree` (`disagreement.tier` is `issue`), `aging` (newest price older than 12 hours), `source-stopped`, `onchain-only` (only the on-chain fallback is fresh; `reviewed` while an applied `onchain-only` review stands) and `priced`. `unpriced` comes before `sources-disagree` because derived USD values already leave out a token without a fresh price; `disagreement` is still set. `source-stopped`: a configured source stopped or never priced the token, and either no configured market source is fresh, or the stopped source has no positive price within the 7-day cutoff (it never priced the token, or its last price is older). While a configured market source is fresh, each price run compares a stopped market source whose last price is within the cutoff with it, as long as the source still answers; without a disagreement of 10% or more (`sources-disagree`) the token is `priced` and `sources` still shows the source as `stopped`. A stopped on-chain fallback is no issue then, since the fallback runs only for tokens without a fresh market quote. A market source is any source but the on-chain fallback; ERC-4626 share prices count. Only served prices count: a source set up per token counts only while the token has an enabled entry for it. Listed items are never `priced`; a dismiss or resume response can be.
      - `since` string, date-time, nullable, required: When the asset entered its state, derived from price and source timestamps; for a reviewed item, the review time. An asset never priced counts from its catalog entry. For `sources-disagree`, the older of the two disagreeing prices.
      - `priority` integer, required: 5 sources-disagree, 4 unpriced, 3 aging, 2 source-stopped, 1 onchain-only, 0 reviewed. The list is sorted by it, highest first. A disagreement lists first because V3 may serve the wrong price, while an unpriced token is already left out of USD values.
      - `price` object, nullable, required: Last known served price with its internal source name, of any age: fresh sources by precedence, otherwise the newest stale one.
        - `priceUsd` number, double, required
        - `source` string, required
        - `timestamp` string, date-time, required
        - `stale` boolean, required: True when the price is older than 24 hours.
      - `sources` object[], required: Configured and observed price sources. Each orchestrator run stores only the highest-ranked source with a fresh quote for the token (the newest quote when none is fresh), in the write-time merge order erc4626-fixed < erc4626 < defillama < coingecko < pendle < pyth. So a configured source silent for 24 hours, or never seen, is `stopped` or `never` only when the fresh winner ranks below it; it is `outranked` when a higher-ranked source won, and its health is then unknown. A source set up per token that the token has no enabled entry for is `stopped`, whatever the age of its last row: V3 no longer serves it. So is the on-chain fallback of a token whose `onchain` entry is disabled.
        - `source` string, required
        - `configured` boolean, required
        - `lastObservedAt` string, date-time, nullable, required
        - `lastPriceUsd` number, double, nullable, required
        - `status` 'fresh' | 'stopped' | 'never' | 'outranked', required
      - `disagreement` PriceSourceDisagreement, required: The lowest and the highest quote of the token in the last price run that compared every source of the token: each market source's quote (not only the one the run stores), an ERC-4626 share price computed in the run, and the on-chain fallback quote when the fallback ran for the token. A quote counts while its provider time is within the 7-day cutoff of `GET /v3/prices`, fresh or not, so a provider that stopped updating but still answers is compared. Only quotes V3 would serve count. No stored price is compared. A run in which a source that should quote the token fails (an adapter with an enabled entry for it, or the token's own fallback read) leaves the last result as it is; a result more than 24 hours old is not shown. It never changes the price V3 serves: `price` follows the usual rules.
        - `ratio` number, double, required: (high - low) / low, as a fraction, not a percentage: 0.8267 means the highest price is 82.67% above the lowest.
        - `tier` 'warning' | 'issue', required: `warning` from 2% (the state does not change, and the item is not listed for it), `issue` from 10% (the state is `sources-disagree` unless a standing `no-price-source` or stop-for-now review, or `unpriced`, comes first). Both bounds are inclusive, as in the adapter assessment's price deviation check.
        - `low` object, required
          - `source` string, required: V3's stored source name, for example `coingecko`, `defillama`, `oracle-fallback` or `erc4626`.
          - `priceUsd` number, double, required
          - `observedAt` string, date-time, required
        - `high` object, required
          - `source` string, required: V3's stored source name.
          - `priceUsd` number, double, required
          - `observedAt` string, date-time, required
      - `fallback` object, nullable, required: Latest on-chain fallback outcome, read for up to 26 hours. When `outcome` is `priced`, the fallback stored that price. Otherwise it gives the reason for the first step that failed, for example `no-candidate` (no assessed adapter on an active route prices it), `out-of-scope` (only adapters of vaults the app does not show could price it), `reference-required` (a fixed or rate-provider adapter without an independent reference) or `assessment-warning` (every candidate adapter has failing checks).
        - `outcome` 'priced' | 'out-of-scope' | 'no-candidate' | 'reference-required' | 'reference-mismatch' | 'conflict' | 'assessment-warning' | 'assessment-stale' | 'rpc-behind' | 'decimals' | 'inventory-truncated' | 'wrapper-unresolved' | 'reorg' | 'error' | 'switched-off', required
        - `priceUsd` number, double, nullable, required
        - `adapter` string, nullable, required
        - `path` object[], nullable, required
          - `kind` 'unwrap' | 'quote', required
          - `token` string, required
          - `adapter` string, nullable, required
        - `evaluatedAt` string, date-time, required
      - `exposure` object, required
        - `vaultCount` integer, required
        - `vaults` object[], required
          - `address` string, required
          - `symbol` string, nullable, required
          - `vaultType` 'evk' | 'earn' | 'securitize', required
          - `role` 'asset' | 'collateral', required
          - `isEscrow` boolean, required
        - `depositsRaw` string, required: Deposits of the asset in in-scope vaults, in base units.
        - `depositsUsdAtLastPrice` number, double, nullable, required
      - `review` WorkItemReview, required: The applied review that moved a work item off the outstanding list.
        - `changeId` string, uuid, required: The applied change that records the review.
        - `kind` 'onchain-only' | 'no-price-source' | 'no-logo-available' | 'no-rule-needed' | 'no-category' | 'no-intrinsic-apy', nullable, required: The recognized terminal state, or null for a plain dismissal (stop looking for now). `onchain-only` or `no-price-source` on `token-price-missing`; `no-logo-available` on `token-logo-missing`; `no-category` on `token-category-missing` and `no-intrinsic-apy` on `token-intrinsic-apy-missing`, which take no null kind; `no-rule-needed` on `asset-newly-exposed`, where a null-kind review lapses when the asset is exposed again after it. A price item with a null-kind review is `reviewed` and lapses like `no-price-source`: any price observed after the decision brings it back. A logo item with a null-kind review stays reviewed until it is resumed.
        - `reason` string, required
        - `proposedBy` ChangeActorRef, required: Who did it. API-key readers see only their own key's ID; every other actor is shown by kind with a null ID and label.
          - `kind` 'api-key' | 'platform-admin' | 'admin-secret' | 'system' | 'entity-admin', required
          - `id` string, nullable, required
          - `label` string, nullable, required: The platform admin's email or the key's name; null for API-key readers.
        - `decidedBy` string, nullable, required: The platform admin's email, else `<actorKind>:<actorId>`. Null for an API-key reader, which never sees operator identities.
        - `decidedAt` string, date-time, required
      - `marketClosedUntil` string, date-time, nullable, required: Set while the on-chain fallback's read fails and the adapter assessment excuses the revert as a trading-session pause (`session-tolerance` passes; for a cross adapter, on every leg): the feed's last update plus the closure bound. Until then the last on-chain price counts as current: the item keeps the state it had (normally `onchain-only`), is not `unpriced` or `aging`, does not count toward the 48-hour alert, and derived USD values keep the price. `price.stale` stays true. Null otherwise.
    - `meta` object, required
      - `total` integer: Exact total count when the endpoint provides one.
      - `hasMore` boolean: Indicates whether another page exists beyond the current page.
      - `offset` integer
      - `limit` integer: Echoed page size after endpoint-side clamping.
      - `outcome` 'disabled' | 'removed': On a toolbox config DELETE, what happened to the row.
      - `products` ProductLabels[]: On a curation vault `POST`, `PUT`, or `PATCH`: the products the write touched (the one the vault left and the one it joined) as they are after the write, `governanceMode` included, so the caller applies them instead of re-reading.
        - `id` string, required
        - `chainId` integer, required
        - `entityId` string, required
        - `coBrandEntityIds` string[], required: Additional entities whose logos should be displayed. Product management remains exclusively with entityId.
        - `name` string, required
        - `logo` string, nullable
        - `description` string, nullable
        - `url` string, nullable: Absolute https URL.
        - `portfolioNotice` string, nullable
        - `isDeprecated` boolean, required
        - `deprecationReason` string, nullable
        - `notExplorable` boolean, nullable, required: Curator listing flag, outranked by platform overrides and by Euler's deprecation on the assessment. `null` leaves the decision to deprecation, `true` hides the vault(s) from discovery, `false` keeps listed a vault the curator deprecated, but never one Euler deprecated.
        - `governanceMode` 'governed' | 'ungoverned' | 'unknown', required: Derived by the server from the on-chain governor of member vaults; clients cannot set it. Products are created as `unknown`. Every vault assignment recomputes the mode over the resulting member set and rejects sets that mix governed and ungoverned vaults. Layer 2 adopts `governed` or `ungoverned` for an `unknown` product once its membership verifies against chain state. Entity members cannot update or delete an `ungoverned` product or its vaults after the initial assignment.
        - `resolved` ResolvedProductLabels, required: Read-time entity fallbacks for display. Derived, never stored.
          - `entityName` string, nullable, required
          - `url` string, nullable, required: Product url, falling back to the owning entity url.
          - `logo` string, nullable, required: Product logo, falling back to the owning entity logo.
        - `anyExplorableLend` boolean, required: True when at least one member vault is lend-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
        - `anyExplorableBorrow` boolean, required: True when at least one member vault is borrow-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
        - `createdAt` string, date-time, required
        - `updatedAt` string, date-time, required
        - `hold` LabelHoldSummary: What a draft read shows on a held row.
          - `id` string, uuid, required
          - `kind` 'quarantine' | 'entity-hold', required
          - `reason` string, required
          - `since` string, date-time, required
        - `platformListing` ProductPlatformListing: The platform-owned discovery decision on a product, as a product row shows it.
          - `notExplorableLend` boolean, required
          - `notExplorableBorrow` boolean, required
          - `reason` string, nullable, required
      - `timestamp` string, date-time, required
      - `chainId` string: Comma-separated chain IDs for multi-chain responses.
      - `degradedProviders` string[]: Live providers whose data is incomplete in this response.
      - `excludedChains` object[]: On a read across chains that names no `chainId`: the served chains it left out because they do not run the capability the operation needs, rather than reading them as empty. Absent when no chain was left out.
        - `chainId` integer, required
        - `capability` 'indexing' | 'activity' | 'prices' | 'historicalPrices' | 'assessments' | 'labels' | 'logos' | 'stats' | 'risk' | 'rewards' | 'apys', required
      - `unreadSources` string[], required: Price sources whose token list could not be read. While it is not empty, the list is partial, because entries of these sources are missing from each item's `sources`.
      - `counts` object, required: Listed items on the requested chains, before the state filter and paging.
        - `unpriced` integer, required
        - `aging` integer, required
        - `sourcesDisagree` integer, required: Items in the `sources-disagree` state.
        - `sourceStopped` integer, required
        - `onchainOnly` integer, required
        - `reviewed` integer, required
  - TokenLogoWorkItemList
    - `data` TokenLogoWorkItem[], required
      - `id` string, required: Opaque work item ID, `<chainId>:<lowercase token address>`, as on every work list.
      - `chainId` integer, required
      - `address` string, required: Lowercase token address.
      - `symbol` string, required
      - `name` string, required
      - `workerOutcome` string, nullable, required: The logo worker's latest outcome for the token: `no_candidate`, `invalid_source`, `provider_failure`, `created` or `already_present`. `shadow_candidate` is a legacy value the worker no longer writes; a token that still shows it is retried at `nextRetryAt`, and that attempt replaces it.
      - `workerProvider` string, nullable, required
      - `lastAttemptAt` string, date-time, nullable, required
      - `nextRetryAt` string, date-time, nullable, required
      - `review` WorkItemReview, required: The applied review that moved a work item off the outstanding list.
        - `changeId` string, uuid, required: The applied change that records the review.
        - `kind` 'onchain-only' | 'no-price-source' | 'no-logo-available' | 'no-rule-needed' | 'no-category' | 'no-intrinsic-apy', nullable, required: The recognized terminal state, or null for a plain dismissal (stop looking for now). `onchain-only` or `no-price-source` on `token-price-missing`; `no-logo-available` on `token-logo-missing`; `no-category` on `token-category-missing` and `no-intrinsic-apy` on `token-intrinsic-apy-missing`, which take no null kind; `no-rule-needed` on `asset-newly-exposed`, where a null-kind review lapses when the asset is exposed again after it. A price item with a null-kind review is `reviewed` and lapses like `no-price-source`: any price observed after the decision brings it back. A logo item with a null-kind review stays reviewed until it is resumed.
        - `reason` string, required
        - `proposedBy` ChangeActorRef, required: Who did it. API-key readers see only their own key's ID; every other actor is shown by kind with a null ID and label.
          - `kind` 'api-key' | 'platform-admin' | 'admin-secret' | 'system' | 'entity-admin', required
          - `id` string, nullable, required
          - `label` string, nullable, required: The platform admin's email or the key's name; null for API-key readers.
        - `decidedBy` string, nullable, required: The platform admin's email, else `<actorKind>:<actorId>`. Null for an API-key reader, which never sees operator identities.
        - `decidedAt` string, date-time, required
    - `meta` PaginationMeta, required
      - `total` integer: Exact total count when the endpoint provides one.
      - `hasMore` boolean: Indicates whether another page exists beyond the current page.
      - `offset` integer
      - `limit` integer: Echoed page size after endpoint-side clamping.
      - `outcome` 'disabled' | 'removed': On a toolbox config DELETE, what happened to the row.
      - `products` ProductLabels[]: On a curation vault `POST`, `PUT`, or `PATCH`: the products the write touched (the one the vault left and the one it joined) as they are after the write, `governanceMode` included, so the caller applies them instead of re-reading.
        - `id` string, required
        - `chainId` integer, required
        - `entityId` string, required
        - `coBrandEntityIds` string[], required: Additional entities whose logos should be displayed. Product management remains exclusively with entityId.
        - `name` string, required
        - `logo` string, nullable
        - `description` string, nullable
        - `url` string, nullable: Absolute https URL.
        - `portfolioNotice` string, nullable
        - `isDeprecated` boolean, required
        - `deprecationReason` string, nullable
        - `notExplorable` boolean, nullable, required: Curator listing flag, outranked by platform overrides and by Euler's deprecation on the assessment. `null` leaves the decision to deprecation, `true` hides the vault(s) from discovery, `false` keeps listed a vault the curator deprecated, but never one Euler deprecated.
        - `governanceMode` 'governed' | 'ungoverned' | 'unknown', required: Derived by the server from the on-chain governor of member vaults; clients cannot set it. Products are created as `unknown`. Every vault assignment recomputes the mode over the resulting member set and rejects sets that mix governed and ungoverned vaults. Layer 2 adopts `governed` or `ungoverned` for an `unknown` product once its membership verifies against chain state. Entity members cannot update or delete an `ungoverned` product or its vaults after the initial assignment.
        - `resolved` ResolvedProductLabels, required: Read-time entity fallbacks for display. Derived, never stored.
          - `entityName` string, nullable, required
          - `url` string, nullable, required: Product url, falling back to the owning entity url.
          - `logo` string, nullable, required: Product logo, falling back to the owning entity logo.
        - `anyExplorableLend` boolean, required: True when at least one member vault is lend-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
        - `anyExplorableBorrow` boolean, required: True when at least one member vault is borrow-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
        - `createdAt` string, date-time, required
        - `updatedAt` string, date-time, required
        - `hold` LabelHoldSummary: What a draft read shows on a held row.
          - `id` string, uuid, required
          - `kind` 'quarantine' | 'entity-hold', required
          - `reason` string, required
          - `since` string, date-time, required
        - `platformListing` ProductPlatformListing: The platform-owned discovery decision on a product, as a product row shows it.
          - `notExplorableLend` boolean, required
          - `notExplorableBorrow` boolean, required
          - `reason` string, nullable, required
      - `timestamp` string, date-time, required
      - `chainId` string: Comma-separated chain IDs for multi-chain responses.
      - `degradedProviders` string[]: Live providers whose data is incomplete in this response.
      - `excludedChains` object[]: On a read across chains that names no `chainId`: the served chains it left out because they do not run the capability the operation needs, rather than reading them as empty. Absent when no chain was left out.
        - `chainId` integer, required
        - `capability` 'indexing' | 'activity' | 'prices' | 'historicalPrices' | 'assessments' | 'labels' | 'logos' | 'stats' | 'risk' | 'rewards' | 'apys', required
  - GeoExposureWorkItemList
    - `data` GeoExposureWorkItem[], required
      - `id` string, required: `<chainId>:<lowercase asset address>`, as on every work list.
      - `type` 'asset-newly-exposed', required
      - `chainId` integer, required
      - `subject` object, required
        - `address` string, required
        - `symbol` string, nullable, required
        - `name` string, nullable, required
        - `decimals` integer, nullable, required
      - `state` 'new' | 'unverified-only' | 'reviewed' | 'covered', required: The first that applies: `covered` (a geo rule applies on the whole chain), `reviewed` (a standing review), `unverified-only` (reached only through vaults the app does not show, by holding or by lineage), `new`. Only `new` is outstanding. An `unverified-only` asset that a shown vault starts to reach becomes `new` on the next sweep.
      - `since` string, date-time, required: Start of the current exposure.
      - `firstSeenAt` string, date-time, required
      - `lastSeenAt` string, date-time, required
      - `priority` integer, required: One step per order of magnitude of `depositsUsd` ($10 is 1, $10M is 7); 0 when unknown or below $1.
      - `vaults` GeoExposureVault[], required: The vaults that hold the asset itself, shown in the app or not.
        - `address` string, required
        - `symbol` string, nullable, required
        - `vaultType` 'evk' | 'earn' | 'securitize', required
        - `role` 'asset' | 'collateral', required
        - `isEscrow` boolean, required
        - `productId` string, nullable, required
        - `strategies` string[]: An Earn vault's strategies, from its supply and withdraw queues.
      - `depositsRaw` string, required: Deposits of those vaults in the asset's base units.
      - `depositsUsd` number, nullable, required: Deposits in USD at the last price, including the tokens built on the asset; null when no price is known.
      - `parents` GeoExposureEdge[], required: What the asset is built on.
        - `address` string, required: Lowercase token address.
        - `relation` 'erc4626' | 'evk-share' | 'escrow-share' | 'earn-share' | 'securitize-share' | 'earn-allocation' | 'pendle-pt' | 'pendle-lp' | 'pendle-sy' | 'pendle-yt', required: How the token is built on the other: in `parents` the other token is what this one wraps; in `reachedVia` the other token wraps this one.
      - `reachedVia` GeoExposureEdge[], required: The exposed tokens built on this asset, through which a vault reaches it.
        - `address` string, required: Lowercase token address.
        - `relation` 'erc4626' | 'evk-share' | 'escrow-share' | 'earn-share' | 'securitize-share' | 'earn-allocation' | 'pendle-pt' | 'pendle-lp' | 'pendle-sy' | 'pendle-yt', required: How the token is built on the other: in `parents` the other token is what this one wraps; in `reachedVia` the other token wraps this one.
      - `fingerprints` string[], required: The asset's proxy implementation as `implementation:0x…`, empty for a plain contract. A reviewer signal only: tokens that use the same implementation may come from one issuer or from a common template, and no rule covers a token through it. Code hashes are not recorded.
      - `signals` GeoExposureSignals, required: Server-read facts about the token. A read that failed on the last attempt is named in `unavailable`.
        - `proxy` object, nullable: The proxy the token is (EIP-1967, an EIP-1967 beacon or an EIP-1167 clone); null for a plain contract.
          - `kind` 'eip1967' | 'eip1967-beacon' | 'eip1167', required
          - `implementation` string, required
        - `coingecko` object, nullable
          - `id` string, required
          - `categories` string[], required
        - `unavailable` string[]
      - `signalsCheckedAt` string, date-time, nullable, required
      - `rules` object[], required: Geo rules that cover the asset; on a `covered` item one of them applies on the whole chain, otherwise each applies only inside one product or vault.
        - `policyId` string, required
        - `policyType` 'block' | 'restrict', required
        - `countries` string[], required
        - `productId` string, nullable, required
        - `vaultAddress` string, nullable, required
        - `match` 'address' | 'symbol' | 'name' | 'lineage', required
      - `review` WorkItemReview, required: The applied review that moved a work item off the outstanding list.
        - `changeId` string, uuid, required: The applied change that records the review.
        - `kind` 'onchain-only' | 'no-price-source' | 'no-logo-available' | 'no-rule-needed' | 'no-category' | 'no-intrinsic-apy', nullable, required: The recognized terminal state, or null for a plain dismissal (stop looking for now). `onchain-only` or `no-price-source` on `token-price-missing`; `no-logo-available` on `token-logo-missing`; `no-category` on `token-category-missing` and `no-intrinsic-apy` on `token-intrinsic-apy-missing`, which take no null kind; `no-rule-needed` on `asset-newly-exposed`, where a null-kind review lapses when the asset is exposed again after it. A price item with a null-kind review is `reviewed` and lapses like `no-price-source`: any price observed after the decision brings it back. A logo item with a null-kind review stays reviewed until it is resumed.
        - `reason` string, required
        - `proposedBy` ChangeActorRef, required: Who did it. API-key readers see only their own key's ID; every other actor is shown by kind with a null ID and label.
          - `kind` 'api-key' | 'platform-admin' | 'admin-secret' | 'system' | 'entity-admin', required
          - `id` string, nullable, required
          - `label` string, nullable, required: The platform admin's email or the key's name; null for API-key readers.
        - `decidedBy` string, nullable, required: The platform admin's email, else `<actorKind>:<actorId>`. Null for an API-key reader, which never sees operator identities.
        - `decidedAt` string, date-time, required
      - `coverage` AssetCoverage: The onboarding checklist of one exposed asset: logo, price, category (`tags`), intrinsic APY (`yield`) and geo. Logo, price, tags and yield apply only to assets shown in the app, the scope of the logo and price lists; any other asset has them as `out-of-scope`. Geo applies to every exposed asset. `paused` is a standing review without a kind (stop for now). Every piece is read in a batch for the page.
        - `logo` object, required
          - `settled` boolean, required: The piece has its data, an automatic match, or an applied "none" review. A settled piece is never a need.
          - `need` boolean, required: Not settled, no open proposal, and the state is neither `out-of-scope` nor `paused`. The `needs` filter matches it.
          - `review` AssetCoverageReview, nullable, required: The standing review that settles or pauses the piece; null when none does.
            - `changeId` string, uuid, required
            - `kind` string, nullable, required: The review kind; null for a stop-for-now review, which pauses the piece.
          - `proposal` AssetCoverageProposal, nullable, required: The oldest open proposal that addresses the piece, a proposed "none" review included; null when none does.
            - `changeId` string, uuid, required
          - `state` 'present' | 'none-reviewed' | 'paused' | 'missing' | 'out-of-scope', required: Settled: `present` (a managed image) or `none-reviewed` (an applied `no-logo-available` review).
        - `price` object, required
          - `settled` boolean, required: The piece has its data, an automatic match, or an applied "none" review. A settled piece is never a need.
          - `need` boolean, required: Not settled, no open proposal, and the state is neither `out-of-scope` nor `paused`. The `needs` filter matches it.
          - `review` AssetCoverageReview, nullable, required: The standing review that settles or pauses the piece; null when none does.
            - `changeId` string, uuid, required
            - `kind` string, nullable, required: The review kind; null for a stop-for-now review, which pauses the piece.
          - `proposal` AssetCoverageProposal, nullable, required: The oldest open proposal that addresses the piece, a proposed "none" review included; null when none does.
            - `changeId` string, uuid, required
          - `state` 'market' | 'onchain-only-reviewed' | 'none-reviewed' | 'paused' | 'onchain-only' | 'aging' | 'source-stopped' | 'sources-disagree' | 'unpriced' | 'out-of-scope', required: Settled: `market` (a fresh market price), `onchain-only-reviewed` (an `onchain-only` review) or `none-reviewed` (a `no-price-source` review). The `token-price-missing` states `onchain-only`, `aging`, `source-stopped`, `sources-disagree` and `unpriced` without a standing review are needs.
        - `yield` object, required
          - `settled` boolean, required: The piece has its data, an automatic match, or an applied "none" review. A settled piece is never a need.
          - `need` boolean, required: Not settled, no open proposal, and the state is neither `out-of-scope` nor `paused`. The `needs` filter matches it.
          - `review` AssetCoverageReview, nullable, required: The standing review that settles or pauses the piece; null when none does.
            - `changeId` string, uuid, required
            - `kind` string, nullable, required: The review kind; null for a stop-for-now review, which pauses the piece.
          - `proposal` AssetCoverageProposal, nullable, required: The oldest open proposal that addresses the piece, a proposed "none" review included; null when none does.
            - `changeId` string, uuid, required
          - `state` 'configured' | 'none-reviewed' | 'not-applicable' | 'source-stopped' | 'missing' | 'out-of-scope', required: Intrinsic APY cannot be inferred, so every asset in scope needs a decision. Settled: `configured` (a provider wrote a non-zero intrinsic APY for the asset in the last 7 days, or an enabled entry exists and any provider wrote a row, zero included, in that time), `none-reviewed` (an applied `no-intrinsic-apy` review) or `not-applicable` (an Euler vault share: EVK, Earn, escrow or Securitize). `source-stopped` is a need: an enabled entry with no row for the asset in the last 7 days, a new entry included until its source first runs, or an asset whose only rows are older than 7 days. Only served rows count: a provider set up per token counts only while the asset has an enabled entry for it, and a DefiLlama pool row only while the enabled pool mapping names its pool.
          - `sources` string[], required: `yield-source`: an enabled yield-source entry; `yield-pool`: an enabled DefiLlama pool mapping; `provider`: a provider serves a non-zero intrinsic APY now.
        - `tags` object, required
          - `settled` boolean, required: The piece has its data, an automatic match, or an applied "none" review. A settled piece is never a need.
          - `need` boolean, required: Not settled, no open proposal, and the state is neither `out-of-scope` nor `paused`. The `needs` filter matches it.
          - `review` AssetCoverageReview, nullable, required: The standing review that settles or pauses the piece; null when none does.
            - `changeId` string, uuid, required
            - `kind` string, nullable, required: The review kind; null for a stop-for-now review, which pauses the piece.
          - `proposal` AssetCoverageProposal, nullable, required: The oldest open proposal that addresses the piece, a proposed "none" review included; null when none does.
            - `changeId` string, uuid, required
          - `state` 'tagged' | 'none-reviewed' | 'untagged' | 'out-of-scope', required: Settled: `tagged` (any rule tags the token: a CoinGecko category, a symbol rule or an address rule) or `none-reviewed` (an applied `no-category` review). The proposal is a matching symbol, prefix, contains or address rule, or a proposed `no-category` review; category rules are not evaluated here.
          - `tags` string[], required: The tags `/v3/tokens` derives for the token.
        - `geo` object, required
          - `settled` boolean, required: The piece has its data, an automatic match, or an applied "none" review. A settled piece is never a need.
          - `need` boolean, required: Not settled, no open proposal, and the state is neither `out-of-scope` nor `paused`. The `needs` filter matches it.
          - `review` AssetCoverageReview, nullable, required: The standing review that settles or pauses the piece; null when none does.
            - `changeId` string, uuid, required
            - `kind` string, nullable, required: The review kind; null for a stop-for-now review, which pauses the piece.
          - `proposal` AssetCoverageProposal, nullable, required: The oldest open proposal that addresses the piece, a proposed "none" review included; null when none does.
            - `changeId` string, uuid, required
          - `state` 'covered' | 'none-reviewed' | 'paused' | 'outstanding', required: Settled: `covered` (a geo rule applies on the whole chain) or `none-reviewed` (an applied `no-rule-needed` review). The proposal is a `geo` rule that names the asset address, or a proposed review of the asset.
    - `meta` object, required
      - `total` integer: Exact total count when the endpoint provides one.
      - `hasMore` boolean: Indicates whether another page exists beyond the current page.
      - `offset` integer
      - `limit` integer: Echoed page size after endpoint-side clamping.
      - `outcome` 'disabled' | 'removed': On a toolbox config DELETE, what happened to the row.
      - `products` ProductLabels[]: On a curation vault `POST`, `PUT`, or `PATCH`: the products the write touched (the one the vault left and the one it joined) as they are after the write, `governanceMode` included, so the caller applies them instead of re-reading.
        - `id` string, required
        - `chainId` integer, required
        - `entityId` string, required
        - `coBrandEntityIds` string[], required: Additional entities whose logos should be displayed. Product management remains exclusively with entityId.
        - `name` string, required
        - `logo` string, nullable
        - `description` string, nullable
        - `url` string, nullable: Absolute https URL.
        - `portfolioNotice` string, nullable
        - `isDeprecated` boolean, required
        - `deprecationReason` string, nullable
        - `notExplorable` boolean, nullable, required: Curator listing flag, outranked by platform overrides and by Euler's deprecation on the assessment. `null` leaves the decision to deprecation, `true` hides the vault(s) from discovery, `false` keeps listed a vault the curator deprecated, but never one Euler deprecated.
        - `governanceMode` 'governed' | 'ungoverned' | 'unknown', required: Derived by the server from the on-chain governor of member vaults; clients cannot set it. Products are created as `unknown`. Every vault assignment recomputes the mode over the resulting member set and rejects sets that mix governed and ungoverned vaults. Layer 2 adopts `governed` or `ungoverned` for an `unknown` product once its membership verifies against chain state. Entity members cannot update or delete an `ungoverned` product or its vaults after the initial assignment.
        - `resolved` ResolvedProductLabels, required: Read-time entity fallbacks for display. Derived, never stored.
          - `entityName` string, nullable, required
          - `url` string, nullable, required: Product url, falling back to the owning entity url.
          - `logo` string, nullable, required: Product logo, falling back to the owning entity logo.
        - `anyExplorableLend` boolean, required: True when at least one member vault is lend-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
        - `anyExplorableBorrow` boolean, required: True when at least one member vault is borrow-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
        - `createdAt` string, date-time, required
        - `updatedAt` string, date-time, required
        - `hold` LabelHoldSummary: What a draft read shows on a held row.
          - `id` string, uuid, required
          - `kind` 'quarantine' | 'entity-hold', required
          - `reason` string, required
          - `since` string, date-time, required
        - `platformListing` ProductPlatformListing: The platform-owned discovery decision on a product, as a product row shows it.
          - `notExplorableLend` boolean, required
          - `notExplorableBorrow` boolean, required
          - `reason` string, nullable, required
      - `timestamp` string, date-time, required
      - `chainId` string: Comma-separated chain IDs for multi-chain responses.
      - `degradedProviders` string[]: Live providers whose data is incomplete in this response.
      - `excludedChains` object[]: On a read across chains that names no `chainId`: the served chains it left out because they do not run the capability the operation needs, rather than reading them as empty. Absent when no chain was left out.
        - `chainId` integer, required
        - `capability` 'indexing' | 'activity' | 'prices' | 'historicalPrices' | 'assessments' | 'labels' | 'logos' | 'stats' | 'risk' | 'rewards' | 'apys', required
      - `counts` object, required: Items per state on the requested chains, before the state filter and paging.
        - `new` integer, required
        - `unverifiedOnly` integer, required: Items in the `unverified-only` state.
        - `reviewed` integer, required
        - `covered` integer, required

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found, or `CHAIN_CAPABILITY_DISABLED`: a requested chain does not run the capability the operation needs (see `capabilities` on `/v3/chains`), named in `x-chain-capability` or, where it depends on the request, in the parameter. `details.chainIds` lists those chains and `details.capability` names the capability.
- `503`: Service unavailable

## Changes

- **2026-10-30** `e987d7695ec1`: 2 breaking, 2 warning, 8 info
  - removed the enum value `baseline` from the `query` request parameter `state`
  - removed the required property `anyOf[#/components/schemas/GeoExposureWorkItemList]/meta/allOf[subschema #2]/counts/baseline` from the response with the `200` status
  - added the new `sources-disagree` enum value to the `anyOf[#/components/schemas/GeoExposureWorkItemList]/data/items/coverage/price/allOf[subschema #2]/state` response property for the response status `200`
  - added the new `sources-disagree` enum value to the `anyOf[#/components/schemas/PriceCoverageWorkItemList]/data/items/state` response property for the response status `200`
  - …8 more
- **2026-10-19** `f0ed0045ce41`: 4 info
  - added the non-success response with the status `404`
  - added the optional property `anyOf[#/components/schemas/GeoExposureWorkItemList]/meta/allOf[#/components/schemas/PaginationMeta]/excludedChains` to the response with the `200` status
  - added the optional property `anyOf[#/components/schemas/PriceCoverageWorkItemList]/meta/allOf[#/components/schemas/PaginationMeta]/excludedChains` to the response with the `200` status
  - added the optional property `anyOf[#/components/schemas/TokenLogoWorkItemList]/meta/excludedChains` to the response with the `200` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/euler/apis/euler-data-api-v3/changes/v3/work-items/get.md)

---

[API](https://skmtc.dev/euler/apis/euler-data-api-v3.md) - [All operations](https://skmtc.dev/euler/apis/euler-data-api-v3/llms.txt) - [OpenAPI document](https://skmtc.dev/euler/apis/euler-data-api-v3/revisions/e987d7695ec1?raw)
