# API Basis `/api`. Cookie-Sitzung oder lesender Bearer-Token. Schreibende Cookie-Anfragen müssen einen Origin-Header passend zu NEXTAUTH_URL senden. Alle fachlichen Endpunkte prüfen aktuelle Rechte; Rollenbezeichnungen im Request verleihen keine Rechte. Antworten sind privat und nicht cachebar. Fehler: 400 Validierung, 401 Anmeldung, 403 Rechte, 404 nicht vorhanden/nicht sichtbar, 409 Konflikt, 413 Größenlimit, 429 Rate-Limit. ## Aufgaben - GET `/tasks`: `{items,total,page,pages}`. Query: page, limit (1–100), status (OPEN/ALL/UNERLEDIGT/IN_BEARBEITUNG/ERLEDIGT), q, group, project, tag, priority (1–4), archived (true/false), from/to (YYYY-MM-DD), sort (due/newest). - POST `/tasks`: wo, was, bisWann (YYYY-MM-DD), owningGroupId; optional assigneeId, priority, tags[], project, parentId, checklist[{text,done}], recurrenceDays, beauftragtAm, firmaBeauftragt. - GET `/tasks/:id`: Detail inklusive erlaubter Kommentare/Dateien, Unteraufgaben, Abhängigkeiten, letzter Aktivitäten und capabilities. - PATCH `/tasks/:id`: zwingend version aus zuletzt gelesener Aufgabe; geänderte Felder, optional status/archived. Fehlende Felder bleiben unverändert. Konflikte liefern 409. - DELETE `/tasks/:id`: JSON `{version}`; nur archivierte, erledigte Aufgaben mit tasks.delete. Anhänge werden zur privaten Cleanup-Queue hinzugefügt. - GET/POST `/tasks/:id/comments`: Kommentare, GET page, POST `{content}` (max. 10000 Zeichen). - GET/POST `/tasks/:id/files`: Dateiliste oder Multipart-Feld file, maximal 10 MB. PDF/JPEG/PNG/DOCX/XLSX nach Inhalt. - GET/DELETE `/tasks/:id/files/:fileId`: geschützter Download bzw. Löschung. Datei muss zur Aufgabe gehören. - GET `/assignees?group=:id`: minimale Auswahl aktiver Gruppenmitglieder, erfordert tasks.assign in dieser Gruppe. ## Benutzer und RBAC - GET `/me`: aktueller Principal, grants mit Quelle, verfügbare Gruppen, SMTP-Verfügbarkeit. - PATCH `/me`: `{currentPassword,password}`; entwertet bestehende Sessions und Tokens. - GET/POST `/users`: Benutzerliste oder `{name,email,password?}`. Neue Benutzer ohne Rechte; Passwortänderung erforderlich. - PATCH `/users/:id`: name, email, active, oidcSubject. Keine Rollen- oder Passwortfelder. Verwaltungsrechte separat; privilegierte Konten nur für Berechtigungsverwalter. - DELETE `/users/:id`: nicht unterstützt; Konten deaktivieren. - GET `/access`: Gruppen, Rollen, Permissions, Benutzerzuweisungen. - POST `/access`: action group/role/membership/userRole/groupRole. Payload siehe `src/app/api/access/route.ts` (Zod-Schemas). Rollen-/Mitgliedschaftsvergabe benötigt roles.assign, zusätzlich passende Verwaltungsrechte. Geschützte Rollen und letzter aktiver Administrator sind abgesichert. - POST `/account`: action requestReset `{email}`, invite `{userId}` oder redeem `{token,password}`. Reset-/Einladungsversand benötigt SMTP; kein Rückschluss auf unbekannte E-Mails in der normalen Antwort. Tokens sind einmalig und laufen nach einer Stunde ab. ## Arbeitsbereich GET `/workspace?mode=stats|filters|templates|notifications|audit|integrations`. Audit paginiert mit page. Statistiken und Benachrichtigungen berücksichtigen dieselben Aufgabenrechte. POST `/workspace`, action: - filter: name, query; deleteFilter: id - template: name, taskId; deleteTemplate: id - read: Benachrichtigungs-id - batch: tasks[{id,version}], status oder archived; Rückgabe results mit Teilerfolgen - claim: taskId, version; nur unzugewiesene offene Aufgabe mit tasks.claim und aktiver Gruppenmitgliedschaft - dependency: taskId, dependsOnId, remove?; Kreise, Selbstreferenz und fremde Gruppen werden abgewiesen - token: name, days (1–90), permissions aus tasks.read/tasks.export/comments.read/files.read; Geheimnis nur einmal angezeigt - revokeTokens: alle eigenen API-Tokens widerrufen - calendarToken / revokeCalendar: privater 90-Tage-Kalenderlink / alle eigenen Kalenderlinks widerrufen - webhook: name, url; disableWebhook: id ## Import und Export GET `/transfer`: CSV; format=xlsx: Excel; format=ics: Kalender. Export benötigt tasks.export UND tasks.read im jeweiligen Scope. Keine vertraulichen Daten in öffentlichen Dateien. CSV-Zellen mit Formelpräfix werden escaped; XLSX schreibt ausdrücklich Textzellen. POST `/transfer`: `{csv,commit:false}` oder `{xlsx:"base64",commit:false}` zur Vorschau; commit=true legt gültige Zeilen an. Ergebnis pro Zeile. Spalten: wo, was, bisWann, owningGroupId, assigneeId, priority, project, tags (Komma getrennt). Export enthält zusätzlich id/status, die beim Import keine bestehenden Aufgaben überschreiben. CSV verwendet Semikolon und UTF-8. Größen-/XML-/ZIP-Grenzen schützen den Excel-Parser. GET `/calendar/:token`: ICS-Abonnement. Der Link ist ein Geheimnis; aktuelle Benutzer- und Aufgabenrechte werden bei jedem Abruf neu geprüft. Lesende Bearer-Tokens können alternativ den regulären Export-Endpunkt nutzen. ## Integrationssicherheit API-Tokens werden ausschließlich gehasht gespeichert und erben zusätzlich die aktuellen Rechte ihres Besitzers. Sie können keine Schreibaktionen ausführen. Passwortänderung/Deaktivierung widerruft vorhandene Tokens. Webhooks benötigen betreiberseitige Hostfreigabe und enthalten eine HMAC-Signatur; Details in README.Docker.md.