API-Dokumentation
Der Pseudonymisierer bietet drei gleichwertige Wege: eine REST-API, einen Proxy im OpenAI- und Anthropic-Format sowie einen MCP-Server. Alle nutzen dieselben Sitzungen und Zuordnungen. Die vollständige Schema-Beschreibung liefert Swagger bzw. ReDoc, das rohe Schema liegt unter /openapi.json.
Grundprinzip
Sie schicken Text (oder JSON/Tabellen) an den Pseudonymisierer. Er erkennt personenbezogene Daten, ersetzt sie durch konsistente Ersatzwerte und legt die Zuordnung verschlüsselt in einer Sitzung ab. Den pseudonymisierten Text geben Sie an ein Cloud-Modell. Dessen Antwort schicken Sie mit derselben Sitzungs-ID zurück; der Personifizierer setzt die Originale wieder ein – auch bei Beugungen, veränderter Schreibweise oder Platzhalter-Varianten.
Pseudonyme sind deterministisch: dasselbe Original ergibt für Ihr Konto immer dasselbe Pseudonym, auch über Sitzungen hinweg. Mehrstufige Agenten bleiben deshalb konsistent, ohne dass Sie Sitzungs-IDs verwalten müssen.
Authentifizierung
Jede Anfrage trägt Ihren Schlüssel als Header X-API-Key: psk_live_… oder Authorization: Bearer psk_live_…. Schlüssel erhalten Sie über die Registrierung (Testzugang) oder im Konto; dort lässt er sich jederzeit erneuern. Der Schlüssel wird serverseitig nur als Hash gespeichert.
| Endpunkt | Zweck |
|---|---|
POST /api/registrieren | Testzugang anlegen (Name, E-Mail, datenschutz: true) – Schlüssel wird einmalig zurückgegeben |
GET /api/konto | Tarif, Gültigkeit, Nutzung im laufenden Monat, Anzahl Sitzungen |
POST /api/konto/schluessel | Neuen Schlüssel erzeugen (alter sofort ungültig) |
GET /api/tarife | Öffentliche Tarifübersicht |
Schnellstart
curl https://pseudonymisierer.de/api/pseudonymisieren \
-H "X-API-Key: psk_live_…" -H "content-type: application/json" \
-d '{"text": "Frau Anna Schmidt (anna@schmidt-bau.de) bittet um ein Angebot."}'
{"text": "Frau Marliese Koch (marliese@koch-technik.de) bittet um ein Angebot.",
"sitzung": "s_acGvuqjpmHd9amul3oyp7g", "anzahl": 2,
"je_typ": {"PERSON": 1, "EMAIL_ADDRESS": 1}, "warnungen": [], "dauer_ms": 637,
"treffer": [{"typ": "PERSON", "start": 0, "ende": 17, "pseudonym": "Frau Marliese Koch", "score": 0.95, "quelle": "GLiNERRecognizer"}, …]}
curl https://pseudonymisierer.de/api/personifizieren \
-H "X-API-Key: psk_live_…" -H "content-type: application/json" \
-d '{"text": "Angebot an Frau Koch gesendet.", "sitzung": "s_acGvuqjpmHd9amul3oyp7g"}'
{"text": "Angebot an Frau Schmidt gesendet.", "ersetzt": 1, "details": [{"pseudonym": "Koch", "original": "Schmidt", "anzahl": 1, "methode": "exakt"}], "nicht_gefunden": […]}
REST-Endpunkte
| Methode & Pfad | Anfrage (JSON) | Antwort |
|---|---|---|
POST /api/pseudonymisieren | text (Pflicht), sitzung, modus (realistisch|platzhalter), entitaeten (Liste), erlaubnisliste, sperrliste ("Begriff" oder "Begriff=TYP"), llm (bool), schnell (bool), mit_originalen (bool) | text, sitzung, anzahl, je_typ, treffer[] (Typ, Position, Pseudonym, Score, Quelle), warnungen, dauer_ms |
POST /api/personifizieren | text, sitzung (Pflicht), fuzzy (bool, Standard true) | text, ersetzt, details[], nicht_gefunden[], dauer_ms |
POST /api/tabelle/pseudonymisieren | zeilen (Liste von Objekten), spalten_typen z. B. {"Name":"PERSON","Betrag":"KEEP","Notiz":"TEXT"}, sitzung, modus | zeilen, sitzung, je_typ, warnungen |
POST /api/tabelle/personifizieren | zeilen, sitzung, fuzzy | zeilen, ersetzt |
POST /api/struktur/pseudonymisieren | daten (beliebiges JSON), sitzung, modus – alle Zeichenketten werden geprüft, Zahlen und Schlüssel bleiben | daten, sitzung, warnungen |
POST /api/struktur/personifizieren | daten, sitzung, fuzzy | daten, ersetzt |
GET /api/sitzungen | – | Liste Ihrer Sitzungen mit Statistik (ohne Originale) |
GET /api/sitzungen/{id} | Query mit_originalen=true liefert die Zuordnung | Statistik bzw. Zuordnungstabelle |
DELETE /api/sitzungen/{id} | – | {"geloescht": true} |
GET /gesund | – | Status, Version, geladene Modelle (ohne Schlüssel) |
Spaltentypen für Tabellen: TEXT (Freitext mit Erkennung, Standard), KEEP (unverändert), PERSON, ORGANIZATION, ADDRESS, LOCATION, EMAIL_ADDRESS, PHONE_NUMBER, IBAN_CODE, DATE_OF_BIRTH, ID_NUMBER. Typisierte Spalten werden ohne Erkennung direkt ersetzt – schneller und treffsicherer.
LLM-Proxy (OpenAI- und Anthropic-Format)
Der Proxy pseudonymisiert alle Nachrichten einer Anfrage, leitet sie an den Anbieter weiter und personifiziert die Antwort – Text ebenso wie Argumente von Werkzeugaufrufen (Function Calling / tool_use). Ihre Anwendung braucht dafür keine Änderung außer der Basis-URL.
| Format | Basis-URL | Weitergeleitete Pfade |
|---|---|---|
| OpenAI Chat Completions | https://pseudonymisierer.de/v1 | POST /v1/chat/completions, GET /v1/models |
| Anthropic Messages | https://pseudonymisierer.de | POST /v1/messages, GET /v1/models/{id} |
Header
| Header | Bedeutung |
|---|---|
Authorization: Bearer psk_… oder x-api-key | Ihr Pseudonymisierer-Schlüssel (so, wie das SDK den api_key setzt) |
X-Pseudo-Cloud-Key | Ihr Schlüssel beim Cloud-Anbieter (OpenAI, Anthropic …). Pflicht – der Pseudonymisierer stellt keine Modellkontingente bereit und speichert diesen Schlüssel nicht. Fehlt er: 402. |
X-Pseudo-Ziel | Anderer Upstream, z. B. https://openrouter.ai/api oder ein Azure-Endpunkt (Standard: api.openai.com / api.anthropic.com) |
X-Pseudo-Sitzung | Sitzung ausdrücklich wiederverwenden (z. B. je Unterhaltung oder Agentenaufgabe); sonst pro Anfrage eine neue, Konsistenz über deterministische Pseudonyme. Die verwendete Sitzung steht in der Antwort im gleichnamigen Header. |
X-Pseudo-Modus | auto (Standard): System-Prompt und Nutzertext voll analysieren, Werkzeugergebnisse und Modellantworten im Schnellmodus. voll: überall volle Erkennung. schnell: überall nur Muster und Wörterbuch. |
X-Pseudo-Warnung (Antwort) | Hinweise, z. B. wenn die LLM-Stufe nicht erreichbar war |
# Python, OpenAI-SDK
from openai import OpenAI
client = OpenAI(base_url="https://pseudonymisierer.de/v1", api_key="psk_live_…",
default_headers={"X-Pseudo-Cloud-Key": "sk-…", "X-Pseudo-Sitzung": "auftrag-4711"})
r = client.chat.completions.create(model="gpt-5", messages=[{"role": "user", "content": mail_text}], tools=werkzeuge)
# Node, Anthropic-SDK
const client = new Anthropic({ baseURL: "https://pseudonymisierer.de", apiKey: "psk_live_…",
defaultHeaders: { "X-Pseudo-Cloud-Key": "sk-ant-…" } });
Streaming: Der Proxy puffert die Antwort und sendet sie am Ende als reguläre Server-Sent-Events (ein Chunk plus Abschluss), damit Pseudonyme nicht über Chunk-Grenzen zerfallen. Für Chat-Oberflächen mit Live-Tippen ist das spürbar; für Agenten ist es unerheblich.
MCP-Server
Streamable-HTTP-Endpunkt: https://pseudonymisierer.de/mcp-server/mcp mit Header X-API-Key.
claude mcp add --transport http pseudonymisierer https://pseudonymisierer.de/mcp-server/mcp --header "X-API-Key: psk_live_…"
# .mcp.json / Claude Desktop
{ "mcpServers": { "pseudonymisierer": { "type": "http", "url": "https://pseudonymisierer.de/mcp-server/mcp",
"headers": { "X-API-Key": "psk_live_…" } } } }
| Werkzeug | Zweck |
|---|---|
pseudonymisieren(text, sitzung?, modus?, erlaubnisliste?, sperrliste?, llm?, schnell?) | Text → Pseudonyme (Treffer ohne Originale) |
personifizieren(text, sitzung, fuzzy?) | Pseudonyme → Originale |
pseudonymisieren_datei(pfad, …) / personifizieren_in_datei(text, sitzung, zielpfad) | Dateibasiert – für Cloud-Agenten, die den Klartext nie sehen sollen (nur bei eigener Installation sinnvoll) |
pseudonymisieren_tabelle, personifizieren_tabelle | Listen von Datensätzen |
sitzung_info, sitzungen_liste, sitzung_loeschen | Verwaltung |
Wichtig: Ruft ein Cloud-Modell pseudonymisieren mit Klartext auf, hat es die Daten bereits gesehen. Das Werkzeug gehört in lokale Orchestrierung (eigene Skripte, n8n) oder vor das Modell (Proxy).
Entitätstypen
| Typ | Beispiel | Ersatz (realistisch) |
|---|---|---|
PERSON | Herrn Dr. Thomas Müller · Müller · T. Müller | Anrede und Titel bleiben, Vor- und Nachname konsistent ersetzt, Geschlecht passend |
ORGANIZATION | Müller & Söhne GmbH | Rechtsform bleibt; zugehörige Domain wird abgeleitet |
ADDRESS | Hauptstraße 12, 80331 München | Straße, Hausnummer, PLZ (erste Ziffer optional erhalten), Ort |
LOCATION (optional) | München | anderer Ort; standardmäßig aus, Orte aus Adressen werden immer ersetzt |
EMAIL_ADDRESS | lisa.weber@mueller-soehne.de | aus Ersatznamen abgeleitet, Domain der Ersatzfirma, Webmail-Domains bleiben |
PHONE_NUMBER | +49 171 2345678 | Vorwahl und Format bleiben |
IBAN_CODE, CREDIT_CARD | DE89 3704 0044 … | gültige Prüfsumme, gleiches Land |
DATE_OF_BIRTH | 03.05.1978 | konsistent verschoben, Format bleibt; andere Daten bleiben unverändert |
ID_NUMBER | Kundennummer KD-2024-0815 | gleiche Form (Ziffern/Buchstaben) |
DE_TAX_ID, DE_TAX_NUMBER, DE_VAT_ID, DE_ID_CARD, DE_PASSPORT, DE_SOCIAL_SECURITY, DE_HEALTH_INSURANCE, DE_HANDELSREGISTER | Steuer-ID, USt-IdNr., Ausweis, Pass, SV-Nr., KVNR, HRB | gleiche Form |
URL, IP_ADDRESS (optional) | https://www.mueller-soehne.de/… | Domain bekannter Firmen wird ersetzt; standardmäßig aus, damit Portal-Adressen funktional bleiben |
Modi & Optionen
| Option | Wirkung |
|---|---|
modus: realistisch (Standard) | Plausible Ersatzwerte – das Modell arbeitet mit natürlichem Text (Formulare, Anreden, Feldprüfungen). |
modus: platzhalter | [[PERSON_1]], [[FIRMA_1]], [[ADRESSE_1]], [[EMAIL_1]] … – strikt, Rückabbildung versteht auch [PERSON_1] oder „Person 1“. |
schnell: true | Nur Muster-Erkenner plus Wörterbuch der Sitzung (Millisekunden). Neue Namen werden nicht erkannt – Sitzung vorher mit dem Datensatz befüllen. |
llm: true | Zweite Erkennungsstufe mit lokalem Sprachmodell (ab Tarif Business). Fällt sie aus, arbeitet der Dienst weiter und meldet eine Warnung. |
erlaubnisliste | Begriffe, die nie ersetzt werden (eigene Firma, Produktnamen). |
sperrliste | Begriffe, die immer ersetzt werden: "Projekt Phoenix=ORGANIZATION". |
entitaeten | Eigene Auswahl der Typen, z. B. zusätzlich LOCATION oder URL. |
fuzzy (Personifizieren) | Unscharfe Rückabbildung für leicht veränderte Schreibweisen (Standard an; für Tabellen aus). |
Sitzungen
Eine Sitzung ist die Zuordnungstabelle Original ⇄ Pseudonym samt Teilstücken (Nachname, Vorname, Firmenkern, Straße, Ort, Domain). Sie wird mit einem Schlüssel verschlüsselt, der aus dem Server-Geheimnis abgeleitet ist, läuft nach 7 Tagen ohne Nutzung ab und kann jederzeit gelöscht werden. Sitzungen sind strikt Ihrem Konto zugeordnet. Empfehlung: eine Sitzung je Vorgang (E-Mail-Thread, Agentenaufgabe, Datei), die ID bei sich speichern und nach Abschluss löschen.
Fehler & Limits
| Status | Bedeutung |
|---|---|
| 401 | Schlüssel fehlt, ist falsch oder gesperrt |
| 402 | Testzeitraum abgelaufen bzw. Cloud-Schlüssel im Proxy fehlt |
| 404 | Sitzung unbekannt, abgelaufen oder gehört einem anderen Konto |
| 422 | Ungültige Anfrage (z. B. fehlender Text, unbekannter Tarif) |
| 429 | Taktlimit je Minute oder Monatskontingent erreicht – Antwort enthält Zahlen und Limit |
| Tarif | Zeichen / Monat | Aufrufe / Minute | Stufe B |
|---|---|---|---|
| Test (14 Tage) | 100.000 | 20 | – |
| Start | 1 Mio. | 60 | – |
| Business | 10 Mio. | 300 | ja |
| Agentur | 50 Mio. | 900 | ja |
Gezählt werden die übermittelten Zeichen je Anfrage (Content-Length). Die Nutzung sehen Sie live unter GET /api/konto.
Datenschutz & Aufbewahrung
- Erkennung, Ersetzung und Zuordnung laufen vollständig auf unserem Server in Nürnberg; kein Text erreicht ein Cloud-Modell im Klartext.
- Inhalte werden nicht protokolliert. Das Audit-Protokoll enthält Zeitpunkt, Sitzungs-ID und Trefferzahlen je Typ.
- Sitzungen: verschlüsselt, 7 Tage, jederzeit löschbar. Konto: Name, E-Mail, Tarif, Schlüssel-Hash, Nutzungszähler.
- Pseudonymisierung ist keine Anonymisierung (Art. 4 Nr. 5 DSGVO) – gegenüber dem Cloud-Anbieter sind die Daten faktisch anonym, bei uns bleibt die Zuordnung für die Dauer der Sitzung bestehen. Auftragsverarbeitungsvertrag auf Anfrage.
Selbst betreiben
Der Dienst läuft als Docker-Container auf Linux-Servern oder Macs (Apple Silicon) im eigenen Netz; die Modelle (GLiNER, spaCy, optional Ollama) werden lokal geladen, Zuordnungen verlassen nie das Haus. Umgebungsvariablen tragen das Präfix PSEUDO_; die Werkzeuge pseudonymisieren_datei/personifizieren_in_datei und serverseitige Cloud-Schlüssel stehen dann ebenfalls zur Verfügung. Lizenz, Einrichtung und Wartung: info@alpha-digital.de.