curl --request GET \
--url https://api.arcus.xyz/v1/leaderboardimport requests
url = "https://api.arcus.xyz/v1/leaderboard"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/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.arcus.xyz/v1/leaderboard",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.arcus.xyz/v1/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
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.arcus.xyz/v1/leaderboard")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"entries": [
{
"address": "<string>",
"volume": 123,
"feesPaid": 123,
"pnl": 123,
"rank": 123
}
],
"window": "all",
"sortBy": "volume"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}Get the all-traders leaderboard
Returns the top-N traders ranked by sortBy (volume, pnl, or fees; default volume) over the requested rolling window (all, 30d, or 24h; default 30d).
curl --request GET \
--url https://api.arcus.xyz/v1/leaderboardimport requests
url = "https://api.arcus.xyz/v1/leaderboard"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/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.arcus.xyz/v1/leaderboard",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.arcus.xyz/v1/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
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.arcus.xyz/v1/leaderboard")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"entries": [
{
"address": "<string>",
"volume": 123,
"feesPaid": 123,
"pnl": 123,
"rank": 123
}
],
"window": "all",
"sortBy": "volume"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}sortBy (volume, pnl, or fees; default volume) over the requested rolling window (all, 30d, or 24h; default 30d). Each row carries volume, fees paid, realized PnL, and its rank on the active sortBy column, all computed in a single query so the columns are always mutually consistent for a row. pnl is realized only (sum of per-fill closed_pnl); open-position (unrealized) MTM is NOT included. Served from the hourly rollup, which lags real-time by up to the current partial hour.
Pass address to fetch just that one trader’s row — its figures and its rank on the sortBy column, wherever it sits on the board (not only within the top-N). limit is ignored in that mode, and an address that did not trade in the window returns an empty entries list.
Pagination: limit max is 100 and there is no cursor — fetch up to 100 rows in one call and paginate client-side.Query Parameters
Rolling window for the ranking.
all, 30d, 24h Column to rank by. Determines which top-N traders return and which column each row's rank is computed on.
volume, pnl, fees Optional. When set, return only this trader's row (with its rank on the sortBy column) instead of the top-N list. limit is ignored; an address that did not trade in the window yields an empty entries list.
20-byte EVM address as hex: optional 0x or 0X prefix and exactly 40 hexadecimal digits. API responses normalize to lowercase a–f after 0x.
^(0x|0X)?[0-9a-fA-F]{40}$Number of leaderboard rows to return. Default and maximum are both 100; requests above the maximum are silently clamped. Ignored when address is set.
1 <= x <= 100Was this page helpful?