curl --request GET \
--url 'https://api.glider.fi/v2/portfolios/a1b2c3d4/positions' \
--header 'x-api-key: gldr_sk_your_api_key'
const response = await fetch(
"https://api.glider.fi/v2/portfolios/a1b2c3d4/positions",
{ headers: { "x-api-key": "gldr_sk_your_api_key" } },
);
const data = await response.json();
if (data.data.warnings.length > 0) {
// Show a stale-data banner; the response is still usable for whatever loaded.
}
{
"success": true,
"data": {
"portfolioId": "a1b2c3d4",
"totalValueUsd": "1525.500000",
"inTransit": {
"totalUsd": "25.000000",
"items": [
{
"sourceAssetId": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913:8453",
"destinationChainId": 42161,
"amountRaw": "25000000",
"valueUsd": "25.000000"
}
]
},
"fetchedAt": "2026-04-15T12:34:56.000Z",
"smartAccounts": [
{ "accountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058" }
],
"assets": [
{
"assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"smartAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
"symbol": "USDC",
"decimals": 6,
"balance": "1500.500000",
"balanceRaw": "1500500000",
"priceUsd": "1.000000",
"valueUsd": "1500.500000"
}
],
"warnings": []
}
}
{
"success": true,
"data": {
"portfolioId": "a1b2c3d4",
"totalValueUsd": "1000.000000",
"inTransit": {
"totalUsd": "0",
"items": []
},
"fetchedAt": "2026-04-15T12:34:56.000Z",
"smartAccounts": [
{ "accountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058" }
],
"assets": [
{
"assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"smartAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
"symbol": "USDC",
"decimals": 6,
"balance": "1000.000000",
"balanceRaw": "1000000000",
"priceUsd": "1.000000",
"valueUsd": "1000.000000"
}
],
"warnings": [
{ "kind": "RPC_ERROR", "message": "chain 1 RPC timeout" }
]
}
}
{
"success": false,
"error": {
"code": "API_006",
"message": "Portfolio with ID a1b2c3d4 not found"
}
}
Portfolio Data
Get Portfolio Positions
Returns real-time per-asset token balances and USD values for a portfolio.
GET
/
v2
/
portfolios
/
{portfolioId}
/
positions
curl --request GET \
--url 'https://api.glider.fi/v2/portfolios/a1b2c3d4/positions' \
--header 'x-api-key: gldr_sk_your_api_key'
const response = await fetch(
"https://api.glider.fi/v2/portfolios/a1b2c3d4/positions",
{ headers: { "x-api-key": "gldr_sk_your_api_key" } },
);
const data = await response.json();
if (data.data.warnings.length > 0) {
// Show a stale-data banner; the response is still usable for whatever loaded.
}
{
"success": true,
"data": {
"portfolioId": "a1b2c3d4",
"totalValueUsd": "1525.500000",
"inTransit": {
"totalUsd": "25.000000",
"items": [
{
"sourceAssetId": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913:8453",
"destinationChainId": 42161,
"amountRaw": "25000000",
"valueUsd": "25.000000"
}
]
},
"fetchedAt": "2026-04-15T12:34:56.000Z",
"smartAccounts": [
{ "accountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058" }
],
"assets": [
{
"assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"smartAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
"symbol": "USDC",
"decimals": 6,
"balance": "1500.500000",
"balanceRaw": "1500500000",
"priceUsd": "1.000000",
"valueUsd": "1500.500000"
}
],
"warnings": []
}
}
{
"success": true,
"data": {
"portfolioId": "a1b2c3d4",
"totalValueUsd": "1000.000000",
"inTransit": {
"totalUsd": "0",
"items": []
},
"fetchedAt": "2026-04-15T12:34:56.000Z",
"smartAccounts": [
{ "accountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058" }
],
"assets": [
{
"assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"smartAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
"symbol": "USDC",
"decimals": 6,
"balance": "1000.000000",
"balanceRaw": "1000000000",
"priceUsd": "1.000000",
"valueUsd": "1000.000000"
}
],
"warnings": [
{ "kind": "RPC_ERROR", "message": "chain 1 RPC timeout" }
]
}
}
{
"success": false,
"error": {
"code": "API_006",
"message": "Portfolio with ID a1b2c3d4 not found"
}
}
Returns the portfolio’s live positions — per-asset balances, unit prices,
and USD values — plus an aggregate
Common error responses:
totalValueUsd. During an open bridge,
totalValueUsd includes the inTransit.totalUsd component so portfolio value
does not dip while funds move between chains; use inTransit.items[] to
reconcile the component that is not yet represented as a settled destination
asset row. Responses are cached for up to 30 seconds, so rapid polling from a
single caller is cheap. For schedule state (nextDueAt, lastRebalanceAt,
status), strategy metadata, and smart account addresses without live
balances, use GET /v2/portfolios/{portfolioId} instead.
One shape, every asset class. The assets[] array uses the same row
shape (assetId, symbol, decimals, balance, balanceRaw,
priceUsd, valueUsd) for ERC-20 tokens, SPL tokens, and tokenized
real-world assets (equities, treasuries) when the underlying allocation
includes them. Symbol, decimals, and price come from Glider’s upstream
data providers and are passed through unchanged.
- Auth:
x-api-keyheader (required) - Scope:
portfolios:read
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 transient issues.
Multi-chain by construction. Every asset entry carries a full CAIP-19
assetId and a CAIP-10 smartAccountId, so EVM and non-EVM holdings share
one wire shape.
string
required
Portfolio identifier returned by
POST /v2/enroll or GET /v2/portfolios.400when the path parameter is invalid401whenx-api-keyheader is missing or the key is invalid403when the API key lacks theportfolios:readscope404when the portfolio does not exist or does not belong to the tenant500on unexpected server errors
warnings[]):
MISSING_SMART_ACCOUNT— no smart account is known for the requested chainRPC_ERROR— chain RPC timed out or erroredMISSING_PRICE— no USD price found for an assetBLOCKLISTED_ASSET— asset is blocked and was skippedMISSING_ASSET— asset metadata is unavailableIN_TRANSIT_READ_FAILED— bridge in-transit value could not be read
curl --request GET \
--url 'https://api.glider.fi/v2/portfolios/a1b2c3d4/positions' \
--header 'x-api-key: gldr_sk_your_api_key'
const response = await fetch(
"https://api.glider.fi/v2/portfolios/a1b2c3d4/positions",
{ headers: { "x-api-key": "gldr_sk_your_api_key" } },
);
const data = await response.json();
if (data.data.warnings.length > 0) {
// Show a stale-data banner; the response is still usable for whatever loaded.
}
{
"success": true,
"data": {
"portfolioId": "a1b2c3d4",
"totalValueUsd": "1525.500000",
"inTransit": {
"totalUsd": "25.000000",
"items": [
{
"sourceAssetId": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913:8453",
"destinationChainId": 42161,
"amountRaw": "25000000",
"valueUsd": "25.000000"
}
]
},
"fetchedAt": "2026-04-15T12:34:56.000Z",
"smartAccounts": [
{ "accountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058" }
],
"assets": [
{
"assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"smartAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
"symbol": "USDC",
"decimals": 6,
"balance": "1500.500000",
"balanceRaw": "1500500000",
"priceUsd": "1.000000",
"valueUsd": "1500.500000"
}
],
"warnings": []
}
}
{
"success": true,
"data": {
"portfolioId": "a1b2c3d4",
"totalValueUsd": "1000.000000",
"inTransit": {
"totalUsd": "0",
"items": []
},
"fetchedAt": "2026-04-15T12:34:56.000Z",
"smartAccounts": [
{ "accountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058" }
],
"assets": [
{
"assetId": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"smartAccountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058",
"symbol": "USDC",
"decimals": 6,
"balance": "1000.000000",
"balanceRaw": "1000000000",
"priceUsd": "1.000000",
"valueUsd": "1000.000000"
}
],
"warnings": [
{ "kind": "RPC_ERROR", "message": "chain 1 RPC timeout" }
]
}
}
{
"success": false,
"error": {
"code": "API_006",
"message": "Portfolio with ID a1b2c3d4 not found"
}
}