Stempeluhr-API
Alle Statistiken dieser Instanz sind über eine schlanke HTTP-API abrufbar – ideal für Dashboards, Tabellen, Automationen und eigene Auswertungen. Diagramme werden serverseitig als PNG gerendert und lassen sich direkt einbetten.
Basis-URL: https://stempeluhr.npdev.eu/api/v1
Bot zum eigenen Server hinzufügen: https://stempeluhr.npdev.eu/invite
Authentifizierung
Jeder Request (außer /health, /docs und /invite) benötigt einen instanz-spezifischen API-Schlüssel als Bearer-Token:
Authorization: Bearer stmp_dein-schluessel
Einen Schlüssel erstellst du im Discord mit /apikey create – er wird nur einmal angezeigt. Weitere Schlüssel verwaltest du mit /apikey list und /apikey revoke. Jeder Schlüssel ist an genau einen Server (Guild) gebunden; die API liefert ausschließlich Daten dieses Servers.
Fehlt der Header oder ist der Schlüssel ungültig, antwortet die API mit 401 und einem JSON-Body { "error": "..." }.
Endpunkte
| Methode & Pfad | Beschreibung | Format | ||
|---|---|---|---|---|
GET /health | Statusprüfung (ohne Auth) | JSON | ||
GET /docs | Diese Dokumentation im Browser (ohne Auth) | HTML | ||
GET /dispatch | Leitstellenblatt im Browser (ohne Auth) | HTML | ||
GET /stats/leaderboard | Rangliste des Servers | JSON | ||
GET /stats/user/:userId | Statistik eines einzelnen Nutzers | JSON | ||
GET /stats/leaderboard/chart/:type.png | Ranglisten-Diagramm | PNG | ||
GET /stats/user/:userId/chart/:type.png | Nutzer-Diagramm | PNG | ||
POST /admin/clock-in | Person per Dienstmarke einstempeln | JSON | ||
POST /admin/clock-out | Person per Dienstmarke ausstempeln | JSON | ||
GET /admin/clock-status/:badge | Ist die Dienstmarke im Dienst? | JSON | ||
GET /admin/on-duty | Alle offenen Schichten (im Dienst) | JSON | ||
GET /admin/members | Alle Mitarbeiter mit Dienstmarke | JSON | ||
PUT /admin/dispatchers | Leitstelle / Sek. Leitstelle / Höchstrangiger setzen | JSON | ||
POST /admin/units | Einheit anlegen | JSON | ||
GET /admin/units | Einheiten auflisten | JSON | ||
PUT /admin/units/:callsign | Einheit aktualisieren (leere Besatzung löscht sie) | JSON | ||
DELETE /admin/units/:callsign | Einheit löschen | JSON | ||
GET /personal | Personalblatt lesen (Mitarbeiter + Spalten) | JSON | ||
PUT /personal/columns | Spalten des Personalblatts ersetzen | JSON | ||
POST /personal/employees | Mitarbeiter manuell anlegen | JSON | ||
PATCH /personal/employees/:id | Zellen eines Mitarbeiters aktualisieren | JSON | ||
POST /personal/employees/:id/archive | Mitarbeiter archivieren | JSON | ||
POST /personal/employees/:id/restore | Archivierten Mitarbeiter reaktivieren | JSON | ||
GET /personal/sync | Vorschläge aus dem Discord-Abgleich lesen | JSON | ||
POST /personal/sync/apply | Vorschläge annehmen/verwerfen | JSON | ||
GET /personal/employees/:id/notes | Notizen zur Personalakte lesen | JSON | ||
POST /personal/employees/:id/notes | Notiz anlegen | JSON | ||
PATCH /personal/employees/:id/notes/:noteId | Notiz ändern | JSON | ||
DELETE /personal/employees/:id/notes/:noteId | Notiz löschen | JSON | ||
GET /firstaid | Erste-Hilfe-Kurs-Anmeldungen lesen | JSON | ||
POST /firstaid | Anmeldung anlegen | JSON | ||
PATCH /firstaid/:id | Felder einer Anmeldung bearbeiten | JSON | ||
POST /firstaid/:id/pass | Anmeldung als bestanden markieren | JSON | ||
POST /firstaid/:id/unpass | Bestehen einer Anmeldung zurücknehmen | JSON | ||
DELETE /firstaid/:id | Anmeldung löschen | JSON | ||
GET /board-notices | Aushänge des Schwarzen Bretts lesen | JSON | ||
POST /board-notices | Aushang veröffentlichen | JSON | ||
DELETE /board-notices/:id | Aushang entfernen | JSON | ||
GET /einsatz?archived=1 | Einsatzblätter lesen (ohne archived nur laufende) | JSON | ||
POST /einsatz | Einsatzblatt anlegen | JSON | ||
PATCH /einsatz/:id | Titel, Ort, Kartenmarkierung oder Einsatzleiter setzen | JSON | ||
POST /einsatz/:id/close | Einsatz abschließen (ins Archiv) | JSON | ||
POST /einsatz/:id/reopen | Abgeschlossenen Einsatz wieder öffnen | JSON | ||
DELETE /einsatz/:id | Abgeschlossenes Einsatzblatt löschen (nur Archiv; ein offener Einsatz wird mit 409 abgelehnt) | JSON | ||
POST /einsatz/:id/patients | Patient erfassen | JSON | ||
PATCH /einsatz/:id/patients/:pid | Name, Zugehörigkeit, Triage, Ort oder Schritte ändern | JSON | ||
DELETE /einsatz/:id/patients/:pid | Patient entfernen | JSON | ||
GET /einsatz/:id/entries | Verlauf des Einsatzes lesen (Einsatz- und Patienteneinträge) | JSON | ||
POST /einsatz/:id/entries | Notiz eintragen (patientId: null = Lagemeldung) | JSON | ||
DELETE /einsatz/:id/entries/:eid | Eigene Notiz zurücknehmen | JSON | ||
POST /einsatz/:id/patients/:pid/transfer | Patient ins Krankenhaus verlegen — optionales Feld buildingId wählt das Zielkrankenhaus; ohne Angabe das erste | JSON | ||
GET /hospital/buildings | Krankenhäuser auflisten | JSON | ||
POST /hospital/buildings | Krankenhaus anlegen | JSON | ||
PATCH /hospital/buildings/:id | Krankenhaus umbenennen oder Position ändern | JSON | ||
DELETE /hospital/buildings/:id | Krankenhaus löschen — 409, solange Patienten darin liegen oder es das letzte ist | JSON | ||
| `GET /hospital[?view=active\ | pending\ | discharged]` | Krankenhaus-Board lesen — ohne Parameter die aktiven Patienten, pending die Entlassenen ohne geschriebene Akte (mit involved: wer beteiligt war), discharged das Archiv. ?discharged=1 bleibt als Alias für view=discharged, liefert seitdem aber nur noch Patienten mit geschriebener Akte — vor pending waren das alle Entlassenen, jetzt strikt weniger. Antwort enthält buildings (alle Krankenhäuser der Guild); jeder Raum und jeder Patient trägt buildingId. Gefiltert wird im Client. | JSON |
POST /hospital/patients | Patient direkt im Krankenhaus anlegen (Direktaufnahme, landet im Warteraum). Optionales Feld buildingId wählt das Krankenhaus; ohne Angabe das erste. | JSON | ||
PATCH /hospital/patients/:id | Ort (buildingId + Raum/Bett — alle drei Felder gemeinsam), Triage, Zugehörigkeit oder Schritte eines Patienten ändern | JSON | ||
GET /hospital/patients/:id/entries | Verlauf eines Krankenhaus-Patienten lesen | JSON | ||
POST /hospital/patients/:id/entries | Notiz zum Krankenhaus-Patienten eintragen | JSON | ||
DELETE /hospital/patients/:id/entries/:eid | Eigene Notiz eines Krankenhaus-Patienten zurücknehmen (Leitstelle: jede) | JSON | ||
GET /hospital/rooms | Krankenhäuser mit ihren Räumen und Betten auflisten (Antwort: { buildings: [{ id, name, position, rooms: [...] }] }) | JSON | ||
POST /hospital/rooms | Raum anlegen (Felder buildingId, name) | JSON | ||
PATCH /hospital/rooms/:id | Raum umbenennen oder Position ändern | JSON | ||
DELETE /hospital/rooms/:id | Raum löschen (Patienten fallen in den Warteraum zurück) | JSON | ||
POST /hospital/rooms/:id/beds | Bett in einem Raum anlegen | JSON | ||
PATCH /hospital/beds/:id | Bett umbenennen oder Position ändern | JSON | ||
DELETE /hospital/beds/:id | Bett löschen (Patient fällt in den Streifen „ohne Bett" zurück) | JSON |
:userId ist die numerische Discord-User-ID. :type ist einer der unten gelisteten Diagramm-Typen.