-
Notifications
You must be signed in to change notification settings - Fork 0
HTTP_API_REFERENCE
Stand: 10. Dezember 2025
Version: 1.0.1
Kategorie: APIs
Dieses Dokument bietet eine vollständige Referenz aller HTTP-Endpunkte der ThemisDB REST API. Für maschinell lesbare API-Spezifikationen siehe die OpenAPI-Spezifikation.
http://localhost:8765
In Produktionsumgebungen sollte HTTPS verwendet werden.
Die meisten Endpunkte erfordern eine Bearer-Token-Authentifizierung:
Authorization: Bearer <api_key>
API-Keys können über die Key Management API verwaltet werden.
- System & Monitoring
- Entities (CRUD)
- Query & AQL
- Index Management
- Graph Operations
- Vector Search
- Content Management
- Cache (Semantic Cache)
- LLM Integration
- Change Data Capture (CDC)
- Transaction Management
- API Key Management
- PII Operations
- Audit & Compliance
- Classification & Reports
- Error Handling
Health Check des Servers.
Query-Parameter: Keine
Antwort (200 OK):
{
"status": "healthy",
"version": "1.0.1",
"database": "rocksdb",
"uptime_seconds": 3600
}Fehlerbehandlung:
- Bei Ausfall der Datenbank wird Status 503 zurückgegeben
Detaillierte Server- und Datenbankstatistiken.
Query-Parameter: Keine
Antwort (200 OK):
{
"server": {
"uptime_seconds": 3600,
"total_requests": 12345,
"total_errors": 42,
"queries_per_second": 123.45,
"threads": 8
},
"storage": {
"rocksdb": {
"block_cache_usage_bytes": 1048576,
"block_cache_capacity_bytes": 8388608,
"estimate_num_keys": 100000,
"estimate_live_data_size_bytes": 52428800,
"cache_hit_rate_percent": 95.5,
"bytes_written": 104857600,
"bytes_read": 209715200
},
"raw_stats": "..."
}
}Fehlerbehandlung:
-
500 Internal Server Error: Bei Fehler beim Abrufen der Statistiken
Prometheus-Metriken im Text Exposition Format.
Query-Parameter: Keine
Antwort (200 OK):
Content-Type: text/plain
# HELP process_uptime_seconds Process uptime in seconds
# TYPE process_uptime_seconds gauge
process_uptime_seconds 3600
# HELP vccdb_requests_total Total HTTP requests handled
# TYPE vccdb_requests_total counter
vccdb_requests_total 12345
# HELP vccdb_errors_total Total HTTP errors
# TYPE vccdb_errors_total counter
vccdb_errors_total 42
Fehlerbehandlung:
-
500 Internal Server Error: Bei Fehler beim Generieren der Metriken
Liest eine Entity anhand des Primärschlüssels.
Path-Parameter:
-
key(string, required): Primärschlüssel im Formattable:pk(z.B.users:123)
Query-Parameter: Keine
Antwort (200 OK):
{
"key": "users:123",
"blob": "{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"}"
}Fehlerbehandlung:
-
404 Not Found: Entity existiert nicht -
400 Bad Request: Ungültiger Key-Format -
500 Internal Server Error: Datenbankfehler
Erstellt oder aktualisiert eine Entity (Upsert).
Path-Parameter:
-
key(string, required): Primärschlüssel im Formattable:pk
Request Body:
{
"blob": "{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"}"
}Antwort (201 Created):
{
"success": true,
"key": "users:123",
"blob_size": 58
}Fehlerbehandlung:
-
400 Bad Request: Ungültiges Request-Format oder fehlender Blob -
500 Internal Server Error: Datenbankfehler
Löscht eine Entity.
Path-Parameter:
-
key(string, required): Primärschlüssel im Formattable:pk
Query-Parameter: Keine
Antwort (200 OK):
{
"success": true,
"key": "users:123"
}Fehlerbehandlung:
-
400 Bad Request: Ungültiger Key-Format -
500 Internal Server Error: Datenbankfehler
Erstellt eine neue Entity (mit Key im Body oder auto-generiert).
Query-Parameter: Keine
Request Body:
{
"key": "users:124",
"blob": "{\"name\":\"Bob\",\"age\":25}"
}Falls key fehlt, wird automatisch ein UUID generiert.
Antwort (201 Created):
{
"success": true,
"key": "users:124",
"blob_size": 28
}Fehlerbehandlung:
-
400 Bad Request: Ungültiges Request-Format -
500 Internal Server Error: Datenbankfehler
Führt eine Query mit Gleichheits- und Range-Prädikaten aus.
Query-Parameter: Keine
Request Body:
{
"table": "users",
"predicates": [
{ "column": "city", "value": "Berlin" }
],
"range": [
{
"column": "age",
"gte": "25",
"lte": "35",
"includeLower": true,
"includeUpper": true
}
],
"order_by": {
"column": "age",
"desc": false,
"limit": 10
},
"return": "entities",
"optimize": true,
"allow_full_scan": false,
"explain": false
}Antwort (200 OK) - bei return: "keys":
{
"table": "users",
"count": 42,
"keys": ["users:123", "users:456", "..."],
"plan": {
"mode": "index_optimized",
"order": [
{ "column": "city", "value": "Berlin" }
],
"estimates": [
{
"column": "city",
"value": "Berlin",
"estimatedCount": 1000,
"capped": false
}
]
}
}Antwort (200 OK) - bei return: "entities":
{
"table": "users",
"count": 42,
"entities": [
"{\"name\":\"Alice\",\"age\":30,\"city\":\"Berlin\"}",
"{\"name\":\"Bob\",\"age\":28,\"city\":\"Berlin\"}",
"..."
],
"plan": { "..." }
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Query-Syntax oder fehlende erforderliche Felder -
501 Not Implemented: Feature noch nicht implementiert (z.B. Graph/Vector-Platzhalter) -
500 Internal Server Error: Query-Ausführungsfehler
Führt eine AQL-Query aus (Advanced Query Language).
Query-Parameter: Keine
Request Body:
{
"query": "FOR user IN users FILTER user.city == \"Berlin\" SORT user.age ASC LIMIT 10 RETURN user",
"optimize": true,
"allow_full_scan": false,
"explain": false,
"use_cursor": false,
"cursor": null
}Antwort (200 OK) - Standard:
{
"table": "users",
"count": 10,
"entities": [
"{\"name\":\"Alice\",\"age\":25,\"city\":\"Berlin\"}",
"..."
],
"plan": {
"mode": "index_optimized",
"let_pre_extracted": false
},
"query": "FOR user IN users FILTER user.city == \"Berlin\" SORT user.age ASC LIMIT 10 RETURN user"
}Antwort (200 OK) - mit Cursor:
{
"items": ["...", "..."],
"batch_size": 10,
"has_more": true,
"next_cursor": "eyJvZmZzZXQiOjEwfQ==",
"plan": { "..." }
}Fehlerbehandlung:
-
400 Bad Request: Ungültige AQL-Syntax -
500 Internal Server Error: Query-Ausführungsfehler
AQL-Features:
-
FOR ... IN collection: Iteration über Collection -
FILTER condition: Filterung -
SORT field ASC|DESC: Sortierung -
LIMIT n: Limitierung -
RETURN expression: Rückgabe -
LET var = expression: Variable definieren - Einfache Equality-Joins über zwei
FOR-Klauseln
Erstellt einen Sekundärindex.
Query-Parameter: Keine
Request Body:
{
"table": "users",
"column": "email",
"type": "equality",
"unique": true
}Index-Typen:
-
equality: Gleichheitsfilter (Standard) -
range: Range-Prädikate und ORDER BY -
fulltext: Volltextsuche mit BM25
Fulltext-Konfiguration (optional):
{
"table": "docs",
"column": "text",
"type": "fulltext",
"config": {
"stemming_enabled": true,
"language": "de",
"stopwords_enabled": true,
"normalize_umlauts": true,
"stopwords": ["foo", "bar"]
}
}Antwort (200 OK):
{
"success": true,
"table": "users",
"column": "email"
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter oder Index existiert bereits -
500 Internal Server Error: Index-Erstellungsfehler
Löscht einen Sekundärindex.
Query-Parameter: Keine
Request Body:
{
"table": "users",
"column": "email",
"type": "equality"
}Antwort (200 OK):
{
"success": true,
"table": "users",
"column": "email"
}Fehlerbehandlung:
-
400 Bad Request: Index existiert nicht -
500 Internal Server Error: Fehler beim Löschen
Führt eine BFS-Traversierung im Graph aus.
Query-Parameter: Keine
Request Body:
{
"start_vertex": "user1",
"max_depth": 3
}Antwort (200 OK):
{
"start_vertex": "user1",
"max_depth": 3,
"visited_count": 15,
"visited": ["user1", "user2", "user3", "..."]
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
500 Internal Server Error: Traversierungsfehler
Hinweis: Graph-Kanten müssen als Entities mit Feldern id, _from, _to gespeichert sein.
Führt eine k-NN Vektorsuche aus.
Query-Parameter: Keine
Request Body:
{
"vector": [0.1, 0.2, 0.3, 0.4],
"k": 10,
"use_cursor": false,
"cursor": null
}Antwort (200 OK) - Legacy-Format:
{
"results": [
{ "pk": "doc1", "distance": 0.234 },
{ "pk": "doc2", "distance": 0.456 }
],
"k": 10,
"count": 10
}Antwort (200 OK) - mit Cursor:
{
"items": [
{ "pk": "doc1", "distance": 0.234 }
],
"batch_size": 10,
"has_more": true,
"next_cursor": "eyJvZmZzZXQiOjEwfQ=="
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Vektor-Dimension oder Parameter -
500 Internal Server Error: Such-Fehler
Fügt mehrere Vektoren im Batch ein.
Query-Parameter: Keine
Request Body:
{
"vector_field": "embedding",
"items": [
{
"pk": "doc1",
"vector": [0.1, 0.2, 0.3],
"fields": { "title": "Document 1" }
},
{
"pk": "doc2",
"vector": [0.4, 0.5, 0.6],
"fields": { "title": "Document 2" }
}
]
}Antwort (200 OK):
{
"inserted": 2,
"errors": 0,
"objectName": "vector_index",
"dimension": 3
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Vektor-Dimension -
500 Internal Server Error: Einfügefehler
Löscht Vektoren basierend auf Filter (PKs oder Prefix).
Query-Parameter: Keine
Request Body (per PKs):
{
"pks": ["doc1", "doc2", "doc3"]
}Request Body (per Prefix):
{
"prefix": "doc:"
}Antwort (200 OK):
{
"deleted": 42,
"method": "pks",
"prefix": null
}Fehlerbehandlung:
-
400 Bad Request: Wederpksnochprefixangegeben -
500 Internal Server Error: Löschfehler
Gibt die aktuelle Vektorindex-Konfiguration zurück.
Query-Parameter: Keine
Antwort (200 OK):
{
"objectName": "vector_index",
"dimension": 768,
"metric": "COSINE",
"efSearch": 64,
"M": 16,
"efConstruction": 200,
"hnswEnabled": true
}Fehlerbehandlung:
-
500 Internal Server Error: Fehler beim Abrufen der Konfiguration
Aktualisiert die Vektorindex-Konfiguration.
Query-Parameter: Keine
Request Body:
{
"efSearch": 128
}Antwort (200 OK):
{
"message": "Configuration updated",
"updated_fields": {
"efSearch": 128
}
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Werte (efSearch muss 1-10000 sein) -
500 Internal Server Error: Aktualisierungsfehler
Gibt Statistiken zum Vektorindex zurück.
Query-Parameter: Keine
Antwort (200 OK):
{
"objectName": "vector_index",
"dimension": 768,
"metric": "COSINE",
"efSearch": 64,
"M": 16,
"efConstruction": 200,
"hnswEnabled": true,
"vectorCount": 100000
}Fehlerbehandlung:
-
500 Internal Server Error: Fehler beim Abrufen der Statistiken
Importiert Content (v0 Bulk).
Query-Parameter: Keine
Request Body:
{
"content": {
"id": "doc123",
"mime_type": "application/pdf",
"category": 0,
"original_filename": "document.pdf",
"size_bytes": 1024000
},
"chunks": [
{
"id": "chunk1",
"content_id": "doc123",
"seq_num": 0,
"text": "Sample text...",
"embedding": [0.1, 0.2, 0.3]
}
],
"blob": "base64_encoded_content"
}Antwort (200 OK):
{
"status": "ok",
"content_id": "doc123"
}Fehlerbehandlung:
-
400 Bad Request: Ungültiges Request-Format -
500 Internal Server Error: Import-Fehler
Liest Content-Metadaten.
Path-Parameter:
-
id(string, required): Content-ID
Query-Parameter: Keine
Antwort (200 OK):
{
"id": "doc123",
"mime_type": "application/pdf",
"category": 0,
"original_filename": "document.pdf",
"size_bytes": 1024000,
"created_at": 1702400000000,
"hash_sha256": "abc123...",
"chunk_count": 10
}Fehlerbehandlung:
-
404 Not Found: Content existiert nicht -
500 Internal Server Error: Fehler beim Abrufen
Listet alle Chunks eines Contents auf.
Path-Parameter:
-
id(string, required): Content-ID
Query-Parameter: Keine
Antwort (200 OK):
{
"count": 10,
"chunks": [
{
"id": "chunk1",
"content_id": "doc123",
"seq_num": 0,
"text": "Sample text...",
"embedding": [0.1, 0.2, 0.3]
}
]
}Fehlerbehandlung:
-
404 Not Found: Content existiert nicht -
500 Internal Server Error: Fehler beim Abrufen
Gibt den Original-Blob eines Contents zurück.
Path-Parameter:
-
id(string, required): Content-ID
Query-Parameter: Keine
Antwort (200 OK):
Content-Type: application/pdf (aus Metadaten)
[Binary Content]
Fehlerbehandlung:
-
404 Not Found: Content existiert nicht -
500 Internal Server Error: Fehler beim Abrufen
Führt eine semantische Cache-Abfrage aus.
Query-Parameter: Keine
Request Body:
{
"key": "rag:question:hash123",
"top_k": 1
}Oder mit Embedding:
{
"prompt": "Wie skaliere ich HNSW efSearch?",
"embedding": [0.01, 0.12, 0.0],
"top_k": 3
}Antwort (200 OK) - Treffer:
{
"hit": true,
"hits": [
{
"key": "rag:question:hash123",
"value": { "answer": "Nutze ef_search 64–128 für Latenz/Qualität." },
"score": 0.95,
"metadata": { "model": "gpt-4o" }
}
]
}Antwort (200 OK) - Kein Treffer:
{
"hit": false,
"hits": []
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
500 Internal Server Error: Cache-Fehler
Speichert einen Eintrag im Semantic Cache.
Query-Parameter: Keine
Request Body:
{
"key": "rag:question:hash123",
"value": { "answer": "Nutze ef_search 64–128 für Latenz/Qualität." },
"embedding": [0.01, 0.12, 0.0],
"ttl_sec": 3600,
"metadata": { "model": "gpt-4o", "topic": "vecsearch" }
}Antwort (200 OK):
{
"success": true,
"key": "rag:question:hash123",
"expires_at": "2025-12-10T19:00:00Z"
}Fehlerbehandlung:
-
400 Bad Request: Fehlende erforderliche Felder -
500 Internal Server Error: Speicherfehler
Gibt Cache-Statistiken zurück.
Query-Parameter: Keine
Antwort (200 OK):
{
"entries": 10000,
"hit_ratio_1m": 0.85,
"hit_ratio_1h": 0.78,
"evictions_total": 42,
"bytes": 1048576
}Fehlerbehandlung:
-
500 Internal Server Error: Fehler beim Abrufen der Statistiken
Speichert eine LLM-Interaktion.
Query-Parameter: Keine
Request Body:
{
"model": "gpt-4o",
"messages": [
{ "role": "user", "content": "Erkläre MVCC kurz" },
{ "role": "assistant", "content": "MVCC erlaubt paralleles Lesen/Schreiben..." }
],
"reasoning_steps": [
{
"type": "chain_of_thought",
"content": ["MVCC erlaubt paralleles Lesen/Schreiben", "Versionen pro Tx"]
}
],
"metadata": { "session_id": "abc" }
}Antwort (201 Created):
{
"id": "interaction123",
"success": true
}Fehlerbehandlung:
-
400 Bad Request: Ungültiges Request-Format -
500 Internal Server Error: Speicherfehler
Listet LLM-Interaktionen auf.
Query-Parameter:
-
limit(integer, optional): Max. Anzahl (Standard: 50) -
after(string, optional): Cursor/ID für Pagination
Antwort (200 OK):
{
"items": [
{
"id": "interaction123",
"created_at": "2025-12-10T18:00:00Z",
"model": "gpt-4o",
"messages": [...],
"reasoning_steps": [...],
"metadata": {}
}
],
"next": "interaction124"
}Fehlerbehandlung:
-
500 Internal Server Error: Fehler beim Abrufen
Liest eine spezifische LLM-Interaktion.
Path-Parameter:
-
id(string, required): Interaktions-ID
Query-Parameter: Keine
Antwort (200 OK):
{
"id": "interaction123",
"created_at": "2025-12-10T18:00:00Z",
"model": "gpt-4o",
"messages": [...],
"reasoning_steps": [...],
"metadata": {}
}Fehlerbehandlung:
-
404 Not Found: Interaktion existiert nicht -
500 Internal Server Error: Fehler beim Abrufen
Liefert Änderungen ab einer Sequenznummer (Long-Polling).
Query-Parameter:
-
from_seq(integer, required): Start-Sequenznummer (exklusiv) -
limit(integer, optional): Max. Anzahl (Standard: 100) -
long_poll_ms(integer, optional): Long-Polling-Timeout in ms (Standard: 0, max: 60000)
Antwort (200 OK):
{
"from_seq": 100,
"next_seq": 150,
"entries": [
{
"seq": 101,
"ts": "2025-12-10T18:00:00Z",
"op": "put",
"key": "users:123",
"table": "users",
"value": { "name": "Alice" },
"prev": null,
"txn_id": "tx123"
}
]
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
500 Internal Server Error: CDC-Fehler
Streamt Änderungen in Server-Sent Events (SSE) Format.
Query-Parameter:
-
from_seq(integer, optional): Start-Sequenznummer (Standard: 0) -
key_prefix(string, optional): Filtert Events nach Key-Präfix -
keep_alive(boolean, optional): Verbindung offen halten (Standard: true) -
max_seconds(integer, optional): Max. Stream-Dauer 1-60s (Standard: 30) -
heartbeat_ms(integer, optional): Heartbeat-Intervall (min: 100ms, nur für Tests)
Antwort (200 OK):
Content-Type: text/event-stream
data: {"operation":"PUT","key":"doc:1","sequence":42,"old_val":null,"new_val":"{\"x\":1}"}
data: {"operation":"DELETE","key":"doc:2","sequence":43,"old_val":"{\"y\":2}","new_val":null}
: heartbeat
Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
500 Internal Server Error: Streaming-Fehler
Hinweis: Dieser Endpoint ist nicht Teil der OpenAPI-Spezifikation, da er text/event-stream zurückliefert.
Startet eine neue Transaktion.
Query-Parameter: Keine
Request Body:
{
"isolation": "snapshot"
}Isolation Levels:
-
read_committed(Standard) snapshot
Antwort (200 OK):
{
"transaction_id": 42,
"isolation": "snapshot",
"status": "begun"
}Fehlerbehandlung:
-
500 Internal Server Error: Fehler beim Starten
Committet eine Transaktion.
Query-Parameter: Keine
Request Body:
{
"transaction_id": 42
}Antwort (200 OK):
{
"transaction_id": 42,
"status": "committed",
"message": "Transaction committed successfully"
}Fehlerbehandlung:
-
400 Bad Request: Transaktion nicht gefunden oder bereits abgeschlossen -
500 Internal Server Error: Commit fehlgeschlagen (automatisch rollback)
Rollt eine Transaktion zurück.
Query-Parameter: Keine
Request Body:
{
"transaction_id": 42
}Antwort (200 OK):
{
"transaction_id": 42,
"status": "rolled_back",
"message": "Transaction rolled back successfully"
}Fehlerbehandlung:
-
400 Bad Request: Transaktion nicht gefunden -
500 Internal Server Error: Rollback-Fehler
Gibt Transaktionsstatistiken zurück.
Query-Parameter: Keine
Antwort (200 OK):
{
"total_begun": 1523,
"total_committed": 1401,
"total_aborted": 122,
"active_count": 3,
"avg_duration_ms": 45,
"max_duration_ms": 523,
"success_rate": 0.92
}Fehlerbehandlung:
-
500 Internal Server Error: Fehler beim Abrufen der Statistiken
Erstellt einen neuen API-Key.
Query-Parameter: Keine
Authentifizierung: Erforderlich (admin-Berechtigung)
Request Body:
{
"name": "Analytics Service Key",
"permissions": ["audit:read", "stats:read"],
"expires_in_days": 90,
"metadata": {
"service": "internal-admin",
"environment": "production"
}
}Antwort (201 Created):
{
"keyId": "key123",
"secret": "sk_live_abc123...",
"name": "Analytics Service Key",
"permissions": ["audit:read", "stats:read"],
"created_at": "2025-12-10T18:00:00Z",
"expires_at": "2026-03-10T18:00:00Z"
}Hinweis: Der secret wird nur einmal zurückgegeben!
Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine admin-Berechtigung -
500 Internal Server Error: Fehler beim Erstellen
Listet alle API-Keys auf.
Query-Parameter:
-
include_revoked(boolean, optional): Auch widerrufene Keys anzeigen (Standard: false) -
page(integer, optional): Seitennummer (Standard: 1) -
page_size(integer, optional): Einträge pro Seite (Standard: 50, max: 100)
Authentifizierung: Erforderlich (admin-Berechtigung)
Antwort (200 OK):
{
"keys": [
{
"keyId": "key123",
"name": "Analytics Service Key",
"permissions": ["audit:read", "stats:read"],
"created_at": "2025-12-10T18:00:00Z",
"expires_at": "2026-03-10T18:00:00Z",
"last_used_at": "2025-12-10T19:00:00Z",
"revoked": false,
"revoked_at": null
}
],
"total": 42,
"page": 1,
"page_size": 50
}Fehlerbehandlung:
-
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine admin-Berechtigung -
500 Internal Server Error: Fehler beim Abrufen
Gibt Details zu einem spezifischen API-Key zurück.
Path-Parameter:
-
keyId(string, required): Key-ID
Query-Parameter: Keine
Authentifizierung: Erforderlich (admin-Berechtigung)
Antwort (200 OK):
{
"keyId": "key123",
"name": "Analytics Service Key",
"permissions": ["audit:read", "stats:read"],
"created_at": "2025-12-10T18:00:00Z",
"expires_at": "2026-03-10T18:00:00Z",
"last_used_at": "2025-12-10T19:00:00Z",
"revoked": false,
"revoked_at": null,
"metadata": {
"service": "internal-admin"
}
}Fehlerbehandlung:
-
404 Not Found: Key existiert nicht -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine admin-Berechtigung -
500 Internal Server Error: Fehler beim Abrufen
Aktualisiert einen API-Key (Name, Permissions, Metadata).
Path-Parameter:
-
keyId(string, required): Key-ID
Query-Parameter: Keine
Authentifizierung: Erforderlich (admin-Berechtigung)
Request Body:
{
"name": "Updated Analytics Key",
"permissions": ["audit:read", "stats:read", "reports:read"],
"metadata": {
"service": "internal-admin",
"updated": true
}
}Antwort (200 OK):
{
"keyId": "key123",
"name": "Updated Analytics Key",
"permissions": ["audit:read", "stats:read", "reports:read"],
"created_at": "2025-12-10T18:00:00Z",
"expires_at": "2026-03-10T18:00:00Z",
"revoked": false,
"metadata": {
"service": "internal-admin",
"updated": true
}
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
404 Not Found: Key existiert nicht -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine admin-Berechtigung -
500 Internal Server Error: Fehler beim Aktualisieren
Widerruft einen API-Key permanent.
Path-Parameter:
-
keyId(string, required): Key-ID
Query-Parameter: Keine
Authentifizierung: Erforderlich (admin-Berechtigung)
Antwort (200 OK):
{
"success": true,
"keyId": "key123",
"revoked_at": "2025-12-10T20:00:00Z"
}Fehlerbehandlung:
-
404 Not Found: Key existiert nicht -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine admin-Berechtigung -
500 Internal Server Error: Fehler beim Widerrufen
Gibt den Originalwert zu einer pseudonymisierten UUID zurück.
Path-Parameter:
-
uuid(string, required): PII-UUID
Query-Parameter: Keine
Authentifizierung: Erforderlich
Antwort (200 OK):
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"value": "max.mustermann@example.com"
}Fehlerbehandlung:
-
404 Not Found: UUID existiert nicht -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine Berechtigung -
500 Internal Server Error: Fehler beim Abrufen
Löscht PII-Daten (soft oder hard delete).
Path-Parameter:
-
uuid(string, required): PII-UUID
Query-Parameter:
-
mode(string, optional):softoderhard(Standard:soft)
Authentifizierung: Erforderlich
Antwort (200 OK) - Soft Delete:
{
"status": "ok",
"mode": "soft",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"updated": true
}Antwort (200 OK) - Hard Delete:
{
"status": "ok",
"mode": "hard",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"deleted": true
}Fehlerbehandlung:
-
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine Berechtigung -
500 Internal Server Error: Fehler beim Löschen
Fragt Audit-Logs ab.
Query-Parameter:
-
start(string, optional): Start-Zeitpunkt (ms seit Epoch oder ISO 8601) -
end(string, optional): End-Zeitpunkt (ms seit Epoch oder ISO 8601) -
user(string, optional): Filter nach Benutzer -
action(string, optional): Filter nach Aktion -
entity_type(string, optional): Filter nach Entity-Typ -
entity_id(string, optional): Filter nach Entity-ID -
success(boolean, optional): Nur erfolgreiche Einträge (Standard: false) -
page(integer, optional): Seitennummer (Standard: 1) -
page_size(integer, optional): Einträge pro Seite (Standard: 100, max: 1000)
Authentifizierung: Erforderlich (audit:read)
Antwort (200 OK):
{
"entries": [
{
"id": 1,
"timestamp": "2025-12-10T18:00:00Z",
"user": "admin",
"action": "CREATE_KEY",
"entityType": "api_key",
"entityId": "key123",
"oldValue": null,
"newValue": "{\"name\":\"Analytics Key\"}",
"success": true,
"ipAddress": "192.168.1.1",
"sessionId": "session123",
"errorMessage": null
}
],
"totalCount": 1000,
"page": 1,
"pageSize": 100,
"hasMore": true
}Fehlerbehandlung:
-
429 Too Many Requests: Rate-Limit erreicht (Header:Retry-After,X-RateLimit-Limit,X-RateLimit-Remaining) -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine audit:read-Berechtigung -
500 Internal Server Error: Fehler beim Abrufen
Exportiert Audit-Logs als CSV.
Query-Parameter:
- Gleiche wie
/api/audit -
page_sizemax: 10000 (für Export)
Authentifizierung: Erforderlich (audit:read)
Antwort (200 OK):
Content-Type: text/csv
id,timestamp,user,action,entityType,entityId,success
1,2025-12-10T18:00:00Z,admin,CREATE_KEY,api_key,key123,true
...
Fehlerbehandlung:
- Gleich wie
/api/audit
Klassifiziert Text auf personenbezogene Daten (PII).
Query-Parameter: Keine
Authentifizierung: Erforderlich (classify:read)
Request Body:
{
"text": "Kontakt: Max Mustermann, max@example.com, +49 123 456789",
"include_positions": true
}Antwort (200 OK):
{
"contains_pii": true,
"matches": [
{
"category": "name",
"value": "Max Mustermann",
"confidence": 0.95,
"start_pos": 9,
"end_pos": 23
},
{
"category": "email",
"value": "max@example.com",
"confidence": 1.0,
"start_pos": 25,
"end_pos": 40
},
{
"category": "phone",
"value": "+49 123 456789",
"confidence": 0.98,
"start_pos": 42,
"end_pos": 56
}
],
"summary": {
"total_matches": 3,
"categories_found": ["name", "email", "phone"],
"risk_level": "high"
}
}Erkannte Kategorien:
-
email: E-Mail-Adressen -
phone: Telefonnummern -
iban: IBAN -
credit_card: Kreditkartennummern -
name: Namen (DE/EN) -
address: Adressen (DE/EN)
Fehlerbehandlung:
-
400 Bad Request: Ungültiges Request-Format -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine classify:read-Berechtigung -
500 Internal Server Error: Klassifizierungsfehler
Gibt die aktuellen Klassifizierungs-Regeln zurück.
Query-Parameter: Keine
Authentifizierung: Erforderlich (classify:read)
Antwort (200 OK):
{
"rules": [
{
"category": "email",
"pattern": "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}",
"enabled": true,
"confidence": 1.0
}
],
"nlp_enabled": true,
"nlp_model": "de_core_news_sm",
"supported_languages": ["de", "en"]
}Fehlerbehandlung:
-
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine classify:read-Berechtigung -
500 Internal Server Error: Fehler beim Abrufen
Generiert einen aggregierten Audit-Report.
Query-Parameter:
-
start(string, optional): Start-Zeitpunkt (ISO 8601 oder Epoch ms) -
end(string, optional): End-Zeitpunkt (ISO 8601 oder Epoch ms) -
format(string, optional):json,csvoderpdf(Standard:json) -
group_by(string, optional):user,action,entity_type,hour,day(Standard:action)
Authentifizierung: Erforderlich (audit:read, reports:read)
Antwort (200 OK):
{
"period": {
"start": "2025-12-01T00:00:00Z",
"end": "2025-12-10T23:59:59Z"
},
"summary": {
"total_events": 10000,
"successful_events": 9500,
"failed_events": 500,
"success_rate": 0.95,
"unique_users": 42,
"unique_entities": 1234
},
"top_actions": [
{
"action": "QUERY",
"count": 5000,
"success_rate": 0.98
}
],
"top_users": [
{
"user": "admin",
"action_count": 1000,
"failed_count": 10
}
],
"timeline": [
{
"timestamp": "2025-12-01T00:00:00Z",
"event_count": 100
}
]
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Fehlende Berechtigungen -
500 Internal Server Error: Report-Generierungsfehler
Generiert einen Compliance-Report (DSGVO/Datenschutz).
Query-Parameter:
-
start(string, optional): Start-Zeitpunkt -
end(string, optional): End-Zeitpunkt -
format(string, optional):jsonoderpdf(Standard:json)
Authentifizierung: Erforderlich (reports:read, audit:read)
Antwort (200 OK):
{
"period": {
"start": "2025-12-01T00:00:00Z",
"end": "2025-12-10T23:59:59Z"
},
"pii_processing": {
"total_pii_records": 50000,
"pii_access_events": 1000,
"pii_deletion_events": 42,
"pseudonymization_active": true,
"encryption_enabled": true
},
"retention": {
"policies_active": 5,
"auto_deletion_enabled": true,
"records_deleted_in_period": 500
},
"security": {
"failed_auth_attempts": 10,
"unauthorized_access_attempts": 5,
"data_breaches_detected": 0
},
"data_subject_rights": {
"access_requests": 15,
"deletion_requests": 8,
"rectification_requests": 3,
"portability_requests": 2
},
"compliance_score": 92.5
}Fehlerbehandlung:
-
400 Bad Request: Ungültige Parameter -
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Fehlende Berechtigungen -
500 Internal Server Error: Report-Generierungsfehler
Gibt den Status der Retention Policies zurück.
Query-Parameter:
-
include_stats(boolean, optional): Detaillierte Statistiken (Standard: true)
Authentifizierung: Erforderlich (reports:read)
Antwort (200 OK):
{
"policies": [
{
"collection": "audit_logs",
"retention_days": 365,
"auto_deletion_enabled": true,
"last_cleanup": "2025-12-10T02:00:00Z",
"records_total": 1000000,
"records_expired": 5000,
"oldest_record_age_days": 400
}
],
"summary": {
"total_collections": 10,
"collections_with_policy": 5,
"total_expired_records": 10000,
"auto_deletion_active": true,
"last_global_cleanup": "2025-12-10T02:00:00Z"
}
}Fehlerbehandlung:
-
401 Unauthorized: Nicht authentifiziert -
403 Forbidden: Keine reports:read-Berechtigung -
500 Internal Server Error: Fehler beim Abrufen
Alle Fehler folgen diesem Format:
{
"error": true,
"message": "Beschreibung des Fehlers",
"status_code": 400
}| Code | Bedeutung | Verwendung |
|---|---|---|
200 OK |
Erfolg | Erfolgreiche GET/PUT/DELETE Requests |
201 Created |
Erstellt | Erfolgreiche POST Requests (Ressource erstellt) |
400 Bad Request |
Ungültige Anfrage | Ungültige Parameter oder Request-Format |
401 Unauthorized |
Nicht authentifiziert | Fehlende oder ungültige Authentifizierung |
403 Forbidden |
Verboten | Fehlende Berechtigung für die Aktion |
404 Not Found |
Nicht gefunden | Ressource existiert nicht |
429 Too Many Requests |
Rate-Limit | Zu viele Anfragen (siehe Header) |
500 Internal Server Error |
Server-Fehler | Interner Fehler bei Verarbeitung |
501 Not Implemented |
Nicht implementiert | Feature noch nicht verfügbar |
Bei Rate-Limit-Überschreitung (429) werden zusätzliche Header gesendet:
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
Response:
{
"error": true,
"message": "Rate limit exceeded",
"status_code": 429
}Übersicht der verfügbaren Berechtigungen:
-
admin: Volle Administrative Rechte -
audit:read: Audit-Logs lesen -
stats:read: Statistiken abrufen -
query:execute: Queries ausführen -
classify:read: PII-Klassifizierung -
reports:read: Reports generieren -
*: Alle Berechtigungen (nur für Admin-Keys)
- OpenAPI-Spezifikation - Vollständige maschinell lesbare API-Spec
- AQL Dokumentation - Query Language Referenz
- Server Module - HTTP Server Implementierung
- Authentication Guide - Authentifizierung & Autorisierung
Version: 1.0.1
Letzte Aktualisierung: 10. Dezember 2025
Lizenz: Siehe LICENSE
ThemisDB v1.3.4 | GitHub | Documentation | Discussions | License
Last synced: January 02, 2026 | Commit: 6add659
Version: 1.3.0 | Stand: Dezember 2025
- Übersicht
- Home
- Dokumentations-Index
- Quick Reference
- Sachstandsbericht 2025
- Features
- Roadmap
- Ecosystem Overview
- Strategische Übersicht
- Geo/Relational Storage
- RocksDB Storage
- MVCC Design
- Transaktionen
- Time-Series
- Memory Tuning
- Chain of Thought Storage
- Query Engine & AQL
- AQL Syntax
- Explain & Profile
- Rekursive Pfadabfragen
- Temporale Graphen
- Zeitbereichs-Abfragen
- Semantischer Cache
- Hybrid Queries (Phase 1.5)
- AQL Hybrid Queries
- Hybrid Queries README
- Hybrid Query Benchmarks
- Subquery Quick Reference
- Subquery Implementation
- Content Pipeline
- Architektur-Details
- Ingestion
- JSON Ingestion Spec
- Enterprise Ingestion Interface
- Geo-Processor Design
- Image-Processor Design
- Hybrid Search Design
- Fulltext API
- Hybrid Fusion API
- Stemming
- Performance Tuning
- Migration Guide
- Future Work
- Pagination Benchmarks
- Enterprise README
- Scalability Features
- HTTP Client Pool
- Build Guide
- Implementation Status
- Final Report
- Integration Analysis
- Enterprise Strategy
- Verschlüsselungsstrategie
- Verschlüsselungsdeployment
- Spaltenverschlüsselung
- Encryption Next Steps
- Multi-Party Encryption
- Key Rotation Strategy
- Security Encryption Gap Analysis
- Audit Logging
- Audit & Retention
- Compliance Audit
- Compliance
- Extended Compliance Features
- Governance-Strategie
- Compliance-Integration
- Governance Usage
- Security/Compliance Review
- Threat Model
- Security Hardening Guide
- Security Audit Checklist
- Security Audit Report
- Security Implementation
- Development README
- Code Quality Pipeline
- Developers Guide
- Cost Models
- Todo Liste
- Tool Todo
- Core Feature Todo
- Priorities
- Implementation Status
- Roadmap
- Future Work
- Next Steps Analysis
- AQL LET Implementation
- Development Audit
- Sprint Summary (2025-11-17)
- WAL Archiving
- Search Gap Analysis
- Source Documentation Plan
- Changefeed README
- Changefeed CMake Patch
- Changefeed OpenAPI
- Changefeed OpenAPI Auth
- Changefeed SSE Examples
- Changefeed Test Harness
- Changefeed Tests
- Dokumentations-Inventar
- Documentation Summary
- Documentation TODO
- Documentation Gap Analysis
- Documentation Consolidation
- Documentation Final Status
- Documentation Phase 3
- Documentation Cleanup Validation
- API
- Authentication
- Cache
- CDC
- Content
- Geo
- Governance
- Index
- LLM
- Query
- Security
- Server
- Storage
- Time Series
- Transaction
- Utils
Vollständige Dokumentation: https://makr-code.github.io/ThemisDB/