---
title: "Preview the Layer 1 verdict of a Earn vault, for the live configuration or a proposed one"
method: POST
path: "/v3/earn/vaults/{chainId}/{address}/assessment/preview"
tags: ["Labels"]
---

# Preview the Layer 1 verdict of a Earn vault, for the live configuration or a proposed one

`POST /v3/earn/vaults/{chainId}/{address}/assessment/preview`

## Request

- Base URL: `https://v3.euler.finance`
- URL: `https://v3.euler.finance/v3/earn/vaults/{chainId}/{address}/assessment/preview`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Answers what a fresh Layer 1 check would say, without storing anything. With an empty body
(or no body) it is a fresh check of the live vault under its policy family; with
`overrides` it is the EVK policy judging the live snapshot with the proposed configuration
applied: caps, LTV rows (change, add, remove), the interest rate model (its rates re-probed
with the vault impersonated at the pinned block), router resolutions (`resolvedVaults`),
oracle routes (base to adapter; a proposed adapter's verdict comes from the registry when
it knows it and from the evaluate-only adapter check when it does not, and every quote a
changed route or resolution answers is simulated through the proposed adapter at the pinned
block, one unit of the base converted through the resolved vaults the way the router
converts it) and the hook configuration. The answer names the findings whose verdict
differs from the stored assessment (`changed`), the status the vault would land on
(`configStatusIfApplied`, from `currentConfigStatus` and the outcome) and, in
`notSimulated`, the findings left unknown because their simulation could not run (the
chain unreachable for a quote, the evaluate-only adapter check refused), each naming the
reason in its `observed`. Platform rule exemptions apply as the
stored check applies them. One vault is previewed at most 6 times per minute (429 with
`Retry-After`) and the reads get 12 seconds (504). Accepts a platform session or a
API key holding `assessments:evaluate`; a curator session is never enough. Overrides are refused for an Earn vault (422); an empty body previews the live vault under the Earn policy.

Needs the `assessments` chain capability; a chain without it answers 404
`CHAIN_CAPABILITY_DISABLED`.

## Path parameters

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

## Request body

- VaultConfigPreviewRequest
  - `overrides` VaultConfigOverrides: A proposed EVK vault configuration as changes to the live one. Every kind is optional; addresses are 0x-prefixed, LTVs and caps are decimal integer strings in the units the assessment reports them (basis points for LTVs, resolved asset units for caps).
    - `caps` object
      - `supplyCap` string
      - `borrowCap` string
    - `collaterals` object[]
      - `collateral` string, required
      - `borrowLTV` string
      - `liquidationLTV` string
      - `initialLiquidationLTV` string
      - `targetTimestamp` integer
      - `rampDuration` integer
      - `remove` boolean: Drop the collateral row instead of changing it.
    - `interestRateModel` object
      - `address` string, required
    - `resolvedVaults` object[]: `govSetResolvedVault(vault, resolved)` on the vault's router: the entry the lens would report after it (the vault, its asset, the unit of account, the unwrap chain) is added or removed, so a route staged in the same batch on the vault's asset prices it. A vault with an adapter configured for itself keeps answering through it either way, as the router reads the configured pair before any resolution.
      - `vault` string, required
      - `resolved` boolean, required
    - `oracleRoutes` object[]
      - `base` string, required
      - `quote` string: Defaults to the vault's unit of account.
      - `adapter` string: Required unless `remove` is true.
      - `remove` boolean
    - `hooks` object
      - `hookTarget` string
      - `hookedOperations` object
        - `deposit` boolean
        - `mint` boolean
        - `withdraw` boolean
        - `redeem` boolean
        - `transfer` boolean
        - `skim` boolean
        - `borrow` boolean
        - `repay` boolean
        - `repayWithShares` boolean
        - `pullDebt` boolean
        - `convertFees` boolean
        - `liquidate` boolean
        - `flashloan` boolean
        - `touch` boolean
        - `vaultStatusCheck` boolean

## Response `200`

The preview; `persisted` is always false.

