{"openapi":"3.1.0","info":{"title":"Agile API","version":"1.0.0","summary":"Öffentliche API für Agile Projektmanagement, Agile Kalender und Agile Clips.","description":"Die API von **Agile Projektmanagement**, **Agile Kalender** und **Agile Clips** (Agile Developer). Sie kann alles, was die Oberfläche kann: dieselben Funktionen, dieselben Rechte, derselbe Arbeitsbereich.\n\n## Schnellstart\n\n1. In Agile Projektmanagement unter **Konto › API-Schlüssel** (https://projektmanagement.agiledeveloper.de/konto/#api-schluessel) einen Schlüssel anlegen, Rechte wählen und den Schlüssel kopieren. Er wird nur einmal angezeigt.\n2. Ersten Aufruf machen:\n\n```bash\ncurl https://projektmanagement.agiledeveloper.de/api/v1/ich \\\n  -H \"Authorization: Bearer agile_pm_IhrSchluessel\"\n```\n\n3. Ein Issue anlegen:\n\n```bash\ncurl -X POST https://projektmanagement.agiledeveloper.de/api/v1/issues/anlegen \\\n  -H \"Authorization: Bearer agile_pm_IhrSchluessel\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: 4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07\" \\\n  -d '{\"titel\":\"Speichern verliert die Anhänge\",\"art\":\"BUG\",\"prioritaet\":\"HOCH\"}'\n```\n\nAlle Pfade beginnen mit `/api/v1`. Die API ist unter allen drei Adressen gleich erreichbar (projektmanagement., calendar. und clips.agiledeveloper.de); wir empfehlen https://projektmanagement.agiledeveloper.de.\n\n## Authentifizierung\n\n- **API-Schlüssel** (`agile_pm_…`) im Kopf `Authorization: Bearer …`. Ein Schlüssel gehört einer Person in genau einem Arbeitsbereich und arbeitet mit deren Rolle, eingeschränkt auf die gewählten Rechte (Scopes). Er endet, wenn er widerrufen wird, abläuft, die Person das Team verlässt oder ihre Rolle sinkt.\n- **OAuth 2.1** (Authorization Code mit PKCE S256, dynamische Client-Registrierung) für Apps, die im Namen einer Person arbeiten, etwa Claude und ChatGPT. Discovery unter `https://projektmanagement.agiledeveloper.de/.well-known/oauth-authorization-server`.\n\n**Scopes:** je Bereich `<bereich>:lesen` und `<bereich>:schreiben` (schreiben schließt lesen ein), Bereiche: `issues`, `mockups`, `clips`, `integrationen`, `kalender`, `team`, `webhooks`. Dazu `lesen` und `schreiben` für alles. GET liest, alles andere schreibt. Bei fehlendem Recht kommt 403 mit `WWW-Authenticate: Bearer error=\"insufficient_scope\"`.\n\n## Fehler\n\nJeder Fehler hat dieselbe Form und einen passenden HTTP-Status:\n\n```json\n{ \"fehler\": { \"code\": \"nicht_gefunden\", \"nachricht\": \"Dieses Issue gibt es nicht (mehr).\", \"details\": {} } }\n```\n\nCodes: `ungueltige_anfrage` (400), `nicht_angemeldet` (401), `keine_berechtigung` (403), `nicht_gefunden` (404), `methode_nicht_erlaubt` (405), `konflikt` (409), `zu_gross` (413), `zu_viele_anfragen` (429), `serverfehler` (500), `nicht_verfuegbar` (503).\n\n## Pagination, Filter und Sortierung\n\nJede Liste nimmt `limit` (1 bis 1000, Standard 100) und `offset` (Standard 0) und antwortet zusätzlich mit `seite`: `{ limit, offset, gesamt, naechster_offset }`. Ist `naechster_offset` null, ist die Liste zu Ende. `sortierung=feld` sortiert aufsteigend, `sortierung=-feld` absteigend (etwa `-geaendert_am`). Filter stehen bei jeder Liste.\n\n## Rate-Limits\n\n300 Anfragen je Minute und Schlüssel bzw. Verbindung. Jede Antwort trägt `RateLimit-Limit`, `RateLimit-Remaining` und `RateLimit-Reset` (Sekunden); bei Überschreitung kommt 429 mit `Retry-After`.\n\n## Idempotenz\n\nSchreibende Aufrufe (POST, PATCH, DELETE) nehmen den Kopf `Idempotency-Key` (bis 200 Zeichen, etwa eine UUID). Kommt derselbe Schlüssel innerhalb von 24 Stunden noch einmal, wird nichts doppelt ausgeführt: die API antwortet mit der gespeicherten Antwort und dem Kopf `Idempotent-Replayed: true`. Läuft der erste Aufruf noch, kommt 409.\n\n## Webhooks\n\nUnter **Konto › Webhooks** oder per API (`/api/v1/webhooks`) tragen Inhaber und Admins eine https-Adresse ein und wählen Ereignisse: `issue.angelegt`, `issue.geaendert`, `issue.kommentiert`, `clip.fertig`, `termin.angelegt`, `termin.geaendert`, `termin.abgesagt`. Jede Zustellung ist ein POST mit JSON (siehe Abschnitt Webhooks) und dem Kopf\n\n```\nAgile-Signature: t=1760090000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd\n```\n\n`v1` ist HMAC-SHA256 über `<t>.<roher Körper>` mit Ihrem Geheimnis (`whsec_…`). Prüfen Sie die Signatur und dass `t` nicht älter als fünf Minuten ist. Antworten Sie mit 2xx innerhalb von zehn Sekunden; sonst versuchen wir es erneut (nach 1, 5, 30 Minuten, 2, 6 und 12 Stunden). `Agile-Event-Id` ist bei Wiederholungen gleich.\n\n## MCP für Claude und ChatGPT\n\nDerselbe Funktionsumfang steht als MCP-Server bereit: **https://projektmanagement.agiledeveloper.de/mcp** (Streamable HTTP, Anmeldung per OAuth). In Claude: Einstellungen › Konnektoren › Benutzerdefinierten Konnektor hinzufügen, URL einfügen, verbinden. In Claude Code: `claude mcp add --transport http agile-projektmanagement https://projektmanagement.agiledeveloper.de/mcp`. In ChatGPT: Einstellungen › Apps und Konnektoren › Erweitert › Entwicklermodus, dann Konnektor erstellen. Die ausführliche Anleitung steht unter https://projektmanagement.agiledeveloper.de/docs/mcp/.","contact":{"name":"Agile Developer","url":"https://agiledeveloper.de","email":"info@agiledeveloper.de"},"termsOfService":"https://agiledeveloper.de/impressum","license":{"name":"Proprietär (Nutzung mit einem Konto bei Agile Developer)","url":"https://agiledeveloper.de/impressum"}},"jsonSchemaDialect":"https://spec.openapis.org/oas/3.1/dialect/base","servers":[{"url":"https://projektmanagement.agiledeveloper.de/api","description":"Produktiv"},{"url":"https://calendar.agiledeveloper.de/api","description":"Gleiche API unter anderer Adresse"},{"url":"https://clips.agiledeveloper.de/api","description":"Gleiche API unter anderer Adresse"}],"tags":[{"name":"Issues","description":"Fehler, Wünsche, Aufgaben und Fragen mit Kommentaren, Screenshots, Anhängen, Verknüpfungen und eigenen Ansichten."},{"name":"Mockups","description":"Arbeitsdateien (Konzepte als Markdown, Klick-Mockups als HTML, Tabellen als CSV) mit Fassungen v1, v2 … und Notizen."},{"name":"Integrationen","description":"Schnittstellen zu Partnern und Diensten als Pipeline mit Verlauf, Ansprechpartnern und E-Mail."},{"name":"Team","description":"Mitglieder des Arbeitsbereichs, Einladungen per E-Mail."},{"name":"Arbeitsbereich","description":"Arbeitsbereiche der Person und Name des aktuellen."},{"name":"Termine","description":"Termine im Agile Kalender mit Teilnehmern, Einladungen per Mail und Videomeeting."},{"name":"Meeting-Links","description":"Moderator- und Gästelinks für Videomeetings auf meeting.agiledeveloper.de."},{"name":"Buchungslinks","description":"Persönliche Buchungsseite: Einstellungen (angemeldet) und Buchen (öffentlich)."},{"name":"Kalender-Abo","description":"ICS-Abo für Outlook, Apple Kalender und Google Kalender."},{"name":"Clips","description":"Bildschirmvideos mit Transkript, KI-Zusammenfassung, Kommentaren am Zeitpunkt und Freigabe per Link; Upload in Stücken."},{"name":"Identität","description":"Wer ist angemeldet, mit welchen Rechten."},{"name":"Webhooks","description":"Ereignisse an Ihre Adresse, signiert mit HMAC-SHA256."}],"x-tagGroups":[{"name":"Projektmanagement","tags":["Issues","Mockups","Integrationen","Team","Arbeitsbereich"]},{"name":"Kalender","tags":["Termine","Meeting-Links","Buchungslinks","Kalender-Abo"]},{"name":"Clips","tags":["Clips"]},{"name":"Plattform","tags":["Identität","Webhooks"]}],"paths":{"/v1/ich":{"get":{"tags":["Identität"],"summary":"Wer bin ich","description":"Person, Arbeitsbereich, Rolle und die Rechte (Scopes) des verwendeten Schlüssels bzw. der Verbindung. Gut als erster Aufruf, um einen Schlüssel zu prüfen.\n\n**Recht (Scope):** jeder gültige Zugang.","operationId":"getIch","parameters":[],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"benutzer":{"type":"object","properties":{"benutzer_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"name":{"type":"string","description":"Name.","example":"Anna Beispiel"},"email":{"type":"string","description":"E-Mail.","example":"anna@example.com"}},"additionalProperties":true},"arbeitsbereich":{"$ref":"#/components/schemas/Arbeitsbereich"},"rolle":{"type":"string","enum":["INHABER","ADMIN","MITGLIED","GAST"],"description":"Rolle.","example":"ADMIN"},"zugang":{"type":"object","properties":{"art":{"type":"string","enum":["SCHLUESSEL","OAUTH","SITZUNG"],"description":"Wie Sie angemeldet sind.","example":"SCHLUESSEL"},"name":{"type":"string","description":"Name des Schlüssels oder der App.","example":"Zapier"},"scopes":{"type":"array","items":{"type":"string","description":"Scope","example":"issues:schreiben"}}},"additionalProperties":true}},"additionalProperties":true},"example":{"benutzer":{"benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Anna Beispiel","email":"anna@example.com"},"arbeitsbereich":{"datenraum_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","workspace_id":"beispiel-gmbh","anzeigename":"Beispiel GmbH","rolle":"ADMIN"},"rolle":"ADMIN","zugang":{"art":"SCHLUESSEL","name":"Zapier","scopes":["issues:schreiben"]}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/rechte/meine":{"get":{"tags":["Identität"],"summary":"Meine Rechte","description":"Was die Person in diesem Arbeitsbereich darf (Module, Lesen/Schreiben).\n\n**Recht (Scope):** jeder gültige Zugang.","operationId":"getRechteMeine","parameters":[],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{},"description":"Rechte je Modul.","additionalProperties":true},"example":{}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/arbeitsbereiche":{"get":{"tags":["Arbeitsbereich"],"summary":"Arbeitsbereiche auflisten","description":"Alle Arbeitsbereiche, in denen die Person Mitglied ist, mit Rolle. Ein API-Schlüssel arbeitet immer nur in dem einen, für den er ausgestellt wurde (`aktuell`).\n\n**Recht (Scope):** `team:lesen` oder `lesen`.","operationId":"getArbeitsbereiche","parameters":[{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"arbeitsbereiche":{"type":"array","items":{"$ref":"#/components/schemas/Arbeitsbereich"}},"aktuell":{"type":"string","format":"uuid","description":"Arbeitsbereich dieses Zugangs.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"arbeitsbereiche":[{"datenraum_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","workspace_id":"beispiel-gmbh","anzeigename":"Beispiel GmbH","rolle":"ADMIN"}],"aktuell":"7c9e6679-7425-40de-944b-e07fc1f90ae7","seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/arbeitsbereich":{"patch":{"tags":["Arbeitsbereich"],"summary":"Arbeitsbereich umbenennen","description":"Ändert den Namen des Arbeitsbereichs. Nur Inhaber und Admins.\n\n**Recht (Scope):** `team:schreiben` oder `schreiben`.","operationId":"patchArbeitsbereich","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Hat geklappt.","example":true},"anzeigename":{"type":"string","description":"Neuer Name.","example":"Beispiel GmbH"}},"additionalProperties":true},"example":{"ok":true,"anzeigename":"Beispiel GmbH"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"anzeigename":{"type":"string","description":"Neuer Name.","example":"Beispiel GmbH"}},"required":["anzeigename"],"additionalProperties":true},"example":{"anzeigename":"Beispiel GmbH"}}}}}},"/v1/mitglieder":{"get":{"tags":["Team"],"summary":"Teammitglieder","description":"Alle aktiven Personen im Arbeitsbereich mit Rolle; für Zuständigkeiten und Termin-Teilnehmer.\n\n**Recht (Scope):** `team:lesen` oder `lesen`.","operationId":"getMitglieder","parameters":[{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"mitglieder":{"type":"array","items":{"$ref":"#/components/schemas/Mitglied"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"mitglieder":[{"benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Anna Beispiel","email":"anna@example.com","rolle":"MITGLIED"}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/einladungen":{"post":{"tags":["Team"],"summary":"Person einladen","description":"Lädt eine Person per E-Mail in den Arbeitsbereich ein (nur Inhaber und Admins). Die Mail geht sofort hinaus; die Person meldet sich danach mit einem Code an.\n\n**Recht (Scope):** `team:schreiben` oder `schreiben`.","operationId":"postEinladungen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Hat geklappt.","example":true},"benutzer":{"$ref":"#/components/schemas/Mitglied"},"neu":{"type":"boolean","description":"Konto neu angelegt.","example":true}},"additionalProperties":true},"example":{"ok":true,"benutzer":{"benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Anna Beispiel","email":"anna@example.com","rolle":"MITGLIED"},"neu":true}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"E-Mail-Adresse.","example":"ben@example.com"},"name":{"type":"string","description":"Name (optional).","example":"Ben Muster"},"rolle":{"type":"string","enum":["ADMIN","MITGLIED","GAST"],"description":"Rolle.","example":"MITGLIED"}},"required":["email"],"additionalProperties":true},"example":{"email":"ben@example.com","name":"Ben Muster","rolle":"MITGLIED"}}}}}},"/v1/mitglieder/{benutzer_id}":{"delete":{"tags":["Team"],"summary":"Person entfernen","description":"Entfernt eine Person aus dem Arbeitsbereich (nicht den Inhaber). Ihre Schlüssel und Verbindungen für diesen Arbeitsbereich enden damit.\n\n**Recht (Scope):** `team:schreiben` oder `schreiben`.","operationId":"deleteMitgliederBenutzerId","parameters":[{"name":"benutzer_id","in":"path","required":true,"schema":{"type":"string","example":"3f1d2a40-1a2b-4c5d-8e9f-0123456789ab"},"description":"ID (benutzer_id)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Hat geklappt.","example":true},"entfernt":{"type":"integer","description":"Entfernte Mitgliedschaften (0 oder 1).","example":1}},"additionalProperties":true},"example":{"ok":true,"entfernt":1}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/issues/liste":{"get":{"tags":["Issues"],"summary":"Issues auflisten","description":"Alle Issues mit Zählern, zuletzt geänderte zuerst. Filter sind kombinierbar.\n\n**Recht (Scope):** `issues:lesen` oder `lesen`.","operationId":"getIssuesListe","parameters":[{"name":"q","in":"query","required":false,"description":"Suchwort.","schema":{"type":"string","description":"Suchwort in Nummer, Titel, Beschreibung und Labels.","example":"safari"},"example":"safari"},{"name":"status","in":"query","required":false,"description":"Status-Filter.","schema":{"type":"string","description":"Ein oder mehrere Status mit Komma, oder OFFEN_ALLE für alles nicht Abgeschlossene.","example":"OFFEN,IN_ARBEIT"},"example":"OFFEN,IN_ARBEIT"},{"name":"art","in":"query","required":false,"description":"Art-Filter.","schema":{"type":"string","description":"Eine oder mehrere Arten mit Komma.","example":"BUG"},"example":"BUG"},{"name":"prioritaet","in":"query","required":false,"description":"Prioritäts-Filter.","schema":{"type":"string","description":"Eine oder mehrere Prioritäten mit Komma.","example":"DRINGEND,HOCH"},"example":"DRINGEND,HOCH"},{"name":"label","in":"query","required":false,"description":"Label-Filter.","schema":{"type":"string","description":"Ein oder mehrere Labels mit Komma.","example":"frontend"},"example":"frontend"},{"name":"zustaendig","in":"query","required":false,"description":"Zuständigkeit.","schema":{"type":"string","description":"benutzer_id, „ich\" oder „niemand\".","example":"ich"},"example":"ich"},{"name":"blockiert","in":"query","required":false,"description":"Blockiert-Filter.","schema":{"type":"string","enum":["ja","nein"],"description":"ja = nur blockierte, nein = nur unblockierte.","example":"ja"},"example":"ja"},{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"issues":{"type":"array","items":{"$ref":"#/components/schemas/Issue"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"issues":[{"issue_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":12,"titel":"Speichern verliert die Anhänge in Safari","art":"BUG","status":"OFFEN","prioritaet":"HOCH","labels":["frontend"],"bereich":"Editor","seite":"https://app.example.com/editor","zustaendig_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","zustaendig_name":"Ben Muster","faellig_am":"2026-10-14T09:30:00+02:00","ki_eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","angelegt_von_name":"Anna Beispiel","angelegt_ueber":"HAND","angelegt_am":"2026-10-14T09:30:00+02:00","geaendert_am":"2026-10-14T09:30:00+02:00","erledigt_am":"2026-10-14T09:30:00+02:00","auszug":"Beim Speichern in Safari 17 …","kommentare":3,"bilder":1,"anhaenge":0,"beziehungen":1,"blockiert_offen":0}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/issues/issue":{"get":{"tags":["Issues"],"summary":"Ein Issue lesen","description":"Ein Issue mit Beschreibung, Kommentaren, Screenshots, Anhängen, Verknüpfungen, „Erwähnt in\" und Verlauf. Entweder `nummer` oder `id`.\n\n**Recht (Scope):** `issues:lesen` oder `lesen`.","operationId":"getIssuesIssue","parameters":[{"name":"nummer","in":"query","required":false,"description":"Nummer.","schema":{"type":"integer","description":"Nummer (12 oder #12).","example":12},"example":12},{"name":"id","in":"query","required":false,"description":"ID.","schema":{"type":"string","format":"uuid","description":"issue_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueVoll"},"example":{"issue_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":12,"titel":"Speichern verliert die Anhänge in Safari","beschreibung":"Schritte: 1. Datei anhängen 2. Speichern …","kommentare":[{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Kann ich nachstellen, betrifft nur Safari.","benutzer_name":"Ben Muster","erstellt_am":"2026-10-14T09:30:00+02:00","erstellt_ueber":"HAND"}],"bilder":[{"bild_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"fehler.png"}],"anhaenge":[{"anhang_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"protokoll.pdf","groesse_bytes":48213}],"beziehungen":[{"beziehung_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","art":"BLOCKIERT","nummer":4}],"verlauf":[{"art":"STATUS","von":"OFFEN","zu":"IN_ARBEIT","am":"2026-10-14T09:30:00+02:00"}],"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=12"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]},"delete":{"tags":["Issues"],"summary":"Issue löschen","description":"Löscht ein Issue (weich). Nur die Leitung oder wer es angelegt hat.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"deleteIssuesIssue","parameters":[{"name":"id","in":"query","required":true,"description":"issue_id.","schema":{"type":"string","format":"uuid","description":"issue_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geloescht"},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/issues/anlegen":{"post":{"tags":["Issues"],"summary":"Issue anlegen","description":"Legt ein Issue an. Die Antwort nennt Nummer, Link und unter `aehnlich` mögliche Doppelte. Screenshots als Base64 in `bilder`, Verknüpfungen in `beziehungen`.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesAnlegen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"issue_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Nummer.","example":13},"link":{"type":"string","description":"Link.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=13"},"bilder":{"type":"integer","description":"Gespeicherte Screenshots.","example":0},"verknuepft":{"type":"array","items":{"type":"integer","description":"Nummer","example":4}},"aehnlich":{"type":"array","items":{"type":"object","properties":{"nummer":{"type":"integer","description":"Nummer.","example":9},"titel":{"type":"string","description":"Titel.","example":"Anhänge fehlen nach Speichern"}},"additionalProperties":true}}},"additionalProperties":true},"example":{"issue_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":13,"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=13","bilder":0,"verknuepft":[4],"aehnlich":[{"nummer":9,"titel":"Anhänge fehlen nach Speichern"}]}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"titel":{"type":"string","description":"Kurzer Titel.","example":"Speichern verliert die Anhänge in Safari"},"beschreibung":{"type":"string","description":"Markdown; „#12\" verweist auf Issue 12.","example":"Schritte zum Nachstellen …"},"art":{"type":"string","enum":["BUG","VERBESSERUNG","AUFGABE","FRAGE"],"description":"Art.","example":"BUG"},"status":{"type":"string","enum":["OFFEN","IN_ARBEIT","IN_PRUEFUNG","ERLEDIGT","VERWORFEN"],"description":"Status.","example":"OFFEN"},"prioritaet":{"type":"string","enum":["DRINGEND","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"HOCH"},"labels":{"type":"array","items":{"type":"string","description":"Label","example":"safari"}},"bereich":{"type":"string","description":"Bereich.","example":"Editor"},"seite":{"type":"string","description":"Adresse, wo es auftrat.","example":"https://app.example.com/editor"},"zustaendig_id":{"type":"string","format":"uuid","description":"Zuständige Person (aus /mitglieder).","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"faellig_am":{"type":"string","description":"Fälligkeit (ISO-Datum).","example":"2026-10-20"},"ki_eintrag_id":{"type":"string","format":"uuid","description":"Verknüpftes Mockup.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"bilder":{"type":"array","items":{"type":"object","properties":{"dateiname":{"type":"string","description":"Name.","example":"fehler.png"},"daten":{"type":"string","description":"Base64 oder data:-URL (PNG, JPEG, GIF, WebP, je bis 5 MB).","example":"iVBORw0KGgo…"}},"required":["daten"],"additionalProperties":true}},"beziehungen":{"type":"array","items":{"type":"object","properties":{"art":{"type":"string","enum":["BLOCKIERT","DUPLIKAT","GEHOERT_ZU","VERWANDT"],"description":"Art.","example":"BLOCKIERT"},"nummer":{"type":"integer","description":"Anderes Issue.","example":4},"richtung":{"type":"string","enum":["von","zu"],"description":"„zu\": das andere Issue ist der Ausgangspunkt.","example":"von"}},"required":["art"],"additionalProperties":true}}},"required":["titel"],"additionalProperties":true},"example":{"titel":"Speichern verliert die Anhänge in Safari","beschreibung":"1. Datei anhängen\n2. Speichern\n\nErwartet: Anhang bleibt. Tatsächlich: weg.","art":"BUG","prioritaet":"HOCH","labels":["safari"]}}}}}},"/v1/issues/aendern":{"post":{"tags":["Issues"],"summary":"Issue ändern","description":"Ändert nur die mitgeschickten Felder; jede Änderung steht im Verlauf. `issue_id` oder `nummer`.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesAendern","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueVoll"},"example":{"issue_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":12,"titel":"Speichern verliert die Anhänge in Safari","beschreibung":"Schritte: 1. Datei anhängen 2. Speichern …","kommentare":[{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Kann ich nachstellen, betrifft nur Safari.","benutzer_name":"Ben Muster","erstellt_am":"2026-10-14T09:30:00+02:00","erstellt_ueber":"HAND"}],"bilder":[{"bild_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"fehler.png"}],"anhaenge":[{"anhang_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"protokoll.pdf","groesse_bytes":48213}],"beziehungen":[{"beziehung_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","art":"BLOCKIERT","nummer":4}],"verlauf":[{"art":"STATUS","von":"OFFEN","zu":"IN_ARBEIT","am":"2026-10-14T09:30:00+02:00"}],"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=12"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"issue_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":12},"titel":{"type":"string","description":"Titel.","example":"Neuer Titel"},"beschreibung":{"type":"string","description":"Markdown.","example":"…"},"art":{"type":"string","enum":["BUG","VERBESSERUNG","AUFGABE","FRAGE"],"description":"Art.","example":"BUG"},"status":{"type":"string","enum":["OFFEN","IN_ARBEIT","IN_PRUEFUNG","ERLEDIGT","VERWORFEN"],"description":"Status.","example":"IN_ARBEIT"},"prioritaet":{"type":"string","enum":["DRINGEND","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"DRINGEND"},"labels":{"type":"array","items":{"type":"string","description":"Label","example":"safari"}},"bereich":{"type":"string","description":"Bereich.","example":""},"seite":{"type":"string","description":"Seite.","example":""},"zustaendig_id":{"type":["string","null"],"format":"uuid","description":"Zuständig; null = niemand.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"faellig_am":{"type":["string","null"],"description":"Fälligkeit; null = keine.","example":"2026-10-20"},"ki_eintrag_id":{"type":["string","null"],"format":"uuid","description":"Mockup.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"nummer":12,"status":"IN_ARBEIT","zustaendig_id":"3f1d2a40-1a2b-4c5d-8e9f-0123456789ab"}}}}}},"/v1/issues/kommentar":{"post":{"tags":["Issues"],"summary":"Issue kommentieren","description":"Schreibt einen Kommentar (Markdown, „#12\" wird verlinkt), optional mit Screenshots.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesKommentar","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"kommentar_id":{"type":"string","format":"uuid","description":"Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Issue.","example":12},"bilder":{"type":"integer","description":"Screenshots.","example":0},"erwaehnt":{"type":"integer","description":"Erwähnte Issues.","example":0},"link":{"type":"string","description":"Link.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=12"}},"additionalProperties":true},"example":{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":12,"bilder":0,"erwaehnt":0,"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=12"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"issue_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":12},"text":{"type":"string","description":"Text (Markdown).","example":"Kann ich nachstellen, nur in Safari."},"bilder":{"type":"array","items":{"type":"object","properties":{"dateiname":{"type":"string","description":"Name.","example":"a.png"},"daten":{"type":"string","description":"Base64.","example":"iVBORw0KGgo…"}},"required":["daten"],"additionalProperties":true}}},"required":["text"],"additionalProperties":true},"example":{"nummer":12,"text":"Kann ich nachstellen, nur in Safari 17."}}}}},"delete":{"tags":["Issues"],"summary":"Eigenen Kommentar löschen","description":"Löscht einen eigenen Kommentar samt seiner Screenshots.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"deleteIssuesKommentar","parameters":[{"name":"id","in":"query","required":true,"description":"kommentar_id.","schema":{"type":"string","format":"uuid","description":"kommentar_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"geloescht":{"type":"string","format":"uuid","description":"Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Issue.","example":12}},"additionalProperties":true},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":12}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/issues/kommentar-aendern":{"post":{"tags":["Issues"],"summary":"Eigenen Kommentar ändern","description":"Ändert den Text eines eigenen Kommentars.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesKommentarAendern","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"},"example":{"ok":true}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kommentar_id":{"type":"string","format":"uuid","description":"Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"text":{"type":"string","description":"Neuer Text.","example":"Korrektur: auch in Chrome."}},"required":["kommentar_id","text"],"additionalProperties":true},"example":{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Korrektur: auch in Chrome."}}}}}},"/v1/issues/bilder":{"post":{"tags":["Issues"],"summary":"Screenshots anhängen","description":"Hängt Bilder an ein Issue (PNG, JPEG, GIF, WebP, je bis 5 MB, Base64).\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesBilder","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"bild_ids":{"type":"array","items":{"type":"string","format":"uuid","description":"bild_id","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"link":{"type":"string","description":"Link.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=12"}},"additionalProperties":true},"example":{"bild_ids":["7c9e6679-7425-40de-944b-e07fc1f90ae7"],"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=12"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"issue_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":12},"bilder":{"type":"array","items":{"type":"object","properties":{"dateiname":{"type":"string","description":"Name.","example":"fehler.png"},"daten":{"type":"string","description":"Base64 oder data:-URL.","example":"iVBORw0KGgo…"}},"required":["daten"],"additionalProperties":true}}},"required":["bilder"],"additionalProperties":true},"example":{"nummer":12,"bilder":[{"dateiname":"fehler.png","daten":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="}]}}}}}},"/v1/issues/bild":{"get":{"tags":["Issues"],"summary":"Screenshot laden","description":"Liefert einen Screenshot als Bild (bild_id aus dem Issue).\n\n**Recht (Scope):** `issues:lesen` oder `lesen`.","operationId":"getIssuesBild","parameters":[{"name":"id","in":"query","required":true,"description":"bild_id.","schema":{"type":"string","format":"uuid","description":"bild_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"responses":{"200":{"description":"Die Datei.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"image/*":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/issues/anhang":{"post":{"tags":["Issues"],"summary":"Datei anhängen","description":"Hängt eine beliebige Datei an (roh im Körper, bis 100 MB). Den Dateinamen im Kopf `X-Dateiname` (URI-kodiert) mitschicken.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesAnhang","parameters":[{"name":"issue_id","in":"query","required":false,"description":"Issue.","schema":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"nummer","in":"query","required":false,"description":"Issue-Nummer.","schema":{"type":"integer","description":"Oder die Nummer.","example":12},"example":12},{"name":"X-Dateiname","in":"header","required":true,"description":"Dateiname.","schema":{"type":"string","description":"Dateiname, URI-kodiert.","example":"protokoll.pdf"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"anhang_id":{"type":"string","format":"uuid","description":"Anhang.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"dateiname":{"type":"string","description":"Name.","example":"protokoll.pdf"},"groesse_bytes":{"type":"integer","description":"Größe.","example":48213}},"additionalProperties":true},"example":{"anhang_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"protokoll.pdf","groesse_bytes":48213}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}},"get":{"tags":["Issues"],"summary":"Anhang herunterladen","description":"Lädt einen Anhang herunter (anhang_id aus dem Issue).\n\n**Recht (Scope):** `issues:lesen` oder `lesen`.","operationId":"getIssuesAnhang","parameters":[{"name":"id","in":"query","required":true,"description":"anhang_id.","schema":{"type":"string","format":"uuid","description":"anhang_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"responses":{"200":{"description":"Die Datei.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]},"delete":{"tags":["Issues"],"summary":"Anhang entfernen","description":"Entfernt einen Anhang.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"deleteIssuesAnhang","parameters":[{"name":"id","in":"query","required":true,"description":"anhang_id.","schema":{"type":"string","format":"uuid","description":"anhang_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geloescht"},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/issues/beziehung":{"post":{"tags":["Issues"],"summary":"Issues verknüpfen","description":"Verknüpft zwei Issues: BLOCKIERT (blockiert das Ziel), DUPLIKAT, GEHOERT_ZU (ist Teil des Ziels), VERWANDT.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesBeziehung","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"beziehung_id":{"type":"string","format":"uuid","description":"Verknüpfung.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"von":{"type":"integer","description":"Von.","example":12},"zu":{"type":"integer","description":"Zu.","example":4}},"additionalProperties":true},"example":{"beziehung_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","von":12,"zu":4}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"issue_id":{"type":"string","format":"uuid","description":"Ausgangspunkt.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder seine Nummer.","example":12},"art":{"type":"string","enum":["BLOCKIERT","DUPLIKAT","GEHOERT_ZU","VERWANDT"],"description":"Art.","example":"BLOCKIERT"},"ziel_nummer":{"type":"integer","description":"Ziel-Nummer.","example":4},"ziel_id":{"type":"string","format":"uuid","description":"Oder Ziel-ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["art"],"additionalProperties":true},"example":{"nummer":12,"art":"BLOCKIERT","ziel_nummer":4}}}}},"delete":{"tags":["Issues"],"summary":"Verknüpfung lösen","description":"Löst eine Verknüpfung (beziehung_id aus dem Issue).\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"deleteIssuesBeziehung","parameters":[{"name":"id","in":"query","required":true,"description":"beziehung_id.","schema":{"type":"string","format":"uuid","description":"beziehung_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"geloest":{"type":"string","format":"uuid","description":"Verknüpfung.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"geloest":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/issues/personen":{"get":{"tags":["Issues"],"summary":"Mögliche Zuständige","description":"Wer im Arbeitsbereich ein Issue übernehmen kann (für zustaendig_id).\n\n**Recht (Scope):** `issues:lesen` oder `lesen`.","operationId":"getIssuesPersonen","parameters":[{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"personen":{"type":"array","items":{"$ref":"#/components/schemas/Mitglied"}},"ich":{"type":"string","format":"uuid","description":"Ihre benutzer_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"personen":[{"benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Anna Beispiel","email":"anna@example.com","rolle":"MITGLIED"}],"ich":"7c9e6679-7425-40de-944b-e07fc1f90ae7","seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/issues/ansichten":{"get":{"tags":["Issues"],"summary":"Eigene Ansichten","description":"Die eigenen gespeicherten Ansichten (Filter, Ordnung, Darstellung) in ihrer Reihenfolge.\n\n**Recht (Scope):** `issues:lesen` oder `lesen`.","operationId":"getIssuesAnsichten","parameters":[{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"ansichten":{"type":"array","items":{"type":"object","properties":{"ansicht_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"name":{"type":"string","description":"Name.","example":"Meine Bugs"},"symbol":{"type":"string","description":"Emoji.","example":"🐞"},"filter":{"type":"object","properties":{},"additionalProperties":true},"ordnung":{"type":"string","description":"Ordnung.","example":"prioritaet"},"darstellung":{"type":"string","description":"Darstellung.","example":"liste"}},"additionalProperties":true}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"ansichten":[{"ansicht_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Meine Bugs","symbol":"🐞","filter":{},"ordnung":"prioritaet","darstellung":"liste"}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]},"post":{"tags":["Issues"],"summary":"Ansicht speichern","description":"Speichert eine eigene Ansicht.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesAnsichten","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ansicht":{"type":"object","properties":{"ansicht_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true}},"additionalProperties":true},"example":{"ansicht":{"ansicht_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name.","example":"Meine Bugs"},"symbol":{"type":"string","description":"Emoji.","example":"🐞"},"filter":{"type":"object","properties":{"status":{"type":"array","items":{"type":"string","description":"Status","example":"OFFEN"}},"art":{"type":"array","items":{"type":"string","description":"Art","example":"BUG"}},"zustaendig":{"type":"array","items":{"type":"string","description":"Person","example":"ich"}}},"additionalProperties":true},"ordnung":{"type":"string","enum":["prioritaet","bewegt","nummer"],"description":"Ordnung.","example":"prioritaet"},"darstellung":{"type":"string","enum":["liste","board"],"description":"Darstellung.","example":"liste"}},"required":["name"],"additionalProperties":true},"example":{"name":"Meine Bugs","symbol":"🐞","filter":{"art":["BUG"],"zustaendig":["ich"]},"ordnung":"prioritaet","darstellung":"liste"}}}}},"patch":{"tags":["Issues"],"summary":"Ansicht ändern","description":"Ändert eine eigene Ansicht (umbenennen, Symbol, Filter).\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"patchIssuesAnsichten","parameters":[{"name":"id","in":"query","required":true,"description":"ansicht_id.","schema":{"type":"string","format":"uuid","description":"ansicht_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ansicht":{"type":"object","properties":{"ansicht_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true}},"additionalProperties":true},"example":{"ansicht":{"ansicht_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name.","example":"Meine offenen Bugs"},"symbol":{"type":"string","description":"Emoji.","example":"🐞"},"filter":{"type":"object","properties":{},"additionalProperties":true},"ordnung":{"type":"string","description":"Ordnung.","example":"nummer"},"darstellung":{"type":"string","description":"Darstellung.","example":"board"}},"additionalProperties":true},"example":{"name":"Meine offenen Bugs"}}}}},"delete":{"tags":["Issues"],"summary":"Ansicht löschen","description":"Löscht eine eigene Ansicht.\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"deleteIssuesAnsichten","parameters":[{"name":"id","in":"query","required":true,"description":"ansicht_id.","schema":{"type":"string","format":"uuid","description":"ansicht_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geloescht"},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/issues/ansichten/reihenfolge":{"post":{"tags":["Issues"],"summary":"Ansichten ordnen","description":"Ordnet die eigenen Ansichten neu (alle IDs in der neuen Reihenfolge).\n\n**Recht (Scope):** `issues:schreiben` oder `schreiben`.","operationId":"postIssuesAnsichtenReihenfolge","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ansichten":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"additionalProperties":true},"example":{"ansichten":[{}]}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid","description":"ansicht_id","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}},"required":["ids"],"additionalProperties":true},"example":{"ids":["7c9e6679-7425-40de-944b-e07fc1f90ae7"]}}}}}},"/v1/ki-ablage/liste":{"get":{"tags":["Mockups"],"summary":"Mockups auflisten","description":"Alle Einträge (Konzepte, Klick-Mockups, Tabellen) mit Status, Priorität, Schlagworten und den Dateien der aktuellen Fassung.\n\n**Recht (Scope):** `mockups:lesen` oder `lesen`.","operationId":"getKiAblageListe","parameters":[{"name":"q","in":"query","required":false,"description":"Suchwort.","schema":{"type":"string","description":"Sucht in Titel, Beschreibung, Schlagworten und Dateinamen.","example":"onboarding"},"example":"onboarding"},{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"eintraege":{"type":"array","items":{"$ref":"#/components/schemas/Mockup"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"eintraege":[{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","titel":"Onboarding-Konzept","beschreibung":"Erster Entwurf","status":"ENTWURF","prioritaet":"MITTEL","schlagworte":["onboarding"],"aktuelle_fassung":2,"dateien":[{"datei_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"konzept.md","art":"MARKDOWN","groesse_bytes":5120}],"angelegt_am":"2026-10-14T09:30:00+02:00","geaendert_am":"2026-10-14T09:30:00+02:00"}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/ki-ablage/eintrag":{"get":{"tags":["Mockups"],"summary":"Mockup lesen","description":"Ein Eintrag mit allen Fassungen (v1, v2 …), deren Dateien (mit datei_id) und den Notizen.\n\n**Recht (Scope):** `mockups:lesen` oder `lesen`.","operationId":"getKiAblageEintrag","parameters":[{"name":"id","in":"query","required":true,"description":"eintrag_id.","schema":{"type":"string","format":"uuid","description":"eintrag_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"titel":{"type":"string","description":"Titel.","example":"Onboarding-Konzept"},"fassungen":{"type":"array","items":{"type":"object","properties":{"fassung":{"type":"integer","description":"Fassung.","example":1},"aenderung":{"type":"string","description":"Was sich änderte.","example":"Erster Entwurf"},"dateien":{"type":"array","items":{"$ref":"#/components/schemas/MockupDatei"}}},"additionalProperties":true}},"notizen":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Notiz.","example":"Bitte Farben prüfen"}},"additionalProperties":true}}},"additionalProperties":true},"example":{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","titel":"Onboarding-Konzept","fassungen":[{"fassung":1,"aenderung":"Erster Entwurf","dateien":[{"datei_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"konzept.md","art":"MARKDOWN","groesse_bytes":5120}]}],"notizen":[{"text":"Bitte Farben prüfen"}]}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]},"delete":{"tags":["Mockups"],"summary":"Mockup löschen","description":"Löscht einen Eintrag (weich). Nur die Leitung oder wer ihn angelegt hat.\n\n**Recht (Scope):** `mockups:schreiben` oder `schreiben`.","operationId":"deleteKiAblageEintrag","parameters":[{"name":"id","in":"query","required":true,"description":"eintrag_id.","schema":{"type":"string","format":"uuid","description":"eintrag_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geloescht"},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/ki-ablage/datei":{"get":{"tags":["Mockups"],"summary":"Datei lesen","description":"Den Inhalt einer Datei lesen (datei_id aus dem Eintrag).\n\n**Recht (Scope):** `mockups:lesen` oder `lesen`.","operationId":"getKiAblageDatei","parameters":[{"name":"id","in":"query","required":true,"description":"datei_id.","schema":{"type":"string","format":"uuid","description":"datei_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"datei_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"dateiname":{"type":"string","description":"Name.","example":"konzept.md"},"inhalt":{"type":"string","description":"Inhalt.","example":"# Onboarding …"}},"additionalProperties":true},"example":{"datei_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateiname":"konzept.md","inhalt":"# Onboarding …"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/ki-ablage/anlegen":{"post":{"tags":["Mockups"],"summary":"Mockup anlegen","description":"Legt einen Eintrag mit Fassung v1 an. Gibt es den Titel schon, kommt 409 mit dessen eintrag_id in `details`; dann eine neue Fassung anlegen.\n\n**Recht (Scope):** `mockups:schreiben` oder `schreiben`.","operationId":"postKiAblageAnlegen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"fassung":{"type":"integer","description":"Fassung.","example":1},"link":{"type":"string","description":"Link.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=mockups&id=7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","fassung":1,"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=mockups&id=7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"titel":{"type":"string","description":"Titel.","example":"Onboarding-Konzept"},"dateien":{"type":"array","items":{"$ref":"#/components/schemas/DateiInhalt"}},"beschreibung":{"type":"string","description":"Beschreibung.","example":"Erster Entwurf"},"status":{"type":"string","enum":["ENTWURF","IN_ARBEIT","IN_PRUEFUNG","AENDERUNGEN","ERLEDIGT","VERWORFEN"],"description":"Status.","example":"ENTWURF"},"prioritaet":{"type":"string","enum":["KRITISCH","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"KRITISCH"},"schlagworte":{"type":"array","items":{"type":"string","description":"Schlagwort","example":"onboarding"}},"aenderung":{"type":"string","description":"Notiz zur Fassung.","example":"Erster Entwurf"}},"required":["titel","dateien"],"additionalProperties":true},"example":{"titel":"Onboarding-Konzept","dateien":[{"dateiname":"konzept.md","inhalt":"# Onboarding\n\n1. Konto anlegen\n2. Team einladen"}],"schlagworte":["onboarding"]}}}}}},"/v1/ki-ablage/fassung":{"post":{"tags":["Mockups"],"summary":"Neue Fassung","description":"Legt eine neue Fassung an (v2, v3 …). Gleicher Dateiname ersetzt, nicht gelieferte Dateien gehen unverändert mit; `entfernen` nimmt Dateien heraus.\n\n**Recht (Scope):** `mockups:schreiben` oder `schreiben`.","operationId":"postKiAblageFassung","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"fassung":{"type":"integer","description":"Neue Fassung.","example":2},"link":{"type":"string","description":"Link.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=mockups&id=7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","fassung":2,"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=mockups&id=7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"Eintrag.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"dateien":{"type":"array","items":{"$ref":"#/components/schemas/DateiInhalt"}},"entfernen":{"type":"array","items":{"type":"string","description":"Dateiname","example":"alt.md"}},"aenderung":{"type":"string","description":"Was sich geändert hat.","example":"Schritt 3 ergänzt"},"status":{"type":"string","enum":["ENTWURF","IN_ARBEIT","IN_PRUEFUNG","AENDERUNGEN","ERLEDIGT","VERWORFEN"],"description":"Status.","example":"ENTWURF"},"prioritaet":{"type":"string","enum":["KRITISCH","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"KRITISCH"}},"required":["eintrag_id"],"additionalProperties":true},"example":{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","dateien":[{"dateiname":"konzept.md","inhalt":"# Onboarding\n\n1. Konto anlegen\n2. Team einladen\n3. Erstes Issue"}],"aenderung":"Schritt 3 ergänzt"}}}}}},"/v1/ki-ablage/aendern":{"post":{"tags":["Mockups"],"summary":"Mockup ändern","description":"Ändert Kopfdaten (Titel, Beschreibung, Status, Priorität, Schlagworte).\n\n**Recht (Scope):** `mockups:schreiben` oder `schreiben`.","operationId":"postKiAblageAendern","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{},"description":"Der Eintrag wie bei „Mockup lesen“.","additionalProperties":true},"example":{}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"Eintrag.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"titel":{"type":"string","description":"Titel.","example":"Onboarding v2"},"beschreibung":{"type":"string","description":"Beschreibung.","example":""},"status":{"type":"string","enum":["ENTWURF","IN_ARBEIT","IN_PRUEFUNG","AENDERUNGEN","ERLEDIGT","VERWORFEN"],"description":"Status.","example":"IN_PRUEFUNG"},"prioritaet":{"type":"string","enum":["KRITISCH","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"KRITISCH"},"schlagworte":{"type":"array","items":{"type":"string","description":"Schlagwort","example":"onboarding"}}},"required":["eintrag_id"],"additionalProperties":true},"example":{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","status":"IN_PRUEFUNG"}}}}}},"/v1/ki-ablage/notiz":{"post":{"tags":["Mockups"],"summary":"Notiz schreiben","description":"Schreibt eine Notiz an einen Eintrag.\n\n**Recht (Scope):** `mockups:schreiben` oder `schreiben`.","operationId":"postKiAblageNotiz","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"notiz_id":{"type":"string","format":"uuid","description":"Notiz.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"notiz_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"Eintrag.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"text":{"type":"string","description":"Notiz.","example":"Bitte Farben prüfen"}},"required":["eintrag_id","text"],"additionalProperties":true},"example":{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Bitte Farben prüfen"}}}}}},"/v1/ki-ablage/ansicht-ticket":{"post":{"tags":["Mockups"],"summary":"Vorschau-Adresse","description":"Eine Adresse für die Vorschau einer HTML-Datei (zehn Minuten gültig, nur diese Datei).\n\n**Recht (Scope):** `mockups:lesen` oder `lesen`.","operationId":"postKiAblageAnsichtTicket","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Vorschau-Adresse.","example":"https://projektmanagement.agiledeveloper.de/api/ki-ablage/ansicht?t=…"}},"additionalProperties":true},"example":{"url":"https://projektmanagement.agiledeveloper.de/api/ki-ablage/ansicht?t=…"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"datei_id":{"type":"string","format":"uuid","description":"Datei.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["datei_id"],"additionalProperties":true},"example":{"datei_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}}},"/v1/integrationen/kataloge":{"get":{"tags":["Integrationen"],"summary":"Kataloge","description":"Die Werte für Art, Status (Pipeline), Priorität, Datenarten und Einträge im Verlauf.\n\n**Recht (Scope):** `integrationen:lesen` oder `lesen`.","operationId":"getIntegrationenKataloge","parameters":[],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"arten":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}},"status":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}},"prioritaeten":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}},"datenarten":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}},"eintrag_arten":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"additionalProperties":true},"example":{"arten":[{}],"status":[{}],"prioritaeten":[{}],"datenarten":[{}],"eintrag_arten":[{}]}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/integrationen/liste":{"get":{"tags":["Integrationen"],"summary":"Integrationen auflisten","description":"Alle Integrationen (Dienste und Partner, mit denen das Team Daten austauscht) mit Pipeline-Status und Zählern.\n\n**Recht (Scope):** `integrationen:lesen` oder `lesen`.","operationId":"getIntegrationenListe","parameters":[{"name":"q","in":"query","required":false,"description":"Suchwort.","schema":{"type":"string","description":"Suchwort.","example":"stripe"},"example":"stripe"},{"name":"status","in":"query","required":false,"description":"Status.","schema":{"type":"string","enum":["IDEE","RECHERCHE","ANGEFRAGT","IM_GESPRAECH","VERTRAG","UMSETZUNG","TEST","LIVE","PAUSIERT","ABGELEHNT"],"description":"Status.","example":"IDEE"},"example":"IDEE"},{"name":"art","in":"query","required":false,"description":"Art.","schema":{"type":"string","description":"Art.","example":"ZAHLUNG"},"example":"ZAHLUNG"},{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"integrationen":{"type":"array","items":{"$ref":"#/components/schemas/Integration"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"integrationen":[{"integration_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":3,"name":"Stripe","art":"ZAHLUNG","status":"IM_GESPRAECH","prioritaet":"HOCH","naechster_schritt":"Vertrag prüfen","faellig_am":"2026-10-20","zustaendig_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/integrationen/integration":{"get":{"tags":["Integrationen"],"summary":"Integration lesen","description":"Eine Integration mit Beschreibung, Checkliste, Ansprechpartnern und dem ganzen Verlauf. `nummer` oder `id`.\n\n**Recht (Scope):** `integrationen:lesen` oder `lesen`.","operationId":"getIntegrationenIntegration","parameters":[{"name":"nummer","in":"query","required":false,"description":"Nummer.","schema":{"type":"integer","description":"Nummer.","example":3},"example":3},{"name":"id","in":"query","required":false,"description":"ID.","schema":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"integration_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Nummer.","example":3},"name":{"type":"string","description":"Name.","example":"Stripe"},"kontakte":{"type":"array","items":{"type":"object","properties":{"kontakt_id":{"type":"string","format":"uuid","description":"Kontakt.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"name":{"type":"string","description":"Name.","example":"Max Kontakt"}},"additionalProperties":true}},"eintraege":{"type":"array","items":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"Eintrag.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"art":{"type":"string","enum":["NOTIZ","EMAIL","ANRUF","TERMIN","UNTERLAGE","ZUGANG"],"description":"Art.","example":"NOTIZ"}},"additionalProperties":true}},"link":{"type":"string","description":"Link.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=anbindungen&n=3"}},"description":"Die Integration mit allen Feldern aus Integration, dazu Kontakte und Verlauf.","additionalProperties":true},"example":{"integration_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":3,"name":"Stripe","kontakte":[{"kontakt_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Max Kontakt"}],"eintraege":[{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","art":"NOTIZ"}],"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=anbindungen&n=3"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]},"delete":{"tags":["Integrationen"],"summary":"Integration löschen","description":"Löscht eine Integration (nur die Leitung).\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"deleteIntegrationenIntegration","parameters":[{"name":"id","in":"query","required":true,"description":"integration_id.","schema":{"type":"string","format":"uuid","description":"integration_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geloescht"},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/integrationen/anlegen":{"post":{"tags":["Integrationen"],"summary":"Integration anlegen","description":"Legt eine Integration an. Werte für art und datenarten aus den Katalogen.\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"postIntegrationenAnlegen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"integration_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Nummer.","example":4},"link":{"type":"string","description":"Link.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=anbindungen&n=4"}},"additionalProperties":true},"example":{"integration_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":4,"link":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=anbindungen&n=4"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name.","example":"Stripe"},"art":{"type":"string","description":"Art.","example":"ZAHLUNG"},"status":{"type":"string","enum":["IDEE","RECHERCHE","ANGEFRAGT","IM_GESPRAECH","VERTRAG","UMSETZUNG","TEST","LIVE","PAUSIERT","ABGELEHNT"],"description":"Status.","example":"IDEE"},"prioritaet":{"type":"string","enum":["DRINGEND","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"DRINGEND"},"datenarten":{"type":"array","items":{"type":"string","description":"Datenart","example":"ZAHLUNG"}},"zweck":{"type":"string","description":"Zweck.","example":"Kartenzahlung im Shop"},"beschreibung":{"type":"string","description":"Markdown.","example":""},"website":{"type":"string","description":"Website.","example":"https://stripe.com"},"portal_url":{"type":"string","description":"Portal.","example":""},"doku_url":{"type":"string","description":"Doku.","example":"https://docs.stripe.com"},"kennung":{"type":"string","description":"Kundennummer o. Ä.","example":""},"benoetigt":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Punkt.","example":"API-Schlüssel"},"erledigt":{"type":"boolean","description":"Erledigt.","example":false}},"additionalProperties":true}},"naechster_schritt":{"type":"string","description":"Nächster Schritt.","example":"Konto anlegen"},"faellig_am":{"type":"string","description":"JJJJ-MM-TT.","example":"2026-10-31"},"zustaendig_id":{"type":"string","format":"uuid","description":"Zuständig.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"kontakte":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name.","example":"Max Kontakt"},"rolle":{"type":"string","description":"Rolle.","example":"Vertrieb"},"email":{"type":"string","description":"E-Mail.","example":"max@example.com"},"telefon":{"type":"string","description":"Telefon.","example":""}},"required":["name"],"additionalProperties":true}}},"required":["name"],"additionalProperties":true},"example":{"name":"Stripe","art":"ZAHLUNG","status":"RECHERCHE","zweck":"Kartenzahlung im Shop","naechster_schritt":"Konto anlegen"}}}}}},"/v1/integrationen/aendern":{"post":{"tags":["Integrationen"],"summary":"Integration ändern","description":"Ändert Felder, auch den Status in der Pipeline. `integration_id` oder `nummer` und die Felder aus „anlegen\".\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"postIntegrationenAendern","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{},"description":"Die geänderte Integration wie bei „Integration lesen“.","additionalProperties":true},"example":{}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"integration_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":4},"status":{"type":"string","enum":["IDEE","RECHERCHE","ANGEFRAGT","IM_GESPRAECH","VERTRAG","UMSETZUNG","TEST","LIVE","PAUSIERT","ABGELEHNT"],"description":"Status.","example":"IM_GESPRAECH"},"naechster_schritt":{"type":"string","description":"Nächster Schritt.","example":"Vertrag prüfen"}},"additionalProperties":true},"example":{"nummer":4,"status":"IM_GESPRAECH","naechster_schritt":"Vertrag prüfen"}}}}}},"/v1/integrationen/eintrag":{"post":{"tags":["Integrationen"],"summary":"Im Verlauf festhalten","description":"Hält Kommunikation oder einen Schritt fest: NOTIZ, EMAIL, ANRUF, TERMIN, UNTERLAGE, ZUGANG; richtung AUS (wir an sie) oder EIN.\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"postIntegrationenEintrag","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"Eintrag.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"integration_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":4},"art":{"type":"string","enum":["NOTIZ","EMAIL","ANRUF","TERMIN","UNTERLAGE","ZUGANG"],"description":"Art.","example":"ANRUF"},"richtung":{"type":"string","enum":["AUS","EIN"],"description":"Richtung.","example":"AUS"},"kontakt_id":{"type":"string","format":"uuid","description":"Ansprechpartner.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"betreff":{"type":"string","description":"Betreff.","example":"Telefonat Vertrag"},"text":{"type":"string","description":"Markdown.","example":"Vertrag kommt nächste Woche."},"zeitpunkt":{"type":"string","format":"date-time","description":"Wann (sonst jetzt).","example":"2026-10-14T09:30:00+02:00"}},"required":["art"],"additionalProperties":true},"example":{"nummer":4,"art":"ANRUF","richtung":"AUS","betreff":"Telefonat Vertrag","text":"Vertrag kommt nächste Woche."}}}}},"delete":{"tags":["Integrationen"],"summary":"Eintrag löschen","description":"Löscht einen eigenen Eintrag im Verlauf.\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"deleteIntegrationenEintrag","parameters":[{"name":"id","in":"query","required":true,"description":"eintrag_id.","schema":{"type":"string","format":"uuid","description":"eintrag_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geloescht"},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/integrationen/kontakt":{"post":{"tags":["Integrationen"],"summary":"Ansprechpartner speichern","description":"Legt einen Ansprechpartner an (integration_id oder nummer) oder ändert einen (kontakt_id).\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"postIntegrationenKontakt","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"kontakt_id":{"type":"string","format":"uuid","description":"Kontakt.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"kontakt_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"integration_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":4},"kontakt_id":{"type":"string","format":"uuid","description":"Zum Ändern.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"name":{"type":"string","description":"Name.","example":"Max Kontakt"},"rolle":{"type":"string","description":"Rolle.","example":"Vertrieb"},"email":{"type":"string","description":"E-Mail.","example":"max@example.com"},"telefon":{"type":"string","description":"Telefon.","example":"+49 30 123456"},"notiz":{"type":"string","description":"Notiz.","example":""}},"additionalProperties":true},"example":{"nummer":4,"name":"Max Kontakt","rolle":"Vertrieb","email":"max@example.com"}}}}},"delete":{"tags":["Integrationen"],"summary":"Ansprechpartner entfernen","description":"Entfernt einen Ansprechpartner.\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"deleteIntegrationenKontakt","parameters":[{"name":"id","in":"query","required":true,"description":"kontakt_id.","schema":{"type":"string","format":"uuid","description":"kontakt_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geloescht"},"example":{"geloescht":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/integrationen/mail":{"post":{"tags":["Integrationen"],"summary":"E-Mail senden","description":"Sendet eine E-Mail an die Gegenseite und hält sie im Verlauf fest. Absender projektmanagement@agiledeveloper.de; Antworten gehen an Sie.\n\n**Recht (Scope):** `integrationen:schreiben` oder `schreiben`.","operationId":"postIntegrationenMail","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"gesendet":{"type":"boolean","description":"Versendet.","example":true},"eintrag_id":{"type":"string","format":"uuid","description":"Eintrag im Verlauf.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true},"example":{"gesendet":true,"eintrag_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"integration_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":4},"an":{"type":"string","description":"Adresse (oder Liste).","example":"max@example.com"},"betreff":{"type":"string","description":"Betreff.","example":"Rückfrage zum Vertrag"},"text":{"type":"string","description":"Text.","example":"Guten Tag …"},"kontakt_id":{"type":"string","format":"uuid","description":"Ansprechpartner.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["an","betreff","text"],"additionalProperties":true},"example":{"nummer":4,"an":"max@example.com","betreff":"Rückfrage zum Vertrag","text":"Guten Tag Herr Kontakt, …"}}}}}},"/v1/clips/liste":{"get":{"tags":["Clips"],"summary":"Clips auflisten","description":"Alle Clips, neueste zuerst. `q` sucht auch im Gesprochenen (Transkript).\n\n**Recht (Scope):** `clips:lesen` oder `lesen`.","operationId":"getClipsListe","parameters":[{"name":"q","in":"query","required":false,"description":"Suchwort.","schema":{"type":"string","description":"Suchwort.","example":"export"},"example":"export"},{"name":"von","in":"query","required":false,"description":"Nur eigene.","schema":{"type":"string","enum":["ich"],"description":"ich = nur die eigenen.","example":"ich"},"example":"ich"},{"name":"bezug_art","in":"query","required":false,"description":"Bezugsart.","schema":{"type":"string","enum":["ISSUE"],"description":"Bezug.","example":"ISSUE"},"example":"ISSUE"},{"name":"bezug_id","in":"query","required":false,"description":"Bezug.","schema":{"type":"string","format":"uuid","description":"Issue-ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"clips":{"type":"array","items":{"$ref":"#/components/schemas/Clip"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"clips":[{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":14,"titel":"Neuer Export erklärt","status":"BEREIT","transkript_status":"FERTIG","ki_status":"FERTIG","dauer_ms":94000,"freigabe":"TEAM","angelegt_am":"2026-10-14T09:30:00+02:00"}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/clips/clip":{"get":{"tags":["Clips"],"summary":"Clip lesen","description":"Ein Clip mit Transkript, KI-Zusammenfassung, Kapiteln, Aufgaben, Kommentaren, Reaktionen, Zuschauern, Bezügen und dem Link zum Teilen. `id` oder `n` (Nummer).\n\n**Recht (Scope):** `clips:lesen` oder `lesen`.","operationId":"getClipsClip","parameters":[{"name":"id","in":"query","required":false,"description":"ID.","schema":{"type":"string","format":"uuid","description":"clip_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"n","in":"query","required":false,"description":"Nummer.","schema":{"type":"integer","description":"Nummer.","example":14},"example":14}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"clip":{"$ref":"#/components/schemas/ClipVoll"}},"additionalProperties":true},"example":{"clip":{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":14,"titel":"Neuer Export erklärt","beschreibung":"","zusammenfassung":"Der Clip zeigt den neuen CSV-Export …","kapitel":[{"zeit_ms":0,"titel":"Einleitung"}],"aufgaben":["Export-Spalten umbenennen"],"transkript":[{"von_ms":0,"bis_ms":4200,"text":"Hallo zusammen, …"}],"kommentare":[{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Bei 0:42 fehlt der Knopf.","zeit_ms":42000,"erledigt":false}],"link":"https://clips.agiledeveloper.de/c/?t=…","bezuege":[{"art":"ISSUE","ziel_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}]}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/clips/bild":{"get":{"tags":["Clips"],"summary":"Vorschaubild laden","description":"Vorschaubild (POSTER) oder Vorschauleiste (LEISTE) als JPEG.\n\n**Recht (Scope):** `clips:lesen` oder `lesen`.","operationId":"getClipsBild","parameters":[{"name":"art","in":"query","required":true,"description":"Art.","schema":{"type":"string","enum":["POSTER","LEISTE"],"description":"Welches Bild.","example":"POSTER"},"example":"POSTER"},{"name":"id","in":"query","required":false,"description":"ID.","schema":{"type":"string","format":"uuid","description":"clip_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"n","in":"query","required":false,"description":"Nummer.","schema":{"type":"integer","description":"Nummer.","example":14},"example":14}],"responses":{"200":{"description":"Die Datei.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/clips/anlegen":{"post":{"tags":["Clips"],"summary":"Upload beginnen","description":"Schritt 1 des Uploads: legt den Clip an. Danach die Datei in Stücken (bis 8 MB) an `/clips/stueck` schicken und mit `/clips/abschliessen` beenden; Transkript und Zusammenfassung entstehen danach von selbst (Webhook `clip.fertig`).\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsAnlegen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"clip":{"$ref":"#/components/schemas/ClipVoll"}},"additionalProperties":true},"example":{"clip":{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":14,"titel":"Neuer Export erklärt","beschreibung":"","zusammenfassung":"Der Clip zeigt den neuen CSV-Export …","kapitel":[{"zeit_ms":0,"titel":"Einleitung"}],"aufgaben":["Export-Spalten umbenennen"],"transkript":[{"von_ms":0,"bis_ms":4200,"text":"Hallo zusammen, …"}],"kommentare":[{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Bei 0:42 fehlt der Knopf.","zeit_ms":42000,"erledigt":false}],"link":"https://clips.agiledeveloper.de/c/?t=…","bezuege":[{"art":"ISSUE","ziel_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}]}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"titel":{"type":"string","description":"Titel (leer = KI-Titel).","example":"Neuer Export erklärt"},"mime":{"type":"string","description":"Art des Videos (video/mp4, video/webm, audio/…).","example":"video/mp4"},"ton_mime":{"type":"string","description":"Eigene Tonspur (optional).","example":""},"modus":{"type":"string","enum":["BILDSCHIRM","KAMERA","BEIDES"],"description":"Aufnahmeart.","example":"BILDSCHIRM"},"quelle":{"type":"string","enum":["BROWSER","DESKTOP","UPLOAD"],"description":"Quelle.","example":"UPLOAD"},"breite":{"type":"integer","description":"Breite.","example":1920},"hoehe":{"type":"integer","description":"Höhe.","example":1080},"bezug":{"type":"object","properties":{"art":{"type":"string","enum":["ISSUE"],"description":"Bezug.","example":"ISSUE"},"id":{"type":"string","format":"uuid","description":"Issue-ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true}},"required":["mime"],"additionalProperties":true},"example":{"titel":"Neuer Export erklärt","mime":"video/mp4","modus":"BILDSCHIRM","quelle":"UPLOAD"}}}}}},"/v1/clips/stueck":{"post":{"tags":["Clips"],"summary":"Upload: Stück senden","description":"Schritt 2: ein Stück der Datei (Rohbytes, bis 8 MB) in Reihenfolge `nr` 0, 1, 2 … Video als spur=ROH, eine eigene Tonspur als spur=TON.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsStueck","parameters":[{"name":"id","in":"query","required":true,"description":"Clip.","schema":{"type":"string","format":"uuid","description":"clip_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"spur","in":"query","required":true,"description":"Spur.","schema":{"type":"string","enum":["ROH","TON"],"description":"Spur.","example":"ROH"},"example":"ROH"},{"name":"nr","in":"query","required":true,"description":"Stück.","schema":{"type":"integer","description":"Laufende Nummer ab 0.","example":0},"example":0},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Gespeichert.","example":true},"nr":{"type":"integer","description":"Stück.","example":0},"bytes":{"type":"integer","description":"Größe.","example":8388608}},"additionalProperties":true},"example":{"ok":true,"nr":0,"bytes":8388608}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}},"/v1/clips/vorschau":{"post":{"tags":["Clips"],"summary":"Upload: Vorschaubild","description":"Optional: Vorschaubild (art=POSTER) oder Vorschauleiste (art=LEISTE mit spalten, zeilen, abstand_ms, kachel_b, kachel_h) als JPEG im Körper.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsVorschau","parameters":[{"name":"id","in":"query","required":true,"description":"Clip.","schema":{"type":"string","format":"uuid","description":"clip_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},{"name":"art","in":"query","required":true,"description":"Art.","schema":{"type":"string","enum":["POSTER","LEISTE"],"description":"Bild.","example":"POSTER"},"example":"POSTER"},{"name":"spalten","in":"query","required":false,"description":"Spalten.","schema":{"type":"integer","description":"Nur LEISTE.","example":10},"example":10},{"name":"zeilen","in":"query","required":false,"description":"Zeilen.","schema":{"type":"integer","description":"Nur LEISTE.","example":10},"example":10},{"name":"abstand_ms","in":"query","required":false,"description":"Abstand.","schema":{"type":"integer","description":"Nur LEISTE.","example":2000},"example":2000},{"name":"kachel_b","in":"query","required":false,"description":"Kachelbreite.","schema":{"type":"integer","description":"Nur LEISTE.","example":160},"example":160},{"name":"kachel_h","in":"query","required":false,"description":"Kachelhöhe.","schema":{"type":"integer","description":"Nur LEISTE.","example":90},"example":90},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"},"example":{"ok":true}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}}}},"/v1/clips/abschliessen":{"post":{"tags":["Clips"],"summary":"Upload abschließen","description":"Schritt 3: schließt den Upload ab (Zahl der Stücke je Spur, Dauer). Fehlen Stücke, kommt 409 mit der Liste. Danach laufen Umwandlung, Transkript und Zusammenfassung.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsAbschliessen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"clip":{"$ref":"#/components/schemas/ClipVoll"}},"additionalProperties":true},"example":{"clip":{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":14,"titel":"Neuer Export erklärt","beschreibung":"","zusammenfassung":"Der Clip zeigt den neuen CSV-Export …","kapitel":[{"zeit_ms":0,"titel":"Einleitung"}],"aufgaben":["Export-Spalten umbenennen"],"transkript":[{"von_ms":0,"bis_ms":4200,"text":"Hallo zusammen, …"}],"kommentare":[{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Bei 0:42 fehlt der Knopf.","zeit_ms":42000,"erledigt":false}],"link":"https://clips.agiledeveloper.de/c/?t=…","bezuege":[{"art":"ISSUE","ziel_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}]}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"stuecke":{"type":"object","properties":{"roh":{"type":"integer","description":"Anzahl Video-Stücke.","example":3},"ton":{"type":"integer","description":"Anzahl Ton-Stücke.","example":0}},"additionalProperties":true},"dauer_ms":{"type":"integer","description":"Dauer (0 = ermitteln).","example":0}},"required":["clip_id"],"additionalProperties":true},"example":{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","stuecke":{"roh":3},"dauer_ms":0}}}}}},"/v1/clips/verwerfen":{"post":{"tags":["Clips"],"summary":"Upload verwerfen","description":"Verwirft einen laufenden Upload; der Clip verschwindet ganz.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsVerwerfen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"},"example":{"ok":true}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["clip_id"],"additionalProperties":true},"example":{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}}},"/v1/clips/aendern":{"post":{"tags":["Clips"],"summary":"Clip ändern und freigeben","description":"Titel, Beschreibung und Freigabe: TEAM (nur Ihr Team) oder LINK (jeder mit dem Link), Kommentare für Gäste, Download und Ablauf des Links.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsAendern","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"clip":{"$ref":"#/components/schemas/ClipVoll"}},"additionalProperties":true},"example":{"clip":{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":14,"titel":"Neuer Export erklärt","beschreibung":"","zusammenfassung":"Der Clip zeigt den neuen CSV-Export …","kapitel":[{"zeit_ms":0,"titel":"Einleitung"}],"aufgaben":["Export-Spalten umbenennen"],"transkript":[{"von_ms":0,"bis_ms":4200,"text":"Hallo zusammen, …"}],"kommentare":[{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Bei 0:42 fehlt der Knopf.","zeit_ms":42000,"erledigt":false}],"link":"https://clips.agiledeveloper.de/c/?t=…","bezuege":[{"art":"ISSUE","ziel_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}]}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":14},"titel":{"type":"string","description":"Titel.","example":"Export erklärt"},"beschreibung":{"type":"string","description":"Beschreibung.","example":""},"freigabe":{"type":"string","enum":["TEAM","LINK"],"description":"Freigabe.","example":"LINK"},"kommentare_offen":{"type":"boolean","description":"Gäste dürfen kommentieren.","example":true},"download_erlaubt":{"type":"boolean","description":"Download erlaubt.","example":false},"ablauf_am":{"type":["string","null"],"format":"date-time","description":"Link läuft ab am; null = nie.","example":"2026-10-14T09:30:00+02:00"}},"additionalProperties":true},"example":{"nummer":14,"freigabe":"LINK","kommentare_offen":true,"download_erlaubt":false}}}}}},"/v1/clips/loeschen":{"post":{"tags":["Clips"],"summary":"Clip löschen","description":"Löscht einen Clip: Video, Bilder und Transkript sind danach weg, der Link tot.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsLoeschen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"},"example":{"ok":true}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":14}},"additionalProperties":true},"example":{"nummer":14}}}}}},"/v1/clips/kommentar":{"post":{"tags":["Clips"],"summary":"Clip kommentieren","description":"Schreibt einen Kommentar, auf Wunsch an einer Stelle des Videos (zeit_ms) oder als Antwort (antwort_auf).\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsKommentar","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"kommentar":{"type":"object","properties":{"kommentar_id":{"type":"string","format":"uuid","description":"Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true}},"additionalProperties":true},"example":{"kommentar":{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":14},"text":{"type":"string","description":"Text.","example":"Bei 0:42 fehlt der Knopf."},"zeit_ms":{"type":"integer","description":"Stelle im Video.","example":42000},"antwort_auf":{"type":"string","format":"uuid","description":"Antwort auf Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["text"],"additionalProperties":true},"example":{"nummer":14,"text":"Bei 0:42 fehlt der Knopf.","zeit_ms":42000}}}}}},"/v1/clips/kommentar-aendern":{"post":{"tags":["Clips"],"summary":"Kommentar erledigen oder löschen","description":"Markiert einen Kommentar als erledigt (erledigt: true/false) oder löscht ihn (loeschen: true).\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsKommentarAendern","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"},"example":{"ok":true}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kommentar_id":{"type":"string","format":"uuid","description":"Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"erledigt":{"type":"boolean","description":"Erledigt.","example":true},"loeschen":{"type":"boolean","description":"Löschen.","example":false}},"required":["kommentar_id"],"additionalProperties":true},"example":{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","erledigt":true}}}}}},"/v1/clips/reaktion":{"post":{"tags":["Clips"],"summary":"Reaktion setzen","description":"Setzt eine Reaktion (👍 ❤️ 😂 😮 🎉 👀 ✅ 🙏 🔥 🤔) an einer Stelle des Videos.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsReaktion","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"reaktion":{"type":"object","properties":{},"additionalProperties":true}},"additionalProperties":true},"example":{"reaktion":{}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":14},"emoji":{"type":"string","description":"Emoji.","example":"👍"},"zeit_ms":{"type":"integer","description":"Stelle.","example":12000}},"required":["emoji"],"additionalProperties":true},"example":{"nummer":14,"emoji":"👍","zeit_ms":12000}}}}}},"/v1/clips/bezug":{"post":{"tags":["Clips"],"summary":"Clip mit Issue verknüpfen","description":"Verknüpft einen Clip mit einem Issue (art=ISSUE, ziel_id=issue_id); entfernen: true löst die Verknüpfung.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsBezug","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"bezuege":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"additionalProperties":true},"example":{"bezuege":[{}]}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":14},"art":{"type":"string","enum":["ISSUE"],"description":"Art.","example":"ISSUE"},"ziel_id":{"type":"string","format":"uuid","description":"issue_id.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"entfernen":{"type":"boolean","description":"Lösen.","example":false}},"required":["art","ziel_id"],"additionalProperties":true},"example":{"nummer":14,"art":"ISSUE","ziel_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}}},"/v1/clips/auswerten":{"post":{"tags":["Clips"],"summary":"Transkript neu erstellen","description":"Lässt Transkript und KI-Zusammenfassung neu erstellen.\n\n**Recht (Scope):** `clips:schreiben` oder `schreiben`.","operationId":"postClipsAuswerten","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"clip":{"$ref":"#/components/schemas/ClipVoll"}},"additionalProperties":true},"example":{"clip":{"clip_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","nummer":14,"titel":"Neuer Export erklärt","beschreibung":"","zusammenfassung":"Der Clip zeigt den neuen CSV-Export …","kapitel":[{"zeit_ms":0,"titel":"Einleitung"}],"aufgaben":["Export-Spalten umbenennen"],"transkript":[{"von_ms":0,"bis_ms":4200,"text":"Hallo zusammen, …"}],"kommentare":[{"kommentar_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","text":"Bei 0:42 fehlt der Knopf.","zeit_ms":42000,"erledigt":false}],"link":"https://clips.agiledeveloper.de/c/?t=…","bezuege":[{"art":"ISSUE","ziel_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}]}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"Clip.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Oder die Nummer.","example":14}},"additionalProperties":true},"example":{"nummer":14}}}}}},"/v1/termine":{"get":{"tags":["Termine"],"summary":"Termine auflisten","description":"Termine im Zeitraum (Tage in Europe/Berlin), ohne abgesagte. nur_meine=1: nur eigene und solche, zu denen Sie eingeladen sind.\n\n**Recht (Scope):** `kalender:lesen` oder `lesen`.","operationId":"getTermine","parameters":[{"name":"von","in":"query","required":false,"description":"Von.","schema":{"type":"string","format":"date","description":"Erster Tag.","example":"2026-10-01"},"example":"2026-10-01"},{"name":"bis","in":"query","required":false,"description":"Bis.","schema":{"type":"string","format":"date","description":"Letzter Tag.","example":"2026-10-31"},"example":"2026-10-31"},{"name":"nur_meine","in":"query","required":false,"description":"Nur meine.","schema":{"type":"string","enum":["1"],"description":"1 = nur meine.","example":"1"},"example":"1"},{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"termine":{"type":"array","items":{"$ref":"#/components/schemas/Termin"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"termine":[{"termin_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","titel":"Release-Abstimmung","beginn":"2026-10-14T09:30:00+02:00","ende":"2026-10-14T10:00:00+02:00","ganztag":false,"ort":"","notiz":"Stand der Issues durchgehen","benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","meeting_url":"https://meeting.agiledeveloper.de/agile-release-k3x9","teilnehmer":[{"email":"ben@example.com","name":"Ben Muster","benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"sequenz":1,"abgesagt_am":"2026-10-14T09:30:00+02:00"}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/termine.ics":{"get":{"tags":["Termine"],"summary":"Termine als ICS","description":"Dieselben Termine als iCalendar-Datei (RFC 5545).\n\n**Recht (Scope):** `kalender:lesen` oder `lesen`.","operationId":"getTermineIcs","parameters":[{"name":"von","in":"query","required":false,"description":"Von.","schema":{"type":"string","format":"date","description":"Erster Tag.","example":"2026-10-01"},"example":"2026-10-01"},{"name":"bis","in":"query","required":false,"description":"Bis.","schema":{"type":"string","format":"date","description":"Letzter Tag.","example":"2026-10-31"},"example":"2026-10-31"},{"name":"nur_meine","in":"query","required":false,"description":"Nur meine.","schema":{"type":"string","enum":["1"],"description":"1 = nur meine.","example":"1"},"example":"1"}],"responses":{"200":{"description":"Die Datei.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"text/calendar":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/termin/{termin_id}":{"get":{"tags":["Termine"],"summary":"Termin lesen","description":"Ein Termin mit Teilnehmern und Meeting-Link.\n\n**Recht (Scope):** `kalender:lesen` oder `lesen`.","operationId":"getTerminTerminId","parameters":[{"name":"termin_id","in":"path","required":true,"schema":{"type":"string","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"description":"ID (termin_id)."}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"termin":{"$ref":"#/components/schemas/Termin"}},"additionalProperties":true},"example":{"termin":{"termin_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","titel":"Release-Abstimmung","beginn":"2026-10-14T09:30:00+02:00","ende":"2026-10-14T10:00:00+02:00","ganztag":false,"ort":"","notiz":"Stand der Issues durchgehen","benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","meeting_url":"https://meeting.agiledeveloper.de/agile-release-k3x9","teilnehmer":[{"email":"ben@example.com","name":"Ben Muster","benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"sequenz":1,"abgesagt_am":"2026-10-14T09:30:00+02:00"}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/termin":{"post":{"tags":["Termine"],"summary":"Termin anlegen oder ändern","description":"Ohne termin_id: legt an. Mit termin_id: ändert (alle Felder angeben; nicht genannte Teilnehmer werden ausgeladen). Teilnehmer bekommen Einladung bzw. Änderung per Mail mit ICS; meeting: true legt ein Videomeeting an.\n\n**Recht (Scope):** `kalender:schreiben` oder `schreiben`.","operationId":"postTermin","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"termin_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"termin":{"$ref":"#/components/schemas/Termin"},"versand":{"type":"object","properties":{},"description":"Welche Mails hinausgingen.","additionalProperties":true}},"additionalProperties":true},"example":{"termin_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","termin":{"termin_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","titel":"Release-Abstimmung","beginn":"2026-10-14T09:30:00+02:00","ende":"2026-10-14T10:00:00+02:00","ganztag":false,"ort":"","notiz":"Stand der Issues durchgehen","benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","meeting_url":"https://meeting.agiledeveloper.de/agile-release-k3x9","teilnehmer":[{"email":"ben@example.com","name":"Ben Muster","benutzer_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"sequenz":1,"abgesagt_am":"2026-10-14T09:30:00+02:00"},"versand":{}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminEingabe"},"example":{"titel":"Release-Abstimmung","beginn":"2026-10-14T09:30:00+02:00","ende":"2026-10-14T10:00:00+02:00","meeting":true,"teilnehmer":[{"email":"ben@example.com","name":"Ben Muster"}]}}}}}},"/v1/termin/absagen":{"post":{"tags":["Termine"],"summary":"Termin absagen","description":"Sagt einen Termin ab; Teilnehmer bekommen die Absage per Mail (benachrichtigen: false unterdrückt das).\n\n**Recht (Scope):** `kalender:schreiben` oder `schreiben`.","operationId":"postTerminAbsagen","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"termin_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"versand":{"type":"object","properties":{},"additionalProperties":true}},"additionalProperties":true},"example":{"termin_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","versand":{}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"termin_id":{"type":"string","format":"uuid","description":"Termin.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"benachrichtigen":{"type":"boolean","description":"Absagen verschicken.","example":true}},"required":["termin_id"],"additionalProperties":true},"example":{"termin_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}}},"/v1/termin/meeting":{"post":{"tags":["Meeting-Links"],"summary":"Moderator-Link holen","description":"Frischer Moderator-Link (12 Stunden gültig) und Gästelink für das Videomeeting eines Termins. Den Moderator-Link nicht weitergeben.\n\n**Recht (Scope):** `kalender:schreiben` oder `schreiben`.","operationId":"postTerminMeeting","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Moderator-Link.","example":"https://meeting.agiledeveloper.de/agile-release-k3x9?jwt=…"},"gast_url":{"type":"string","description":"Gästelink.","example":"https://meeting.agiledeveloper.de/agile-release-k3x9"}},"additionalProperties":true},"example":{"url":"https://meeting.agiledeveloper.de/agile-release-k3x9?jwt=…","gast_url":"https://meeting.agiledeveloper.de/agile-release-k3x9"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"termin_id":{"type":"string","format":"uuid","description":"Termin.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["termin_id"],"additionalProperties":true},"example":{"termin_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}}}}}},"/v1/kalender/abo":{"get":{"tags":["Kalender-Abo"],"summary":"ICS-Abo-Adresse","description":"Die persönliche Abo-Adresse für Outlook, Apple Kalender oder Google Kalender (https und webcal).\n\n**Recht (Scope):** `kalender:lesen` oder `lesen`.","operationId":"getKalenderAbo","parameters":[],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"https-Adresse.","example":"https://calendar.agiledeveloper.de/api/kalender/abo/Xy7K….ics"},"webcal":{"type":"string","description":"webcal-Adresse.","example":"webcal://calendar.agiledeveloper.de/api/kalender/abo/Xy7K….ics"}},"additionalProperties":true},"example":{"url":"https://calendar.agiledeveloper.de/api/kalender/abo/Xy7K….ics","webcal":"webcal://calendar.agiledeveloper.de/api/kalender/abo/Xy7K….ics"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/kalender/abo/neu":{"post":{"tags":["Kalender-Abo"],"summary":"Neue Abo-Adresse","description":"Stellt eine neue Abo-Adresse aus; die alte hört sofort auf zu gelten.\n\n**Recht (Scope):** `kalender:schreiben` oder `schreiben`.","operationId":"postKalenderAboNeu","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"https-Adresse.","example":"https://calendar.agiledeveloper.de/api/kalender/abo/Pq9….ics"},"webcal":{"type":"string","description":"webcal-Adresse.","example":"webcal://…"}},"additionalProperties":true},"example":{"url":"https://calendar.agiledeveloper.de/api/kalender/abo/Pq9….ics","webcal":"webcal://…"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/kalender/abo/{token}.ics":{"get":{"tags":["Kalender-Abo"],"summary":"Abo abrufen (öffentlich)","description":"Der Kalender selbst. Das Geheimwort in der Adresse ist der Ausweis; keine Anmeldung nötig.\n\n**Öffentlich**: keine Anmeldung nötig.","operationId":"getKalenderAboTokenIcs","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","example":"Xy7Kp2Qr9Ls4Mn8Bv3Cz6Df1Gh5Jk0Wq2Er7Ty4Ui"},"description":"Geheimwort aus der Abo-Adresse."}],"responses":{"200":{"description":"Die Datei.","content":{"text/calendar":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[]}},"/v1/kalender/buchungslink":{"get":{"tags":["Buchungslinks"],"summary":"Eigener Buchungslink","description":"Ihr Buchungslink mit Einstellungen (wird beim ersten Abruf angelegt).\n\n**Recht (Scope):** `kalender:lesen` oder `lesen`.","operationId":"getKalenderBuchungslink","parameters":[],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"link":{"$ref":"#/components/schemas/Buchungslink"},"url":{"type":"string","description":"Öffentliche Buchungsseite.","example":"https://calendar.agiledeveloper.de/buchen/?p=anna-beispiel"}},"additionalProperties":true},"example":{"link":{"kennung":"anna-beispiel","aktiv":true,"titel":"Kennenlernen","dauer_min":30,"wochentage":[1],"von":"09:00","bis":"17:00","vorlauf_std":12,"horizont_tage":30,"puffer_min":10},"url":"https://calendar.agiledeveloper.de/buchen/?p=anna-beispiel"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]},"post":{"tags":["Buchungslinks"],"summary":"Buchungslink einstellen","description":"Speichert die Einstellungen: aktiv, Titel, Dauer, Wochentage, Zeitfenster, Vorlauf, Horizont, Puffer.\n\n**Recht (Scope):** `kalender:schreiben` oder `schreiben`.","operationId":"postKalenderBuchungslink","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"link":{"$ref":"#/components/schemas/Buchungslink"},"url":{"type":"string","description":"Buchungsseite.","example":"https://calendar.agiledeveloper.de/buchen/?p=anna-beispiel"}},"additionalProperties":true},"example":{"link":{"kennung":"anna-beispiel","aktiv":true,"titel":"Kennenlernen","dauer_min":30,"wochentage":[1],"von":"09:00","bis":"17:00","vorlauf_std":12,"horizont_tage":30,"puffer_min":10},"url":"https://calendar.agiledeveloper.de/buchen/?p=anna-beispiel"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Buchungslink"},"example":{"aktiv":true,"titel":"Kennenlernen","dauer_min":30,"wochentage":[1,2,3,4,5],"von":"09:00","bis":"16:00","vorlauf_std":12,"horizont_tage":30,"puffer_min":10}}}}}},"/v1/buchung/{kennung}":{"get":{"tags":["Buchungslinks"],"summary":"Freie Zeiten (öffentlich)","description":"Öffentlich: Name der Person, Titel und freie Anfangszeiten eines Buchungslinks.\n\n**Öffentlich**: keine Anmeldung nötig.","operationId":"getBuchungKennung","parameters":[{"name":"kennung","in":"path","required":true,"schema":{"type":"string","example":"anna-beispiel"},"description":"Kennung des Buchungslinks."}],"responses":{"200":{"description":"Erfolg.","content":{"application/json":{"schema":{"type":"object","properties":{"person":{"type":"object","properties":{"name":{"type":"string","description":"Name.","example":"Anna Beispiel"},"titel":{"type":"string","description":"Titel.","example":"Kennenlernen"},"dauer_min":{"type":"integer","description":"Dauer.","example":30}},"additionalProperties":true},"zeiten":{"type":"array","items":{"type":"object","properties":{"beginn":{"type":"string","format":"date-time","description":"Beginn.","example":"2026-10-14T09:30:00+02:00"},"ende":{"type":"string","format":"date-time","description":"Ende.","example":"2026-10-14T09:30:00+02:00"}},"additionalProperties":true}}},"additionalProperties":true},"example":{"person":{"name":"Anna Beispiel","titel":"Kennenlernen","dauer_min":30},"zeiten":[{"beginn":"2026-10-14T09:30:00+02:00","ende":"2026-10-14T09:30:00+02:00"}]}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[]},"post":{"tags":["Buchungslinks"],"summary":"Termin buchen (öffentlich)","description":"Öffentlich: bucht eine freie Zeit. Legt einen Termin mit Videomeeting an; Gast und Person bekommen eine Einladung.\n\n**Öffentlich**: keine Anmeldung nötig.","operationId":"postBuchungKennung","parameters":[{"name":"kennung","in":"path","required":true,"schema":{"type":"string","example":"anna-beispiel"},"description":"Kennung des Buchungslinks."}],"responses":{"200":{"description":"Erfolg.","content":{"application/json":{"schema":{"type":"object","properties":{"beginn":{"type":"string","format":"date-time","description":"Beginn.","example":"2026-10-14T09:30:00+02:00"},"ende":{"type":"string","format":"date-time","description":"Ende.","example":"2026-10-14T09:30:00+02:00"},"titel":{"type":"string","description":"Titel.","example":"Kennenlernen"},"meeting_url":{"type":"string","description":"Meeting.","example":"https://meeting.agiledeveloper.de/agile-…"}},"additionalProperties":true},"example":{"beginn":"2026-10-14T09:30:00+02:00","ende":"2026-10-14T09:30:00+02:00","titel":"Kennenlernen","meeting_url":"https://meeting.agiledeveloper.de/agile-…"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"beginn":{"type":"string","format":"date-time","description":"Gewählte Anfangszeit aus den freien Zeiten.","example":"2026-10-14T09:30:00+02:00"},"name":{"type":"string","description":"Name des Gastes.","example":"Carla Gast"},"email":{"type":"string","description":"E-Mail des Gastes.","example":"carla@example.com"},"nachricht":{"type":"string","description":"Nachricht (optional).","example":"Es geht um das Angebot."}},"required":["beginn","name","email"],"additionalProperties":true},"example":{"beginn":"2026-10-15T10:00:00+02:00","name":"Carla Gast","email":"carla@example.com","nachricht":"Es geht um das Angebot."}}}}}},"/v1/webhooks/ereignisse":{"get":{"tags":["Webhooks"],"summary":"Ereignisarten","description":"Alle Ereignisse, die ein Webhook abonnieren kann, mit Beschreibung.\n\n**Recht (Scope):** `webhooks:lesen` oder `lesen`.","operationId":"getWebhooksEreignisse","parameters":[],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ereignisse":{"type":"array","items":{"type":"object","properties":{"typ":{"type":"string","enum":["issue.angelegt","issue.geaendert","issue.kommentiert","clip.fertig","termin.angelegt","termin.geaendert","termin.abgesagt"],"description":"Ereignis.","example":"issue.angelegt"},"beschreibung":{"type":"string","description":"Wann es kommt.","example":"Ein Issue wurde angelegt."}},"additionalProperties":true}}},"additionalProperties":true},"example":{"ereignisse":[{"typ":"issue.angelegt","beschreibung":"Ein Issue wurde angelegt."}]}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"Webhooks auflisten","description":"Alle Webhooks des Arbeitsbereichs (nur Inhaber und Admins).\n\n**Recht (Scope):** `webhooks:lesen` oder `lesen`.","operationId":"getWebhooks","parameters":[{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"webhooks":[{"webhook_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","url":"https://example.com/agile-hook","beschreibung":"Issues nach Slack","ereignisse":["issue.angelegt"],"aktiv":true,"angelegt_am":"2026-10-14T09:30:00+02:00","fehler_folge":0}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]},"post":{"tags":["Webhooks"],"summary":"Webhook anlegen","description":"Legt einen Webhook an (nur Inhaber und Admins). Das Signaturgeheimnis steht nur in dieser Antwort.\n\n**Recht (Scope):** `webhooks:schreiben` oder `schreiben`.","operationId":"postWebhooks","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"201":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"},"geheimnis":{"type":"string","description":"Signaturgeheimnis (whsec_…), nur jetzt sichtbar.","example":"whsec_8fK2…"}},"additionalProperties":true},"example":{"webhook":{"webhook_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","url":"https://example.com/agile-hook","beschreibung":"Issues nach Slack","ereignisse":["issue.angelegt"],"aktiv":true,"angelegt_am":"2026-10-14T09:30:00+02:00","fehler_folge":0},"geheimnis":"whsec_8fK2…"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Ziel (https, öffentlich erreichbar).","example":"https://example.com/agile-hook"},"ereignisse":{"type":"array","items":{"type":"string","enum":["issue.angelegt","issue.geaendert","issue.kommentiert","clip.fertig","termin.angelegt","termin.geaendert","termin.abgesagt"],"description":"Ereignis.","example":"issue.angelegt"}},"beschreibung":{"type":"string","description":"Wofür.","example":"Issues nach Slack"}},"required":["url","ereignisse"],"additionalProperties":true},"example":{"url":"https://example.com/agile-hook","ereignisse":["issue.angelegt","issue.kommentiert"],"beschreibung":"Issues nach Slack"}}}}}},"/v1/webhooks/{webhook_id}":{"patch":{"tags":["Webhooks"],"summary":"Webhook ändern","description":"Ändert Ziel, Ereignisse, Beschreibung oder schaltet ihn ab (aktiv: false).\n\n**Recht (Scope):** `webhooks:schreiben` oder `schreiben`.","operationId":"patchWebhooksWebhookId","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","example":"9b2f6c1e-5d4a-4e3b-9c8d-7a6b5c4d3e2f"},"description":"ID (webhook_id)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}},"additionalProperties":true},"example":{"webhook":{"webhook_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","url":"https://example.com/agile-hook","beschreibung":"Issues nach Slack","ereignisse":["issue.angelegt"],"aktiv":true,"angelegt_am":"2026-10-14T09:30:00+02:00","fehler_folge":0}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Ziel.","example":"https://example.com/neu"},"ereignisse":{"type":"array","items":{"type":"string","enum":["issue.angelegt","issue.geaendert","issue.kommentiert","clip.fertig","termin.angelegt","termin.geaendert","termin.abgesagt"],"description":"Ereignis.","example":"issue.angelegt"}},"beschreibung":{"type":"string","description":"Wofür.","example":""},"aktiv":{"type":"boolean","description":"Aktiv.","example":true}},"additionalProperties":true},"example":{"aktiv":false}}}}},"delete":{"tags":["Webhooks"],"summary":"Webhook löschen","description":"Löscht einen Webhook samt Protokoll.\n\n**Recht (Scope):** `webhooks:schreiben` oder `schreiben`.","operationId":"deleteWebhooksWebhookId","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","example":"9b2f6c1e-5d4a-4e3b-9c8d-7a6b5c4d3e2f"},"description":"ID (webhook_id)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"},"example":{"ok":true}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/webhooks/{webhook_id}/test":{"post":{"tags":["Webhooks"],"summary":"Test senden","description":"Schickt sofort ein Testereignis (`typ: \"test\"`) an den Webhook und meldet die Antwort.\n\n**Recht (Scope):** `webhooks:schreiben` oder `schreiben`.","operationId":"postWebhooksWebhookIdTest","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","example":"9b2f6c1e-5d4a-4e3b-9c8d-7a6b5c4d3e2f"},"description":"ID (webhook_id)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"Ziel antwortete mit 2xx.","example":true},"status":{"type":["integer","null"],"description":"HTTP-Status.","example":200},"antwort":{"type":"string","description":"Anfang der Antwort.","example":"ok"}},"additionalProperties":true},"example":{"ok":true,"status":200,"antwort":"ok"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/webhooks/{webhook_id}/geheimnis":{"post":{"tags":["Webhooks"],"summary":"Geheimnis erneuern","description":"Stellt ein neues Signaturgeheimnis aus; das alte gilt sofort nicht mehr.\n\n**Recht (Scope):** `webhooks:schreiben` oder `schreiben`.","operationId":"postWebhooksWebhookIdGeheimnis","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","example":"9b2f6c1e-5d4a-4e3b-9c8d-7a6b5c4d3e2f"},"description":"ID (webhook_id)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Beliebiger eindeutiger Wert; Wiederholungen mit demselben Wert werden nicht doppelt ausgeführt (24 Stunden).","schema":{"type":"string","maxLength":200,"example":"4f1c2a9e-0d7b-4a51-9c5e-2b3f8d6e1a07"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"type":"object","properties":{"geheimnis":{"type":"string","description":"Neues Geheimnis, nur jetzt sichtbar.","example":"whsec_Q2m…"}},"additionalProperties":true},"example":{"geheimnis":"whsec_Q2m…"}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["schreiben"]}]}},"/v1/webhooks/{webhook_id}/zustellungen":{"get":{"tags":["Webhooks"],"summary":"Zustellprotokoll","description":"Die letzten Zustellungen mit Status, Versuchen und letzter Antwort.\n\n**Recht (Scope):** `webhooks:lesen` oder `lesen`.","operationId":"getWebhooksWebhookIdZustellungen","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","example":"9b2f6c1e-5d4a-4e3b-9c8d-7a6b5c4d3e2f"},"description":"ID (webhook_id)."},{"name":"limit","in":"query","required":false,"description":"Höchstzahl Einträge (1 bis 1000, Standard 100).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"description":"So viele Einträge überspringen (Standard 0).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortierung","in":"query","required":false,"description":"Feld zum Sortieren; mit „-\" davor absteigend.","schema":{"type":"string","example":"-geaendert_am"}}],"responses":{"200":{"description":"Erfolg.","headers":{"RateLimit-Limit":{"description":"Erlaubte Anfragen je Fenster (60 Sekunden).","schema":{"type":"integer","example":300}},"RateLimit-Remaining":{"description":"Verbleibende Anfragen im Fenster.","schema":{"type":"integer","example":297}},"RateLimit-Reset":{"description":"Sekunden bis zum neuen Fenster.","schema":{"type":"integer","example":41}}},"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"zustellungen":{"type":"array","items":{"$ref":"#/components/schemas/Zustellung"}}},"additionalProperties":true},{"type":"object","properties":{"seite":{"$ref":"#/components/schemas/Seite"}}}]},"example":{"zustellungen":[{"zustellung_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","typ":"issue.angelegt","status":"ZUGESTELLT","versuche":1,"letzter_status":200,"naechster_versuch":"2026-10-14T09:30:00+02:00","angelegt_am":"2026-10-14T09:30:00+02:00","zugestellt_am":"2026-10-14T09:30:00+02:00"}],"seite":{"limit":100,"offset":0,"gesamt":1,"naechster_offset":null}}}}},"400":{"description":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"ungueltige_anfrage","nachricht":"Ungültige Anfrage (Feld fehlt oder hat einen falschen Wert).","details":{}}}}}},"401":{"description":"Kein oder ungültiger Schlüssel bzw. Token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_angemeldet","nachricht":"Kein oder ungültiger Schlüssel bzw. Token.","details":{}}}}}},"403":{"description":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"keine_berechtigung","nachricht":"Angemeldet, aber ohne das nötige Recht (Rolle oder Scope).","details":{}}}}}},"404":{"description":"Nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"nicht_gefunden","nachricht":"Nicht gefunden.","details":{}}}}}},"429":{"description":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"fehler":{"code":"zu_viele_anfragen","nachricht":"Zu viele Anfragen. Siehe Retry-After und RateLimit-Reset.","details":{}}}}},"headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer","example":30}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}]}}},"webhooks":{"issue.angelegt":{"post":{"tags":["Webhooks"],"operationId":"webhookIssueAngelegt","summary":"issue.angelegt","description":"Ein Issue wurde angelegt. `daten` ist das Issue. Prüfen Sie den Kopf `Agile-Signature` (HMAC-SHA256 über `<t>.<Körper>`).","parameters":[{"name":"Agile-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1760090000,v1=5257a869…"}},{"name":"Agile-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Agile-Event","in":"header","required":true,"schema":{"type":"string","example":"issue.angelegt"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ereignis"},"example":{"id":"0b8f1d7e-3c2a-4f5b-9e6d-1a2b3c4d5e6f","typ":"issue.angelegt","erstellt":"2026-10-10T12:00:00Z","arbeitsbereich":{"workspace_id":"beispiel-gmbh"},"daten":{}}}}},"responses":{"200":{"description":"Annehmen mit beliebigem 2xx innerhalb von zehn Sekunden."}}}},"issue.geaendert":{"post":{"tags":["Webhooks"],"operationId":"webhookIssueGeaendert","summary":"issue.geaendert","description":"Felder eines Issues wurden geändert (Status, Zuständigkeit, Titel …). `daten` ist das Issue, `daten.geaendert` nennt die Felder. Prüfen Sie den Kopf `Agile-Signature` (HMAC-SHA256 über `<t>.<Körper>`).","parameters":[{"name":"Agile-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1760090000,v1=5257a869…"}},{"name":"Agile-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Agile-Event","in":"header","required":true,"schema":{"type":"string","example":"issue.geaendert"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ereignis"},"example":{"id":"0b8f1d7e-3c2a-4f5b-9e6d-1a2b3c4d5e6f","typ":"issue.geaendert","erstellt":"2026-10-10T12:00:00Z","arbeitsbereich":{"workspace_id":"beispiel-gmbh"},"daten":{}}}}},"responses":{"200":{"description":"Annehmen mit beliebigem 2xx innerhalb von zehn Sekunden."}}}},"issue.kommentiert":{"post":{"tags":["Webhooks"],"operationId":"webhookIssueKommentiert","summary":"issue.kommentiert","description":"Ein Issue bekam einen Kommentar. `daten` enthält `issue` und `kommentar`. Prüfen Sie den Kopf `Agile-Signature` (HMAC-SHA256 über `<t>.<Körper>`).","parameters":[{"name":"Agile-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1760090000,v1=5257a869…"}},{"name":"Agile-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Agile-Event","in":"header","required":true,"schema":{"type":"string","example":"issue.kommentiert"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ereignis"},"example":{"id":"0b8f1d7e-3c2a-4f5b-9e6d-1a2b3c4d5e6f","typ":"issue.kommentiert","erstellt":"2026-10-10T12:00:00Z","arbeitsbereich":{"workspace_id":"beispiel-gmbh"},"daten":{}}}}},"responses":{"200":{"description":"Annehmen mit beliebigem 2xx innerhalb von zehn Sekunden."}}}},"clip.fertig":{"post":{"tags":["Webhooks"],"operationId":"webhookClipFertig","summary":"clip.fertig","description":"Ein Clip ist fertig verarbeitet (Video bereit, Transkript und Zusammenfassung erstellt oder nicht möglich). `daten` ist der Clip. Prüfen Sie den Kopf `Agile-Signature` (HMAC-SHA256 über `<t>.<Körper>`).","parameters":[{"name":"Agile-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1760090000,v1=5257a869…"}},{"name":"Agile-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Agile-Event","in":"header","required":true,"schema":{"type":"string","example":"clip.fertig"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ereignis"},"example":{"id":"0b8f1d7e-3c2a-4f5b-9e6d-1a2b3c4d5e6f","typ":"clip.fertig","erstellt":"2026-10-10T12:00:00Z","arbeitsbereich":{"workspace_id":"beispiel-gmbh"},"daten":{}}}}},"responses":{"200":{"description":"Annehmen mit beliebigem 2xx innerhalb von zehn Sekunden."}}}},"termin.angelegt":{"post":{"tags":["Webhooks"],"operationId":"webhookTerminAngelegt","summary":"termin.angelegt","description":"Ein Termin wurde angelegt (auch über einen Buchungslink). `daten` ist der Termin. Prüfen Sie den Kopf `Agile-Signature` (HMAC-SHA256 über `<t>.<Körper>`).","parameters":[{"name":"Agile-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1760090000,v1=5257a869…"}},{"name":"Agile-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Agile-Event","in":"header","required":true,"schema":{"type":"string","example":"termin.angelegt"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ereignis"},"example":{"id":"0b8f1d7e-3c2a-4f5b-9e6d-1a2b3c4d5e6f","typ":"termin.angelegt","erstellt":"2026-10-10T12:00:00Z","arbeitsbereich":{"workspace_id":"beispiel-gmbh"},"daten":{}}}}},"responses":{"200":{"description":"Annehmen mit beliebigem 2xx innerhalb von zehn Sekunden."}}}},"termin.geaendert":{"post":{"tags":["Webhooks"],"operationId":"webhookTerminGeaendert","summary":"termin.geaendert","description":"Ein Termin wurde geändert oder verschoben. `daten` ist der Termin. Prüfen Sie den Kopf `Agile-Signature` (HMAC-SHA256 über `<t>.<Körper>`).","parameters":[{"name":"Agile-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1760090000,v1=5257a869…"}},{"name":"Agile-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Agile-Event","in":"header","required":true,"schema":{"type":"string","example":"termin.geaendert"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ereignis"},"example":{"id":"0b8f1d7e-3c2a-4f5b-9e6d-1a2b3c4d5e6f","typ":"termin.geaendert","erstellt":"2026-10-10T12:00:00Z","arbeitsbereich":{"workspace_id":"beispiel-gmbh"},"daten":{}}}}},"responses":{"200":{"description":"Annehmen mit beliebigem 2xx innerhalb von zehn Sekunden."}}}},"termin.abgesagt":{"post":{"tags":["Webhooks"],"operationId":"webhookTerminAbgesagt","summary":"termin.abgesagt","description":"Ein Termin wurde abgesagt. `daten` ist der Termin. Prüfen Sie den Kopf `Agile-Signature` (HMAC-SHA256 über `<t>.<Körper>`).","parameters":[{"name":"Agile-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1760090000,v1=5257a869…"}},{"name":"Agile-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Agile-Event","in":"header","required":true,"schema":{"type":"string","example":"termin.abgesagt"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ereignis"},"example":{"id":"0b8f1d7e-3c2a-4f5b-9e6d-1a2b3c4d5e6f","typ":"termin.abgesagt","erstellt":"2026-10-10T12:00:00Z","arbeitsbereich":{"workspace_id":"beispiel-gmbh"},"daten":{}}}}},"responses":{"200":{"description":"Annehmen mit beliebigem 2xx innerhalb von zehn Sekunden."}}}}},"components":{"schemas":{"Fehler":{"type":"object","properties":{"fehler":{"type":"object","properties":{"code":{"type":"string","description":"Maschinenlesbarer Fehlercode.","example":"nicht_gefunden"},"nachricht":{"type":"string","description":"Verständliche Meldung auf Deutsch.","example":"Dieses Issue gibt es nicht (mehr)."},"details":{"type":"object","description":"Zusätzliche Angaben, etwa die vorhandene eintrag_id bei 409.","additionalProperties":true}},"required":["code","nachricht"],"additionalProperties":true}},"required":["fehler"],"description":"Einheitliches Fehlerformat der API v1.","additionalProperties":true},"Seite":{"type":"object","properties":{"limit":{"type":"integer","description":"Höchstzahl Einträge dieser Seite.","example":100},"offset":{"type":"integer","description":"Übersprungene Einträge.","example":0},"gesamt":{"type":"integer","description":"Treffer insgesamt (nach Filtern).","example":241},"naechster_offset":{"type":["integer","null"],"description":"Offset der nächsten Seite, oder null am Ende.","example":100}},"required":["limit","offset","gesamt"],"description":"Pagination aller Listen (limit/offset).","additionalProperties":true},"Ok":{"type":"object","properties":{"ok":{"type":"boolean","description":"Hat geklappt.","example":true}},"required":["ok"],"additionalProperties":true},"Geloescht":{"type":"object","properties":{"geloescht":{"description":"ID des gelöschten Objekts bzw. true.","oneOf":[{"type":"string","format":"uuid"},{"type":"boolean"}],"example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["geloescht"],"additionalProperties":true},"Mitglied":{"type":"object","properties":{"benutzer_id":{"type":"string","format":"uuid","description":"ID der Person.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"name":{"type":"string","description":"Name.","example":"Anna Beispiel"},"email":{"type":"string","description":"E-Mail.","example":"anna@example.com","format":"email"},"rolle":{"type":"string","enum":["INHABER","ADMIN","MITGLIED","GAST"],"description":"Rolle im Arbeitsbereich.","example":"MITGLIED"}},"additionalProperties":true},"Arbeitsbereich":{"type":"object","properties":{"datenraum_id":{"type":"string","format":"uuid","description":"ID des Arbeitsbereichs.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"workspace_id":{"type":"string","description":"Kurzkennung des Arbeitsbereichs.","example":"beispiel-gmbh"},"anzeigename":{"type":"string","description":"Name.","example":"Beispiel GmbH"},"rolle":{"type":"string","enum":["INHABER","ADMIN","MITGLIED","GAST"],"description":"Ihre Rolle dort.","example":"ADMIN"}},"additionalProperties":true},"Issue":{"type":"object","properties":{"issue_id":{"type":"string","format":"uuid","description":"ID des Issues.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Laufende Nummer im Arbeitsbereich (#12).","example":12},"titel":{"type":"string","description":"Kurzer Titel.","example":"Speichern verliert die Anhänge in Safari"},"art":{"type":"string","enum":["BUG","VERBESSERUNG","AUFGABE","FRAGE"],"description":"Art.","example":"BUG"},"status":{"type":"string","enum":["OFFEN","IN_ARBEIT","IN_PRUEFUNG","ERLEDIGT","VERWORFEN"],"description":"Status.","example":"OFFEN"},"prioritaet":{"type":"string","enum":["DRINGEND","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"HOCH"},"labels":{"type":"array","items":{"type":"string","description":"Label","example":"frontend"}},"bereich":{"type":"string","description":"Bereich/Modul.","example":"Editor"},"seite":{"type":"string","description":"Seite, auf der es auftrat.","example":"https://app.example.com/editor"},"zustaendig_id":{"type":["string","null"],"format":"uuid","description":"Zuständige Person.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"zustaendig_name":{"type":"string","description":"Name der zuständigen Person.","example":"Ben Muster"},"faellig_am":{"type":["string","null"],"format":"date-time","description":"Fälligkeit.","example":"2026-10-14T09:30:00+02:00"},"ki_eintrag_id":{"type":["string","null"],"format":"uuid","description":"Verknüpftes Mockup.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"angelegt_von_name":{"type":"string","description":"Wer es angelegt hat.","example":"Anna Beispiel"},"angelegt_ueber":{"type":"string","enum":["HAND","CLAUDE"],"description":"Von Hand oder über einen KI-Assistenten.","example":"HAND"},"angelegt_am":{"type":"string","format":"date-time","description":"Angelegt am.","example":"2026-10-14T09:30:00+02:00"},"geaendert_am":{"type":"string","format":"date-time","description":"Zuletzt geändert.","example":"2026-10-14T09:30:00+02:00"},"erledigt_am":{"type":["string","null"],"format":"date-time","description":"Erledigt am.","example":"2026-10-14T09:30:00+02:00"},"auszug":{"type":"string","description":"Anfang der Beschreibung (nur in Listen).","example":"Beim Speichern in Safari 17 …"},"kommentare":{"type":"integer","description":"Anzahl Kommentare.","example":3},"bilder":{"type":"integer","description":"Anzahl Screenshots.","example":1},"anhaenge":{"type":"integer","description":"Anzahl Anhänge.","example":0},"beziehungen":{"type":"integer","description":"Anzahl Verknüpfungen.","example":1},"blockiert_offen":{"type":"integer","description":"Offene Issues, die dieses blockieren.","example":0}},"required":["issue_id","nummer","titel","status"],"additionalProperties":true},"IssueVoll":{"type":"object","properties":{"issue_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Nummer.","example":12},"titel":{"type":"string","description":"Titel.","example":"Speichern verliert die Anhänge in Safari"},"beschreibung":{"type":"string","description":"Beschreibung (Markdown).","example":"Schritte: 1. Datei anhängen 2. Speichern …"},"kommentare":{"type":"array","items":{"$ref":"#/components/schemas/IssueKommentar"}},"bilder":{"type":"array","items":{"type":"object","properties":{"bild_id":{"type":"string","format":"uuid","description":"Screenshot.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"dateiname":{"type":"string","description":"Name.","example":"fehler.png"}},"additionalProperties":true}},"anhaenge":{"type":"array","items":{"type":"object","properties":{"anhang_id":{"type":"string","format":"uuid","description":"Anhang.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"dateiname":{"type":"string","description":"Name.","example":"protokoll.pdf"},"groesse_bytes":{"type":"integer","description":"Größe.","example":48213}},"additionalProperties":true}},"beziehungen":{"type":"array","items":{"type":"object","properties":{"beziehung_id":{"type":"string","format":"uuid","description":"Verknüpfung.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"art":{"type":"string","enum":["BLOCKIERT","DUPLIKAT","GEHOERT_ZU","VERWANDT"],"description":"Art.","example":"BLOCKIERT"},"nummer":{"type":"integer","description":"Anderes Issue.","example":4}},"additionalProperties":true}},"verlauf":{"type":"array","items":{"type":"object","properties":{"art":{"type":"string","description":"Ereignis.","example":"STATUS"},"von":{"type":"string","description":"Vorher.","example":"OFFEN"},"zu":{"type":"string","description":"Nachher.","example":"IN_ARBEIT"},"am":{"type":"string","format":"date-time","description":"Wann.","example":"2026-10-14T09:30:00+02:00"}},"additionalProperties":true}},"link":{"type":"string","description":"Adresse in der Oberfläche.","example":"https://projektmanagement.agiledeveloper.de/workspace/?bereich=issues&n=12"}},"required":["issue_id","nummer","titel"],"description":"Ein Issue mit allem, was dazugehört (dazu alle Felder aus Issue).","additionalProperties":true},"IssueKommentar":{"type":"object","properties":{"kommentar_id":{"type":"string","format":"uuid","description":"Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"text":{"type":"string","description":"Text (Markdown).","example":"Kann ich nachstellen, betrifft nur Safari."},"benutzer_name":{"type":"string","description":"Wer.","example":"Ben Muster"},"erstellt_am":{"type":"string","format":"date-time","description":"Wann.","example":"2026-10-14T09:30:00+02:00"},"erstellt_ueber":{"type":"string","enum":["HAND","CLAUDE"],"description":"Hand oder KI.","example":"HAND"}},"additionalProperties":true},"Mockup":{"type":"object","properties":{"eintrag_id":{"type":"string","format":"uuid","description":"ID des Eintrags.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"titel":{"type":"string","description":"Titel.","example":"Onboarding-Konzept"},"beschreibung":{"type":"string","description":"Beschreibung.","example":"Erster Entwurf"},"status":{"type":"string","enum":["ENTWURF","IN_ARBEIT","IN_PRUEFUNG","AENDERUNGEN","ERLEDIGT","VERWORFEN"],"description":"Status.","example":"ENTWURF"},"prioritaet":{"type":"string","enum":["KRITISCH","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"MITTEL"},"schlagworte":{"type":"array","items":{"type":"string","description":"Schlagwort","example":"onboarding"}},"aktuelle_fassung":{"type":"integer","description":"Aktuelle Fassung (v1, v2 …).","example":2},"dateien":{"type":"array","items":{"$ref":"#/components/schemas/MockupDatei"}},"angelegt_am":{"type":"string","format":"date-time","description":"Angelegt.","example":"2026-10-14T09:30:00+02:00"},"geaendert_am":{"type":"string","format":"date-time","description":"Geändert.","example":"2026-10-14T09:30:00+02:00"}},"required":["eintrag_id","titel"],"additionalProperties":true},"MockupDatei":{"type":"object","properties":{"datei_id":{"type":"string","format":"uuid","description":"ID der Datei.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"dateiname":{"type":"string","description":"Name mit Endung.","example":"konzept.md"},"art":{"type":"string","description":"Art.","example":"MARKDOWN"},"groesse_bytes":{"type":"integer","description":"Größe.","example":5120}},"additionalProperties":true},"DateiInhalt":{"type":"object","properties":{"dateiname":{"type":"string","description":"Name mit Endung (.md, .html, .csv, .tsv, .json, .txt).","example":"konzept.md"},"inhalt":{"type":"string","description":"Vollständiger Inhalt.","example":"# Onboarding\n\n1. Konto anlegen …"}},"required":["dateiname","inhalt"],"additionalProperties":true},"Clip":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"ID des Clips.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Nummer im Arbeitsbereich.","example":14},"titel":{"type":"string","description":"Titel.","example":"Neuer Export erklärt"},"status":{"type":"string","enum":["AUFNAHME","VERARBEITUNG","BEREIT"],"description":"Verarbeitungsstand.","example":"BEREIT"},"transkript_status":{"type":"string","description":"Transkript: OFFEN, LAEUFT, FERTIG, KEIN_TON, NICHT_VERFUEGBAR, FEHLER.","example":"FERTIG"},"ki_status":{"type":"string","description":"KI-Zusammenfassung: OFFEN, LAEUFT, FERTIG, …","example":"FERTIG"},"dauer_ms":{"type":"integer","description":"Dauer in Millisekunden.","example":94000},"freigabe":{"type":"string","enum":["TEAM","LINK"],"description":"Wer den Link öffnen darf.","example":"TEAM"},"angelegt_am":{"type":"string","format":"date-time","description":"Aufgenommen am.","example":"2026-10-14T09:30:00+02:00"}},"required":["clip_id","nummer"],"additionalProperties":true},"ClipVoll":{"type":"object","properties":{"clip_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Nummer.","example":14},"titel":{"type":"string","description":"Titel.","example":"Neuer Export erklärt"},"beschreibung":{"type":"string","description":"Beschreibung.","example":""},"zusammenfassung":{"type":"string","description":"KI-Zusammenfassung.","example":"Der Clip zeigt den neuen CSV-Export …"},"kapitel":{"type":"array","items":{"type":"object","properties":{"zeit_ms":{"type":"integer","description":"Start.","example":0},"titel":{"type":"string","description":"Kapitel.","example":"Einleitung"}},"additionalProperties":true}},"aufgaben":{"type":"array","items":{"type":"string","description":"Aufgabe aus dem Gesprochenen.","example":"Export-Spalten umbenennen"}},"transkript":{"type":"array","items":{"type":"object","properties":{"von_ms":{"type":"integer","description":"Start.","example":0},"bis_ms":{"type":"integer","description":"Ende.","example":4200},"text":{"type":"string","description":"Gesprochenes.","example":"Hallo zusammen, …"}},"additionalProperties":true}},"kommentare":{"type":"array","items":{"type":"object","properties":{"kommentar_id":{"type":"string","format":"uuid","description":"Kommentar.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"text":{"type":"string","description":"Text.","example":"Bei 0:42 fehlt der Knopf."},"zeit_ms":{"type":["integer","null"],"description":"Stelle im Video.","example":42000},"erledigt":{"type":"boolean","description":"Erledigt.","example":false}},"additionalProperties":true}},"link":{"type":"string","description":"Link zum Teilen (je nach Freigabe).","example":"https://clips.agiledeveloper.de/c/?t=…"},"bezuege":{"type":"array","items":{"type":"object","properties":{"art":{"type":"string","description":"Art.","example":"ISSUE"},"ziel_id":{"type":"string","format":"uuid","description":"Ziel.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true}}},"required":["clip_id","nummer"],"description":"Ein Clip mit Transkript, Zusammenfassung, Kapiteln, Kommentaren und Freigabe (dazu alle Felder aus Clip).","additionalProperties":true},"Integration":{"type":"object","properties":{"integration_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"nummer":{"type":"integer","description":"Nummer.","example":3},"name":{"type":"string","description":"Name der Gegenstelle.","example":"Stripe"},"art":{"type":"string","description":"Art (Werte aus /integrationen/kataloge).","example":"ZAHLUNG"},"status":{"type":"string","enum":["IDEE","RECHERCHE","ANGEFRAGT","IM_GESPRAECH","VERTRAG","UMSETZUNG","TEST","LIVE","PAUSIERT","ABGELEHNT"],"description":"Stand in der Pipeline.","example":"IM_GESPRAECH"},"prioritaet":{"type":"string","enum":["DRINGEND","HOCH","MITTEL","NIEDRIG"],"description":"Priorität.","example":"HOCH"},"naechster_schritt":{"type":"string","description":"Nächster Schritt.","example":"Vertrag prüfen"},"faellig_am":{"type":["string","null"],"format":"date","description":"Fällig am.","example":"2026-10-20"},"zustaendig_id":{"type":["string","null"],"format":"uuid","description":"Zuständig.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"required":["integration_id","nummer","name"],"additionalProperties":true},"Termin":{"type":"object","properties":{"termin_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"titel":{"type":"string","description":"Titel.","example":"Release-Abstimmung"},"beginn":{"type":"string","format":"date-time","description":"Beginn.","example":"2026-10-14T09:30:00+02:00"},"ende":{"type":"string","format":"date-time","description":"Ende.","example":"2026-10-14T10:00:00+02:00"},"ganztag":{"type":"boolean","description":"Ganztägig.","example":false},"ort":{"type":"string","description":"Ort.","example":""},"notiz":{"type":"string","description":"Beschreibung/Agenda.","example":"Stand der Issues durchgehen"},"benutzer_id":{"type":["string","null"],"format":"uuid","description":"Organisator (zuständig).","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"meeting_url":{"type":["string","null"],"description":"Gästelink zum Videomeeting.","example":"https://meeting.agiledeveloper.de/agile-release-k3x9"},"teilnehmer":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","description":"E-Mail.","example":"ben@example.com"},"name":{"type":"string","description":"Name.","example":"Ben Muster"},"benutzer_id":{"type":["string","null"],"format":"uuid","description":"Teammitglied.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}},"additionalProperties":true}},"sequenz":{"type":"integer","description":"Fassung (steigt bei jeder Änderung).","example":1},"abgesagt_am":{"type":["string","null"],"format":"date-time","description":"Abgesagt am.","example":"2026-10-14T09:30:00+02:00"}},"required":["termin_id","titel","beginn","ende"],"additionalProperties":true},"TerminEingabe":{"type":"object","properties":{"termin_id":{"type":"string","format":"uuid","description":"Nur zum Ändern: der bestehende Termin. Ohne termin_id wird angelegt.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"titel":{"type":"string","description":"Titel.","example":"Release-Abstimmung"},"beginn":{"type":"string","description":"ISO-Zeitpunkt mit Zone; ganztägig JJJJ-MM-TT.","example":"2026-10-14T09:30:00+02:00"},"ende":{"type":"string","description":"ISO-Zeitpunkt; ganztägig ausschließend (Tag nach dem letzten Tag).","example":"2026-10-14T10:00:00+02:00"},"ganztag":{"type":"boolean","description":"Ganztägig.","example":false},"ort":{"type":"string","description":"Ort.","example":""},"notiz":{"type":"string","description":"Beschreibung/Agenda, steht in der Einladung.","example":"Stand der Issues"},"meeting":{"type":"boolean","description":"true = Videomeeting anlegen, false = entfernen.","example":true},"teilnehmer":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","description":"E-Mail.","example":"ben@example.com"},"name":{"type":"string","description":"Name.","example":"Ben Muster"}},"required":["email"],"additionalProperties":true},"description":"Teilnehmer; bekommen eine Einladung per Mail."},"benutzer_id":{"type":"string","format":"uuid","description":"Organisator; Standard: Sie selbst.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"benachrichtigen":{"type":"boolean","description":"false = keine Mails verschicken.","example":true}},"required":["titel","beginn","ende"],"additionalProperties":true},"Buchungslink":{"type":"object","properties":{"kennung":{"type":"string","description":"Kennung im Link.","example":"anna-beispiel"},"aktiv":{"type":"boolean","description":"Buchbar.","example":true},"titel":{"type":"string","description":"Titel der Buchung.","example":"Kennenlernen"},"dauer_min":{"type":"integer","description":"Dauer in Minuten.","example":30},"wochentage":{"type":"array","items":{"type":"integer","description":"ISO-Wochentag 1 = Montag.","example":1}},"von":{"type":"string","description":"Früheste Uhrzeit.","example":"09:00"},"bis":{"type":"string","description":"Späteste Uhrzeit.","example":"17:00"},"vorlauf_std":{"type":"integer","description":"Mindestvorlauf in Stunden.","example":12},"horizont_tage":{"type":"integer","description":"So weit im Voraus buchbar.","example":30},"puffer_min":{"type":"integer","description":"Puffer zwischen Terminen.","example":10}},"additionalProperties":true},"Webhook":{"type":"object","properties":{"webhook_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"url":{"type":"string","description":"Ziel (https).","example":"https://example.com/agile-hook","format":"uri"},"beschreibung":{"type":"string","description":"Wofür.","example":"Issues nach Slack"},"ereignisse":{"type":"array","items":{"type":"string","enum":["issue.angelegt","issue.geaendert","issue.kommentiert","clip.fertig","termin.angelegt","termin.geaendert","termin.abgesagt"],"description":"Ereignis.","example":"issue.angelegt"}},"aktiv":{"type":"boolean","description":"Wird beliefert.","example":true},"angelegt_am":{"type":"string","format":"date-time","description":"Angelegt.","example":"2026-10-14T09:30:00+02:00"},"fehler_folge":{"type":"integer","description":"Fehlschläge in Folge.","example":0}},"required":["webhook_id","url","ereignisse"],"additionalProperties":true},"Zustellung":{"type":"object","properties":{"zustellung_id":{"type":"string","format":"uuid","description":"ID.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"typ":{"type":"string","enum":["issue.angelegt","issue.geaendert","issue.kommentiert","clip.fertig","termin.angelegt","termin.geaendert","termin.abgesagt"],"description":"Ereignis.","example":"issue.angelegt"},"status":{"type":"string","enum":["OFFEN","ZUGESTELLT","GESCHEITERT"],"description":"Stand.","example":"ZUGESTELLT"},"versuche":{"type":"integer","description":"Versuche.","example":1},"letzter_status":{"type":["integer","null"],"description":"Letzter HTTP-Status.","example":200},"naechster_versuch":{"type":"string","format":"date-time","description":"Nächster Versuch.","example":"2026-10-14T09:30:00+02:00"},"angelegt_am":{"type":"string","format":"date-time","description":"Ereignis am.","example":"2026-10-14T09:30:00+02:00"},"zugestellt_am":{"type":["string","null"],"format":"date-time","description":"Zugestellt am.","example":"2026-10-14T09:30:00+02:00"}},"additionalProperties":true},"Ereignis":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Ereignis-ID (bleibt bei Wiederholungen gleich; zum Entdoppeln).","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"typ":{"type":"string","enum":["issue.angelegt","issue.geaendert","issue.kommentiert","clip.fertig","termin.angelegt","termin.geaendert","termin.abgesagt"],"description":"Ereignis.","example":"issue.angelegt"},"erstellt":{"type":"string","format":"date-time","description":"Zeitpunkt.","example":"2026-10-14T09:30:00+02:00"},"arbeitsbereich":{"type":"object","properties":{"workspace_id":{"type":"string","description":"Kennung.","example":"beispiel-gmbh"}},"additionalProperties":true},"daten":{"type":"object","description":"Das betroffene Objekt (Issue, Kommentar, Clip, Termin).","additionalProperties":true}},"required":["id","typ","erstellt","daten"],"description":"Nutzlast eines Webhooks.","additionalProperties":true}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"agile_pm_…","description":"API-Schlüssel aus Konto › API-Schlüssel."},"oauth2":{"type":"oauth2","description":"OAuth 2.1, Authorization Code mit PKCE (S256). Clients registrieren sich dynamisch unter /oauth/register.","flows":{"authorizationCode":{"authorizationUrl":"https://projektmanagement.agiledeveloper.de/oauth/authorize","tokenUrl":"https://projektmanagement.agiledeveloper.de/oauth/token","refreshUrl":"https://projektmanagement.agiledeveloper.de/oauth/token","scopes":{"lesen":"Alles lesen.","schreiben":"Lesen und schreiben."}}}}}},"security":[{"apiKey":[]},{"oauth2":["lesen"]}],"externalDocs":{"description":"MCP-Anleitung für Claude und ChatGPT","url":"https://projektmanagement.agiledeveloper.de/docs/mcp/"}}