Skip to main content
POST
/
api
/
v1
/
developer
/
wallet
/
positions
Wallet DeFi Positions
curl --request POST \
  --url https://api.allium.so/api/v1/developer/wallet/positions \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: <api-key>' \
  --data '
[
  {
    "chain": "solana",
    "address": "125Z6k4ZAxsgdG7JxrKZpwbcS1rxqpAeqM9GSCKd66Wp"
  }
]
'
import requests

url = "https://api.allium.so/api/v1/developer/wallet/positions"

payload = [
{
"chain": "solana",
"address": "125Z6k4ZAxsgdG7JxrKZpwbcS1rxqpAeqM9GSCKd66Wp"
}
]
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify([{chain: 'solana', address: '125Z6k4ZAxsgdG7JxrKZpwbcS1rxqpAeqM9GSCKd66Wp'}])
};

fetch('https://api.allium.so/api/v1/developer/wallet/positions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.allium.so/api/v1/developer/wallet/positions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
[
'chain' => 'solana',
'address' => '125Z6k4ZAxsgdG7JxrKZpwbcS1rxqpAeqM9GSCKd66Wp'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.allium.so/api/v1/developer/wallet/positions"

payload := strings.NewReader("[\n {\n \"chain\": \"solana\",\n \"address\": \"125Z6k4ZAxsgdG7JxrKZpwbcS1rxqpAeqM9GSCKd66Wp\"\n }\n]")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.allium.so/api/v1/developer/wallet/positions")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"chain\": \"solana\",\n \"address\": \"125Z6k4ZAxsgdG7JxrKZpwbcS1rxqpAeqM9GSCKd66Wp\"\n }\n]")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.allium.so/api/v1/developer/wallet/positions")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"chain\": \"solana\",\n \"address\": \"125Z6k4ZAxsgdG7JxrKZpwbcS1rxqpAeqM9GSCKd66Wp\"\n }\n]"

response = http.request(request)
puts response.read_body
{
  "items": [
    {
      "address": "0xab16781a13fe343a275f4bb5c883a64ceda52917",
      "chain": "ethereum",
      "fee_tier": "500",
      "in_range": true,
      "pool_address": "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
      "position_id": "uniswap_v3-ethereum-637818",
      "position_type": "LP",
      "protocol": "uniswap_v3",
      "token0": {
        "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "chain": "ethereum",
        "decimals": 6,
        "info": {
          "name": "USD Coin",
          "symbol": "USDC"
        },
        "object": "token",
        "type": "evm_erc20"
      },
      "token0_amount": "2100.543210",
      "token0_amount_usd": "2100.54",
      "token1": {
        "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
        "chain": "ethereum",
        "decimals": 18,
        "info": {
          "name": "Wrapped Ether",
          "symbol": "WETH"
        },
        "object": "token",
        "type": "evm_erc20"
      },
      "token1_amount": "1.234567890123456789",
      "token1_amount_usd": "2421.33",
      "total_value_usd": "4521.87",
      "unclaimed_fees_token0": "3.210000",
      "unclaimed_fees_token1": "0.001234567890123456",
      "unclaimed_fees_usd": "5.63"
    }
  ],
  "cursor": "<string>",
  "total": 123
}
{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}

Position Types

The response contains a flat array of positions in items. Each position has a position_type discriminator:
  • LP — Liquidity pool positions (Uniswap V2/V3/V4, PancakeSwap V3, SushiSwap V2/V3, Raydium CLMM, Meteora DLMM, Orca Whirlpool, and more)
  • lending — Lending/borrowing positions (Aave V3, Compound V3, Morpho Blue, Term Finance, Kamino Lend, Loopscale)
  • staked — Liquid-staking and restaking positions (Lido, Rocket Pool, EtherFi, Kelp, Mantle mETH, Swell, Benqi sAVAX, Kinetiq kHYPE, Symbiotic vaults, Pendle PT, Sanctum LSTs, Marinade, Jito, etc.)
  • regular — Simple token holdings (Solana balances, Hyperliquid spot)
  • perps — Perpetual futures positions (Hyperliquid)

Supported Chains

ChainChain IDStatus
ArbitrumArbitrumarbitrum✅ Live
AvalancheAvalancheavalanche✅ Live
BaseBasebase✅ Live
BSCBSCbsc✅ Live
CeloCelocelo✅ Live
EthereumEthereumethereum✅ Live
HyperEVMHyperEVMhyperevm✅ Live
HyperliquidHyperliquidhyperliquid✅ Live
LoopscaleLoopscaleloopscale✅ Live
MantleMantlemantle✅ Live
MegaETHMegaETHmegaeth✅ Live
MonadMonadmonad✅ Live
OptimismOptimismoptimism✅ Live
PolygonPolygonpolygon✅ Live
SolanaSolanasolana✅ Live
UnichainUnichainunichain✅ Live
X LayerX Layerx_layer✅ Live

Supported Protocols

EVM — Concentrated-liquidity LPs (NFT positions)

ProtocolChains
Uniswap V3ethereum, arbitrum, optimism, polygon, base, bsc, avalanche, celo
Uniswap V4ethereum, arbitrum, optimism, polygon, base, bsc, avalanche, unichain
PancakeSwap V3ethereum, bsc, arbitrum, polygon, base
SushiSwap V3ethereum, arbitrum, polygon, bsc
FusionX V3mantle
Pharaohavalanche
QuickSwap V3polygon

EVM — Lending

ProtocolChains
Aave V3ethereum (Main + Lido + EtherFi markets), arbitrum, optimism, polygon, base, avalanche, bsc
HyperLend (Aave V3 fork)hyperevm
Compound V3ethereum, arbitrum, base, polygon, optimism
Morpho Blueethereum, base, polygon
Term Financeethereum

EVM — V2 AMM / pool LPs

ProtocolChains
Uniswap V2ethereum
SushiSwap V2ethereum, arbitrum, polygon, bsc
Impossible Finance V2bsc
CoWSwap AMMethereum
Curve TwoCrypto (Yield Basis)ethereum
Trader Joe V1avalanche
Valantis Sovereignhyperevm

EVM — Yield & restaking

ProtocolChains
Pendle (PT tokens)ethereum, arbitrum
Symbiotic vaultsethereum

EVM — Liquid staking tokens (LSTs)

ChainLSTs
ethereumLido (wstETH, stETH), Rocket Pool (rETH), Coinbase (cbETH), Frax (sfrxETH), Mantle (mETH), Swell (swETH), EtherFi (weETH), Kelp (rsETH), Aave (stkAAVE, stkGHO), SushiBar (xSUSHI)
baseLido (wstETH), Rocket Pool (rETH), Coinbase (cbETH), EtherFi (weETH)
arbitrumLido (wstETH), Rocket Pool (rETH), EtherFi (weETH)
optimismLido (wstETH), Rocket Pool (rETH)
polygonLido (wstETH)
avalancheBenqi (sAVAX)
hyperevmKinetiq (kHYPE)

Solana

CategoryProtocols
LP positionsRaydium CLMM, Meteora DLMM, Orca Whirlpool (V1 + V2), Byreal CLMM
Vault sharesKamino Vault (live strategies, refreshed hourly from Kamino API), Jupiter LP (JLP)
LendingKamino Lend
Liquid stakingMarinade (mSOL), Jito (JitoSOL), BlazeStake (bSOL), Lido (stSOL), Sanctum INF, OKX (OKSOL), Jupiter (JupSOL), plus the full Sanctum LST registry (refreshed hourly)

Hyperliquid

Full account state via Hyperliquid API — perps, spot holdings, and staking. No sub-protocols.

Loopscale

Solana-based lending protocol — exposed as its own chain identifier.

Important Notes

  • USD value fields (total_value_usd, token0_amount_usd, staked_amount_usd, etc.) may return null when price data is temporarily unavailable
  • Positions are sorted by type priority (lending > LP > staked > regular), then by USD value descending
  • Each entry in the request array is an address/chain pair — to query the same address on multiple chains, include separate entries for each chain
  • Up to 5 address/chain pairs may be submitted per request
  • Use the returned cursor query parameter to paginate through large result sets
  • LST and Kamino vault registries are refreshed in the background, so new tokens become recognized without a deploy

Authorizations

X-API-KEY
string
header
required

Query Parameters

limit
integer
default:25

Max number of positions returned. Default is 25.

Required range: x <= 100
cursor
string

Cursor to request the next page of results.

Body

application/json
Required array length: 1 - 5 elements
chain
string
required

Lowercase chain name

address
string
required

Wallet address

Response

Successful Response

Response envelope for wallet positions with pagination support.

items
(LPPosition · object | LendingPosition · object | VaultPosition · object | StakedPosition · object | PerpPosition · object | RegularPosition · object)[]
required

List of DeFi positions across all requested wallets

Liquidity provider position (e.g., Uniswap V3, Raydium CLMM, Meteora DLMM). Concentrated or standard AMM positions.

Example:
{
"address": "0xab16781a13fe343a275f4bb5c883a64ceda52917",
"chain": "ethereum",
"fee_tier": "500",
"in_range": true,
"pool_address": "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
"position_id": "uniswap_v3-ethereum-637818",
"position_type": "LP",
"protocol": "uniswap_v3",
"token0": {
"address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"chain": "ethereum",
"decimals": 6,
"info": { "name": "USD Coin", "symbol": "USDC" },
"object": "token",
"type": "evm_erc20"
},
"token0_amount": "2100.543210",
"token0_amount_usd": "2100.54",
"token1": {
"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"chain": "ethereum",
"decimals": 18,
"info": { "name": "Wrapped Ether", "symbol": "WETH" },
"object": "token",
"type": "evm_erc20"
},
"token1_amount": "1.234567890123456789",
"token1_amount_usd": "2421.33",
"total_value_usd": "4521.87",
"unclaimed_fees_token0": "3.210000",
"unclaimed_fees_token1": "0.001234567890123456",
"unclaimed_fees_usd": "5.63"
}
cursor
string | null

Pagination cursor for the next page of results

total
integer | null

Total number of positions across all pages