Skip to main content
POST
/
v2
/
pnl
/
wallets
/
{wallet}
/
positions
/
batch
SDK
import { Client } from '@solana-tracker/data-api';

const client = new Client({ apiKey: 'YOUR_API_KEY' });

const data = await client.batchPnlV2WalletTokenPositions('FbMxP3GVq8TQ36nbYgx4NP9iygMpwAwFWJwW81ioCiSF', ['6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN']);
curl --request POST \
--url https://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"tokens": [
"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump",
"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump",
"CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS"
]
}
'
import requests

url = "https://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch"

payload = { "tokens": ["38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump", "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump", "CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS"] }
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({
tokens: [
'38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump',
'84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump',
'CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS'
]
})
};

fetch('https://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch', 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://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch",
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([
'tokens' => [
'38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump',
'84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump',
'CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS'
]
]),
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://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch"

payload := strings.NewReader("{\n \"tokens\": [\n \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\",\n \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\",\n \"CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS\"\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://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tokens\": [\n \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\",\n \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\",\n \"CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS\"\n ]\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://data.solanatracker.io/v2/pnl/wallets/{wallet}/positions/batch")

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 \"tokens\": [\n \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\",\n \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\",\n \"CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS\"\n ]\n}"

response = http.request(request)
puts response.read_body
{
  "wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
  "identity": {
    "name": "Cented",
    "twitter": "@Cented7",
    "avatar": "https://kol-avatar.solanatracker.io/CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
    "platforms": [
      "axiom",
      "bloom"
    ],
    "type": "kol",
    "tags": [
      "kol",
      "axiom",
      "bloom"
    ]
  },
  "pnlMode": "strict",
  "count": 3,
  "positions": [
    {
      "token": "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump",
      "pnl": {
        "realized": 50791.19,
        "unrealized": 0,
        "total": 50791.19
      },
      "invested": 2621.72,
      "proceeds": 53412.92,
      "roi": 1937.32,
      "current": {
        "balance": 0,
        "costBasis": 0,
        "value": 0,
        "price": 0.000015786816405367,
        "avgCost": 0
      },
      "volume": {
        "tokensBought": 96296057.47450998,
        "tokensSold": 96296057.47451006,
        "buyUsd": 2621.72,
        "sellUsd": 53412.92
      },
      "averages": {
        "buy": 70.86,
        "sell": 346.84
      },
      "counts": {
        "buys": 37,
        "sells": 154,
        "total": 191
      },
      "timing": {
        "firstBuy": 1774277622281,
        "lastBuy": 1774294723039,
        "firstSell": 1774277870173,
        "lastSell": 1774296331666,
        "firstTrade": 1774277622281,
        "lastTrade": 1774296331666,
        "holdTimeSecs": 18709
      },
      "meta": {
        "symbol": "7",
        "name": "The 7 Wanderers",
        "image": "https://image.solanatracker.io/proxy?url=https%3A%2F%2Fedge.uxento.io%2Fimage%2FBxu1Dr8rLNBDyEutHRapKLdquDLeZkn8zkiUn9Avpump",
        "decimals": 6,
        "price": 0.000015786816405367,
        "snapshotPrice": 0.000022584238960459607,
        "marketCap": 15781.28,
        "liquidity": 13952.21,
        "primaryMarket": "pumpfun-amm"
      }
    },
    {
      "token": "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump",
      "pnl": {
        "realized": 88872.66,
        "unrealized": 0,
        "total": 88872.66
      },
      "invested": 3071.27,
      "proceeds": 91943.94,
      "roi": 2893.67,
      "current": {
        "balance": 0,
        "costBasis": 0,
        "value": 0,
        "price": 0.001572798005924808,
        "avgCost": 0
      },
      "volume": {
        "tokensBought": 46026806.173715,
        "tokensSold": 46026806.173715,
        "buyUsd": 3071.27,
        "sellUsd": 91943.94
      },
      "averages": {
        "buy": 341.25,
        "sell": 1242.49
      },
      "counts": {
        "buys": 9,
        "sells": 74,
        "total": 83
      },
      "timing": {
        "firstBuy": 1746044721229,
        "lastBuy": 1772031549416,
        "firstSell": 1746044751527,
        "lastSell": 1772032040873,
        "firstTrade": 1746044721229,
        "lastTrade": 1772032040873,
        "holdTimeSecs": 25987320
      },
      "meta": {
        "symbol": "gork",
        "name": "New XAI gork",
        "image": "https://image.solanatracker.io/proxy?url=https%3A%2F%2Fipfs-forward.solanatracker.io%2Fipfs%2FQmXkHvTBRFMyY5ozYHXcF7JHqqLBTorca3dXAdF3ooD5e3",
        "decimals": 6,
        "price": 0.001572798005924808,
        "snapshotPrice": 0.001666646257827002,
        "marketCap": 1572419.01,
        "liquidity": 381495.96,
        "primaryMarket": "pumpfun-amm"
      }
    }
  ],
  "notFound": []
}
{
"error": "<string>"
}
{
"error": "<string>"
}

SDK Example

import { Client } from '@solana-tracker/data-api';

const client = new Client({ apiKey: 'YOUR_API_KEY' });

const data = await client.batchPnlV2WalletTokenPositions('FbMxP3GVq8TQ36nbYgx4NP9iygMpwAwFWJwW81ioCiSF', ['6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN']);

Authorizations

x-api-key
string
header
required

API Key for authentication

Path Parameters

wallet
string
required

Solana wallet address (base58, 32-44 characters).

Pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$

Query Parameters

pnlMode
enum<string>
default:strict

How to treat positions flagged by the invalid PnL heuristic. strict zeros them out, adjusted caps them to a cost-basis-aware value, and raw leaves realized PnL untouched. Aliases pnl_mode and mode are also accepted by the API.

Available options:
strict,
adjusted,
raw

Body

application/json
tokens
string[]
required

Token mint addresses to look up. Max 100.

Maximum array length: 100
Example:
[
"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump",
"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump",
"CMx7yon2cLzHcXqgHsKJhuU3MmME6noWLQk2rAycBAGS"
]

Response

Positions found. Tokens the wallet never traded appear in notFound.

wallet
string
identity
object

Unified wallet identity. Only fields with known values are returned; a wallet can carry multiple tags at once.

pnlMode
enum<string>
Available options:
strict,
adjusted,
raw
count
integer

Number of positions returned

positions
object[]
notFound
string[]

Token mints with no position for this wallet

invalid
string[]

Addresses that failed Base58 validation. Omitted when empty.