---
title: "Read a token's price sources before proposing a change"
method: GET
path: "/v3/changes/targets/price-sources/{chainId}/{address}"
tags: ["Changes", "Prices"]
---

# Read a token's price sources before proposing a change

`GET /v3/changes/targets/price-sources/{chainId}/{address}`

## Request

- Base URL: `https://v3.euler.finance`
- URL: `https://v3.euler.finance/v3/changes/targets/price-sources/{chainId}/{address}`
- Auth: API key in header `X-API-Key`

Requires `price-sources:read` or an allowlisted Toolbox session. Returns each configured source entry with its `version` (send it as `expectedVersion`; a source without an entry is filled with `expectedVersion: null`), the open proposals on the token, oldest first, and the current review of its price work item. API-key responses omit operator attribution, and `review.proposedBy` and `review.decidedBy` are null for them.

## Path parameters

- `chainId` integer, required
- `address` string, required

## Response `200`

The token's price sources

- object
  - `data` PriceSourceTarget, required
    - `chainId` integer, required
    - `address` string, required
    - `sources` object[], required
      - `source` 'defillama' | 'pyth' | 'coingecko' | 'erc4626' | 'pendle' | 'onchain', required
      - `entry` object, required: The configured entry (identifier, symbol, metadata, enabled).
      - `version` string, required: Send as `expectedVersion` to change this entry.
    - `proposals` ChangeRecord[], required
      - `id` string, uuid, required
      - `domain` string, required
      - `operation` string, required
      - `opClass` 'fill' | 'add' | 'replace' | 'update' | 'remove' | 'enable' | 'disable' | 'tighten' | 'loosen' | 'dismiss' | 'resume' | 'revert', nullable, required: What the change does, computed by the server. Geo changes are `tighten` (more people or assets fall under a rule), `loosen` (fewer, including any change that loosens one part) or `update` (nothing anyone is subject to changes, for example the reason).
      - `targetKey` string, required
      - `status` 'proposed' | 'applied' | 'rejected' | 'superseded' | 'reverted' | 'withdrawn' | 'failed' | 'expired', required
      - `reason` string, required
      - `rationale` string, nullable
      - `value` unknown, required
      - `before` unknown, required
      - `appliedValue` unknown, required
      - `checks` ChangeCheck[], required
        - `id` string, required
        - `outcome` 'pass' | 'fail' | 'warn' | 'skip', required
        - `message` string, required
        - `details` object, nullable
      - `policy` ChangePolicyResult, required
        - `version` string, required
        - `decision` 'apply' | 'propose', nullable, required: Null on rows recorded before the generic policy existed.
        - `reasons` string[], required
      - `evidence` object, nullable
      - `actor` 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.
      - `decision` object, nullable, required
        - `actor` 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.
        - `at` string, date-time, required
        - `comment` string, nullable, required
      - `expectedVersion` string, nullable
      - `resultingVersion` string, nullable
      - `revertsChangeId` string, uuid, nullable
      - `supersededByChangeId` string, uuid, nullable
      - `expiresAt` string, date-time, nullable
      - `error` object, nullable
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
      - `uploadId` string, uuid, nullable: Token images only: the staged upload the change carries.
      - `sourceProvider` string, nullable: Token images only: `coingecko`, `pendle` or `pendle-pt-ring`; null for an upload.
      - `sourceUrl` string, nullable: Token images only.
      - `sourceEvidence` object, nullable: Token images only: the provider record or the derivation the image came from.
      - `events` ChangeEvent[]: Present on the detail read only, oldest first.
        - `id` string, uuid, required
        - `event` 'submitted' | 'approved' | 'rejected' | 'withdrawn' | 'superseded' | 'reverted' | 'failed' | 'expired', required
        - `status` 'proposed' | 'applied' | 'rejected' | 'superseded' | 'reverted' | 'withdrawn' | 'failed' | 'expired', required
        - `actor` 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.
        - `details` object, nullable: What the event recorded. An API-key reader sees only `decision`, `stale`, `kind`, `reason`, `comment` and the related change ids, plus `error` as the generic `{ message: 'The change could not be applied' }`, as on the change itself.
        - `createdAt` string, date-time, 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

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden
- `503`: Service unavailable

## Changes

- **2026-10-30** `e987d7695ec1`: 1 info
  - added the required property `data/review/oneOf[#/components/schemas/WorkItemReview]/proposedBy` to the response with the `200` status
- **2026-10-19** `f0ed0045ce41`: 1 info
  - added the optional property `meta/excludedChains` to the response with the `200` status
- **2026-10-13** `5f4b4bf720c6`: 1 warning
  - added the new `onchain` enum value to the `data/sources/items/source` response property for the response status `200`
- **2026-10-09** `1b550dddfa46`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/euler/apis/euler-data-api-v3/changes/v3/changes/targets/price-sources/:chainId/:address/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)
