curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/leaderboard \
--header 'X-Api-Key: <api-key>'import requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/leaderboard")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/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{
"period": "today",
"snapshotAt": "2023-11-07T05:31:56Z",
"total": 123,
"entries": [
{
"rank": 17,
"walletAddress": "<string>",
"vaultAddress": "<string>",
"username": "<string>",
"pnl": "125.50",
"volume": "4200.00"
}
],
"nextCursor": "<string>",
"me": {
"rank": 17,
"walletAddress": "<string>",
"vaultAddress": "<string>",
"username": "<string>",
"pnl": "125.50",
"volume": "4200.00"
}
}{
"status": 400,
"error": {
"code": "bad_request",
"message": "<string>",
"trace_id": "<string>",
"retryAfterSec": 123,
"retryable": true,
"details": {}
}
}Wallet leaderboard ranked by realised PnL or volume
Returns the leaderboard snapshot for the requested period plus the caller’s own row when authenticated.
Realised PnL only — open positions do NOT contribute to PnL. Only sells, on-chain MERGE legs, and market resolutions move the number, so ranks stay stable between snapshots even when prices move.
Board size — the board lists the top 1000 places per sort and pages no further; total is capped at 1000, and search only matches within that top. pnl (default) ranks wallets with any activity in the period by realised PnL desc; volume ranks wallets with volume above 0 by notional traded desc. The caller’s own place, wherever it is, comes back in me (me.rank can exceed total; null when the caller has no place on this board).
Search routing — when search looks like a 0x-hex prefix it matches either the wallet (EOA) or the vault address; anything else filters usernames. Both are case-insensitive prefix matches over the top 1000 of the active sort.
curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/leaderboard \
--header 'X-Api-Key: <api-key>'import requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/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://core.api.dev.predictstreet.sde.adifoundation.ai/api/leaderboard")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/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{
"period": "today",
"snapshotAt": "2023-11-07T05:31:56Z",
"total": 123,
"entries": [
{
"rank": 17,
"walletAddress": "<string>",
"vaultAddress": "<string>",
"username": "<string>",
"pnl": "125.50",
"volume": "4200.00"
}
],
"nextCursor": "<string>",
"me": {
"rank": 17,
"walletAddress": "<string>",
"vaultAddress": "<string>",
"username": "<string>",
"pnl": "125.50",
"volume": "4200.00"
}
}{
"status": 400,
"error": {
"code": "bad_request",
"message": "<string>",
"trace_id": "<string>",
"retryAfterSec": 123,
"retryable": true,
"details": {}
}
}Authorizations
Partner / integrator key — format ps_live_<keyId>_<secret>. Partner keys are issued by PredictStreet; a user can also create keys bound to their own wallet from their account settings in the web app. Never ship to a browser. multi_wallet partners must additionally send X-User-Wallet: 0x<40-hex> on every authenticated request to declare the acting wallet. See the API keys guide for scope taxonomy, partner kinds, rate limits, and rotation procedure.
Query Parameters
Which period to rank — defaults to today.
today, week, month, all Sort field. pnl (default) ranks wallets with any activity by realised PnL desc; volume ranks wallets with volume above 0 by notional traded desc. rank always reflects the active sort.
pnl, volume Optional case-insensitive prefix. A 0x-hex value matches either the wallet (EOA) or the vault address; anything else searches usernames.
Page size, 1–50; defaults to 20.
1 <= x <= 50Opaque cursor returned by a previous page.
Response
OK
today, week, month, all Wall-clock at which the recompute cron sampled the data feeding this page. Frontends can render "snapshot 2 min ago" directly off this field.
Entries on the board for this period, capped at 1000 (the board lists the top 1000 places only). With search, the matches within that top. Independent of the page slice — use it for the page count.
Show child attributes
Show child attributes
Opaque keyset cursor for the next page; null on the last page.
The authenticated caller's row for the same period. Populated when the request is authenticated and the wallet has a deployed vault. Carries the exact rank even outside the top 1000, so me.rank can exceed total; rank is null when the caller has no place on this board. null for anonymous traffic, for callers without a deployed vault, and for closed or restricted accounts.
Show child attributes
Show child attributes