- object
  - `data` union, required: What a fresh Layer 1 check would say, in the shape of the vault's kind: `family` names the variant. EVK previews may carry applied overrides and findings whose simulation could not run; Earn and Securitize previews accept no overrides and answer both lists empty. Each variant lists the finding keys its policy can produce.
    - VaultAssessmentPreviewEvk: The fields every preview answers, whatever the vault kind.
      - `chainId` integer, required
      - `vaultAddress` string, required
      - `persisted` false, required
      - `family` 'evk', required
      - `policyId` 'euler-evk', required
      - `policyVersion` integer, required
      - `blockNumber` string, required
      - `blockHash` string, required
      - `evaluatedAt` string, date-time, required
      - `currentConfigStatus` 'unverified' | 'pending' | 'verified' | 'suspended' | 'revoked', required: The stored Layer 1 status, `unverified` when nothing is stored yet.
      - `configStatusIfApplied` 'unverified' | 'pending' | 'verified' | 'suspended' | 'revoked', required: The status the stored check would write from `currentConfigStatus` and the previewed outcome.
      - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
      - `localOutcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
      - `checksStatus` 'positive' | 'warning' | 'negative', nullable, required: What the advisory findings would say if this configuration were applied. Same axis as `checksStatus` on the stored assessment.
      - `summary` object, required
        - `passed` integer, required
        - `failed` integer, required
        - `unknown` integer, required
        - `notApplicable` integer, required
      - `findings` object[], required
        - `key` string, required
        - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
        - `required` boolean, required
        - `description` string, required
        - `expected` unknown
        - `observed` unknown
        - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
          - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
          - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
          - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
          - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
        - `exempted` boolean
      - `changed` VaultAssessmentFindingChange[], required: Findings whose verdict differs from the stored assessment, added and removed ones included.
        - `key` string, required
        - `before` VaultConfigFinding, required: One Layer 1 finding, as in `VaultConfigAssessmentContext.findings`.
          - `key` string, required
          - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
          - `required` boolean, required
          - `description` string, required
          - `expected` unknown
          - `observed` unknown
          - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
            - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
            - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
            - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
            - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
          - `exempted` boolean
        - `after` VaultConfigFinding, required: One Layer 1 finding, as in `VaultConfigAssessmentContext.findings`.
          - `key` string, required
          - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
          - `required` boolean, required
          - `description` string, required
          - `expected` unknown
          - `observed` unknown
          - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
            - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
            - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
            - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
            - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
          - `exempted` boolean
      - `appliedOverrides` string[], required: One line per override applied, in the order applied.
      - `notSimulated` string[], required: Finding keys left unknown because their simulation could not run: a quote the probe could not reach, or `oracle.adapters-recognized` when the evaluate-only check refused a proposed adapter. Each finding names the reason in `observed`; the list is empty when every change the batch makes was simulated.
    - VaultAssessmentPreviewEarn: The fields every preview answers, whatever the vault kind.
      - `chainId` integer, required
      - `vaultAddress` string, required
      - `persisted` false, required
      - `family` 'earn', required
      - `policyId` 'euler-earn', required
      - `policyVersion` integer, required
      - `blockNumber` string, required
      - `blockHash` string, required
      - `evaluatedAt` string, date-time, required
      - `currentConfigStatus` 'unverified' | 'pending' | 'verified' | 'suspended' | 'revoked', required: The stored Layer 1 status, `unverified` when nothing is stored yet.
      - `configStatusIfApplied` 'unverified' | 'pending' | 'verified' | 'suspended' | 'revoked', required: The status the stored check would write from `currentConfigStatus` and the previewed outcome.
      - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
      - `localOutcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
      - `checksStatus` 'positive' | 'warning' | 'negative', nullable, required: What the advisory findings would say if this configuration were applied. Same axis as `checksStatus` on the stored assessment.
      - `summary` object, required
        - `passed` integer, required
        - `failed` integer, required
        - `unknown` integer, required
        - `notApplicable` integer, required
      - `findings` object[], required
        - `key` string, required
        - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
        - `required` boolean, required
        - `description` string, required
        - `expected` unknown
        - `observed` unknown
        - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
          - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
          - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
          - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
          - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
        - `exempted` boolean
      - `changed` VaultAssessmentFindingChange[], required: Findings whose verdict differs from the stored assessment, added and removed ones included.
        - `key` string, required
        - `before` VaultConfigFinding, required: One Layer 1 finding, as in `VaultConfigAssessmentContext.findings`.
          - `key` string, required
          - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
          - `required` boolean, required
          - `description` string, required
          - `expected` unknown
          - `observed` unknown
          - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
            - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
            - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
            - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
            - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
          - `exempted` boolean
        - `after` VaultConfigFinding, required: One Layer 1 finding, as in `VaultConfigAssessmentContext.findings`.
          - `key` string, required
          - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
          - `required` boolean, required
          - `description` string, required
          - `expected` unknown
          - `observed` unknown
          - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
            - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
            - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
            - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
            - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
          - `exempted` boolean
      - `appliedOverrides` string[], required: Always empty; this vault kind accepts no overrides.
      - `notSimulated` string[], required: Always empty; nothing is simulated for this vault kind.
    - VaultAssessmentPreviewSecuritize: The fields every preview answers, whatever the vault kind.
      - `chainId` integer, required
      - `vaultAddress` string, required
      - `persisted` false, required
      - `family` 'securitize', required
      - `policyId` 'euler-securitize', required
      - `policyVersion` integer, required
      - `blockNumber` string, required
      - `blockHash` string, required
      - `evaluatedAt` string, date-time, required
      - `currentConfigStatus` 'unverified' | 'pending' | 'verified' | 'suspended' | 'revoked', required: The stored Layer 1 status, `unverified` when nothing is stored yet.
      - `configStatusIfApplied` 'unverified' | 'pending' | 'verified' | 'suspended' | 'revoked', required: The status the stored check would write from `currentConfigStatus` and the previewed outcome.
      - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
      - `localOutcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
      - `checksStatus` 'positive' | 'warning' | 'negative', nullable, required: What the advisory findings would say if this configuration were applied. Same axis as `checksStatus` on the stored assessment.
      - `summary` object, required
        - `passed` integer, required
        - `failed` integer, required
        - `unknown` integer, required
        - `notApplicable` integer, required
      - `findings` object[], required
        - `key` string, required
        - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
        - `required` boolean, required
        - `description` string, required
        - `expected` unknown
        - `observed` unknown
        - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
          - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
          - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
          - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
          - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
        - `exempted` boolean
      - `changed` VaultAssessmentFindingChange[], required: Findings whose verdict differs from the stored assessment, added and removed ones included.
        - `key` string, required
        - `before` VaultConfigFinding, required: One Layer 1 finding, as in `VaultConfigAssessmentContext.findings`.
          - `key` string, required
          - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
          - `required` boolean, required
          - `description` string, required
          - `expected` unknown
          - `observed` unknown
          - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
            - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
            - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
            - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
            - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
          - `exempted` boolean
        - `after` VaultConfigFinding, required: One Layer 1 finding, as in `VaultConfigAssessmentContext.findings`.
          - `key` string, required
          - `outcome` 'pass' | 'fail' | 'unknown' | 'not_applicable', required
          - `required` boolean, required
          - `description` string, required
          - `expected` unknown
          - `observed` unknown
          - `cause` object: Why this is not a pass. On `fail` and `unknown` it is the failure; on `not_applicable` it is why the rule did not run, and its absence on an `evidence.*` row is what separates a skipped check from an observation. The rule key alone cannot say: `hooks.zero-or-trusted` fails either because the hook target is untrusted or because a zero target disabled an exit operation, and those have opposite remedies. Switch on `code`; `subject` is the value to act on; `summary` is one sentence naming it, and is what `configReason` carries for the blocking finding.
            - `code` 'deposit-only-vault' | 'feed-revert-tolerated' | 'curator-unset' | 'owner-renounced' | 'vault-lens-reverted' | 'not-a-recognized-evault' | 'deployment-record-unavailable' | 'liability-asset-is-evault' | 'evc-compatible-asset-flag-set' | 'hook-target-untrusted' | 'exit-operations-disabled' | 'oracle-unset' | 'unit-of-account-unset' | 'interest-rate-model-unset' | 'router-not-recognized' | 'router-has-fallback' | 'router-config-unreadable' | 'route-has-no-unit-of-account-adapter' | 'collateral-route-skips-evault-asset' | 'quote-reverted' | 'quote-returned-zero' | 'pyth-feed-discontinued' | 'pyth-update-unconfirmed' | 'pyth-feed-unattributed' | 'pyth-receiver-incompatible' | 'session-feed-tolerance-withdrawn' | 'quote-unavailable' | 'interest-rate-model-reverts' | 'interest-rate-model-not-probed' | 'borrow-apy-above-bound' | 'router-governor-outside-entity' | 'deprecated-governor-contract' | 'timelock-too-short' | 'liquidation-discount-out-of-range' | 'liquidation-cool-off-out-of-range' | 'collateral-ltv-out-of-range' | 'dependency-not-verified' | 'dependency-not-assessed' | 'route-adapter-unrecognized' | 'route-adapter-unassessed' | 'route-adapter-checks-failing' | 'dependency-unclaimed' | 'dependency-hidden' | 'dependency-deprecated' | 'governing-address-unregistered' | 'vault-paused' | 'compliance-service-unresolvable' | 'compliance-probe-unavailable', required
            - `subject` string, nullable, required: The one value to act on -- an address, or a formatted parameter value. Null when the rule names none.
            - `summary` string, required: One sentence naming the value that failed, not the requirement it failed.
            - `remedy` 'have-euler-trust-the-hook-target' | 'restore-the-disabled-exit-operations' | 'make-the-vault-deposit-only' | 'set-an-interest-rate-model' | 'use-a-recognized-euler-router' | 'remove-the-router-fallback' | 'add-the-missing-oracle-route' | 'replace-the-oracle-adapter' | 'review-the-oracle-adapter' | 'move-router-governance-to-the-entity' | 'replace-the-deprecated-governor' | 'change-the-vault-parameter' | 'wait-for-the-dependency-verdict' | 'wait-for-euler-to-check-again' | 'unpause-the-vault' | 'remove-the-dependency' | 'register-the-address' | 'contact-euler', nullable, required: Which way out applies. Null when the answer is not the reader's to act on.
          - `exempted` boolean
      - `appliedOverrides` string[], required: Always empty; this vault kind accepts no overrides.
      - `notSimulated` string[], required: Always empty; nothing is simulated for this vault kind.

## Other responses

- `400`: Malformed JSON, or an invalid address in the path.
- `401`: Unauthorized
- `403`: A key without `assessments:evaluate`.
- `404`: The chain is not served (`CHAIN_NOT_SUPPORTED`), the chain does not run assessments (`CHAIN_CAPABILITY_DISABLED`), or no Layer 1 policy family matches the vault (`VAULT_NOT_FOUND`).
- `413`: Request body too large
- `415`: Unsupported media type
- `422`: The body fails validation (`error.details.issues`), or overrides were sent for a vault outside the EVK family (`error.details.family`).
- `429`: The vault was previewed more than 6 times in the last minute; `Retry-After` says when to retry.
- `500`: Internal server error
- `503`: Service unavailable
- `504`: The on-chain reads did not finish within the 12-second budget (`UPSTREAM_TIMEOUT`).

## Changes

- **2026-10-25** `d880a68ad3e2`: 24 warning
  - added the new `deprecated-governor-contract` enum value to the `data/oneOf[#/components/schemas/VaultAssessmentPreviewEarn]/allOf[#/components/schemas/VaultAssessmentPreviewBase]/changed/items/after/allOf[#/components/schemas/VaultConfigFinding]/cause/code` response property for the response status `200`
  - added the new `deprecated-governor-contract` enum value to the `data/oneOf[#/components/schemas/VaultAssessmentPreviewEarn]/allOf[#/components/schemas/VaultAssessmentPreviewBase]/changed/items/before/allOf[#/components/schemas/VaultConfigFinding]/cause/code` response property for the response status `200`
  - added the new `deprecated-governor-contract` enum value to the `data/oneOf[#/components/schemas/VaultAssessmentPreviewEarn]/allOf[#/components/schemas/VaultAssessmentPreviewBase]/findings/items/cause/code` response property for the response status `200`
  - added the new `deprecated-governor-contract` enum value to the `data/oneOf[#/components/schemas/VaultAssessmentPreviewEarn]/allOf[subschema #2]/findings/items/allOf[#/components/schemas/VaultConfigFinding]/cause/code` response property for the response status `200`
  - …20 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/euler/apis/euler-data-api-v3/changes/v3/earn/vaults/:chainId/:address/assessment/preview/post.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)
