Get selectable validators for an LST deposit
GET/v1/data/vaults/validators
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: 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
/v1/data/vaults?provider=lst→ an item'sproviderMeta.delegationtells you if a choice is needed:- absent ⇒ pooled LST (Lido, Rocket Pool, …) — no picker, deposit directly.
{ required, kind, optionKey, default, source }⇒ a selection applies.
- If
source: "endpoint", call this endpoint to populate the picker. - Send the chosen item's
idback to /v1/actions/vaults/deposit as the param named bydelegation.optionKey(e.g.validator=<id>for Core,validatorGroup=<id>for Celo).
Behaviour by LST type
- Required (Core stCORE —
validator): the picker is mandatory; preselect therecommendeditem. - 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, emptyitems[](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).
Plain-text reference — GET /v1/data/vaults/validators
Parameters
| Parameter | 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
| Field | Type | Description |
|---|---|---|
success | True | |
data | object | Informational payload. null when the endpoint only builds calldata. |
actions | null |
Example response
{
"success": true,
"data": {}
}
Request
Responses
- 200
- 400
- 429
- 500
- 502
{ 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.
Validation error
Rate limited. Unauthenticated callers share a per-IP budget; send an x-api-key header to lift it. Retry with exponential backoff.
Unexpected server error. Safe to retry with backoff.
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.