Tag trader leaderboard
curl --request GET \
--url https://api.polynode.dev/v3/tags/{slug}/leaderboard \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/tags/{slug}/leaderboard"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.polynode.dev/v3/tags/{slug}/leaderboard', 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.polynode.dev/v3/tags/{slug}/leaderboard",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.polynode.dev/v3/tags/{slug}/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.polynode.dev/v3/tags/{slug}/leaderboard")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/tags/{slug}/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyLeaderboard & Tags
Tag Leaderboard
Rank wallets within one market tag using all-time metrics or 1-day, 7-day, and 30-day realized P&L.
GET
/
v3
/
tags
/
{slug}
/
leaderboard
Tag trader leaderboard
curl --request GET \
--url https://api.polynode.dev/v3/tags/{slug}/leaderboard \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/tags/{slug}/leaderboard"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.polynode.dev/v3/tags/{slug}/leaderboard', 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.polynode.dev/v3/tags/{slug}/leaderboard",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.polynode.dev/v3/tags/{slug}/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.polynode.dev/v3/tags/{slug}/leaderboard")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/tags/{slug}/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyGET /v3/tags/{slug}/leaderboard is the path form of a single-tag leaderboard. It supports the same all-time and rolling modes as GET /v3/leaderboard.
Request
GET /v3/tags/{slug}/leaderboard
Path parameters
| Parameter | Type | Description |
|---|---|---|
slug | string | One lower-case tag slug such as sports, ufc, or us-election. Matching is case-insensitive. |
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
period | string | all | 1d, 7d, 30d, or all. Aliases day, week, and month are accepted. all_time and all-time also select all-time mode. |
sort | string | mode-dependent | All-time supports the full all-time sort set. Rolling supports realized_pnl only. |
order | string | desc | All-time supports asc and desc. Rolling supports desc only. |
limit | integer | 20 | Number of rows. Values below 1 use 1; values above 100 use 100. |
offset | integer | 0 | Pagination offset. Negative values use 0. |
tags or tag_slug query value. A conflict returns 400 conflicting_tag_scope.
Rolling example
curl "https://api.polynode.dev/v3/tags/sports/leaderboard?period=7d&limit=20" \
-H "x-api-key: $POLYNODE_API_KEY"
curl "https://api.polynode.dev/v3/leaderboard?period=7d&tag_slug=sports&limit=20" \
-H "x-api-key: $POLYNODE_API_KEY"
{
"leaderboard": [
{
"rank": 1,
"wallet": "0x1111111111111111111111111111111111111111",
"net_realized_pnl": 125000.5,
"realized_pnl": 125000.5,
"gross_profit": 140000.5,
"gross_loss": -15000,
"wins": 42,
"losses": 8,
"position_count": 50,
"event_count": 73,
"condition_count": 31
}
],
"count": 1,
"limit": 20,
"offset": 0,
"has_more": true,
"period": "7d",
"sort": "realized_pnl",
"order": "desc",
"category": null,
"tags": ["sports"]
}
All-time example
curl "https://api.polynode.dev/v3/tags/ufc/leaderboard?sort=total_pnl&limit=20" \
-H "x-api-key: $POLYNODE_API_KEY"
period preserves the all-time response and sort behavior. See Leaderboard response fields for the exact all-time and rolling row shapes.
Pagination, empty results, and errors
- Rolling tag leaderboards return up to 100 rows per request and are capped at rank 1,000. Shorter rankings end at their last returned row.
- All-time tag leaderboards retain their existing offset pagination and do not use the global all-time 10,000-rank cap.
- A tag with no realized results in a valid rolling window returns HTTP
200with an emptyleaderboard. - A rolling view that is temporarily unavailable returns
503 leaderboard_unavailable. - An invalid period, sort, order, filter combination, or rank window returns HTTP
400with a stable error code.
| Status | Error | When it occurs |
|---|---|---|
400 | invalid_tag | The path does not contain one valid tag slug. |
400 | conflicting_tag_scope | A query tag differs from the path tag. |
400 | invalid_period, invalid_sort, or invalid_order | A value is not supported by the selected mode. |
400 | unsupported_leaderboard_filter | A rolling request uses an unsupported filter combination. |
400 | leaderboard_offset_too_deep | A rolling request goes beyond rank 1,000. |
401 | authentication error | The API key is missing or invalid. |
503 | leaderboard_unavailable | The rolling tag leaderboard is temporarily unavailable. |
503 | pnl_unavailable | The all-time tag leaderboard is temporarily unavailable. |
Rolling tag rows contain realized metrics,
event_count, and condition_count. They do not contain historical unrealized P&L, total P&L, open-position counts, or volume.Authorizations
Path Parameters
One tag slug, matched case-insensitively.
Query Parameters
Ranking window. Aliases day, week, and month are also accepted. Values all_time and all-time also select all-time mode.
Available options:
1d, 7d, 30d, all All-time supports the documented all-time sort set. Rolling supports realized_pnl only.
All-time supports ascending or descending order. Rolling supports descending order only.
Available options:
asc, desc Rows per page. Values below 1 use 1; values above 100 use 100.
Required range:
1 <= x <= 100Pagination offset. Negative values use 0. Rolling rankings stop at rank 1,000.
Required range:
x >= 0Response
Ranked wallets. A tag with no realized results in a valid rolling window returns an empty leaderboard.

