AI Data Veil retire les données personnelles des textes avant que vous les utilisiez ailleurs : e-mails de clients, tickets, documents. La détection s’exécute sur nos propres serveurs en Europe, aucun service d’IA externe ne voit votre texte. Vous ne payez que les tokens.
1. Connectez-vous (Connexion / Inscription) et créez une clé API sous Setup → API keys. 2. Envoyez un texte :
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"}'La réponse contient le texte voilé et la liste de ce qui a été remplacé :
{
"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 }
}Adresse de base : https://api.aidataveil.eu. Envoyez votre clé dans l’en-tête Authorization: Bearer veil_…. Gardez les clés secrètes. Un compte peut avoir jusqu’à 5 clés, et vous pouvez supprimer une clé à tout moment.
| Champ | Type | Signification |
|---|---|---|
| text | chaîne, obligatoire | Le texte à traiter. |
| lang | de en fr es it | Langue du texte (par défaut de). |
| mode | technical | fictional | Espaces réservés comme [PERSON_1] (par défaut) ou noms et valeurs inventés. Dans un même texte, un même terme reçoit toujours le même remplacement. |
| prefix | chaîne, optionnel | Placé devant les noms techniques : avec B1, vous obtenez [B1_PERSON_1] au lieu de [PERSON_1]. Cela évite de confondre les espaces réservés lorsque vous combinez plusieurs textes ou des parties à contenu variable. Lettres, chiffres, - et _, jusqu’à 16 caractères. Sans effet avec fictional. |
| ruleset | chaîne | Nom de l’un de vos rule sets. Sans cela, le rule set par défaut de la clé s’applique. |
| allowlist | liste de chaînes | Termes à ne jamais remplacer, pour cette requête seulement. |
| options.mask_countries | booléen | Remplacer aussi les pays et régions (désactivé par défaut). |
| rules | liste de {label, pattern, mask} | Jusqu’à cinq champs regex personnalisés (libellé jusqu’à 40, motif jusqu’à 500 caractères). Les résultats apparaissent sous infos. |
| async | booléen | true : toujours traiter en arrière-plan. false : une réponse immédiate est exigée (voir ci-dessous). |
| Champ | Signification |
|---|---|
| text | Le texte voilé. |
| replacements | Chaque terme remplacé : type, original, replacement. Pour réassocier votre réponse. |
| infos | Valeurs de vos champs regex, telles qu’elles figurent dans le texte voilé. |
| usage | Taille du texte : chars, tokens, size_class et billed_tokens. |
| meta | Langue, mode et durées. |
Les textes jusqu’à 1 000 tokens (environ 3 500 caractères, un long e-mail) reçoivent une réponse immédiate. Les textes plus longs sont acceptés et traités en arrière-plan ; vous récupérez le résultat plus tard. Les requêtes courtes ne sont pas retardées : elles passent toujours en premier.
HTTP/1.1 202 Accepted
{
"request_id": "6549e33e1121a934ac0ece670c8b5017",
"status": "queued",
"tokens": 15900,
"size_class": "XL",
"result_url": "/v1/requests/6549e33e1121a934ac0ece670c8b5017",
"poll_after_seconds": 100
}Récupérez le résultat avec GET result_url. Le statut est queued, processing, done ou failed. Un résultat terminé arrive par blocs de 10 000 caractères au plus, chacun avec un lien vers le suivant :
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] désigne toujours le même terme. Chaque bloc liste les remplacements qu’il contient.infos, usage et meta figurent dans le premier bloc.410 block_released si vous le redemandez). Si une connexion est interrompue, demandez simplement le même bloc à nouveau.next_url du dernier bloc (next_is_confirmation: true) confirme la réception et supprime la requête. Sans confirmation, le résultat est supprimé 60 minutes après la récupération du dernier bloc, au plus tard après 24 heures. DELETE /v1/requests/{id} supprime immédiatement."async": true traite aussi les textes courts en arrière-plan (même prix). "async": false exige une réponse immédiate ; un texte trop long est refusé avec 413 too_large_for_immediate.Un exemple complet en 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()Sous Setup → Rule sets, vous rassemblez vos propres termes : les mots toujours remplacés (noms de projets, numéros de clients) et ceux jamais remplacés (votre entreprise, vos produits). Associez un rule set à une clé comme valeur par défaut ou nommez-le par requête avec ruleset.
Outre des termes, un rule set peut contenir des champs : des valeurs de forme fixe, par exemple un numéro de commande. Vous créez un champ sous Setup → Rule sets en collant un texte d’exemple et en cliquant sur la valeur ; nous construisons le motif pour vous, et vous lui donnez un nom technique comme Ordernumber. Chaque résultat est renvoyé sous infos.Ordernumber et, si vous le souhaitez, remplacé dans le texte. Les champs du rule set et les rules de la requête fonctionnent ensemble.
usage.POST /v1/tokens avec {"text": "…"} renvoie le nombre de tokens et si le texte recevrait une réponse immédiate. Le texte n’est pas traité, c’est gratuit.429 quota_exceeded jusqu’au mois suivant ou jusqu’à l’extension de l’offre. Continuer et facturer ensuite les tokens supplémentaires sera proposé avec les offres payantes ; nous le configurons pour vous.| Statut | Erreur | Signification |
|---|---|---|
| 400 | text_required, unsupported_language, unsupported_mode, invalid_rule, unknown_ruleset | La requête est incomplète ou une valeur n’est pas autorisée. |
| 401 | missing_api_key, invalid_api_key | La clé est absente, erronée ou supprimée. |
| 404 | not_found, block_not_found | Requête inconnue, requête d’un autre compte, résultat confirmé ou expiré, ou bloc inexistant. |
| 410 | block_released | Le bloc a été libéré après la récupération du suivant. |
| 413 | too_large_for_immediate | Trop long pour une réponse immédiate avec "async": false. |
| 429 | quota_exceeded | La limite mensuelle est atteinte et le compte est réglé sur l’arrêt. |
| 502 | anonymizer_unavailable | Temporairement indisponible. Réessayez dans un instant. |