Quickstart
From zero to your first authenticated request in under five minutes.
1. Subscribe and create a key
- Sign in to suprabench.com with Google.
- Open Profile → API & Billing.
- Pick a tier and click Subscribe — you'll be sent to Stripe Checkout.
- After payment you'll land back on the dashboard. Click Create new key, give it a descriptive name (e.g.
laptop-dev), copy the value once.
The key is shown exactly once. Store it in a password
manager or your shell's .env file immediately. If you lose
it, revoke and create a new one — we cannot recover plaintext.
2. Make your first request
Fetch the top 5 ranked models:
export SUPRABENCH_KEY="sb_live_…"
curl "https://api.suprabench.com/v1/models?limit=5" \
-H "Authorization: Bearer $SUPRABENCH_KEY"
import os
import requests
API = "https://api.suprabench.com/v1"
KEY = os.environ["SUPRABENCH_KEY"]
resp = requests.get(
f"{API}/models",
params={"limit": 5},
headers={"Authorization": f"Bearer {KEY}"},
timeout=10,
)
resp.raise_for_status()
for model in resp.json():
print(f"{model['name']:30s} {model['supraScore']:6.2f}")
const API = "https://api.suprabench.com/v1";
const KEY = process.env.SUPRABENCH_KEY;
const r = await fetch(`${API}/models?limit=5`, {
headers: { Authorization: `Bearer ${KEY}` },
});
if (!r.ok) {
const err = await r.json();
throw new Error(`${err.error.code}: ${err.error.message}`);
}
const models = await r.json();
for (const m of models) {
console.log(`${m.name.padEnd(30)} ${m.supraScore.toFixed(2)}`);
}
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
type Model struct {
Name string `json:"name"`
SupraScore float64 `json:"supraScore"`
}
func main() {
req, _ := http.NewRequest("GET",
"https://api.suprabench.com/v1/models?limit=5", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SUPRABENCH_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
var models []Model
json.NewDecoder(resp.Body).Decode(&models)
for _, m := range models {
fmt.Printf("%-30s %6.2f\n", m.Name, m.SupraScore)
}
}
Expected response
[
{
"slug": "claude-opus-4-7",
"name": "Claude Opus 4.7",
"provider": "Anthropic",
"familyTag": "claude",
"tags": ["reasoning", "coding", "long-context"],
"supraScore": 92.41,
"benchCount": 28,
"updatedAt": 1745000000000
},
// … 4 more
]
3. Filter by tag
Want only models good at coding? Pass ?tag=coding. Tags
come from the public taxonomy; list them with
GET /v1/tags.
curl "https://api.suprabench.com/v1/models?tag=coding&limit=10" \
-H "Authorization: Bearer $SUPRABENCH_KEY"
coding = requests.get(
f"{API}/models",
params={"tag": "coding", "limit": 10},
headers={"Authorization": f"Bearer {KEY}"},
).json()
const params = new URLSearchParams({ tag: "coding", limit: "10" });
const r = await fetch(`${API}/models?${params}`, {
headers: { Authorization: `Bearer ${KEY}` },
});
const coding = await r.json();
req, _ := http.NewRequest("GET",
"https://api.suprabench.com/v1/models?tag=coding&limit=10", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SUPRABENCH_KEY"))
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var coding []Model
json.NewDecoder(resp.Body).Decode(&coding)
4. Drill into one model
Get the full per-bench breakdown for any model by slug:
curl https://api.suprabench.com/v1/models/claude-opus-4-7 \
-H "Authorization: Bearer $SUPRABENCH_KEY"
detail = requests.get(
f"{API}/models/claude-opus-4-7",
headers={"Authorization": f"Bearer {KEY}"},
).json()
for s in detail["scores"]:
print(f"{s['benchName']:25s} {s['normalizedScore']:6.2f}")
const r = await fetch(`${API}/models/claude-opus-4-7`, {
headers: { Authorization: `Bearer ${KEY}` },
});
const detail = await r.json();
for (const s of detail.scores) {
console.log(`${s.benchName.padEnd(25)} ${s.normalizedScore.toFixed(2)}`);
}
req, _ := http.NewRequest("GET",
"https://api.suprabench.com/v1/models/claude-opus-4-7", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SUPRABENCH_KEY"))
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var detail struct {
Scores []struct {
BenchName string `json:"benchName"`
NormalizedScore float64 `json:"normalizedScore"`
} `json:"scores"`
}
json.NewDecoder(resp.Body).Decode(&detail)
for _, s := range detail.Scores {
fmt.Printf("%-25s %6.2f\n", s.BenchName, s.NormalizedScore)
}
Returns the full
ModelDetail
object with one entry per benchmark the model has scores for, plus
raw and normalized scores, source URL, accessed-at timestamp, and
community vote tallies.
5. Handle errors
Always check the status. SupraBench errors include both a human message and a stable machine code:
{
"error": {
"code": "rate_limited",
"message": "> 60 req/min",
"hint": "Slow down or upgrade tier."
}
}
Branch on error.code in your code, never on the message text
(messages may be reworded; codes are stable).
Full reference: Errors →.
What's next
- Authentication — key rotation, security best practices.
- Rate limits — every response includes
X-RateLimit-*headers; plan around them. - Models reference — every field, every parameter.
- Bulk export — Pro+ only, single-shot full snapshot.