AI Data Veil elimina los datos personales de los textos antes de que los uses en otro lugar: correos de clientes, tickets, documentos. La detección se ejecuta en nuestros propios servidores en Europa; ningún servicio de IA externo ve tu texto. Solo pagas por tokens.
1. Inicia sesión (Login / Registro) y crea una clave de API en Setup → API keys. 2. Envía un texto:
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 respuesta contiene el texto velado y la lista de lo que se sustituyó:
{
"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 }
}Dirección base: https://api.aidataveil.eu. Envía tu clave en la cabecera Authorization: Bearer veil_…. Mantén las claves en secreto. Una cuenta puede tener hasta 5 claves y puedes eliminar una clave en cualquier momento.
| Campo | Tipo | Significado |
|---|---|---|
| text | cadena, obligatorio | El texto que se procesa. |
| lang | de en fr es it | Idioma del texto (por defecto de). |
| mode | technical | fictional | Marcadores como [PERSON_1] (por defecto) o nombres y valores inventados. Dentro de un texto, el mismo término recibe siempre la misma sustitución. |
| prefix | cadena, opcional | Se antepone a los nombres técnicos: con B1 se obtiene [B1_PERSON_1] en lugar de [PERSON_1]. Así no se confunden los marcadores al combinar varios textos o partes con contenido variable. Letras, dígitos, - y _, hasta 16 caracteres. Sin efecto con fictional. |
| ruleset | cadena | Nombre de uno de tus rule sets. Sin él se aplica el rule set predeterminado de la clave. |
| allowlist | lista de cadenas | Términos que nunca se deben sustituir, solo para esta solicitud. |
| options.mask_countries | booleano | Sustituir también países y regiones (desactivado por defecto). |
| rules | lista de {label, pattern, mask} | Hasta cinco campos regex propios (etiqueta hasta 40, patrón hasta 500 caracteres). Las coincidencias aparecen en infos. |
| async | booleano | true: procesar siempre en segundo plano. false: se exige una respuesta inmediata (ver abajo). |
| Campo | Significado |
|---|---|
| text | El texto velado. |
| replacements | Cada término sustituido: type, original, replacement. Sirve para relacionar tu respuesta. |
| infos | Valores de tus campos regex, tal como aparecen en el texto velado. |
| usage | Tamaño del texto: chars, tokens, size_class y billed_tokens. |
| meta | Idioma, modo y tiempos. |
Los textos de hasta 1.000 tokens (unos 3.500 caracteres, un correo largo) se responden al instante. Los textos más largos se aceptan y se procesan en segundo plano; el resultado se recoge después. Las solicitudes cortas no se retrasan por ello: siempre van primero.
HTTP/1.1 202 Accepted
{
"request_id": "6549e33e1121a934ac0ece670c8b5017",
"status": "queued",
"tokens": 15900,
"size_class": "XL",
"result_url": "/v1/requests/6549e33e1121a934ac0ece670c8b5017",
"poll_after_seconds": 100
}Recoge el resultado con GET result_url. El estado es queued, processing, done o failed. Un resultado terminado llega en bloques de hasta 10.000 caracteres, cada uno con un enlace al siguiente:
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] siempre significa el mismo término. Cada bloque lista las sustituciones que contiene.infos, usage y meta están en el primer bloque.410 block_released si lo pides otra vez). Si se corta una conexión, pide simplemente el mismo bloque de nuevo.next_url del último bloque (next_is_confirmation: true) confirma la recepción y elimina la solicitud. Sin confirmación, el resultado se elimina 60 minutos después de recoger el último bloque, como máximo a las 24 horas. DELETE /v1/requests/{id} elimina al instante."async": true procesa también los textos cortos en segundo plano (mismo precio). "async": false exige una respuesta inmediata; un texto demasiado largo se rechaza con 413 too_large_for_immediate.Un ejemplo completo 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()En Setup → Rule sets reúnes tus propios términos: palabras que siempre se sustituyen (nombres de proyectos, números de cliente) y palabras que nunca se sustituyen (tu empresa, productos). Asigna un rule set a una clave como predeterminado o indícalo por solicitud con ruleset.
Además de términos, un rule set puede contener campos: valores con una forma fija, por ejemplo un número de pedido. Creas un campo en Setup → Rule sets pegando un texto de ejemplo y haciendo clic en el valor; nosotros formamos el patrón y tú le das un nombre técnico como Ordernumber. Cada coincidencia se devuelve en infos.Ordernumber y, si quieres, se sustituye en el texto. Los campos del rule set y las rules de la solicitud funcionan juntos.
usage.POST /v1/tokens con {"text": "…"} devuelve el número de tokens y si el texto se respondería al instante. No procesa el texto y no cuesta nada.429 quota_exceeded hasta el mes siguiente o hasta ampliar el plan. Seguir funcionando y facturar después los tokens adicionales llegará con los planes de pago; lo configuramos por ti.| Estado | Error | Significado |
|---|---|---|
| 400 | text_required, unsupported_language, unsupported_mode, invalid_rule, unknown_ruleset | La solicitud está incompleta o un valor no está permitido. |
| 401 | missing_api_key, invalid_api_key | La clave falta, es incorrecta o fue eliminada. |
| 404 | not_found, block_not_found | Solicitud desconocida, solicitud de otra cuenta, resultado confirmado o caducado, o un bloque que no existe. |
| 410 | block_released | El bloque se liberó después de recoger el siguiente. |
| 413 | too_large_for_immediate | Demasiado largo para una respuesta inmediata con "async": false. |
| 429 | quota_exceeded | Se alcanzó el límite mensual y la cuenta está en modo de parada. |
| 502 | anonymizer_unavailable | Temporalmente no disponible. Inténtalo de nuevo en un momento. |