Skip to main content
GET
/
v2
/
portfolios
/
{portfolioId}
/
positions
curl --request GET \
  --url 'https://api.glider.fi/v2/portfolios/pf_01JWZEE2MF30KVRMRX53N88VA4/positions' \
  --header 'x-api-key: gldr_sk_your_api_key'
{
  "success": true,
  "data": {
    "portfolioId": "pf_01JWZEE2MF30KVRMRX53N88VA4",
    "totalValueUsd": "1500.500000",
    "fetchedAt": "2026-04-15T12:34:56.000Z",
    "assets": [
      {
        "assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
        "vaultAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
        "symbol": "USDC",
        "decimals": 6,
        "balance": "1500.500000",
        "balanceRaw": "1500500000",
        "priceUsd": "1.000000",
        "valueUsd": "1500.500000"
      }
    ],
    "warnings": []
  }
}
Returns the portfolio’s live positions — per-asset token balances, unit prices, and USD values — plus an aggregate totalValueUsd. Balances are read fresh per call from the indexer and chain RPC fallback, then cached upstream for 30 seconds so rapid polling from a single caller is cheap. For pure DB reads (schedule status, strategy metadata, vault addresses) use GET /v2/portfolios/{portfolioId} instead — it is significantly cheaper and safe to poll.
  • Auth: x-api-key header (required)
  • Scope: portfolios:read
Partial failures are surfaced, not raised as errors. If the upstream indexer returns fewer balances than expected (per-chain RPC timeout, missing price, blocklisted asset), the endpoint still returns 200 with whatever loaded and a structured warnings[] array describing the gap. A full failure returns totalValueUsd: "0", assets: [], and populated warnings — never a 5xx for upstream degradation. 5xx is reserved for unhandled server exceptions or a deployment where the live-value service is not wired. Multi-chain by construction. Every asset entry carries a full CAIP-19 assetId and a CAIP-10 vaultAccountId, so EVM and non-EVM holdings share one wire shape. B2B enrollment today only creates EVM vaults, but when Solana or another chain is added, the response format does not need to change — only the values inside the CAIP strings.
portfolioId
string
required
Portfolio identifier returned by POST /v2/enroll or GET /v2/portfolios.
Common error responses:
  • 400 when the path parameter is invalid
  • 401 when x-api-key header is missing or the key is invalid
  • 403 when the API key lacks the portfolios:read scope
  • 404 when the portfolio does not exist or does not belong to the tenant
  • 500 on unexpected server errors or when live-balance service is unavailable
Warning kinds (in warnings[]):
  • MISSING_VAULT — indexer has no vault record for the requested chain
  • RPC_ERROR — chain RPC timed out or errored
  • MISSING_PRICE — no USD price found for an asset
  • BLOCKLISTED_ASSET — asset is on the runtime blocklist and was skipped
  • MISSING_ASSET — asset metadata missing from the indexer
curl --request GET \
  --url 'https://api.glider.fi/v2/portfolios/pf_01JWZEE2MF30KVRMRX53N88VA4/positions' \
  --header 'x-api-key: gldr_sk_your_api_key'
{
  "success": true,
  "data": {
    "portfolioId": "pf_01JWZEE2MF30KVRMRX53N88VA4",
    "totalValueUsd": "1500.500000",
    "fetchedAt": "2026-04-15T12:34:56.000Z",
    "assets": [
      {
        "assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
        "vaultAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
        "symbol": "USDC",
        "decimals": 6,
        "balance": "1500.500000",
        "balanceRaw": "1500500000",
        "priceUsd": "1.000000",
        "valueUsd": "1500.500000"
      }
    ],
    "warnings": []
  }
}