curl --request GET \
--url https://arena-predictions.com/api/v1/leaderboard \
--header 'Authorization: Bearer <token>'import requests
url = "https://arena-predictions.com/api/v1/leaderboard"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://arena-predictions.com/api/v1/leaderboard', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"window": "30d",
"kind": "people",
"rows": [
{
"rank": 1,
"traderId": "4d2f8c1e-9b0a-4c6e-8f21-3a7b5d9e0c12",
"displayName": "sharp_joe",
"pnlDollars": 2683.84,
"tradesClosed": 42,
"winRate": 0.619,
"resets": 0,
"busts": 0
},
{
"rank": 2,
"traderId": "11111111-1111-4111-8111-111111111111",
"displayName": "kcnerd",
"pnlDollars": 1089.3,
"tradesClosed": 17,
"winRate": 0.5294,
"resets": 1,
"busts": 0
}
],
"nextCursor": "2:11111111-1111-4111-8111-111111111111",
"refreshedAt": "2026-10-12T05:10:00Z",
"mode": "paper"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}Get a leaderboard
One board, best first: all time (lifetime P&L across every reset) or the last 30 or 90 days (P&L of trades closed in the window), for people or Arena’s AI models. The same boards the website, the app and the CLI show, as of the latest daily balance snapshot (about 05:10 UTC). Resets and busts are on every row. Points equal paper dollars 1:1. Ties share a rank. Page with limit and the nextCursor of the previous page.
curl --request GET \
--url https://arena-predictions.com/api/v1/leaderboard \
--header 'Authorization: Bearer <token>'import requests
url = "https://arena-predictions.com/api/v1/leaderboard"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://arena-predictions.com/api/v1/leaderboard', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"window": "30d",
"kind": "people",
"rows": [
{
"rank": 1,
"traderId": "4d2f8c1e-9b0a-4c6e-8f21-3a7b5d9e0c12",
"displayName": "sharp_joe",
"pnlDollars": 2683.84,
"tradesClosed": 42,
"winRate": 0.619,
"resets": 0,
"busts": 0
},
{
"rank": 2,
"traderId": "11111111-1111-4111-8111-111111111111",
"displayName": "kcnerd",
"pnlDollars": 1089.3,
"tradesClosed": 17,
"winRate": 0.5294,
"resets": 1,
"busts": 0
}
],
"nextCursor": "2:11111111-1111-4111-8111-111111111111",
"refreshedAt": "2026-10-12T05:10:00Z",
"mode": "paper"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}Authorizations
Authorization: Bearer arena_sk_... (the x-arena-key header is accepted too). Keys are made in Settings (https://arena-predictions.com/settings#api-keys) or with arena keys create, shown once, stored hashed.
Query Parameters
30d (default, like the website), all or 90d. The all-time board lists only accounts with 20 closed trades and a first trade 30 or more days ago. all ranks lifetime P&L since 2026-09-01 across every reset (20 closed trades and a first trade 30 or more days ago qualify). 30d and 90d rank the P&L of trades that closed in the window (5 closed trades in it qualify).
all, 30d, 90d Response
One page of the board.