Skip to main content
GET
/
v3
/
perps
/
leaderboard
Whale leaderboard
curl --request GET \
  --url https://api.polynode.dev/v3/perps/leaderboard \
  --header 'x-api-key: <api-key>'
import requests

url = "https://api.polynode.dev/v3/perps/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/perps/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/perps/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/perps/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/perps/leaderboard")
.header("x-api-key", "<api-key>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.polynode.dev/v3/perps/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_body
{
  "data": [
    {
      "address": "0x4f78dcb560f85bb028d6b75467c4bcb6412f8731",
      "as_of": 1783602532386,
      "positions": 3,
      "total_notional": "1815468.212200",
      "total_unrealized_pnl": "-5581.58753631389691173079221197"
    },
    {
      "address": "0x2e4f2c311efbb8ab3adb9f7b7667af92e8a2af96",
      "as_of": 1783602083934,
      "positions": 2,
      "total_notional": "1789051.590600",
      "total_unrealized_pnl": "4691.6233452882009376598302290"
    },
    {
      "address": "0xece7144d08695fee681496a5de501a0faa6c05ec",
      "as_of": 1783602083934,
      "positions": 2,
      "total_notional": "1785020.450360",
      "total_unrealized_pnl": "-13626.8974648418160300000000169"
    }
  ],
  "metric": "size"
}
Rank perps accounts three ways:
  • metric=equity (default) — by account equity. The biggest accounts by capital.
  • metric=size — by total open notional across all their positions. The biggest active risk-takers.
  • metric=pnl — by total unrealized profit/loss across their open positions.
Add ?instrument=BTC-USD to rank within a single market, and ?limit= to control how many rows. Polymarket has no perps leaderboard, and can’t easily build one: its public trade feed carries no account attribution, so there’s no way to rank accounts from it. This works because we snapshot every account’s portfolio continuously. Each row is drawn from that account’s most recent snapshot, with an as_of timestamp.

Authorizations

x-api-key
string
header
required

Query Parameters

metric
string

equity (default) | size | pnl

instrument
string

Restrict to one instrument

limit
integer

Max rows (default 100)

Response

200 - application/json

Success