SDK
import { Client } from '@solana-tracker/data-api';
const client = new Client({ apiKey: 'YOUR_API_KEY' });
const data = await client.batchPnlV2PositionPairs([{ wallet: 'FbMxP3GVq8TQ36nbYgx4NP9iygMpwAwFWJwW81ioCiSF', token: '6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN' }]);curl --request POST \
--url https://data.solanatracker.io/v2/pnl/positions/batch \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"pairs": [
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump"
},
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
}
]
}
'import requests
url = "https://data.solanatracker.io/v2/pnl/positions/batch"
payload = { "pairs": [
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump"
},
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
}
] }
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({
pairs: [
{
wallet: 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
token: '38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump'
},
{
wallet: 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
token: '84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump'
}
]
})
};
fetch('https://data.solanatracker.io/v2/pnl/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/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([
'pairs' => [
[
'wallet' => 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
'token' => '38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump'
],
[
'wallet' => 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
'token' => '84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump'
]
]
]),
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/positions/batch"
payload := strings.NewReader("{\n \"pairs\": [\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\"\n },\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\"\n }\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/positions/batch")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"pairs\": [\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\"\n },\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.solanatracker.io/v2/pnl/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 \"pairs\": [\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\"\n },\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"pnlMode": "strict",
"count": 3,
"positions": [
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"identity": {
"name": "Cented",
"twitter": "@Cented7",
"avatar": "https://kol-avatar.solanatracker.io/CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"platforms": [
"axiom",
"bloom"
],
"type": "kol",
"tags": [
"kol",
"axiom",
"bloom"
]
},
"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"
}
},
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"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"
}
}
],
"notFound": []
}{
"error": "<string>"
}{
"error": "<string>"
}Batch
Get Position Batch Lookup
Returns positions for arbitrary wallet and token pairs in a single request. Submit { wallet, token } objects; unmatched pairs come back in notFound. Max 200 pairs.
POST
/
v2
/
pnl
/
positions
/
batch
SDK
import { Client } from '@solana-tracker/data-api';
const client = new Client({ apiKey: 'YOUR_API_KEY' });
const data = await client.batchPnlV2PositionPairs([{ wallet: 'FbMxP3GVq8TQ36nbYgx4NP9iygMpwAwFWJwW81ioCiSF', token: '6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN' }]);curl --request POST \
--url https://data.solanatracker.io/v2/pnl/positions/batch \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"pairs": [
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump"
},
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
}
]
}
'import requests
url = "https://data.solanatracker.io/v2/pnl/positions/batch"
payload = { "pairs": [
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump"
},
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
}
] }
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({
pairs: [
{
wallet: 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
token: '38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump'
},
{
wallet: 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
token: '84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump'
}
]
})
};
fetch('https://data.solanatracker.io/v2/pnl/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/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([
'pairs' => [
[
'wallet' => 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
'token' => '38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump'
],
[
'wallet' => 'CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o',
'token' => '84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump'
]
]
]),
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/positions/batch"
payload := strings.NewReader("{\n \"pairs\": [\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\"\n },\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\"\n }\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/positions/batch")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"pairs\": [\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\"\n },\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.solanatracker.io/v2/pnl/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 \"pairs\": [\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump\"\n },\n {\n \"wallet\": \"CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o\",\n \"token\": \"84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"pnlMode": "strict",
"count": 3,
"positions": [
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"identity": {
"name": "Cented",
"twitter": "@Cented7",
"avatar": "https://kol-avatar.solanatracker.io/CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"platforms": [
"axiom",
"bloom"
],
"type": "kol",
"tags": [
"kol",
"axiom",
"bloom"
]
},
"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"
}
},
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"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"
}
}
],
"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.batchPnlV2PositionPairs([{ wallet: 'FbMxP3GVq8TQ36nbYgx4NP9iygMpwAwFWJwW81ioCiSF', token: '6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN' }]);
Authorizations
API Key for authentication
Query Parameters
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
Array of {wallet, token} objects. Max 200.
Maximum array length:
200Show child attributes
Show child attributes
Example:
[
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "38PgzpJYu2HkiYvV8qePFakB8tuobPdGm2FFEn7Dpump"
},
{
"wallet": "CyaE1VxvBrahnPWkqm5VsdCvyS2QmNht2UFrKJHga54o",
"token": "84cAEWqiDsV5xXh6CB69Hi3HcnumBbdjH4THfyorpump"
}
]Response
Positions found. Pairs with no matching record appear in notFound.
Was this page helpful?
⌘I