# Get selectable validators for an LST deposit

Endpoint reference for the 1delta API. Index: https://docs.1delta.io/llms.txt · every endpoint: https://docs.1delta.io/llms-full.txt

---

### GET /v1/data/vaults/validators

- operationId: `vaults-validators`
- docs: https://docs.1delta.io/1delta-api/vaults-validators/
- markdown: https://docs.1delta.io/1delta-api/vaults-validators.md
- tags: Vaults (Data)

Get selectable validators for an LST deposit

Returns the selectable **delegation targets** (validators / validator-groups / nodes) for an LST that lets — or requires — the depositor to choose where the stake is delegated. The companion to the `delegation` descriptor carried on each `lst` item in [/v1/data/vaults](https://docs.1delta.io/1delta-api/vaults/): the descriptor says *whether* a choice is needed and the deposit option key to send it back as; this endpoint returns the live set.

**The flow**

1. `/v1/data/vaults?provider=lst` → an item's `providerMeta.delegation` tells you if a choice is needed:
   - **absent** ⇒ pooled LST (Lido, Rocket Pool, …) — no picker, deposit directly.
   - `{ required, kind, optionKey, default, source }` ⇒ a selection applies.
2. If `source: "endpoint"`, call this endpoint to populate the picker.
3. Send the chosen item's `id` back to /v1/actions/vaults/deposit as the param named by `delegation.optionKey` (e.g. `validator=<id>` for Core, `validatorGroup=<id>` for Celo).

**Behaviour by LST type**

- **Required** (Core stCORE — `validator`): the picker is mandatory; preselect the `recommended` item.
- **Optional / auto** (Celo stCELO — `validatorGroup`, `default: "auto"`): the picker is optional — omit the choice and the deposit endpoint auto-resolves a valid group. Offer it as an "advanced" control.
- **Off-chain** (Solv — `poolId`, `source: "offchain"`): `items[]` is empty — the value comes from the protocol's docs, not the chain. Render an input, not a list.
- **Pooled / unknown**: `delegation: null`, empty `items[]` (200, not 404) so a UI can treat "no selection" uniformly.

**Per-item fields**

| field | meaning |
|---|---|
| `id` | the opaque value to pass back as `delegation.optionKey` (validator / group / node address) |
| `status` | `active` · `inactive` · `jailed` · `full` — only `active` targets are `selectable` |
| `selectable` | passes the protocol's eligibility (healthy + not blocked + has room) |
| `recommended` | the default pick (best capacity / health) — preselect this |
| `receivableVotes` | remaining capacity (raw underlying string), where the protocol exposes it (Celo) — show as "room left" so a user avoids a near-full target |

Only the selectable set is returned today; per-validator APR / commission are populated as clean sources are wired (absent ⇒ not yet available, never approximated).

Results are cached ~60s (validator metadata moves per epoch/round, not per block).

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `chainId` | query | string | yes | Chain ID See the `ChainId` schema for the full set of supported chains. |
| `shareToken` | query | string | yes | LST share-token address (alias: `vault`). |

**Response `200`** — `{ chainId, shareToken, delegation, start, count, items[] }`. `delegation` is null for pooled/unknown share tokens; `items[]` is empty for pooled or off-chain (Solv poolId) selections.

| Field | Type | Description |
| --- | --- | --- |
| `success` | true |  |
| `data` | object | Informational payload. `null` when the endpoint only builds calldata. |
| `actions` | null |  |

**Example response**

```json
{
  "success": true,
  "data": {}
}
```

**Response `400`** — Validation error

**Response `429`** — Rate limited. Unauthenticated callers share a per-IP budget; send an `x-api-key` header to lift it. Retry with exponential backoff.

**Response `500`** — Unexpected server error. Safe to retry with backoff.

**Response `502`** — An upstream data source or protocol origin failed (`error.code` is `ORIGIN_FAILED`). `error.details` carries the per-origin status. This is also what a missing or malformed required parameter currently returns, rather than a 400.
