For utviklere

Badstat API

Hent spillere, rankinger, kamper og statistikk fra norsk badminton som JSON – til din egen nettside, app eller treningsdagbok.

Be om API-nøkkel

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.

Base-URL
https://kfxdblvdunnrxhuxqvzi.supabase.co/functions/v1/public-api
Eksempel
curl -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.

HeaderBetydning
X-RateLimit-LimitGrensen per minutt
X-RateLimit-RemainingKall igjen i dette minuttet
X-RateLimit-ResetUnix-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_date viser 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.

GET/v1

Metadata

Gjeldende sesong, siste rankingdato, når data sist ble oppdatert, og gyldige kategorier og aldersgrupper.

GET/v1/players

Søk etter spillere

Minst én av search og club må være med.

ParameterBeskrivelse
searchDel av navn (minst 2 tegn)
clubKlubbnavn (eksakt, uavhengig av store/små bokstaver)
limit1–100, standard 25
offsetStandard 0
GET/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.

GET/v1/players/{id}/matches

Spillerens 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.

ParameterBeskrivelse
seasonF.eks. 2026/2027
disciplineHS, DS, HD, DD eller MIX
limit1–200, standard 50
offsetStandard 0
GET/v1/players/{id}/stats

Spillerstatistikk

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.

ParameterBeskrivelse
seasonValgfri, f.eks. 2026/2027
GET/v1/rankings

Rankingliste

Gjeldende rankingliste. Hver rad har player, rank, class, ranking_date og points_by_season.

ParameterBeskrivelse
categoryPåkrevd: HS, DS, HD, DD eller MIX
age_groupSEN (standard), U11–U19, O35–O80
clubBare spillere fra denne klubben
limit1–500, standard 100
offsetStandard 0
GET/v1/tournaments

Turneringer

Turneringer, nyeste først.

ParameterBeskrivelse
seasonValgfri
limit1–200, standard 50
offsetStandard 0
GET/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" } }
Statuscode
400invalid_parameter, missing_parameter
401missing_api_key, invalid_api_key
404not_found
405method_not_allowed
429rate_limited
500internal_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;
  }
}