Desarrolladores
· 10 min de lectura

Una API de tachado que se ejecuta en su propia red

Por Amine Gaaliche · borrador redactado con Claude, revisado y editado a mano

La API autoalojada detecta, codifica y tacha dentro de su infraestructura, y el contenido de los documentos no sale de ella. Lo que sí sale es la validación de la licencia, cada seis horas. Sin respuesta del servidor, el servicio funciona tres días más y se detiene.

Quién tiene el documento al detectar

Los equipos técnicos suelen plantear la elección como nube frente a local. La pregunta útil es quién tiene el documento en el momento de detectar.

Con una API en la nube, el documento viaja entero hasta el proveedor, porque para tachar un DNI hay que haberlo recibido. Con una aplicación de escritorio, el documento se queda en el equipo. Pero se pierde lo que da una API: integrarla en un flujo automatizado, lanzarla de noche contra diez mil expedientes, escalarla.

Una API autoalojada conserva las dos cosas. El motor se ejecuta en su perímetro, recibe el documento por REST o por línea de comandos y lo devuelve tratado sin que el contenido salga de su red.

Lo que exige el artículo 28 cuando el documento sale

Un proveedor que trata datos personales por cuenta de otro es encargado del tratamiento. El artículo 28 del RGPD exige con él un contrato: instrucciones, confidencialidad, seguridad, subencargados y destino de los datos al terminar. Es lo que examinaría la AEPD tras una reclamación o una brecha. La LOPDGDD completa el marco, y en un despacho se suma el secreto profesional del artículo 542.3 de la Ley Orgánica del Poder Judicial.

No podemos valorar si su tratamiento concreto es conforme; eso depende de sus bases jurídicas, contratos y análisis de riesgos. Lo que cambia es lo que hay que documentar. Con una API en la nube, el encargo cubre el contenido de cada documento. Con una API autoalojada, solo queda una petición periódica de licencia que no lleva nada de los documentos.

La conexión que sí sale

El servicio revalida su clave contra nuestro servidor de licencias cada seis horas. Si el servidor no responde, la API sigue con la última validación guardada en una caché local, con un tope de tres días. Pasado ese plazo, el contenedor se detiene. Los dos valores están en el código fuente.

Durante un tiempo dijimos otra cosa. Una tabla de este blog decía en una fila que solo la licencia usaba la red y, dos filas más abajo, que no había conexión hacia nosotros. La correcta era la primera.

El lector de este artículo suele ser un ingeniero que ya mira los registros de su cortafuegos. Si ve una conexión cada seis horas que nadie le anunció, deja de creer lo demás, incluido que los documentos no salen. Necesita saber qué conexión existe y cada cuánto para anotarlo en su registro de actividades de tratamiento.

La configuración es sencilla. Una vez instalados los modelos de idioma que necesite, permita solo el tráfico de salida hacia el servidor de licencias. Añada una alerta si el contenedor intenta llegar a otro destino.

Sin red, no hay API

Un comprador corporativo suele preguntar si el producto funciona en una red aislada. La API no tiene modo sin conexión. Una instalación desconectada deja de funcionar, como mucho, tres días después de su última validación.

La aplicación de escritorio sí tiene un modo aislado, en el plan Pro, sin llamada de licencia ni informes de errores. Es otro mecanismo, con otra forma de licenciar, y no se aplica al servicio. Si necesita una red sin salida a internet, hoy la vía es el escritorio.

Por eso el sello «100 % sin conexión» describe solo el escritorio. La aplicación gratuita del navegador envía una señal anónima al arrancar. En las tres formas del producto, el documento no sale del equipo o de la red donde se trata.

Qué hace el motor con cada documento

Primero actúan los Patrones, de alta precisión, para lo que tiene forma reconocible: un DNI (12345678Z), un IBAN (ES91 2100 0418 4502 0005 1332), un correo. Después, el Reconocimiento de entidades, con modelos spaCy, BERT o GLiNER configurables, busca nombres, sociedades y domicilios. El Análisis profundo, con un modelo de lenguaje, solo actúa si se activa.

Los resultados se combinan, se eliminan duplicados y se propagan entre páginas: un nombre hallado en la primera queda marcado en la cuarta. Después se filtra el ruido. Ninguna capa encuentra todos los identificadores, así que una persona revisa los hallazgos. Si el Análisis profundo apunta a un servicio externo, el texto de las páginas viaja a ese servicio y vuelve a aplicarse el artículo 28.

Un escaneo se renderiza a 300 ppp y Tesseract lo lee con el idioma del documento más el inglés. Los datos se localizan como regiones de la imagen, se cubren esos píxeles y debajo se reconstruye una capa de texto en la que se puede buscar. Hay siete paquetes de idioma: español, inglés, francés, alemán, italiano, neerlandés y portugués. Con el paquete equivocado, el escaneo se lee mal sin avisar.

Tachar elimina el contenido en lugar de dibujar un rectángulo negro. La exportación trata también lo que queda fuera de la página visible: texto alternativo, metadatos, marcadores internos y campos de formulario. Allí se escribe el código si se codificó, o un marcador neutro si se tachó. La miniatura previa al tachado se elimina, porque en una imagen no se puede buscar y sustituir.

Códigos por carpeta

Codificar sustituye cada valor por un código corto y reversible. Dentro de un grupo de documentos, un mismo valor recibe el mismo código; entre carpetas, los códigos son distintos. Un documento subido por separado forma su propio espacio, así que la misma persona recibe otro código en la llamada siguiente.

Si su integración debe tratar un expediente como un conjunto, suba esos documentos como grupo. La única excepción global es el código fijado a mano. Decodificar es una llamada local al propio servicio, porque la correspondencia se guarda en el Registro de códigos de su instalación.

Instalación y primera prueba con curl

Se instala desde una copia del código fuente, con pip install -e . en el directorio del paquete. El nombre de paquete que alguna documentación antigua daba para PyPI no está publicado. El servicio arranca con promptshield serve, que exige una clave en PROMPTSHIELD_API_KEY y muestra la dirección en la que escucha.

Toda ruta exige la cabecera Authorization: Bearer, salvo /health. Pruebe primero curl http://HOST:PUERTO/health y después lea el esquema: curl -H "Authorization: Bearer $PROMPTSHIELD_API_KEY" http://HOST:PUERTO/openapi.json.

Si abre /docs en el navegador, obtendrá un 401 aunque la clave sea correcta. El navegador no envía esa cabecera al navegar, así que esa página no se abre en ningún despliegue. El esquema describe las mismas rutas. La otra mitad de la historia está en por qué tantas herramientas de anonimización tropiezan con un expediente real.

Preguntas frecuentes

¿La API envía mis documentos a algún sitio?

Con la configuración predeterminada, no. Lo que sale es la validación de la licencia, cada seis horas y sin contenido. La excepción es el Análisis profundo configurado con un servicio externo, que recibe el texto de las páginas.

¿Puede funcionar sin ninguna conexión de red?

La API, no. Sin respuesta del servidor de licencias, funciona con la caché un máximo de tres días y se detiene.

Por qué lo contamos así

La frase redonda que usábamos antes sonaba mejor y era falsa. Si un proveedor exagera, lo paga ante la AEPD el responsable del tratamiento que se fió de él.

¿Le ha resultado útil? Háganoslo saber.

Compartir