{"openapi":"3.1.0","info":{"title":"1885 Document Intelligence — POC API","description":"Feld-Extraktion aus Dokumentpaketen (Ausschreibungen; ab Juli 2026 Rechnungen/Lieferscheine) mit Drei-Instanzen-Konsens, Format-Regelwerk, Provenance (Datei/Seite/Bbox) und Triage (AUTO/HITL/NOT_FOUND).\n\n**POC-Whitelist:** Zugriff nur mit von Auriga ausgegebenem API-Key; jeder Key ist je Produkt freigeschaltet. Antworten sind erklärbar: jede verworfene Lesung nennt die Regel (siehe GET /v1/rules).\n\n**MCP für KI-Agenten:** `POST /mcp?apiKey=…` (Streamable HTTP) mit den Tools extract_tender_package, list_format_rules, list_extraction_packs, health_check.","version":"0.1.0","contact":{"name":"Auriga Strategy","email":"marcus.ehlers@auriga-strategy.com"}},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/v1/knowledge/search":{"get":{"summary":"Knowledge Search","description":"Wissens-Hub (docs/26): Volltextsuche (deutsch) ueber die docs/-Ordner\nder indexierten Repos. Quelle bleibt Git; Antworten nennen Repo+Pfad.","operationId":"knowledge_search_v1_knowledge_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":8,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/knowledge/reindex":{"post":{"summary":"Knowledge Reindex","description":"Alle konfigurierten Repos neu indexieren (Gateway-Cron, naechtlich).\n\nAsynchron: Start wird sofort quittiert, der Lauf arbeitet im Hintergrund.\nErgebnis/Fehler des letzten Laufs stehen in der Antwort des naechsten\nAufrufs. Doppelstarts laufen ins Leere (laeuft-Flag).","operationId":"knowledge_reindex_v1_knowledge_reindex_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/knowledge/read":{"get":{"summary":"Knowledge Read","description":"Ganzes Wissensdokument lesen (alle Chunks in Reihenfolge).","operationId":"knowledge_read_v1_knowledge_read_get","parameters":[{"name":"path","in":"query","required":true,"schema":{"type":"string","title":"Path"}},{"name":"repo","in":"query","required":false,"schema":{"type":"string","default":"document-intelligence","title":"Repo"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/beleg/lieferanten-index":{"get":{"summary":"Beleg Lieferanten Index","description":"S1 NU-/Lieferanten-Index (7.670 Konten, Quersumme 2.281,0 Mio EUR).","operationId":"beleg_lieferanten_index_v1_beleg_lieferanten_index_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"gruppe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gruppe"}},{"name":"vendorno","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendorno"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/beleg/projekt-bezug":{"get":{"summary":"Beleg Projekt Bezug","description":"S3 Projekt-Bezug (53.307 Zeilen vendorno x Kostentraeger x Mandant).","operationId":"beleg_projekt_bezug_v1_beleg_projekt_bezug_get","parameters":[{"name":"vendorno","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendorno"}},{"name":"kostentraeger","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kostentraeger"}},{"name":"mandant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mandant"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packs":{"get":{"summary":"Packs","operationId":"packs_v1_packs_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PacksAntwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/rules":{"get":{"summary":"Rules","operationId":"rules_v1_rules_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RulesAntwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/classify":{"post":{"summary":"Classify","description":"Inhalts-Klassifikation aller Anlagen eines Pakets (B-W6 Stufe 1).\n\nBody: {\"tender_ref\": \"DTAD:24551506\", \"persist\": true?}\nZwei Lesungen (Dateiname/Inhalt) + LLM-Schiedsrichter; Ergebnis je\nDokument mit Evidenz-Zitat. persist=true schreibt nach\ndi_dokument_klassifikation (Upsert je document_id).","operationId":"classify_v1_classify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifyErgebnis"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bss_verkehr":{"post":{"summary":"Bss Verkehr","description":"BKO-1 (baustellen-konfigurator docs/01): Zwei-Pfad-Konsens fuer\nsperrart / lage / regelplan_nennung je LV-Position.\n\nBody: {\"tender_ref\": \"DTAD:...\", \"batch_groesse\": 25?}\nPfad A = engine/bss_verkehr (Regelwerk), Pfad B = LLM mit Negation.\nJe Feld: konsens (beide gleich) -> AUTO; Dissens/eine-Stimme -> HITL.\nPersistenz: di_bss_verkehr (ein Datensatz je Position+Feld).","operationId":"bss_verkehr_v1_bss_verkehr_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BssVerkehrErgebnis"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/vertragsregel":{"post":{"summary":"Vertragsregel","description":"BKO-2 (baustellen-konfigurator docs/02) / B-W10b: regel_arten\n`verkehrsfuehrung` + `abrechnung_vorhaltung` aus Baubeschreibung/ZTV/\nLV-Vorbemerkung nach di_vertragsregel.\n\nBody: {\"tender_ref\": \"DTAD:...\", \"max_docs\": 8?, \"max_seiten\": 40?}\nAnker-Vorfilter je Seite, LLM nur auf Kandidatenseiten; jede Regel mit\nDokument + Seite + woertlichem Zitat.\n\nAsync fuer lange Extraktionen: \"modus\": \"async\" -> 202 {job_id,\npolling_url}; Ergebnis via GET /v1/jobs/{job_id} (statt Gateway-524\naussitzen). Antwort enthaelt \"lesung\" (Kostenausweis, docs/210).","operationId":"vertragsregel_v1_vertragsregel_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VertragsregelErgebnis"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/extract":{"post":{"summary":"Extract","description":"Extrahiert ein Dokumentpaket direkt aus der Dokumentablage.\n\nBody: {\"tender_ref\": \"DTAD:24545281\", \"pack\": \"vob_hva_formalia\",\n       \"fields\": [\"procurement_number\"]?, \"sink_goldset\": false?}\nODER  {\"storage_pfade\": [\"energie_rohbestand/saperion-documents/.../x.PDF\"],\n       \"pack\": \"rechnung_energie\", \"ref\": \"beleg:123\"?}\n      (Dokumente liegen bereits in der Ablage — gleiche Whitelist\n      STORAGE_BUCKETS wie /v1/dokumente, max. 10 Pfade; \"ref\" ist der\n      frei waehlbare Bezugsschluessel fuer Review-Queue und Antwort.)","operationId":"extract_v1_extract_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractErgebnis"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/extract_lauf":{"post":{"summary":"Extract Lauf","description":"Hintergrund-Extraktion EINES Ablage-Dokuments in eine Ergebnis-Senke.\n\nBody: {\"storage_pfad\": \"energie_rohbestand/…/x.PDF\",\n       \"pack\": \"rechnung_energie\", \"beleg_id\": 2542,\n       \"senke\": \"fakten_feld_fundstelle\"}\nAntwortet sofort (angenommen); Ergebnis/FEHLER landet je Feld als\nUpsert in der Senke (PK beleg_id+feld). Fortschritt = Senke abfragen.","operationId":"extract_lauf_v1_extract_lauf_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dokumente":{"post":{"summary":"Dokumente Tuer","description":"Die generische Tuer (P4, docs/53): beliebige Dokumente einreichen —\ndie Engine sagt zuerst, WAS jedes Dokument ist (zwei Lesungen +\nSchiedsrichter, mit Evidenz-Zitat), und dann, was sie damit kann\n(Registry: Endpoint/Pack) — Unbekanntes ehrlich als UNBEKANNT mit\nOnboarding-Hinweis, nie ein Fehler.\n\nBody: {\"tender_ref\": \"DTAD:...\"} ODER\n      {\"dokumente\": [{\"filename\": \"...\", \"content_base64\": \"...\"}]}\n      (v1: PDF + GAEB; max. 10 Dokumente / 15 MB gesamt) ODER\n      {\"storage_pfade\": [\"energie_rohbestand/FTW/17002278/rechnung.pdf\", ...]}\n      (Dokumente liegen bereits in der Ablage — kein Upload noetig,\n      max. 10 Pfade; Buckets: siehe STORAGE_BUCKETS, docs/78)\nZIP-Container werden geoeffnet: Mitglieder (GAEB/PDF) sind eigene\nEintraege. Mit {\"tender_ref\": ..., \"zip_entpacken\": true} werden die\nMitglieder aller ZIPs des Tenders als eigene tender_documents\nmaterialisiert (pending) — Auftrag #12 P.3, Freigabe 11.07.2026.","operationId":"dokumente_tuer_v1_dokumente_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}":{"get":{"summary":"Pruefung Job Status","description":"Status/Ergebnis eines Async-Pruefung-Jobs (E4). ergebnis erscheint\nerst bei status=fertig, fehler nur bei status=fehler.","operationId":"pruefung_job_status_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/beispiele/rechnung":{"get":{"summary":"Beispiel Rechnung Endpoint","description":"Gehostete Muster-XRechnung (docs/109 §5): synthetisch, in sich\nstimmig, direkt als Payload fuer POST /v1/pruefung nutzbar — erster\nErfolg ohne eigene Daten und ohne Freigabe-Runde.","operationId":"beispiel_rechnung_endpoint_v1_beispiele_rechnung_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeispielRechnung"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sdk/python":{"get":{"summary":"Sdk Python","description":"Mini-SDK als eine Datei (docs/109 §5): Retry/Backoff, korrekter\nUser-Agent, Fehler-Codes, Async-Polling — Quelle ist engine/sdk_python.py,\ndamit SDK und Deploy nie auseinanderlaufen.","operationId":"sdk_python_v1_sdk_python_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pruefung":{"post":{"summary":"Pruefung Dokument","description":"Belegpflichtige Dokument-Pruefung (Regelwerk-App docs/22 Phase 2;\nRechnung docs/106; E-Rechnung/OCR/Async docs/107).\n\nBody: {\"filename\": \"...\", \"content_base64\": \"...\"} ODER\n      {\"storage_pfad\": \"<bucket>/<pfad>.pdf\"} —\n      optional \"dokumentart\": nu_vertrag | leistungsverzeichnis |\n      entsorgungsnachweis | rechnung | energiebeleg\n      (sonst Klassifikation zuerst).\nstorage_pfad beginnt IMMER mit dem Bucket-Namen. Freigeschaltete\nBuckets: raw_documents, energie_rohbestand, belege_rohbestand\n(z. B. \"belege_rohbestand/jobrouter-mergedpdf/<MANDANT>/<VORGANG>/\nbeleg_<rev>.pdf\"); Alt-Pfade dtad/... und extracted/... laufen gegen\ntender_documents. Unbekannter Bucket -> sofort 422 mit Klartext.\nPDF + DOCX + XML (XRechnung/ZUGFeRD); Scans laufen ueber OCR; max. 15 MB.\n\nAsync (E4): \"modus\": \"async\" [+ \"webhook_url\" (https) + \"webhook_secret\"]\n-> 202 {job_id, polling_url}; Ergebnis via GET /v1/jobs/{job_id},\noptional POST an webhook_url mit X-1885-Signature (HMAC-SHA256).\n\nErgebnis enthaelt \"lesung\" (Nachbestellung Datenplattform 31.07.):\n{modell, tokens_eingabe, tokens_ausgabe, kosten_usd} — womit und wie\nteuer die LLM-Lesung dieses Jobs war (kosten_usd nur, wenn Preise\nin der Engine konfiguriert sind).","operationId":"pruefung_dokument_v1_pruefung_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional (Etappe D): gleicher Key + gleicher Body -> gespeicherte Antwort (Replay); gleicher Key + anderer Body -> 422. Fenster 48h. Empfohlen fuer Retries.","title":"Idempotency-Key"},"description":"Optional (Etappe D): gleicher Key + gleicher Body -> gespeicherte Antwort (Replay); gleicher Key + anderer Body -> 422. Fenster 48h. Empfohlen fuer Retries."},{"name":"X-Mandant","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Etappe E: Mandant der Gedaechtnis-Pruefungen (setzt das Gateway aus der Key-Meta; Default 'pgb-pilot' = Pilot-Bestand). Dublette/IBAN-Wechsel laufen nur gegen das Gedaechtnis DIESES Mandanten; Zaehlpunkt-Historie wird je Mandant isoliert gelesen und geschrieben.","title":"X-Mandant"},"description":"Etappe E: Mandant der Gedaechtnis-Pruefungen (setzt das Gateway aus der Key-Meta; Default 'pgb-pilot' = Pilot-Bestand). Dublette/IBAN-Wechsel laufen nur gegen das Gedaechtnis DIESES Mandanten; Zaehlpunkt-Historie wird je Mandant isoliert gelesen und geschrieben."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Sync-Modus: belegtes Pruefergebnis","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PruefungErgebnis"}}}},"202":{"description":"Async-Modus (modus=async): Job angenommen","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PruefungAngenommen"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/onboarding":{"get":{"summary":"Onboarding Liste","description":"Onboarding-Tickets (docs/70): welche Dokumentklassen werden nachgefragt\n(Zaehler = Prioritaet), in welchem Status ist ihr Lern-Vorgang.","operationId":"onboarding_liste_v1_onboarding_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/review/begleiter":{"post":{"summary":"Review Begleiter","description":"KI-Begleiter (docs/81): erklaert einen Queue-Fall in Klartext bzw.\nbeantwortet eine Frage dazu — ausschliesslich aus den Fall-Daten\n(Grounding), mit dem ausdruecklichen Verbot zu entscheiden.\nBody: {\"id\": \"<uuid>\", \"frage\"?: \"...\"}","operationId":"review_begleiter_v1_review_begleiter_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/stories":{"get":{"summary":"Stories Katalog","description":"Der Story-Katalog: alle User Stories der Engine — WAS fuer WEN\nextrahiert wird, mit Akzeptanzkriterien, Natur (1 = findet sich in einem\nDokument wieder; 2 = kombiniert Werte ueber mehrere Dokumente je Vorgang)\nund ehrlichem Status (produktiv/teilweise/geplant). Sortiert nach\nThemenbloecken. Filter: thema, q (Volltext), status, natur.","operationId":"stories_katalog_v1_stories_get","parameters":[{"name":"thema","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thema"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"natur","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Natur"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoriesAntwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/stories/wunsch":{"post":{"summary":"Stories Wunsch","description":"Story-Wunsch einreichen: WAS fuer WEN fehlt im Katalog?\nBody: {\"persona\": \"...\", \"wunsch\": \"Als ... will ich ..., damit ...\",\n       \"thema\"?: \"...\", \"dokumentart\"?: \"...\", \"kontakt\"?: \"email\"}.\nDer Wunsch geht zur PO-Triage (neu -> in_pruefung -> freigegeben ->\numgesetzt); freigegebene Stories erscheinen im Katalog mit Status.","operationId":"stories_wunsch_v1_stories_wunsch_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tuev/lauf":{"post":{"summary":"Tuev Lauf","description":"Messlauf der produktiven Kette gegen das verifizierte Goldset\n(di_goldset, waechst mit jedem Review-Entscheid). Body: {\"pack\"?}.\nFrische Extraktion je Tender (nur Gold-Felder), Vergleich normalisiert;\nREVIEW/NOT_FOUND zaehlt nie als Treffer. Ergebnis wird persistiert und\nist oeffentlich unter GET /v1/tuev.","operationId":"tuev_lauf_v1_tuev_lauf_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tuev":{"get":{"summary":"Tuev Report","description":"Oeffentlicher Mess-Stand (Aggregat, keine Kundendaten): letzte\nTUEV-Laeufe je Pack + Methodik. Das Gateway reicht diese Route ohne\nKunden-Key durch (Zahlen sind bewusst oeffentlich, docs/53 P3).","operationId":"tuev_report_v1_tuev_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TuevAntwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/review":{"get":{"summary":"Review List","description":"Queue-Eintraege (aeltester zuerst): je Feld Vorschlag, Fundstelle,\nGrund (triage_reason), Pruefquellen und alle Lesungen.","operationId":"review_list_v1_review_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"offen","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/review/claim":{"post":{"summary":"Review Claim","description":"Eintrag uebernehmen. Body: {\"id\": \"<uuid>\", \"bearbeiter\": \"<name>\"}","operationId":"review_claim_v1_review_claim_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/review/entscheid":{"post":{"summary":"Review Entscheid","description":"Entscheiden. Body: {\"id\",\"bearbeiter\",\"entscheidung\":\n\"bestaetigt|korrigiert|nicht_lesbar\", \"korrektur_wert\"?}.\nbestaetigt/korrigiert schreibt automatisch ins Goldset (di_goldset);\nbei 4-Augen-Packs wartet der Eintrag auf Zweitfreigabe durch eine\nANDERE Person (gleicher Endpoint, gleiche id).","operationId":"review_entscheid_v1_review_entscheid_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/review/metrik":{"get":{"summary":"Review Metrik","description":"Durchsatz-Metrik: offen/in_arbeit/erledigt (+heute), Goldset-Groesse.","operationId":"review_metrik_v1_review_metrik_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"BeispielErwartung":{"properties":{"lesequelle":{"type":"string","title":"Lesequelle"},"en16931_format":{"type":"string","title":"En16931 Format"},"skonto":{"type":"string","title":"Skonto"}},"type":"object","required":["lesequelle","en16931_format","skonto"],"title":"BeispielErwartung"},"BeispielRechnung":{"properties":{"filename":{"type":"string","title":"Filename"},"format":{"type":"string","title":"Format"},"content_base64":{"type":"string","title":"Content Base64","description":"Base64 der Muster-XRechnung — direkt als /v1/pruefung-Payload nutzbar"},"hinweis":{"type":"string","title":"Hinweis"},"erwartung":{"$ref":"#/components/schemas/BeispielErwartung","description":"erwartetes Pruefergebnis (Selbstkontrolle)"}},"type":"object","required":["filename","format","content_base64","hinweis","erwartung"],"title":"BeispielRechnung"},"BssVerkehrErgebnis":{"properties":{"tender_ref":{"type":"string","title":"Tender Ref"},"positionen":{"type":"integer","title":"Positionen"},"felder_geschrieben":{"type":"integer","title":"Felder Geschrieben"},"llm_verfuegbar":{"type":"boolean","title":"Llm Verfuegbar"},"duration_s":{"type":"number","title":"Duration S"},"konsens":{"type":"integer","title":"Konsens"},"dissens":{"type":"integer","title":"Dissens"},"nur_pfad_a":{"type":"integer","title":"Nur Pfad A"},"nur_pfad_b":{"type":"integer","title":"Nur Pfad B"},"AUTO":{"type":"integer","title":"Auto","description":"Zahl AUTO-triagierter Felder"},"HITL":{"type":"integer","title":"Hitl","description":"Zahl zur menschlichen Pruefung markierter Felder"}},"type":"object","required":["tender_ref","positionen","felder_geschrieben","llm_verfuegbar","duration_s","konsens","dissens","nur_pfad_a","nur_pfad_b","AUTO","HITL"],"title":"BssVerkehrErgebnis"},"ClassifyErgebnis":{"properties":{"tender_ref":{"type":"string","title":"Tender Ref"},"dokumente":{"type":"integer","title":"Dokumente"},"duration_s":{"type":"number","title":"Duration S"},"typen":{"additionalProperties":{"type":"integer"},"type":"object","title":"Typen","description":"Zahl je erkanntem attachment_type"},"triage":{"additionalProperties":{"type":"integer"},"type":"object","title":"Triage","description":"Zahl je Triage-Stufe (AUTO/HITL)"},"persistiert":{"type":"integer","title":"Persistiert","description":"Zahl der geschriebenen Zeilen (0 wenn persist=false)"},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results","description":"je Dokument: attachment_type, triage, evidenz_zitat/-seite, inhalt_kanal, hinweis"}},"type":"object","required":["tender_ref","dokumente","duration_s","typen","triage","persistiert","results"],"title":"ClassifyErgebnis"},"ExtractErgebnis":{"properties":{"tender_ref":{"type":"string","title":"Tender Ref"},"pack":{"type":"string","title":"Pack"},"documents":{"type":"integer","title":"Documents"},"duration_s":{"type":"number","title":"Duration S"},"triage":{"additionalProperties":{"type":"integer"},"type":"object","title":"Triage","description":"Zahl je Triage-Stufe (AUTO/HITL/NOT_FOUND)"},"sink_goldset":{"additionalProperties":true,"type":"object","title":"Sink Goldset","description":"Status des Goldset-Rueckschreibens"},"review_queue":{"additionalProperties":true,"type":"object","title":"Review Queue","description":"Status der Review-Queue-Einstellung"},"results":{"additionalProperties":true,"type":"object","title":"Results","description":"je angefordertem Feld ein Befund (wert, triage, regel, evidenz)"}},"type":"object","required":["tender_ref","pack","documents","duration_s","triage","sink_goldset","review_queue","results"],"title":"ExtractErgebnis"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Health":{"properties":{"ok":{"type":"boolean","title":"Ok"},"rules_origin":{"type":"string","title":"Rules Origin","description":"Herkunft des aktiven Regelwerks (git/db/fallback)"},"rules_active":{"type":"integer","title":"Rules Active","description":"Anzahl aktiver Format-Regeln"}},"type":"object","required":["ok","rules_origin","rules_active"],"title":"Health"},"JobStatus":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status","description":"angenommen | laeuft | fertig | fehler"},"dokument":{"type":"string","title":"Dokument"},"erstellt_am":{"type":"string","title":"Erstellt Am"},"fertig_am":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fertig Am"},"ergebnis":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ergebnis","description":"nur bei status=fertig — Struktur wie PruefungErgebnis"},"fehler":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fehler","description":"nur bei status=fehler"}},"type":"object","required":["job_id","status","dokument","erstellt_am"],"title":"JobStatus"},"PacksAntwort":{"properties":{"packs":{"items":{"type":"string"},"type":"array","title":"Packs","description":"verfuegbare Extraktions-Packs"}},"type":"object","required":["packs"],"title":"PacksAntwort"},"PruefPunkt":{"properties":{"punkt_id":{"type":"string","title":"Punkt Id"},"feld":{"type":"string","title":"Feld"},"wert":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wert"},"ampel":{"type":"string","title":"Ampel","description":"gruen | gelb | rot"},"regel":{"type":"string","title":"Regel","description":"angewandte Regel-ID"},"rechtsgrundlage":{"type":"string","title":"Rechtsgrundlage","description":"§/Norm-Beleg der Regel"},"zitat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zitat","description":"woertliches Beleg-Zitat aus dem Dokument"}},"type":"object","required":["punkt_id","feld","ampel","regel","rechtsgrundlage"],"title":"PruefPunkt"},"PruefungAngenommen":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"polling_url":{"type":"string","title":"Polling Url"},"hinweis":{"type":"string","title":"Hinweis"}},"type":"object","required":["job_id","status","polling_url","hinweis"],"title":"PruefungAngenommen","description":"202-Antwort im Async-Modus (modus=async)."},"PruefungErgebnis":{"properties":{"dokument":{"type":"string","title":"Dokument"},"dokumentart":{"type":"string","title":"Dokumentart"},"lesequelle":{"type":"string","title":"Lesequelle","description":"z.B. xrechnung_xml, ocr_konsens"},"gesamt_ampel":{"type":"string","title":"Gesamt Ampel","description":"gruen | gelb | rot"},"punkte":{"items":{"$ref":"#/components/schemas/PruefPunkt"},"type":"array","title":"Punkte","description":"belegte Pruefpunkte, je mit Ampel + Rechtsgrundlage"},"erkannte_angaben":{"additionalProperties":true,"type":"object","title":"Erkannte Angaben","description":"strukturierte Rohangaben (z.B. gewerk, verguetung[], fristen[], vob_bezug)"},"ohne_grounding_verworfen":{"type":"integer","title":"Ohne Grounding Verworfen","description":"Zahl der ohne Beleg verworfenen Lesungen"},"duration_s":{"type":"number","title":"Duration S"},"luecken":{"items":{},"type":"array","title":"Luecken","description":"fehlende Pflichtangaben"}},"type":"object","required":["dokument","dokumentart","lesequelle","gesamt_ampel","punkte","erkannte_angaben","ohne_grounding_verworfen","duration_s","luecken"],"title":"PruefungErgebnis"},"Rule":{"properties":{"id":{"type":"string","title":"Id"},"field":{"type":"string","title":"Field"},"severity":{"type":"string","title":"Severity","description":"hard | soft"},"status":{"type":"string","title":"Status"},"description":{"type":"string","title":"Description"},"source":{"type":"string","title":"Source","description":"Belegquelle der Regel"}},"type":"object","required":["id","field","severity","status","description","source"],"title":"Rule"},"RulesAntwort":{"properties":{"origin":{"type":"string","title":"Origin","description":"Herkunft des Regelwerks"},"rules":{"items":{"$ref":"#/components/schemas/Rule"},"type":"array","title":"Rules"}},"type":"object","required":["origin","rules"],"title":"RulesAntwort"},"StoriesAntwort":{"properties":{"begriff":{"type":"string","title":"Begriff"},"themen":{"items":{"$ref":"#/components/schemas/StoryThema"},"type":"array","title":"Themen"},"stories_gesamt":{"type":"integer","title":"Stories Gesamt"},"wunsch":{"$ref":"#/components/schemas/StoriesWunsch","description":"Weg, eine fehlende Story zu wuenschen"}},"type":"object","required":["begriff","themen","stories_gesamt","wunsch"],"title":"StoriesAntwort"},"StoriesWunsch":{"properties":{"hinweis":{"type":"string","title":"Hinweis"},"endpoint":{"type":"string","title":"Endpoint"},"formular":{"type":"string","title":"Formular"}},"type":"object","required":["hinweis","endpoint","formular"],"title":"StoriesWunsch"},"StoryItem":{"properties":{"id":{"type":"string","title":"Id"},"persona":{"type":"string","title":"Persona"},"story":{"type":"string","title":"Story"},"akzeptanzkriterien":{"items":{"type":"string"},"type":"array","title":"Akzeptanzkriterien"},"natur":{"type":"integer","title":"Natur","description":"Reifegrad der Story (1..n)"},"dokumentart":{"type":"string","title":"Dokumentart"},"status":{"type":"string","title":"Status"},"endpoint":{"type":"string","title":"Endpoint","description":"der Endpoint, der diese Story bedient"}},"type":"object","required":["id","persona","story","akzeptanzkriterien","natur","dokumentart","status","endpoint"],"title":"StoryItem"},"StoryThema":{"properties":{"thema":{"type":"string","title":"Thema"},"titel":{"type":"string","title":"Titel"},"stories":{"items":{"$ref":"#/components/schemas/StoryItem"},"type":"array","title":"Stories"}},"type":"object","required":["thema","titel","stories"],"title":"StoryThema"},"TuevAbdeckung":{"properties":{"produkt":{"type":"string","title":"Produkt"},"status":{"type":"string","title":"Status","description":"belegt | offen"},"packs":{"items":{"type":"string"},"type":"array","title":"Packs","description":"Extraktions-Packs als Messgrundlage"},"grund":{"type":"string","title":"Grund","description":"warum belegt/offen — ehrlich, kein Marketing"}},"type":"object","required":["produkt","status","packs","grund"],"title":"TuevAbdeckung"},"TuevAntwort":{"properties":{"methodik":{"$ref":"#/components/schemas/TuevMethodik","description":"ehrliche Lesart der Zahlen (kein Marketing)"},"laeufe":{"items":{"$ref":"#/components/schemas/TuevLauf"},"type":"array","title":"Laeufe"},"abdeckung":{"items":{"$ref":"#/components/schemas/TuevAbdeckung"},"type":"array","title":"Abdeckung","description":"Mess-Stand je Produkt (7 Produkte): belegt nur mit Goldset-Lauf"}},"type":"object","required":["methodik","laeufe","abdeckung"],"title":"TuevAntwort"},"TuevLauf":{"properties":{"created_at":{"type":"string","title":"Created At"},"pack":{"type":"string","title":"Pack"},"kette":{"type":"string","title":"Kette","description":"Lese-/Konsens-Kette"},"n_felder":{"type":"integer","title":"N Felder"},"treffer":{"type":"integer","title":"Treffer"},"quote":{"type":"number","title":"Quote","description":"Praezision der AUTO-Strasse 0..1 (treffer/n_felder)"},"n_gefunden":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Gefunden","description":"Gold-Felder mit richtigem Wert, auch bei HITL (null vor Etappe B)"},"recall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Recall","description":"n_gefunden/n_felder 0..1 (null vor Etappe B)"},"n_auto":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Auto","description":"Gold-Felder mit Triage AUTO (null vor Etappe B)"},"auto_quote":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Auto Quote","description":"n_auto/n_felder 0..1 (null vor Etappe B)"},"dauer_s":{"type":"number","title":"Dauer S"},"hinweis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hinweis"}},"type":"object","required":["created_at","pack","kette","n_felder","treffer","quote","dauer_s"],"title":"TuevLauf"},"TuevMethodik":{"properties":{"grundgesamtheit":{"type":"string","title":"Grundgesamtheit"},"lauf":{"type":"string","title":"Lauf"},"treffer":{"type":"string","title":"Treffer"},"ehrlichkeit":{"type":"string","title":"Ehrlichkeit"},"selektions_bias":{"type":"string","title":"Selektions Bias"},"recall":{"type":"string","title":"Recall","description":"Definition der Recall-Kennzahl (Etappe B)"},"auto_quote":{"type":"string","title":"Auto Quote","description":"Definition der AUTO-Quote (Etappe B)"}},"type":"object","required":["grundgesamtheit","lauf","treffer","ehrlichkeit","selektions_bias","recall","auto_quote"],"title":"TuevMethodik"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VertragsregelErgebnis":{"properties":{"tender_ref":{"type":"string","title":"Tender Ref"},"regeln":{"type":"integer","title":"Regeln"},"llm_verfuegbar":{"type":"boolean","title":"Llm Verfuegbar"},"duration_s":{"type":"number","title":"Duration S"},"dokumente":{"type":"integer","title":"Dokumente"},"kandidat_seiten":{"type":"integer","title":"Kandidat Seiten"},"verkehrsfuehrung":{"type":"integer","title":"Verkehrsfuehrung","description":"Zahl gefundener verkehrsfuehrung-Regeln"},"abrechnung_vorhaltung":{"type":"integer","title":"Abrechnung Vorhaltung","description":"Zahl gefundener abrechnung_vorhaltung-Regeln"}},"type":"object","required":["tender_ref","regeln","llm_verfuegbar","duration_s","dokumente","kandidat_seiten","verkehrsfuehrung","abrechnung_vorhaltung"],"title":"VertragsregelErgebnis"}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"API-Key als Bearer-Token"},"apiKeyQuery":{"type":"apiKey","in":"query","name":"apiKey","description":"API-Key als Query-Parameter (für MCP)"}}},"servers":[{"url":"https://di.api.1885.cloud","description":"kanonisch (api-Namensraum)"},{"url":"https://di.1885.cloud","description":"Alias, bleibt dauerhaft gueltig"}],"security":[{"bearer":[]},{"apiKeyQuery":[]}]}