PRICKAR · API

Vad du kan göra

Allt som händer i prickar-systemet går genom det här API:et — panelen på väggen, ställningen på webben och adminverktyget är bara klienter. Det betyder att du kan bygga ditt eget: en väggskärm, en Slack-bot, en knapp på skrivbordet, ett skript. Allt är vanlig JSON över HTTPS från ….

Utan nyckelSe ställningen och reglerna, följa händelseströmmen, lämna regelförslag.
Passar väggskärmar och bots som bara läser.
Med klientnyckelAllt ovan + ge prickar, se prick-historik, överklaga prickar.
Be kommittén skapa en nyckel åt din klient på /admin.
KommitténTa bort prickar, besluta om förslag och överklaganden, hantera personer och nycklar.
Adminnyckel — inte något klienter behöver.

Alla svar är JSON. Fel kommer alltid som {"error":"vad som gick fel"} med rimlig statuskod: 400 felaktig indata, 401 nyckel saknas/ogiltig, 404 finns inte, 409 krock, 429 för många anrop.

1 · Visa ställningen

Den öppna endpointen för displayer. Namn, antal prickar i år och personens id — sorterat med flest prickar först. Prickar räknas per kalenderår (§ 1.5.0), så första januari är alla på noll utan att någon behöver göra något.

öppna i ny flik

Vill du ha förra årets ställning: lägg till ?year=2025. Endpointen (liksom /api/rules och /api/events) skickar Access-Control-Allow-Origin: *, så en sida på en annan adress kan läsa den direkt från webbläsaren.

2 · Följ live

Istället för att fråga om och om igen kan din klient hålla en anslutning öppen till /api/events och få en rad pushad varje gång något händer. Det är Server-Sent Events — webbläsare har det inbyggt (EventSource), och på en mikrokontroller räcker en HTTP-klient som läser rader löpande. Strömmen är öppen, ingen nyckel behövs.

HändelseDataBetyder
prick.added{ id, personId, person, ruleParagraph }Någon fick en prick — hämta om ställningen, eller visa direkt vem
prick.deleted{ id }En prick togs bort (kommittén, eller godkänd överklagan)
person.added{ id, name }Ny person i listan
appeal.added{ id, prickId }Någon överklagade en prick
rules.updated—Regelverket ändrades — hämta om /api/rules

ansluter till strömmen… — händelser som inträffar medan du har sidan öppen dyker upp här:

(väntar på händelser – ge någon en prick från panelen eller /ge så ser du den landa)

Var 25:e sekund kommer en kommentarsrad (: ping) som håller anslutningen vid liv genom proxies; retry: 3000 i början gör att EventSource återansluter själv om den tappas.

3 · Reglerna

Musikreglerna som JSON. Bara regler som handlar om själva spelandet kan ge prick (gives_prick: 1) — informationsregler som "första januari nollställs alla prickar" finns med men går inte att prickas för. Bygger du något som ska ge prickar: hämta med ?givesPrick=1 så får du bara de valbara.

alla regler i ny flik

4 · Ge en prick klientnyckel

Det anropet allt handlar om. Du behöver en klientnyckel (pk_…) från kommittén — skicka den i headern X-Api-Key. Personen anges med namn (skiftlägesokänsligt), så en fysisk knapp behöver bara veta vem den tillhör. Regelparagrafen är valfri men rekommenderad; det är den som ger pricken sammanhang.

Svar 201: {"id":42,"person":"Camilo","ruleParagraph":"1.10.0"} — och i samma ögonblick får alla som lyssnar på strömmen prick.added. Max 10 prickar per minut per IP-adress (429 därefter). givenBy är frivilligt men uppskattat — det syns i kommitténs logg.

§ 1.12.2: vid bevisat tekniskt strul bör inga prickar delas ut. API:et kan inte bevisa strul åt dig — den bedömningen är din.

5 · Överklaga en prick klientnyckel

Fick någon en prick på fel grunder? Överklaga den så hamnar den i kommitténs kö. Godkänns överklagan försvinner pricken (och prick.deleted pushas); avslås den står den kvar. En prick kan bara ha en väntande överklagan i taget.

  1. Hitta pricken: GET /api/pricks?person_id=7 (person-id:t får du från ställningen)
  2. Överklaga: POST /api/pricks/42/appeal med {"reason":"Det var dagens album och klockan var 14","appealedBy":"Camilo"}
  3. Följ ärendet: GET /api/prick-appeals visar status pending → approved/rejected

6 · Föreslå en regel

Öppet för alla — inga nycklar. Förslaget hamnar i kö och blir regel först när kommittén godkänt det och gett det ett paragrafnummer. Max 5 förslag per minut per IP.

Bygga en egen knapp eller skärm?

Minsta möjliga klient som ger prick behöver: WiFi (2,4 GHz), en HTTPS-klient och en klientnyckel. Det är hela listan — panelen på väggen är i grunden exakt det, med en snygg display ovanpå. Några saker att veta:

Referens: alla endpoints

EndpointKräverGör
GET/api/scoreboard—Ställningen: id, namn, prickar (?year=)
GET/api/rules—Regler (?givesPrick=1, ?includeRepealed=1)
GET/api/events—Händelseström (SSE)
POST/api/rule-suggestions—Föreslå regel: { text, suggestedBy }
POST/api/pricksklientnyckelGe prick: { personName | personId, ruleParagraph?, comment?, givenBy? }
GET/api/pricksklientnyckelPrick-historik (?person_id=, ?year=)
POST/api/pricks/:id/appealklientnyckelÖverklaga prick: { reason, appealedBy? }
GET/api/prick-appealsklientnyckelÖverklagade prickar (?status=pending)
GET/api/personsklientnyckelPersoner med saldo
GET/api/rule-suggestions, /api/appealsklientnyckelFörslag respektive regelöverklaganden med status
POST/api/appealsklientnyckelÖverklaga en regel: { ruleParagraph, reason, appealedBy? }
POST/api/login · /api/logout · GET /api/me—Webbläsarinloggning med nyckel (HttpOnly-cookie) — för sidor, inte maskiner
DEL/api/pricks/:idkommitténTa bort prick
POST/api/prick-appeals/:id/decision, /api/rule-suggestions/:id/decision, /api/appeals/:id/decisionkommitténBeslut: { status: "approved" | "rejected" } (+ paragraph för godkänt förslag)
POST/api/persons · /api/keys · DEL /api/keys/:idkommitténPersoner och klientnycklar
PATCH/api/persons/:idkommitténKoppla Slack-id: { slackUserId } — ger DM vid prick med länk till överklagan