{"openapi":"3.0.3","info":{"title":"Home Operating Officer REST API v1","version":"0.2.135","x-hoo-api-generation":"v1","x-hoo-application-version":"0.2.135","description":"REST-Vertrag der HOO-Programmversion 0.2.135 (API-Generation v1). Lese- und Schreibzugriff auf HOO-Kernobjekte. Authentifizierung per Bearer-Token (Profil → API-Tokens). Schreiboperationen (POST/PATCH/DELETE) erfordern einen Token mit scope=write; Leseoperationen genuegt scope=read. SQL-Kalendertage (DATE) werden in Antworten immer als zeitzonenlose YYYY-MM-DD-Strings geliefert; DATETIME- und TIMESTAMP-Werte bleiben ISO-8601-Zeitpunkte.","x-hoo-date-wire-contract":{"calendarDate":"YYYY-MM-DD","instant":"ISO-8601","responseFields":{"documents":["retention_until","destroy_after","issued_on","expires_on"],"inventory":["purchase_date"]}}},"servers":[{"url":"/api/v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Meta","x-displayName":"Allgemein","description":"Status, Spezifikation, Übersicht, Token-Informationen und globale Suche."},{"name":"Tasks","x-displayName":"Aufgaben","description":"Aufgaben des aktiven Haushalts lesen, anlegen, ändern, abschließen und löschen."},{"name":"Reminders","x-displayName":"Erinnerungen","description":"Erinnerungen und Fristen lesen, ändern, vertagen und löschen."},{"name":"Documents","x-displayName":"Dokumente","description":"Dokument-Metadaten mit Ablage-, Fristen- und Aufbewahrungsangaben."},{"name":"Inventory","x-displayName":"Inventar","description":"Gegenstände mit Standort, Zustand, Kaufdaten und Wert."},{"name":"Training","x-displayName":"Ausbildung","description":"Persönliche Ausbildungsnachweise und bestätigbare Berichtsquellen. Sichtbar ist nur das eigene Berichtsheft."}],"paths":{"/":{"get":{"tags":["Meta"],"summary":"API-Übersicht mit allen Endpunkten","responses":{"200":{"description":"OK"}}}},"/health":{"get":{"tags":["Meta"],"summary":"Liveness-Check (ohne Token)","security":[],"responses":{"200":{"description":"OK"}}}},"/openapi.json":{"get":{"tags":["Meta"],"summary":"OpenAPI-Spezifikation (ohne Token)","description":"Enthält nur den Schnittstellenvertrag, keine Daten.","security":[],"responses":{"200":{"description":"OK"}}}},"/me":{"get":{"tags":["Meta"],"summary":"Aktueller Token + Benutzer","responses":{"200":{"description":"OK"}}}},"/search":{"get":{"tags":["Meta"],"summary":"Globale Suche (Volltext-aware)","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"Suchbegriff"},{"name":"limitPerGroup","in":"query","schema":{"type":"integer","default":5,"minimum":1,"maximum":25},"description":"Treffer je Bereich (Standard 5, höchstens 25)"}],"responses":{"200":{"description":"Treffer"},"400":{"description":"Suchbegriff fehlt (missing_query)"}}}},"/tasks":{"get":{"tags":["Tasks"],"summary":"Aufgaben listen","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["open","in_progress","waiting","done","cancelled"]}},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":200},"description":"Höchstzahl der Einträge (Standard 50, höchstens 200)"}],"responses":{"200":{"description":"Liste"}}},"post":{"tags":["Tasks"],"summary":"Aufgabe anlegen (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","maxLength":190},"description":{"type":"string"},"status":{"type":"string","enum":["open","in_progress","waiting","done","cancelled"],"default":"open"},"priority":{"type":"string","enum":["low","medium","high","critical"],"default":"medium"},"dueAt":{"type":"string","description":"ISO oder 'YYYY-MM-DD HH:MM:SS'"},"assignedPersonId":{"type":"integer"},"recurrence":{"type":"string","enum":["daily","weekly","monthly","yearly"],"nullable":true}}}}}},"responses":{"201":{"description":"Angelegt"},"422":{"description":"Validierungsfehler (validation_error)"}}}},"/tasks/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"get":{"tags":["Tasks"],"summary":"Aufgabe lesen","responses":{"200":{"description":"OK"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}},"patch":{"tags":["Tasks"],"summary":"Aufgabe aendern (scope=write)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["open","in_progress","waiting","done","cancelled"]},"priority":{"type":"string","enum":["low","medium","high","critical"]},"dueAt":{"type":"string"},"assignedPersonId":{"type":"integer","nullable":true},"notes":{"type":"string"},"recurrence":{"type":"string","enum":["daily","weekly","monthly","yearly"],"nullable":true}}}}}},"responses":{"200":{"description":"Aktualisiert"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"},"409":{"description":"Vorausgesetzte Aufgaben offen (blocked_by_tasks)"},"422":{"description":"Validierungsfehler (validation_error)"}}},"delete":{"tags":["Tasks"],"summary":"Aufgabe loeschen (scope=write, Soft-Delete)","responses":{"200":{"description":"Geloescht"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}}},"/tasks/{id}/complete":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"post":{"tags":["Tasks"],"summary":"Aufgabe abschliessen inkl. Quelleffekte + Wiederkehrung (scope=write)","responses":{"200":{"description":"Abgeschlossen"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"},"409":{"description":"Blockiert (z. B. Dokument offen)"}}}},"/reminders":{"get":{"tags":["Reminders"],"summary":"Erinnerungen listen","parameters":[{"name":"active","in":"query","schema":{"type":"boolean"},"description":"Nur aktive (nicht geschlummert/erledigt)"},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":500},"description":"Höchstzahl der Einträge (Standard 50, höchstens 500)"}],"responses":{"200":{"description":"Liste"}}},"post":{"tags":["Reminders"],"summary":"Erinnerung anlegen (scope=write)","deprecated":true,"description":"Manuelle Erinnerungen werden in der App als Aufgaben mit Termin geführt – bitte POST /api/v1/tasks mit dueAt verwenden.","x-hoo-successor":"/api/v1/tasks","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","dueAt"],"properties":{"title":{"type":"string","maxLength":190},"dueAt":{"type":"string","description":"ISO oder 'YYYY-MM-DD HH:MM:SS'"},"priority":{"type":"string","enum":["low","medium","high","critical"],"default":"medium"},"notes":{"type":"string"}}}}}},"responses":{"201":{"description":"Angelegt","headers":{"Deprecation":{"description":"Immer „true“: Der Endpunkt ist veraltet.","schema":{"type":"string"}},"Link":{"description":"Nachfolger: </api/v1/tasks>; rel=\"successor-version\"","schema":{"type":"string"}}}},"422":{"description":"Validierungsfehler","headers":{"Deprecation":{"description":"Immer „true“: Der Endpunkt ist veraltet.","schema":{"type":"string"}},"Link":{"description":"Nachfolger: </api/v1/tasks>; rel=\"successor-version\"","schema":{"type":"string"}}}}}}},"/reminders/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"get":{"tags":["Reminders"],"summary":"Erinnerung lesen","responses":{"200":{"description":"OK"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}},"patch":{"tags":["Reminders"],"summary":"Erinnerung aendern (scope=write)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"dueAt":{"type":"string"},"priority":{"type":"string","enum":["low","medium","high","critical"]},"status":{"type":"string","enum":["open","done","dismissed"]},"notes":{"type":"string"}}}}}},"responses":{"200":{"description":"Aktualisiert"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"},"422":{"description":"Validierungsfehler (validation_error)"}}},"delete":{"tags":["Reminders"],"summary":"Erinnerung loeschen (scope=write, Soft-Delete)","responses":{"200":{"description":"Geloescht"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}}},"/reminders/{id}/snooze":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"post":{"tags":["Reminders"],"summary":"Erinnerung vertagen (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["days"],"properties":{"days":{"type":"integer","minimum":1,"maximum":365}}}}}},"responses":{"200":{"description":"Vertagt"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"},"422":{"description":"Ungueltige Tage"}}}},"/reminders/{id}/unsnooze":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"post":{"tags":["Reminders"],"summary":"Schlummern beenden (scope=write)","responses":{"200":{"description":"Aktiv"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}}},"/documents":{"get":{"tags":["Documents"],"summary":"Dokumente listen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":500},"description":"Höchstzahl der Einträge (Standard 50, höchstens 500)"}],"responses":{"200":{"description":"Liste"}}},"post":{"tags":["Documents"],"summary":"Dokument anlegen (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","maxLength":190},"documentType":{"type":"string","enum":["receipt","manual","insurance","contract","identity","emergency","other"],"default":"other"},"workflowStatus":{"type":"string","enum":["inbox","review","processed","filed","missing","archived"],"default":"filed"},"originalAvailable":{"type":"boolean"},"locationId":{"type":"integer","nullable":true},"inventoryItemId":{"type":"integer","nullable":true},"issuedOn":{"type":"string","description":"YYYY-MM-DD"},"expiresOn":{"type":"string","description":"YYYY-MM-DD"},"retentionUntil":{"type":"string","description":"YYYY-MM-DD"},"destroyAfter":{"type":"string","description":"YYYY-MM-DD"},"issuerName":{"type":"string"},"missingNote":{"type":"string"},"fileReference":{"type":"string"},"notes":{"type":"string"}}}}}},"responses":{"201":{"description":"Angelegt"},"422":{"description":"Validierungsfehler (validation_error)"}}}},"/documents/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"get":{"tags":["Documents"],"summary":"Dokument lesen","responses":{"200":{"description":"OK"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}},"patch":{"tags":["Documents"],"summary":"Dokument aendern (scope=write)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"documentType":{"type":"string","enum":["receipt","manual","insurance","contract","identity","emergency","other"]},"workflowStatus":{"type":"string","enum":["inbox","review","processed","filed","missing","archived"]},"originalAvailable":{"type":"boolean"},"locationId":{"type":"integer","nullable":true},"inventoryItemId":{"type":"integer","nullable":true},"issuedOn":{"type":"string"},"expiresOn":{"type":"string"},"retentionUntil":{"type":"string"},"destroyAfter":{"type":"string"},"issuerName":{"type":"string"},"missingNote":{"type":"string"},"fileReference":{"type":"string"},"notes":{"type":"string"}}}}}},"responses":{"200":{"description":"Aktualisiert"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"},"422":{"description":"Validierungsfehler (validation_error)"}}},"delete":{"tags":["Documents"],"summary":"Dokument loeschen (scope=write, Soft-Delete)","responses":{"200":{"description":"Geloescht"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}}},"/inventory":{"get":{"tags":["Inventory"],"summary":"Inventar listen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":500},"description":"Höchstzahl der Einträge (Standard 50, höchstens 500)"}],"responses":{"200":{"description":"Liste"}}},"post":{"tags":["Inventory"],"summary":"Inventarobjekt anlegen (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["itemName"],"properties":{"itemName":{"type":"string","maxLength":190},"itemCategory":{"type":"string"},"brand":{"type":"string"},"model":{"type":"string"},"serialNumber":{"type":"string"},"barcode":{"type":"string"},"locationId":{"type":"integer","nullable":true},"roomId":{"type":"integer","nullable":true},"storageUnitId":{"type":"integer","nullable":true},"quantity":{"type":"integer","default":1},"conditionStatus":{"type":"string","enum":["excellent","good","fair","needs_attention"],"default":"good"},"criticality":{"type":"string","enum":["low","medium","high"],"default":"low"},"purchaseDate":{"type":"string","description":"YYYY-MM-DD"},"purchasePrice":{"type":"number"},"estimatedValue":{"type":"number"},"notes":{"type":"string"}}}}}},"responses":{"201":{"description":"Angelegt"},"422":{"description":"Validierungsfehler (validation_error)"}}}},"/inventory/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"get":{"tags":["Inventory"],"summary":"Inventarobjekt lesen","responses":{"200":{"description":"OK"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}},"patch":{"tags":["Inventory"],"summary":"Inventarobjekt aendern (scope=write)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"itemName":{"type":"string"},"itemCategory":{"type":"string"},"brand":{"type":"string"},"model":{"type":"string"},"serialNumber":{"type":"string"},"barcode":{"type":"string"},"locationId":{"type":"integer","nullable":true},"roomId":{"type":"integer","nullable":true},"quantity":{"type":"integer"},"conditionStatus":{"type":"string","enum":["excellent","good","fair","needs_attention"]},"criticality":{"type":"string","enum":["low","medium","high"]},"purchaseDate":{"type":"string"},"purchasePrice":{"type":"number"},"estimatedValue":{"type":"number"},"notes":{"type":"string"}}}}}},"responses":{"200":{"description":"Aktualisiert"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"},"422":{"description":"Validierungsfehler (validation_error)"}}},"delete":{"tags":["Inventory"],"summary":"Inventarobjekt loeschen (scope=write, Soft-Delete)","responses":{"200":{"description":"Geloescht"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}}},"/training/overview":{"get":{"tags":["Training"],"summary":"Ausbildungsmonat mit Kalender, Kennzahlen und Schullücken lesen","parameters":[{"name":"month","in":"query","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","example":"2026-10"},"description":"Monat im Format YYYY-MM (Standard: aktueller Monat)"}],"responses":{"200":{"description":"Monatsübersicht"}}}},"/training/profile":{"get":{"tags":["Training"],"summary":"Eigenes Ausbildungsprofil lesen","responses":{"200":{"description":"Ausbildungsstammdaten und Arbeitszeitvorgaben"}}}},"/training/customers":{"get":{"tags":["Training"],"summary":"Eigene Kundenakten ohne geschützte Kontexttexte seitenweise und mit Suche listen","description":"Liefert höchstens `limit` Kundenakten des eigenen Berichtshefts (Haushalt und Benutzer des Tokens), sortiert nach Name. Infrastruktur, häufige Tätigkeiten und KI-Kontext werden nie ausgeliefert. Weitere Seiten über `offset` bzw. `meta.page.nextOffset`.","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":100,"example":"Muster"},"description":"Suchbegriff (Teilstring) in Name, Export-Alias, Namenszusatz, Anschrift sowie Kunden-, Lieferanten- und Interessentennummer"},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":200},"description":"Höchstzahl der Einträge (Standard 50, höchstens 200)"},{"name":"offset","in":"query","schema":{"type":"integer","default":0,"minimum":0,"maximum":1000000},"description":"Anzahl übersprungener Treffer (Standard 0); für die nächste Seite meta.page.nextOffset verwenden"}],"responses":{"200":{"description":"Sichere Kundenübersicht (eine Seite); Beispiel für ?q=Muster&limit=1","content":{"application/json":{"example":{"data":[{"id":4,"displayName":"Muster GmbH","exportAlias":"Kunde A","confidential":true,"originProvider":"venabo","createdAt":"2026-10-01T08:00:00.000Z","updatedAt":"2026-10-12T14:30:00.000Z"}],"meta":{"count":1,"total":37,"limit":1,"offset":0,"q":"Muster","page":{"number":1,"size":1,"count":37,"hasNext":true,"hasPrevious":false,"nextOffset":1,"previousOffset":null}}}}}}}},"post":{"tags":["Training"],"summary":"Kundenakte anlegen (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["displayName"],"properties":{"displayName":{"type":"string","maxLength":190},"exportAlias":{"type":"string","maxLength":190},"infrastructure":{"type":"string","description":"Geschützter interner Kontext"},"recurringTasks":{"type":"string","description":"Geschützter interner Kontext"},"aiContext":{"type":"string","description":"Geschützter lokaler KI-Kontext"},"isConfidential":{"type":"boolean","default":false}}}}}},"responses":{"201":{"description":"Kundenakte angelegt"},"422":{"description":"Validierungsfehler (validation_error)"}}}},"/training/framework":{"get":{"tags":["Training"],"summary":"Ausbildungsrahmenplan mit Fortschritt lesen","responses":{"200":{"description":"Aktive Ausbildungsinhalte"}}}},"/training/subjects":{"get":{"tags":["Training"],"summary":"Eigene Berufsschulfächer listen","responses":{"200":{"description":"Fächer"}}}},"/training/timetable":{"get":{"tags":["Training"],"summary":"Persönlichen Stundenplan nach Ausbildungsjahr lesen","parameters":[{"name":"trainingYear","in":"query","schema":{"type":"integer","minimum":1,"maximum":10},"description":"Optionales Ausbildungsjahr"}],"responses":{"200":{"description":"Wiederkehrende Unterrichtsstunden"}}}},"/training/school-plan":{"get":{"tags":["Training"],"summary":"Konkreten Berufsschulplan für einen Zeitraum berechnen","parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Erster Kalendertag"},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Letzter Kalendertag"}],"responses":{"200":{"description":"Geplante, dokumentierte und fehlende Unterrichtstage"}}}},"/training/school-entries":{"post":{"tags":["Training"],"summary":"Unterricht dokumentieren und als bestätigte Berichtsquelle übernehmen (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["schoolDate","topics"],"properties":{"schoolDate":{"type":"string","format":"date"},"subjectId":{"type":"integer","nullable":true},"subject":{"type":"string","description":"Erforderlich, wenn subjectId fehlt"},"topics":{"type":"string"},"durationMinutes":{"type":"integer","minimum":0,"maximum":1440},"notes":{"type":"string"}}}}}},"responses":{"201":{"description":"Unterricht und Berichtsnachweis angelegt"},"422":{"description":"Validierungsfehler (validation_error)"}}}},"/training/reports":{"get":{"tags":["Training"],"summary":"Eigene Ausbildungsberichte eines Monats listen","parameters":[{"name":"month","in":"query","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","example":"2026-10"},"description":"Monat im Format YYYY-MM (Standard: aktueller Monat)"}],"responses":{"200":{"description":"Liste der persönlichen Berichte"}}},"post":{"tags":["Training"],"summary":"Ausbildungsbericht aus bestätigten Quellen anlegen (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reportDate","reportKind"],"properties":{"reportDate":{"type":"string","format":"date","example":"2026-10-08"},"reportKind":{"type":"string","enum":["work","school","vacation","sick","holiday","other"]},"title":{"type":"string","maxLength":190},"content":{"type":"string"},"durationMinutes":{"type":"integer","minimum":0,"maximum":1440},"sourceIds":{"type":"array","items":{"type":"integer"}},"frameworkIds":{"type":"array","items":{"type":"integer"}}}}}}},"responses":{"201":{"description":"Angelegt und versioniert"},"422":{"description":"Validierungsfehler (validation_error)"}}}},"/training/reports/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"get":{"tags":["Training"],"summary":"Ausbildungsbericht mit Quellen, Rahmenplan und Versionen lesen","responses":{"200":{"description":"OK"},"400":{"description":"Ungültige ID (invalid_id)"},"404":{"description":"Nicht gefunden (not_found)"}}}},"/training/sources":{"get":{"tags":["Training"],"summary":"Eigene Berichtsquellen eines Monats listen","parameters":[{"name":"month","in":"query","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","example":"2026-10"}},{"name":"state","in":"query","schema":{"type":"string","enum":["unconfirmed","confirmed","rejected"]},"description":"Optional nach Prüfstatus filtern"}],"responses":{"200":{"description":"Quellenliste"}}},"post":{"tags":["Training"],"summary":"Bestätigbare Berichtsquelle anlegen (scope=write)","description":"Neue Quellen sind zunächst unbestätigt. Die KI verwendet nur Quellen, deren evidenceState bestätigt ist; Arbeitszeit-, Berufsschul- und Kalenderquellen entstehen nur systemseitig.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["happenedOn","title"],"properties":{"happenedOn":{"type":"string","format":"date","example":"2026-10-08"},"sourceKind":{"type":"string","enum":["manual","ticket","import"],"default":"manual"},"title":{"type":"string","maxLength":190},"details":{"type":"string"},"durationMinutes":{"type":"integer","minimum":0,"maximum":1440},"customerId":{"type":"integer","nullable":true},"evidenceState":{"type":"string","enum":["unconfirmed","confirmed","rejected"],"default":"unconfirmed"}}}}}},"responses":{"201":{"description":"Quelle angelegt"},"422":{"description":"Validierungsfehler (validation_error)"}}}},"/training/sources/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"patch":{"tags":["Training"],"summary":"Prüfstatus einer nicht gesperrten Quelle ändern (scope=write)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["evidenceState"],"properties":{"evidenceState":{"type":"string","enum":["unconfirmed","confirmed","rejected"]}}}}}},"responses":{"200":{"description":"Prüfstatus geändert"},"400":{"description":"Ungültige ID (invalid_id)"},"409":{"description":"Quelle gesperrt oder nicht gefunden"},"422":{"description":"Validierungsfehler (validation_error)"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API-Token aus Profil → API-Tokens."}},"schemas":{"CalendarDate":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","nullable":true,"description":"Zeitzonenloser SQL-Kalendertag im Format YYYY-MM-DD; null, falls nicht gesetzt."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}