AI Data Veil entfernt personenbezogene Daten aus Texten, bevor du sie weiterverwendest: Kundenmails, Tickets, Dokumente. Die Erkennung läuft auf unseren eigenen Servern in Europa, kein externer KI-Dienst sieht deinen Text. Bezahlt wird nur nach Token.
1. Melde dich an (Login / Registrieren) und lege unter Setup → API keys einen API-Key an. 2. Sende einen Text:
curl https://api.aidataveil.eu/v1/anonymize \
-H "Authorization: Bearer $VEIL_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Hello, I am Anna Schmidt from Berlin, anna@example.com.", "lang": "en"}'Die Antwort enthält den verschleierten Text und die Liste dessen, was ersetzt wurde:
{
"text": "Hello, I am [PERSON_1] from [LOCATION_1], [EMAIL_1].",
"replacements": [
{ "type": "PERSON", "original": "Anna Schmidt", "replacement": "[PERSON_1]" },
{ "type": "LOCATION", "original": "Berlin", "replacement": "[LOCATION_1]" },
{ "type": "EMAIL", "original": "anna@example.com", "replacement": "[EMAIL_1]" }
],
"infos": {},
"usage": { "chars": 55, "tokens": 18, "size_class": "S", "weight": 1, "billed_tokens": 18 },
"meta": { "lang": "en", "mode": "technical", "total_ms": 240 }
}Basisadresse: https://api.aidataveil.eu. Sende den Key im Header Authorization: Bearer veil_…. Halte Keys geheim. Ein Account kann bis zu 5 Keys haben, und du kannst einen Key jederzeit löschen.
| Feld | Typ | Bedeutung |
|---|---|---|
| text | String, Pflicht | Der zu verarbeitende Text. |
| lang | de en fr es it | Sprache des Textes (Standard de). |
| mode | technical | fictional | Platzhalter wie [PERSON_1] (Standard) oder erfundene Namen und Werte. Innerhalb eines Textes bekommt derselbe Begriff immer denselben Ersatz. |
| prefix | String, optional | Wird den technischen Namen vorangestellt: mit B1 entsteht [B1_PERSON_1] statt [PERSON_1]. So bleiben Platzhalter auseinanderzuhalten, wenn du mehrere Texte oder Teile mit variablem Inhalt zusammenführst. Buchstaben, Ziffern, - und _, bis zu 16 Zeichen. Bei fictional ohne Wirkung. |
| ruleset | String | Name eines deiner Rule sets. Ohne Angabe gilt das Standard-Rule-set des Keys. |
| allowlist | Liste von Strings | Begriffe, die nie ersetzt werden dürfen, nur für diese Anfrage. |
| options.mask_countries | Boolean | Auch Länder und Regionen ersetzen (Standard aus). |
| rules | Liste von {label, pattern, mask} | Bis zu fünf eigene Regex-Felder (Bezeichnung bis 40, Muster bis 500 Zeichen). Treffer stehen unter infos. |
| async | Boolean | true: immer im Hintergrund verarbeiten. false: eine sofortige Antwort ist Pflicht (siehe unten). |
| Feld | Bedeutung |
|---|---|
| text | Der verschleierte Text. |
| replacements | Jeder ersetzte Begriff: type, original, replacement. Damit ordnest du deine Antwort wieder zu. |
| infos | Werte deiner eigenen Regex-Felder, so wie sie im verschleierten Text stehen. |
| usage | Größe des Textes: chars, tokens, size_class und billed_tokens. |
| meta | Sprache, Modus und Zeiten. |
Texte bis 1.000 Token (etwa 3.500 Zeichen, eine lange E-Mail) werden sofort beantwortet. Längere Texte werden angenommen und im Hintergrund verarbeitet; das Ergebnis holst du später ab. Kurze Anfragen werden dadurch nicht aufgehalten: Sie gehen immer vor.
HTTP/1.1 202 Accepted
{
"request_id": "6549e33e1121a934ac0ece670c8b5017",
"status": "queued",
"tokens": 15900,
"size_class": "XL",
"result_url": "/v1/requests/6549e33e1121a934ac0ece670c8b5017",
"poll_after_seconds": 100
}Das Ergebnis holst du mit GET result_url ab. Der Status ist queued, processing, done oder failed. Ein fertiges Ergebnis kommt in Blöcken zu höchstens 10.000 Zeichen, jeder mit einem Link auf den nächsten:
GET /v1/requests/6549e33e1121a934ac0ece670c8b5017
{
"request_id": "6549e33e1121a934ac0ece670c8b5017",
"status": "done",
"block": 1,
"blocks": 7,
"next_url": "/v1/requests/6549e33e1121a934ac0ece670c8b5017?block=2",
"next_is_confirmation": false,
"text": "…first 10,000 characters, veiled…",
"replacements": [ … only those used in this block … ],
"infos": {}, "usage": { … }, "meta": { … }
}[PERSON_1] meint immer denselben Begriff. Jeder Block listet die Ersetzungen, die in ihm vorkommen.infos, usage und meta stehen im ersten Block.410 block_released). Bricht eine Verbindung ab, fordere denselben Block einfach noch einmal an.next_url des letzten Blocks (next_is_confirmation: true) bestätigt den Empfang und löscht die Anfrage. Ohne Bestätigung wird das Ergebnis 60 Minuten nach dem Abholen des letzten Blocks gelöscht, spätestens nach 24 Stunden. DELETE /v1/requests/{id} löscht sofort."async": true verarbeitet auch kurze Texte im Hintergrund (gleicher Preis). "async": false verlangt eine sofortige Antwort; ein zu langer Text wird mit 413 too_large_for_immediate abgelehnt.Ein vollständiges Beispiel in Python:
import os, time, requests
API = "https://api.aidataveil.eu"
H = {"Authorization": "Bearer " + os.environ["VEIL_KEY"]}
def anonymize(text, lang="de"):
r = requests.post(API + "/v1/anonymize", headers=H, json={"text": text, "lang": lang})
r.raise_for_status()
if r.status_code == 200: # short text: the answer is here
return r.json()["text"]
url = API + r.json()["result_url"] # 202: processed in the background
while (block := requests.get(url, headers=H).json())["status"] in ("queued", "processing"):
time.sleep(10)
if block["status"] == "failed":
raise RuntimeError(block["error"])
parts = []
while True:
parts.append(block["text"])
if block["next_is_confirmation"]: # last block: confirm, the data is deleted
requests.get(API + block["next_url"], headers=H)
return "".join(parts)
block = requests.get(API + block["next_url"], headers=H).json()Unter Setup → Rule sets sammelst du eigene Begriffe: Wörter, die immer ersetzt werden (Projektnamen, Kundennummern), und Wörter, die nie ersetzt werden (dein Unternehmen, Produkte). Ordne ein Rule set einem Key als Standard zu oder nenne es je Anfrage mit ruleset.
Neben Begriffen kann ein Rule set Felder enthalten: Werte mit festem Aufbau, etwa eine Bestellnummer. Ein Feld legst du unter Setup → Rule sets an: Beispieltext einfügen, den Wert anklicken, das Muster bilden wir für dich, und du gibst einen technischen Namen wie Ordernumber vor. Jeder Treffer kommt unter infos.Ordernumber zurück und wird auf Wunsch im Text ersetzt. Felder des Rule sets und rules der Anfrage wirken zusammen.
usage.POST /v1/tokens mit {"text": "…"} liefert die Token-Zahl und ob der Text sofort beantwortet würde. Der Text wird nicht verarbeitet, es kostet nichts.429 quota_exceeded, bis der nächste Monat beginnt oder der Tarif erweitert wird. Weiterlaufen und die zusätzlichen Token nachträglich berechnen gibt es mit den bezahlten Tarifen; wir richten es für dich ein.| Status | Fehler | Bedeutung |
|---|---|---|
| 400 | text_required, unsupported_language, unsupported_mode, invalid_rule, unknown_ruleset | Die Anfrage ist unvollständig oder ein Wert ist nicht erlaubt. |
| 401 | missing_api_key, invalid_api_key | Der Key fehlt, ist falsch oder gelöscht. |
| 404 | not_found, block_not_found | Unbekannte Anfrage, Anfrage eines anderen Accounts, bestätigtes oder abgelaufenes Ergebnis oder ein Block, den es nicht gibt. |
| 410 | block_released | Der Block wurde freigegeben, nachdem der nächste abgeholt wurde. |
| 413 | too_large_for_immediate | Zu lang für eine sofortige Antwort bei "async": false. |
| 429 | quota_exceeded | Das Monatslimit ist erreicht und der Account steht auf Stopp. |
| 502 | anonymizer_unavailable | Vorübergehend nicht verfügbar. Bitte gleich noch einmal versuchen. |