Badstat API
Hent spillere, rankinger, kamper og statistikk fra norsk badminton som JSON – til din egen nettside, app eller treningsdagbok.
Kopierer hele dokumentasjonen som Markdown – lim den inn i Claude, ChatGPT eller Cursor.
Kom i gang
API-et er gratis og bare for lesing. Alle svar er JSON, og alle kall er GET. Oppgi «Data fra Badstat» med lenke til badstat.no der dataene vises.
https://kfxdblvdunnrxhuxqvzi.supabase.co/functions/v1/public-apicurl -H "X-API-Key: bs_dinnøkkel" \
"https://kfxdblvdunnrxhuxqvzi.supabase.co/functions/v1/public-api/v1/players?search=Brynjar"Tilgang og grenser
Alle kall krever en API-nøkkel i headeren X-API-Key (eller Authorization: Bearer …). Send en e-post med hva du skal bruke dataene til, så får du en. Hold nøkkelen på serveren din hvis du kan.
Hver nøkkel kan gjøre 60 kall i minuttet. Over grensen får du 429 med Retry-After (sekunder). Svar kan caches i 5 minutter.
| Header | Betydning |
|---|---|
X-RateLimit-Limit | Grensen per minutt |
X-RateLimit-Remaining | Kall igjen i dette minuttet |
X-RateLimit-Reset | Unix-tid når telleren nullstilles |
Det er ingen grense på hvor mange kamper du kan hente per spiller – bare maks 200 per kall. Bruk offset for å bla.
Hvor ferske er dataene?
- Kamper og turneringer hentes fra badmintonportalen hver natt (ca. kl. 04–05). En kamp spilt i dag ligger normalt inne neste morgen.
- Ranking oppdateres når Norges Badmintonforbund publiserer en ny rankingversjon.
ranking_dateviser hvilken versjon du ser.
Det finnes ingen sanntidsdata – rankingen endrer seg ikke underveis i en turnering. GET /v1 viser når data sist ble oppdatert.
Spiller-ID-er
Badmintonportalen gir samme person to ID-er: spillernummeret i rankingen (6 sifre, f.eks. 109614) og en intern ID i kampene (f.eks. 36427). API-et kobler dem sammen, så begge ID-ene gir samme spiller, kamper og statistikk. linked_ids viser hvilke som hører sammen. Et søk kan derfor vise samme person to ganger – bruk gjerne ID-en med ranking som fast nøkkel.
Kamper fra før 2025/26 har ofte bare navn, ikke ID, og kobles på navn. To spillere med nøyaktig samme navn kan derfor få hverandres eldre kamper, slik som på badstat.no.
Endepunkter
Alle stier er relative til base-URL-en. Kategorier: HS herresingle, DS damesingle, HD herredouble, DD damedouble, MIX mixed.
/v1Metadata
Gjeldende sesong, siste rankingdato, når data sist ble oppdatert, og gyldige kategorier og aldersgrupper.
/v1/playersSøk etter spillere
Minst én av search og club må være med.
| Parameter | Beskrivelse |
|---|---|
search | Del av navn (minst 2 tegn) |
club | Klubbnavn (eksakt, uavhengig av store/små bokstaver) |
limit | 1–100, standard 25 |
offset | Standard 0 |
/v1/players/{id}Spiller
Spiller med alle rankinger (alle kategorier og aldersgrupper) og poeng per sesong. Poengene per sesong er det du bruker til å vise progresjon over tid. rank er null for kategorier der spilleren ikke er på gjeldende liste.
/v1/players/{id}/matchesSpillerens kamper
Nyeste først. id er stabil – bruk den for å unngå duplikater når du synker kamper. player_side er laget spilleren var på (1 eller 2), og won er null hvis vinneren ikke er kjent. type er tournament eller league.
| Parameter | Beskrivelse |
|---|---|
season | F.eks. 2026/2027 |
discipline | HS, DS, HD, DD eller MIX |
limit | 1–200, standard 50 |
offset | Standard 0 |
/v1/players/{id}/statsSpillerstatistikk
Seire og tap totalt, per øvelse og per sesong. win_rate = vunnet / (vunnet + tapt). Kamper med ukjent vinner er med i played, men ikke i win_rate.
| Parameter | Beskrivelse |
|---|---|
season | Valgfri, f.eks. 2026/2027 |
/v1/rankingsRankingliste
Gjeldende rankingliste. Hver rad har player, rank, class, ranking_date og points_by_season.
| Parameter | Beskrivelse |
|---|---|
category | Påkrevd: HS, DS, HD, DD eller MIX |
age_group | SEN (standard), U11–U19, O35–O80 |
club | Bare spillere fra denne klubben |
limit | 1–500, standard 100 |
offset | Standard 0 |
/v1/tournamentsTurneringer
Turneringer, nyeste først.
| Parameter | Beskrivelse |
|---|---|
season | Valgfri |
limit | 1–200, standard 50 |
offset | Standard 0 |
/v1/tournaments/{id}Turnering
Én turnering med klasser og øvelser.
Feil
Feil kommer som JSON med en fast kode og en lesbar melding:
{ "error": { "code": "invalid_parameter", "message": "season must look like 2025/2026" } }| Status | code |
|---|---|
400 | invalid_parameter, missing_parameter |
401 | missing_api_key, invalid_api_key |
404 | not_found |
405 | method_not_allowed |
429 | rate_limited |
500 | internal_error |
Eksempel: synk kamper (JavaScript)
For en kamplogg: hent hele historikken én gang, og deretter bare inneværende sesong hver natt. Bruk kampens id for å hoppe over kamper du allerede har.
const BASE = 'https://kfxdblvdunnrxhuxqvzi.supabase.co/functions/v1/public-api/v1';
const headers = { 'X-API-Key': process.env.BADSTAT_API_KEY };
// Hent alle kampene til en spiller i en sesong (blar gjennom sidene)
async function seasonMatches(playerId, season) {
const all = [];
for (let offset = 0; ; offset += 200) {
const url = `${BASE}/players/${playerId}/matches` +
`?season=${encodeURIComponent(season)}&limit=200&offset=${offset}`;
const res = await fetch(url, { headers });
if (!res.ok) throw new Error((await res.json()).error.message);
const { data, meta } = await res.json();
all.push(...data);
if (all.length >= meta.total || data.length === 0) return all;
}
}