curl --request GET \
--url https://api.decimal.ai/api/v1/registry/leaderboard \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.decimal.ai/api/v1/registry/leaderboard"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.decimal.ai/api/v1/registry/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.decimal.ai/api/v1/registry/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 => [
"Authorization: Bearer <token>"
],
]);
$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.decimal.ai/api/v1/registry/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.decimal.ai/api/v1/registry/leaderboard")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/registry/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Public Skills Leaderboard — ranked by performance dimension within a window
Anonymous-readable, time-windowed ranked leaderboard.
Distinct from the registry browse endpoint:
- Registry
/skills?sort=is about exploration (filter + paginate) - This endpoint is about ranking (top N by performance dimension)
Axes (every axis is an earned place; each one’s gate is stated in the UI sub-copy):
evidence(DEFAULT since 2026-08-15): the same measured-lift population asbiggest_improvement, ordered so that a skill with MORE evidence legs outranks a single-leg skill — a lift that two independent instruments agree on beats a bigger lift only one instrument ever saw. Carries an evidence FLOOR (seeevidence_floor) so an unmeasured seed cannot outrank measured work. Every row still reports its ownlegs,provisionalflag andactivations_30d, so the UI can label exactly how much evidence a row stands on rather than implying it is settled.skill_score: SkillScore v2 DESC. A skill charts once it has at least one evidence signal (≥1 leg); skills with no evidence never chart. Signal count is a tie-break, not an entry gate, so aprovisional(single-signal) score still ranks — every row reports its ownlegscount andprovisionalflag alongside the score. At an equal score this axis orders by measured benchmark lift, then by a stable id. Rolling 30d rollup, sowindow_daysdoes not apply to this axis.biggest_improvement: latest verified SkillTestRun in the window, pass-rate delta vs the no-skill baseline.efficiency: token savings ASC (most negative = cheapest); skills that INCREASED token cost are excluded.most_turn_savingsis the legacy param for the turns-keyed variant and keeps working.top_rated: SkillRaterReport mean in the window, ≥10 rated traces (matches the v2 rater-leg gate).
category narrows every axis to one skill.category and re-ranks inside
it, so the caller gets the top N of that category rather than whatever
slice of it happens to reach the global top N. Unknown values return an
empty board rather than a 400 — unlike sort, which selects a code path,
a category is a data filter, and “no skills match” is a true answer. That
also matches browse, which has filtered on the same column since forever.
curl --request GET \
--url https://api.decimal.ai/api/v1/registry/leaderboard \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.decimal.ai/api/v1/registry/leaderboard"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.decimal.ai/api/v1/registry/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.decimal.ai/api/v1/registry/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 => [
"Authorization: Bearer <token>"
],
]);
$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.decimal.ai/api/v1/registry/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.decimal.ai/api/v1/registry/leaderboard")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/registry/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Enter your API key (e.g. dai_sk_test_key_001)
Query Parameters
evidence (default) | skill_score | biggest_improvement | efficiency | top_rated (legacy: most_turn_savings)
Time window (≤3650 ≈ 'all time')
1 <= x <= 36501 <= x <= 100Rank WITHIN one skill.category (exact match, as on browse). Omit for the whole registry.
100evidence axis only. True (default) DEMOTES weakly-evidenced rows: a row that is simultaneously zero-activation and single-leg, or that is uncategorised and never activated, sorts below everything else. It is a ranking tier, not a filter — the board never empties, and a cold-start catalogue still returns a full page. Pass evidence_floor=false to rank without the demotion. (The window_days benchmark-recency bound is NOT part of this switch; it applies to the axis either way.) Ignored by every other sort.
Response
Successful Response