An account's earn positions, every chain, both venue kinds
GET/v1/data/earn/positions
Lending accounts (one row per chain × lender, markets as legs) and vault share balances (one row each), with totals. A lender with isolated sub-accounts (Euler, Dolomite, Fluid / Jupiter Lend NFTs, Kamino obligations …) lists each in subAccounts[]: accountId is what the action routes take, label the venue's own name where it has one, accountAddress the address it acts as on chain, and unsupported — when set — why the action routes cannot build for it (a Kamino Multiply / Leverage obligation).
Every position asset (legs[].asset on lending rows, asset on vault rows) carries issuer, issuerExposures (wrappers), desk, denomination, assetClass and underlyingTicker, stamped from the token map exactly as on /v1/data/earn rows, so a holding groups under the same desk as the listing row it came from.
On a BORROW leg the asset's desk is whose money is OWED — a debt is not an exposure; group a loop by its collateral.
Plain-text reference — GET /v1/data/earn/positions
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
chainIds | query | string | yes | CSV of chain ids (aliases chainId, chains). See the ChainId schema for the full set of supported chains. |
account | query | string | yes | A 0x address (EVM chains) or a base58 pubkey (solana). Chains the account cannot exist on are dropped; none left is a 400. |
venueKind | query | lending, vault | no | Fetch one half only. |
lenders | query | string | no | CSV — narrows the lending half. See the LenderId schema for the full set of accepted values. |
vaults | query | string | no | CSV of vault addresses — skips vault discovery for those chains. |
includeZero | query | boolean | no | Keep dust and zero-share rows. |
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
The positions envelope: items, totals, sources, partial?, stale?. Position assets carry issuer, issuerExposures, desk, denomination.
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.