---
title: "Earn vault batch"
method: POST
path: "/v3/earn/vaults/batch"
tags: ["Earn"]
---

# Earn vault batch

`POST /v3/earn/vaults/batch`

Returns earn vault summaries for explicit addresses on one chain.
Pass `include: ["strategies"]` to add the same strategy objects
returned by earn vault detail.
Response preserves request order after address deduplication.
Request cap: 1000 vault addresses and 256 KiB of JSON body.

## Request body

- EarnVaultBatchRequest
  - `chainId` integer, required
  - `addresses` string[], required
  - `include` string[] — Optional related resources to expand for every returned vault.

## Response `200`

Earn vault batch

- EarnVaultBatchResponse
  - `data` EarnVaultBatchItem[]
    - `chainId` integer
    - `address` string
    - `name` string
    - `symbol` string
    - `decimals` integer
    - `asset` AssetRef
      - `address` string
      - `symbol` string
      - `decimals` integer
      - `name` string, nullable
    - `totalAssets` string — Raw underlying asset amount as a bigint string.
    - `totalShares` string — Raw vault share supply as a bigint string.
    - `lostAssets` string — Raw lost asset amount as a bigint string.
    - `exchangeRate` string — Raw exchange rate as a bigint string.
    - `totalSupplyUsd` number — Market USD number for total Earn vault assets.
    - `availableAssets` string — Raw underlying asset amount as a bigint string.
    - `availableAssetsUsd` number — Market USD number for currently available assets.
    - `supplyApy` number, nullable — Public supply APY as a percent number.
    - `apyCurrent` number, nullable — Current public APY as a percent number.
    - `apy7d` number, nullable — Seven-day public APY as a percent number, using an anchor at or up to 15 minutes before the exact cutoff. Null when no qualifying local or archive anchor is available.
    - `apy30d` number, nullable — Thirty-day public APY as a percent number, using an anchor at or up to 15 minutes before the exact cutoff. Null when no qualifying local or archive anchor is available.
    - `apy90d` number, nullable — Ninety-day public APY as a percent number, using an anchor at or up to 15 minutes before the exact cutoff. Null when no qualifying local or archive anchor is available.
    - `utilization` number — Utilization ratio number.
    - `strategyCount` integer
    - `snapshotTimestamp` string, date-time
    - `createdAt` string, date-time
    - `visibility` VaultVisibilitySummary — Platform visibility verdict for discovery surfaces. Warning stays discoverable with a badge; the per-surface booleans carve out lend/borrow discovery individually. A side is explorable when `status` is `visible` or `warning` and nothing hides that side: a platform override, a curator listing flag on the vault or its product, or deprecation (which hides by default unless a curator re-lists with a `false` flag).
      - `status` 'visible' | 'warning' | 'hidden' | 'pending_review', required
      - `explorableLend` boolean, required
      - `explorableBorrow` boolean, required
      - `explorableLendDecidedBy` 'platform' | 'curator' | 'curator-product' | 'deprecated' | 'none' — Who decided one discovery side's listing, nearest explicit decision first: `platform` (assessment override), `curator` (vault-level flag), `curator-product` (product-level flag), `deprecated` (resolved deprecation with no curator flag), or `none` (shown, nothing decided).
      - `explorableBorrowDecidedBy` 'platform' | 'curator' | 'curator-product' | 'deprecated' | 'none' — Who decided one discovery side's listing, nearest explicit decision first: `platform` (assessment override), `curator` (vault-level flag), `curator-product` (product-level flag), `deprecated` (resolved deprecation with no curator flag), or `none` (shown, nothing decided).
      - `decidedBy` 'config-revoked' | 'consistency-revoked' | 'config-suspended' | 'consistency-suspended' | 'config-failed' | 'not-explorable' | 'unassessable' | 'deprecated' | 'unclaimed' | 'unassigned' | 'verified' | 'awaiting-verification', required — Which resolution rule decided the status. `config-*` codes come from Layer 1 (configuration safety), `consistency-*` codes from Layer 2 (label consistency). `unclaimed` and `unassigned` are label gates. A verified or unassessable non-escrow vault stays in `pending_review` until an entity claims it, and EVK and Securitize vaults additionally require assignment to a product. Escrow vaults bypass both label gates.
      - `reason` string, nullable, required — Display-appropriate explanation for the decision (deprecation reason, failing check), when one is authored.
    - `strategies` EarnStrategy[]
      - `address` string
      - `vaultType` 'evk' | 'earn' | 'securitize' | 'unknown'
      - `symbol` string, nullable
      - `name` string, nullable
      - `decimals` integer, nullable
      - `suppliedAssets` string — Raw underlying asset amount supplied to the strategy.
      - `withdrawnAssets` string — Raw underlying asset amount withdrawn from the strategy.
      - `allocatedAssets` string — Raw underlying asset amount allocated to the strategy.
      - `allocatedAssetsUsd` number — Market USD number for assets allocated to this strategy.
      - `availableAssets` string — Raw underlying asset amount available from the strategy.
      - `inSupplyQueue` boolean
      - `inWithdrawQueue` boolean
      - `supplyQueueIndex` integer, nullable
      - `withdrawQueueIndex` integer, nullable
      - `allocationCap` EarnStrategyAllocationCap
        - `current` string — Raw allocation cap as a bigint string in underlying asset units.
        - `pending` string — Pending raw allocation cap as a bigint string in underlying asset units.
        - `pendingValidAt` string, date-time
      - `removableAt` string, date-time
      - `status` 'active' | 'inactive' | 'pending_removal'
      - `lastRebalancedAt` string, date-time, nullable
  - `meta` EarnVaultBatchMeta
    - `count` integer
    - `requested` integer
    - `notFound` string[]
    - `timestamp` string, date-time
    - `chainId` string

## Other responses

- `400` — Bad request
- `404` — Not found
- `413` — Request body too large
- `415` — Unsupported media type
- `429` — Rate limited
- `500` — Internal server error

## Changes

- **2026-09-08** `468b5fe507eb` — 1 warning, 2 info
  - added the new `unassigned` enum value to the `data/items/allOf[#/components/schemas/EarnVaultSummary]/visibility/decidedBy` response property for the response status `200`
  - added the optional property `data/items/allOf[#/components/schemas/EarnVaultSummary]/visibility/explorableBorrowDecidedBy` to the response with the `200` status
  - added the optional property `data/items/allOf[#/components/schemas/EarnVaultSummary]/visibility/explorableLendDecidedBy` to the response with the `200` status

[Change history](https://skmtc.dev/euler/apis/euler-data-api-v3/changes/v3/earn/vaults/batch/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/1cbef949e74f?raw)
