A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
25 KiB
BreakPilot Backend API Dokumentation
Übersicht
Base URL: http://localhost:8000/api
Alle Endpoints erfordern Authentifizierung via JWT im Authorization-Header:
Authorization: Bearer <token>
Worksheets API
Generiert Lernmaterialien (MC-Tests, Lückentexte, Mindmaps, Quiz).
POST /worksheets/generate/multiple-choice
Generiert Multiple-Choice-Fragen aus Quelltext.
Request Body:
{
"source_text": "Der Text, aus dem Fragen generiert werden sollen...",
"num_questions": 5,
"difficulty": "medium",
"topic": "Thema",
"subject": "Deutsch"
}
Response (200):
{
"success": true,
"content": {
"type": "multiple_choice",
"data": {
"questions": [
{
"question": "Was ist...?",
"options": ["A", "B", "C", "D"],
"correct": 0,
"explanation": "Erklärung..."
}
]
}
}
}
POST /worksheets/generate/cloze
Generiert Lückentexte.
Request Body:
{
"source_text": "Quelltext...",
"num_gaps": 5,
"gap_type": "word",
"hint_type": "first_letter"
}
POST /worksheets/generate/mindmap
Generiert Mindmap als Mermaid-Diagramm.
Request Body:
{
"source_text": "Quelltext...",
"max_branches": 5,
"depth": 2
}
POST /worksheets/generate/quiz
Generiert Mix aus verschiedenen Fragetypen.
Request Body:
{
"source_text": "Quelltext...",
"num_questions": 5,
"include_types": ["mc", "open", "truefalse"]
}
POST /worksheets/generate/batch
Generiert mehrere Inhaltstypen gleichzeitig.
Request Body:
{
"source_text": "Quelltext...",
"types": ["multiple_choice", "cloze", "mindmap"]
}
Corrections API
OCR-basierte Klausurkorrektur mit automatischer Bewertung.
POST /corrections/
Erstellt neue Korrektur-Session.
Request Body:
{
"student_id": "student-123",
"student_name": "Max Mustermann",
"class_name": "10a",
"exam_title": "Klassenarbeit Nr. 3",
"subject": "Mathematik",
"max_points": 100
}
Response (200):
{
"success": true,
"correction": {
"id": "uuid",
"status": "uploaded",
"student_name": "Max Mustermann",
...
}
}
POST /corrections/{id}/upload
Lädt gescannte Klausur hoch und startet OCR im Hintergrund.
Request (multipart/form-data):
file: PDF/PNG/JPG Datei
Response (200):
{
"success": true,
"correction": {
"id": "uuid",
"status": "processing"
}
}
GET /corrections/{id}
Ruft Korrektur-Status ab.
Response (200):
{
"success": true,
"correction": {
"id": "uuid",
"status": "ocr_complete",
"extracted_text": "Erkannter Text...",
"evaluations": [],
...
}
}
Status-Werte:
uploaded- Datei hochgeladenprocessing- OCR läuftocr_complete- OCR fertiganalyzing- Analyse läuftanalyzed- Analyse abgeschlossenreviewing- In Reviewcompleted- Fertigerror- Fehler
POST /corrections/{id}/analyze
Analysiert extrahierten Text und bewertet Antworten.
Request Body (optional):
{
"expected_answers": {
"1": "Musterlösung für Aufgabe 1",
"2": "Musterlösung für Aufgabe 2"
}
}
Response (200):
{
"success": true,
"evaluations": [
{
"question_number": 1,
"extracted_text": "Schülerantwort...",
"points_possible": 10,
"points_awarded": 8,
"feedback": "Gut gelöst...",
"is_correct": true,
"confidence": 0.85
}
],
"total_points": 85,
"percentage": 85.0,
"suggested_grade": "2",
"ai_feedback": "Insgesamt gute Arbeit..."
}
PUT /corrections/{id}
Aktualisiert Korrektur (manuelle Anpassungen).
Request Body:
{
"evaluations": [...],
"total_points": 90,
"grade": "1",
"teacher_notes": "Sehr gute Verbesserung",
"status": "reviewing"
}
POST /corrections/{id}/complete
Markiert Korrektur als abgeschlossen.
GET /corrections/{id}/export-pdf
Exportiert korrigierte Arbeit als PDF.
Response: application/pdf
GET /corrections/class/{class_name}/summary
Klassenübersicht mit Statistiken.
Response (200):
{
"class_name": "10a",
"total_students": 25,
"average_percentage": 72.5,
"average_points": 72.5,
"grade_distribution": {"1": 2, "2": 8, "3": 10, "4": 4, "5": 1},
"corrections": [...]
}
Letters API
Elternbriefe mit GFK-Integration und PDF-Export.
POST /letters/
Erstellt neuen Elternbrief.
Request Body:
{
"recipient_name": "Familie Müller",
"recipient_address": "Musterstr. 1, 12345 Stadt",
"student_name": "Max Müller",
"student_class": "7a",
"subject": "Information zum Leistungsstand",
"content": "Sehr geehrte Eltern...",
"letter_type": "halbjahr",
"tone": "professional",
"teacher_name": "Frau Schmidt",
"teacher_title": "Klassenlehrerin"
}
letter_type Werte:
general- Allgemeine Informationhalbjahr- Halbjahresinformationfehlzeiten- Fehlzeiten-Mitteilungelternabend- Einladung Elternabendlob- Positives Feedbackcustom- Benutzerdefiniert
tone Werte:
formal- Sehr förmlichprofessional- Professionell-freundlichwarm- Warmherzigconcerned- Besorgtappreciative- Wertschätzend
GET /letters/{id}
Lädt gespeicherten Brief.
GET /letters/
Listet alle Briefe (mit Filterung).
Query Parameter:
class_name- Filter nach Klasseletter_type- Filter nach Typstatus- Filter nach Status (draft/sent/archived)page- Seitennummerpage_size- Einträge pro Seite
PUT /letters/{id}
Aktualisiert Brief.
DELETE /letters/{id}
Löscht Brief.
POST /letters/export-pdf
Exportiert Brief als PDF.
Request Body:
{
"letter_id": "uuid"
}
oder
{
"letter_data": { ... }
}
Response: application/pdf
POST /letters/improve
Verbessert Text nach GFK-Prinzipien.
Request Body:
{
"content": "Text zur Verbesserung...",
"communication_type": "general_info",
"tone": "professional"
}
Response (200):
{
"improved_content": "Verbesserter Text...",
"changes": ["Hinweis 1", "Hinweis 2"],
"gfk_score": 0.85,
"gfk_principles_applied": ["Ich-Botschaften", "Offene Fragen"]
}
POST /letters/{id}/send
Versendet Brief per Email.
Request Body:
{
"letter_id": "uuid",
"recipient_email": "eltern@example.com",
"cc_emails": ["schulleitung@example.com"],
"include_pdf": true
}
State Engine API
Begleiter-Modus mit Phasen-Management und Antizipation.
GET /state/context
Ruft Lehrer-Kontext ab.
Query Parameter:
teacher_id(required)
Response (200):
{
"context": {
"teacher_id": "xxx",
"current_phase": "school_year_start",
"completed_milestones": ["consent_accept", "profile_complete"],
"classes": [...],
"stats": {...}
},
"phase_info": {
"name": "Schuljahresbeginn",
"description": "..."
}
}
GET /state/phase
Ruft aktuelle Phase ab.
GET /state/phases
Listet alle verfügbaren Phasen.
Response (200):
{
"phases": [
{"id": "onboarding", "name": "Onboarding", "description": "..."},
{"id": "school_year_start", "name": "Schuljahresbeginn", "description": "..."},
...
]
}
GET /state/suggestions
Ruft Vorschläge für Lehrer ab.
Query Parameter:
teacher_id(required)
Response (200):
{
"suggestions": [
{
"id": "create_first_class",
"title": "Erste Klasse anlegen",
"description": "...",
"priority": "urgent",
"category": "setup",
"action": {"type": "navigate", "target": "/school"}
}
],
"current_phase": "school_year_start",
"priority_counts": {"urgent": 1, "high": 2, "medium": 3}
}
GET /state/suggestions/top
Ruft wichtigsten Vorschlag ab.
GET /state/dashboard
Komplettes Dashboard für Begleiter-Modus.
Response (200):
{
"context": {...},
"suggestions": [...],
"stats": {...},
"progress": {
"milestones_completed": 3,
"milestones_total": 5
},
"phases": [...]
}
POST /state/milestone
Schließt Meilenstein ab.
Request Body:
{
"milestone": "consent_accept"
}
POST /state/transition
Manueller Phasenübergang.
Request Body:
{
"target_phase": "teaching_setup"
}
GET /state/next-phase
Zeigt nächste Phase und Bedingungen.
Schuljahr-Phasen
| Phase | ID | Beschreibung |
|---|---|---|
| Onboarding | onboarding |
Ersteinrichtung |
| Schuljahresbeginn | school_year_start |
Klassen anlegen |
| Unterrichtsvorbereitung | teaching_setup |
Materialien erstellen |
| 1. Leistungsphase | performance_1 |
Tests & Klausuren |
| Halbjahr | semester_end |
Zeugnisse |
| 2. Leistungsphase | performance_2 |
Tests & Klausuren |
| Prüfungsphase | exam_phase |
Abschlussprüfungen |
| Schuljahresende | year_end |
Abschluss |
| Archiviert | archived |
Abgeschlossen |
Klausur-Korrektur API (Abitur)
Abitur-Klausurkorrektur mit 15-Punkte-System, Erst-/Zweitprüfer-Workflow und KI-gestützter Bewertung.
Klausur-Modi
| Modus | Beschreibung |
|---|---|
landes_abitur |
NiBiS Niedersachsen - rechtlich geklärte Aufgaben |
vorabitur |
Lehrer-erstellte Klausuren mit Rights-Gate |
POST /klausur-korrektur/klausuren
Erstellt neue Abitur-Klausur.
Request Body:
{
"title": "Deutsch LK Q4",
"subject": "deutsch",
"modus": "landes_abitur",
"year": 2025,
"semester": "Q4"
}
Response (200):
{
"success": true,
"klausur": {
"id": "uuid",
"title": "Deutsch LK Q4",
"modus": "landes_abitur",
"status": "draft",
...
}
}
GET /klausur-korrektur/klausuren
Listet alle Klausuren.
Query Parameter:
subject- Filter nach Fachyear- Filter nach Jahrstatus- Filter nach Status
GET /klausur-korrektur/klausuren/{id}
Ruft Klausur-Details ab.
PUT /klausur-korrektur/klausuren/{id}
Aktualisiert Klausur.
DELETE /klausur-korrektur/klausuren/{id}
Löscht Klausur.
POST /klausur-korrektur/klausuren/{id}/text-sources
Fügt Text-Quelle hinzu (Vorabitur-Modus).
Request Body:
{
"source_type": "eigentext",
"title": "Kafka - Die Verwandlung",
"author": "Franz Kafka",
"content": "Als Gregor Samsa eines Morgens..."
}
POST /klausur-korrektur/text-sources/{id}/verify
Prüft Text-Quelle mit Rights-Gate.
Response (200):
{
"verified": true,
"license_status": "verified",
"license_info": {
"license": "PD",
"source": "Projekt Gutenberg"
}
}
GET /klausur-korrektur/nibis/aufgaben
Listet verfügbare NiBiS-Aufgaben.
Query Parameter:
fach- Filter nach Fachjahr- Filter nach Jahrniveau- Filter nach Niveau (eA/gA)
POST /klausur-korrektur/klausuren/{id}/erwartungshorizont/generate
Generiert Erwartungshorizont mit KI.
Request Body:
{
"aufgabenstellung": "Analysieren Sie den vorliegenden Text...",
"text_context": "Kafka - Die Verwandlung..."
}
Response (200):
{
"erwartungshorizont": {
"aufgaben": [
{
"nummer": "1",
"operator": "analysieren",
"anforderungsbereich": 2,
"erwartete_leistungen": ["Erkennt den Erzähler", "..."],
"punkte": 30
}
],
"max_points": 100
}
}
PUT /klausur-korrektur/klausuren/{id}/erwartungshorizont
Aktualisiert Erwartungshorizont manuell.
POST /klausur-korrektur/klausuren/{id}/students
Lädt Schülerarbeit hoch.
Request (multipart/form-data):
file: PDF/PNG/JPG Dateistudent_name: Name des Schülers
POST /klausur-korrektur/students/{id}/ocr
Startet OCR für Schülerarbeit.
POST /klausur-korrektur/students/{id}/evaluate
Startet KI-Bewertung.
Response (200):
{
"criteria_scores": {
"rechtschreibung": {"score": 85, "weight": 0.15, "annotations": ["..."]},
"grammatik": {"score": 90, "weight": 0.15, "annotations": ["..."]},
"inhalt": {"score": 75, "weight": 0.40, "annotations": ["..."]},
"struktur": {"score": 80, "weight": 0.15, "annotations": ["..."]},
"stil": {"score": 85, "weight": 0.15, "annotations": ["..."]}
},
"raw_points": 80,
"grade_points": 11,
"grade_label": "2"
}
PUT /klausur-korrektur/students/{id}/criteria
Passt Bewertungskriterien manuell an.
POST /klausur-korrektur/students/{id}/annotations
Fügt Annotation zu Dokument hinzu.
POST /klausur-korrektur/students/{id}/gutachten/generate
Generiert Gutachten mit KI.
Response (200):
{
"gutachten": {
"einleitung": "Die vorliegende Arbeit...",
"hauptteil": "Der Verfasser zeigt...",
"fazit": "Zusammenfassend lässt sich...",
"staerken": ["Gute Argumentation", "..."],
"schwaechen": ["Rechtschreibfehler", "..."]
}
}
PUT /klausur-korrektur/students/{id}/gutachten
Bearbeitet Gutachten manuell.
POST /klausur-korrektur/students/{id}/grade
Berechnet 15-Punkte-Note.
PUT /klausur-korrektur/students/{id}/finalize
Schließt Bewertung ab.
POST /klausur-korrektur/students/{id}/examiner
Weist Erst-/Zweitprüfer zu.
Request Body:
{
"examiner_type": "first",
"examiner_id": "teacher-uuid"
}
GET /klausur-korrektur/examiner/queue
Listet Prüfer-Warteschlange.
GET /klausur-korrektur/klausuren/{id}/fairness
Vergleichsanalyse aller Schüler.
Response (200):
{
"average_score": 75.5,
"median_score": 76,
"standard_deviation": 8.2,
"grade_distribution": {"15": 1, "14": 2, "13": 4, ...},
"outliers": ["student-uuid-1", "student-uuid-2"]
}
POST /klausur-korrektur/klausuren/{id}/export
Exportiert Klausur als PDF.
Request Body:
{
"include_gutachten": true,
"include_annotations": true
}
Response: application/pdf
15-Punkte-Notenschlüssel
| Punkte | Prozent | Note |
|---|---|---|
| 15 | ≥95% | 1+ |
| 14 | ≥90% | 1 |
| 13 | ≥85% | 1- |
| 12 | ≥80% | 2+ |
| 11 | ≥75% | 2 |
| 10 | ≥70% | 2- |
| 9 | ≥65% | 3+ |
| 8 | ≥60% | 3 |
| 7 | ≥55% | 3- |
| 6 | ≥50% | 4+ |
| 5 | ≥45% | 4 |
| 4 | ≥40% | 4- |
| 3 | ≥33% | 5+ |
| 2 | ≥27% | 5 |
| 1 | ≥20% | 5- |
| 0 | <20% | 6 |
Bewertungskriterien
| Kriterium | Gewicht | Beschreibung |
|---|---|---|
rechtschreibung |
15% | Orthografie |
grammatik |
15% | Grammatik & Syntax |
inhalt |
40% | Inhaltliche Qualität |
struktur |
15% | Aufbau & Gliederung |
stil |
15% | Ausdruck & Stil |
Abitur-Docs API (Admin)
Verwaltung von Abitur-Dokumenten (NiBiS Niedersachsen) für RAG-System.
GET /abitur-docs/documents
Listet alle Dokumente.
Query Parameter:
jahr- Filter nach Jahrfach- Filter nach Fachniveau- Filter nach Niveau (eA/gA)status- Filter nach Status (pending/recognized/confirmed/indexed)search- Suche im Dateinamen
Response (200):
{
"documents": [
{
"id": "uuid",
"filename": "2025_Deutsch_eA_I_EWH.pdf",
"status": "confirmed",
"metadata": {
"jahr": 2025,
"bundesland": "niedersachsen",
"fach": "deutsch",
"niveau": "eA",
"dokument_typ": "erwartungshorizont",
"aufgaben_nummer": "I"
},
"recognition_result": {
"confidence": 0.95,
"extracted": {...},
"method": "filename_pattern"
}
}
],
"total": 150
}
GET /abitur-docs/documents/{id}
Ruft Dokument-Details ab.
POST /abitur-docs/documents
Lädt einzelnes Dokument hoch.
Request (multipart/form-data):
file: PDF Datei
Response (200):
{
"success": true,
"document": {
"id": "uuid",
"filename": "...",
"status": "recognized",
"recognition_result": {...}
}
}
POST /abitur-docs/import-zip
Importiert ZIP-Datei mit mehreren Dokumenten.
Request (multipart/form-data):
file: ZIP Datei
Response (200):
{
"success": true,
"imported_count": 45,
"skipped_count": 2,
"errors": ["file.xyz: Unbekanntes Format"]
}
PUT /abitur-docs/documents/{id}/metadata
Aktualisiert Dokument-Metadaten.
Request Body:
{
"jahr": 2025,
"bundesland": "niedersachsen",
"fach": "deutsch",
"niveau": "eA",
"dokument_typ": "erwartungshorizont",
"aufgaben_nummer": "I"
}
POST /abitur-docs/documents/{id}/index
Indexiert Dokument für RAG-System.
DELETE /abitur-docs/documents/{id}
Löscht Dokument.
GET /abitur-docs/documents/{id}/preview
Gibt PDF-Vorschau zurück.
Response: application/pdf
GET /abitur-docs/enums
Listet verfügbare Enum-Werte für Dropdowns.
Response (200):
{
"bundeslaender": [
{"value": "niedersachsen", "label": "Niedersachsen"},
...
],
"faecher": [
{"value": "deutsch", "label": "Deutsch"},
...
],
"niveaus": [
{"value": "eA", "label": "eA - erhöhtes Anforderungsniveau"},
{"value": "gA", "label": "gA - grundlegendes Anforderungsniveau"}
],
"dokumenttypen": [
{"value": "aufgabe", "label": "Aufgabe"},
{"value": "erwartungshorizont", "label": "Erwartungshorizont"},
...
]
}
GET /abitur-docs/search
Sucht Dokumente für Klausur-Korrektur.
Query Parameter:
fach(required) - Fachjahr- Jahrniveau- Niveau
Response (200):
{
"documents": [
{
"id": "uuid",
"filename": "...",
"metadata": {...}
}
]
}
Dokument-Status
| Status | Beschreibung |
|---|---|
pending |
Hochgeladen, nicht erkannt |
recognized |
KI-Erkennung abgeschlossen |
confirmed |
Metadaten bestätigt |
indexed |
Im RAG-System indexiert |
error |
Fehler bei Verarbeitung |
NiBiS Dateinamen-Muster
Automatische Erkennung von:
2025_Deutsch_eA_I.pdf→ Deutsch eA Aufgabe I2025_Deutsch_eA_I_EWH.pdf→ Deutsch eA Erwartungshorizont I2025_Englisch_gA_Hoerverstehen.pdf→ Englisch gA Hörverstehen
Security API (DevSecOps Dashboard)
API fuer das Security Dashboard mit DevSecOps-Tools Integration.
GET /v1/security/tools
Gibt Status aller DevSecOps-Tools zurueck.
Response (200):
[
{
"name": "Gitleaks",
"installed": true,
"version": "v8.18.0",
"last_run": "09.01.2025 12:30",
"last_findings": 0
}
]
GET /v1/security/findings
Gibt alle Security-Findings zurueck.
Query Parameter:
tool(optional): Filter nach Tool (gitleaks, semgrep, bandit, trivy, grype)severity(optional): Filter nach Severity (CRITICAL, HIGH, MEDIUM, LOW, INFO)limit(optional): Max. Anzahl (default: 100)
Response (200):
[
{
"id": "CVE-2023-12345",
"tool": "trivy",
"severity": "HIGH",
"title": "Critical vulnerability in package",
"message": "requests 2.28.0",
"file": "requirements.txt",
"line": null,
"found_at": "2025-01-09T12:30:00"
}
]
GET /v1/security/summary
Gibt Severity-Zusammenfassung zurueck.
Response (200):
{
"critical": 0,
"high": 2,
"medium": 5,
"low": 12,
"info": 3,
"total": 22
}
GET /v1/security/sbom
Gibt SBOM (Software Bill of Materials) zurueck.
Response (200):
{
"components": [
{
"name": "fastapi",
"version": "0.109.0",
"type": "python",
"licenses": [{"license": {"id": "MIT"}}]
}
],
"metadata": {
"timestamp": "2025-01-09T12:30:00"
}
}
GET /v1/security/history
Gibt Scan-Historie zurueck.
Query Parameter:
limit(optional): Max. Anzahl (default: 20)
Response (200):
[
{
"timestamp": "2025-01-09T12:30:00",
"title": "Gitleaks Scan",
"description": "Keine Findings",
"status": "success"
}
]
GET /v1/security/reports/{tool}
Gibt vollstaendigen Report eines Tools zurueck.
Path Parameter:
tool: Tool-Name (gitleaks, semgrep, bandit, trivy, grype)
Response (200): Rohes JSON des Tool-Reports
POST /v1/security/scan/{type}
Startet einen Security-Scan.
Path Parameter:
type: Scan-Typ (secrets, sast, deps, containers, sbom, all)
Response (200):
{
"status": "started",
"scan_type": "all",
"timestamp": "20250109_123000",
"message": "Scan 'all' wurde gestartet"
}
GET /v1/security/health
Health-Check fuer Security API.
Response (200):
{
"status": "healthy",
"tools_installed": 5,
"tools_total": 6,
"reports_dir": "/app/security-reports",
"reports_exist": true
}
Legal Templates API (Admin)
Verwaltung von rechtlichen Textbausteinen für den Dokumentengenerator. Die Templates werden aus Open-Source-Repositories (CC0, MIT, CC BY 4.0) ingestiert und für RAG-basierte Dokumentengenerierung verwendet.
GET /api/v1/admin/templates/status
Gibt den aktuellen Ingestion-Status zurück.
Response (200):
{
"collection_exists": true,
"document_count": 1250,
"sources_count": 13,
"last_ingestion": "2026-02-08T10:30:00Z",
"ingestion_running": false
}
GET /api/v1/admin/templates/sources
Listet alle konfigurierten Template-Quellen.
Response (200):
{
"sources": [
{
"name": "github-site-policy",
"repo_url": "https://github.com/github/site-policy",
"license_type": "cc0",
"license_name": "CC0 1.0 Universal",
"template_types": ["terms_of_service", "privacy_policy"],
"languages": ["en"],
"jurisdiction": "US",
"attribution_required": false,
"document_count": 45
}
],
"total_sources": 13
}
GET /api/v1/admin/templates/licenses
Gibt Lizenz-Statistiken zurück.
Response (200):
{
"licenses": {
"cc0": {
"count": 450,
"attribution_required": false,
"sources": ["github-site-policy", "opr-vc"]
},
"mit": {
"count": 380,
"attribution_required": true,
"sources": ["webflorist-privacy-policy"]
},
"cc_by_4": {
"count": 220,
"attribution_required": true,
"sources": ["common-paper"]
}
},
"total_documents": 1250
}
POST /api/v1/admin/templates/ingest
Startet vollständige Ingestion aller Quellen im Hintergrund.
Response (202):
{
"status": "started",
"message": "Ingestion für 13 Quellen gestartet",
"task_id": "uuid",
"sources_count": 13
}
POST /api/v1/admin/templates/ingest-source
Ingestiert eine einzelne Quelle.
Request Body:
{
"source_name": "github-site-policy"
}
Response (202):
{
"status": "started",
"message": "Ingestion für github-site-policy gestartet",
"source": "github-site-policy"
}
POST /api/v1/admin/templates/search
Semantische Suche in Templates mit Lizenz-Filtern.
Request Body:
{
"query": "Datenschutzerklärung DSGVO konform",
"template_type": "privacy_policy",
"license_types": ["cc0", "mit"],
"language": "de",
"jurisdiction": "DE",
"attribution_required": false,
"limit": 10
}
Response (200):
{
"results": [
{
"id": "uuid",
"text": "Diese Datenschutzerklärung informiert Sie...",
"score": 0.92,
"template_type": "privacy_policy",
"license_id": "cc0",
"license_name": "CC0 1.0 Universal",
"source_name": "opr-vc",
"source_url": "https://opr.vc/docs/dsgvo",
"language": "de",
"jurisdiction": "DE",
"attribution_required": false,
"attribution_text": null,
"placeholders": ["[FIRMENNAME]", "[ADRESSE]"]
}
],
"total": 45
}
DELETE /api/v1/admin/templates/reset
Leert die gesamte Collection. Vorsicht: Alle Templates werden gelöscht!
Response (200):
{
"success": true,
"message": "Collection bp_legal_templates geleert",
"deleted_count": 1250
}
DELETE /api/v1/admin/templates/source/{source_name}
Löscht alle Dokumente einer bestimmten Quelle.
Path Parameter:
source_name: Name der Quelle (z.B. "github-site-policy")
Response (200):
{
"success": true,
"message": "45 Dokumente von github-site-policy gelöscht",
"deleted_count": 45
}
Lizenz-Typen
| Typ | Beschreibung | Attribution |
|---|---|---|
public_domain |
Amtliche Werke (§5 UrhG) | Nein |
cc0 |
CC0 1.0 Universal | Nein (empfohlen) |
unlicense |
Unlicense | Nein |
mit |
MIT License | Ja (im Footer) |
cc_by_4 |
CC BY 4.0 | Ja + Änderungshinweis |
reuse_notice |
EDPB/EDPS Reuse Notice | Ja (keine Sinnentstellung) |
Template-Typen
| Typ | Beschreibung |
|---|---|
privacy_policy |
Datenschutzerklärung |
terms_of_service |
Nutzungsbedingungen |
agb |
Allgemeine Geschäftsbedingungen |
cookie_banner |
Cookie-Banner & Cookie-Policy |
impressum |
Impressum/Legal Notice |
widerruf |
Widerrufsbelehrung |
dpa |
Auftragsverarbeitungsvertrag |
sla |
Service Level Agreement |
nda |
Geheimhaltungsvereinbarung |
clause |
Einzelne Vertragsklausel |
Fehler-Responses
400 Bad Request
{
"detail": "Beschreibung des Fehlers"
}
401 Unauthorized
{
"detail": "Not authenticated"
}
404 Not Found
{
"detail": "Ressource nicht gefunden"
}
500 Internal Server Error
{
"detail": "Interner Serverfehler"
}