Per-player ELO, season stats, ranks, achievements, DNA, head-to-heads, and community leaderboards — exposed as JSON for Discord bots, partner integrations, and community researchers.
?season=all.?days=N window.?riftbound_id= → full player./seasons/current shortcut.Full schemas, parameters, and a "Try it out" button live on the interactive reference.
Most experimentation needs no key — anonymous traffic is allowed at 60 requests/hour per IP. Add an API key for ~17× more headroom.
# Anonymous (60/h per IP)
curl https://eloshowdown.com/api/v1/meta
# With a key (1000/h per key)
curl -H "Authorization: Bearer esd_yourkey" \
https://eloshowdown.com/api/v1/players/?community=madrid&limit=10
import requests
BASE = "https://eloshowdown.com/api/v1"
session = requests.Session()
session.headers.update({"Authorization": "Bearer esd_yourkey"})
# What season are we in, and how much quota do I have?
print(session.get(f"{BASE}/meta").json())
# Top 10 players in Madrid this season
r = session.get(f"{BASE}/leaderboard",
params={"season": "season-2-spiritforge",
"community": "madrid", "limit": 10})
for row in r.json():
print(row["rank"], row["display_name"], row["current_elo"])
const BASE = 'https://eloshowdown.com/api/v1';
const headers = { 'Authorization': 'Bearer esd_yourkey' };
const meta = await fetch(`${BASE}/meta`, { headers }).then(r => r.json());
console.log(meta);
// Resolve a Riftbound platform ID to an EloShowdown player
const lookup = await fetch(
`${BASE}/lookup?riftbound_id=137979`, { headers },
).then(r => r.json());
console.log(lookup.display_name, lookup.lifetime_total_matches);
Pass an API key as Authorization: Bearer esd_…. Anonymous
access works for kicking the tires; production consumers should ask
for a key.
| Tier | Auth | Rate limit | For |
|---|---|---|---|
| anonymous | — | 60 req/hour per IP | Manual curl, hobby experiments |
| keyed | Bearer token | 1 000 req/hour per key | Discord bots, partner integrations |
Retry-After header tells you when the bucket
resets. Cache responses on your side — most endpoints only change
once a day when the cron runs.
Keys are issued manually — one email gets you a key with a one-line description of what you're building. Email eloquest.ink@gmail.com or DM on X (Twitter) with:
Expect a reply within 24 hours. The raw key is sent over the secure channel you reached out on, shown once, and never stored on our end as cleartext.
Free for any use, attribution requested. Anything from "Powered by eloshowdown.com" in the footer of your tool to a link from your README is plenty.
If possible, don't redistribute the data as your own dataset — the data is public on the website anyway; the API just saves you the scraping.
HTTPS only. http:// requests redirect, but the bearer
token would have already been transmitted in the clear by the time
the redirect lands — always use https://eloshowdown.com.