Desarrolladores · API pública 1.9.0
Integra Anonimatum en tus sistemas
API REST con contrato estable en /api/public/**, referencia OpenAPI descargable y conector MCP para asistentes de IA. El mismo motor de la App, en la Unión Europea.
Inicio rápido
Tres pasos: crear la API key, comprobarla y anonimizar el primer documento.
- Crea una API key en la App: Perfil → API keys → «Generar API key». Copia la clave en ese momento: no se vuelve a mostrar. Si no ves la sección, tu plan no incluye acceso por API o la gestiona el administrador del grupo.
- Guárdala como variable de entorno y comprueba el plan del grupo con GET /api/public/plan.
- Envía el documento a POST /api/public/ai/anonymize con las opciones de IA que quieras. La respuesta es el documento anonimizado en su formato original.
export ANONIMATUM_API_KEY="tu_api_key"
# 1. Comprueba la clave: plan y cupo del grupo
curl -H "X-API-Key: $ANONIMATUM_API_KEY" \
https://api.anonimatum.com/api/public/plan
# 2. Opciones de IA disponibles (rgpd, fechas, direcciones, qr…)
curl -H "X-API-Key: $ANONIMATUM_API_KEY" \
https://api.anonimatum.com/api/public/ai/options
# 3. Primer anonimizado: PDF, Word, Excel o PowerPoint
curl -X POST https://api.anonimatum.com/api/public/ai/anonymize \
-H "X-API-Key: $ANONIMATUM_API_KEY" \
-F "file=@resolucion.pdf" \
-F "aiOptions=rgpd,direcciones,qr" \
-F "backgroundColor=black" \
-F "textContent=none" \
--output resolucion-anonimizada.pdfLos parámetros de los endpoints multipart se envían como campos del formulario (-F). La cuota se descuenta del plan del grupo de la clave.
Autenticación
- X-API-Key
- Cabecera para integraciones máquina a máquina. Cada clave pertenece a un usuario y a un grupo: usa sus permisos, su plan y su cupo.
- Authorization: Bearer
- JWT de sesión de usuario, el mismo que usa la App. Útil si integras Anonimatum en una aplicación con inicio de sesión de Politeia.
- Aislamiento
- Un recurso de otro grupo responde 404, nunca 403: la API no revela si existe.
- Revocación
- Revoca una clave en Perfil → API keys; deja de funcionar de inmediato. No incluyas claves en el código ni en repositorios.
Límites
Límites técnicos vigentes en la versión 1.9.0 (por dirección IP o por petición):
| 300 / min | Peticiones a /api/public/** por IP. |
|---|---|
| 60 / min | Anonimizaciones (anonymize-patterns, -zones, -complete, -whitelist) por IP. |
| 250 MB | Tamaño máximo de fichero por petición. |
| 20 MB · 100 000 filas · 200 columnas · 50 hojas | Hojas de cálculo por columnas (/api/public/sheets/**). |
Además, cada operación descuenta páginas o documentos del plan del grupo. Consulta el uso con GET /api/public/usage/current y /usage/remaining, o valida antes con POST /usage/validate-operation.
Errores
Los errores siguen el formato estándar { errorCode, message, status }. Los más habituales:
| 400 INVALID_REQUEST | Parámetro ausente o con formato incorrecto, fichero vacío o tipo no admitido. |
|---|---|
| 401 UNAUTHORIZED | Falta la API key o el JWT, o la clave está revocada. |
| 403 PLAN_EXPIRED | El plan del grupo ha expirado. Toda operación que consume cupo se rechaza; descargar resultados ya generados y desanonimizar siguen disponibles. No reintentes. |
| 403 INSUFFICIENT_PERMISSIONS / FORBIDDEN | La clave no tiene permiso para esa operación o el usuario no tiene plan activo. |
| 404 NOT_FOUND | El recurso no existe o pertenece a otro grupo. |
| 409 CONFLICT | Conflicto con el estado actual (p. ej. nombre duplicado). |
| 413 SHEET_LIMIT_EXCEEDED | La hoja supera el tamaño, las filas, las columnas o las hojas permitidas. |
| 415 SHEET_FORMAT_UNSUPPORTED | El fichero enviado a /sheets/** no es una hoja de cálculo (xlsx, xls, ods, csv). |
| 429 | Cupo mensual o anual del plan agotado (errorCode FORBIDDEN y mensaje con el límite) o límite de peticiones por minuto (cuerpo { error, status }). |
| 500 INTERNAL_ERROR | Error inesperado. Si se repite, escríbenos con la hora y el endpoint. |
HTTP/1.1 403
Content-Type: application/json
{
"errorCode": "PLAN_EXPIRED",
"message": "Tu plan ha expirado. Contacta con el equipo de Politeia para renovarlo o activar un plan.",
"status": 403
}Decide por errorCode, no por el texto de message, que puede cambiar o traducirse.
Referencia OpenAPI
Generada desde el Back de la versión 1.9.0 (grupo springdoc «public-api»), solo con las rutas /api/public/**; no incluye endpoints internos ni de administración.
85 operaciones en 71 rutas · Descargar OpenAPI 3.1 (JSON). Impórtalo en Postman, Insomnia, Bruno o tu generador de clientes OpenAPI.
Anonimización de Documentos
POST/api/public/documents/anonymize-by-idsAnonimizar PDF con Patrones y Wordsets por ID
Funcionalidad Principal:
Anonimiza documentos PDF utilizando patrones regex y wordsets existentes en la base de datos,
identificados por sus IDs, junto con palabras sueltas opcionales.
Ventajas de este Endpoint:
- Reutiliza patrones y wordsets existentes
- Mejor rendimiento al evitar recrear patrones
- Gestión centralizada de patrones
- Control de acceso basado en permisos de usuario
Casos de Uso:
- Anonimización de contratos y documentos legales
- Protección de datos médicos en informes
- Ocultación de información comercial confidencial
- Preparación de documentos para auditorías
- Procesamiento automatizado con patrones predefinidos
Proceso de Anonimización:
- El PDF se analiza página por página
- Se cargan los patrones regex desde la base de datos usando los IDs
- Se cargan las palabras de los wordsets usando los IDs
- Se combinan con las palabras sueltas proporcionadas
- Se aplican todos los patrones y palabras para detectar información sensible
- Las coincidencias se marcan para anonimización
- Se genera un PDF con las zonas sensibles ocultadas
Parámetros
| patternIds | query · string | IDs de patrones regex existentes en formato JSON |
| wordSetIds | query · string | IDs de wordsets existentes en formato JSON |
| additionalWords | query · string | Palabras sueltas adicionales en formato JSON |
| backgroundColor | query · string | Color de fondo para anonimización |
| textContent | query · string | Contenido de texto para zonas anonimizadas |
| highQuality | query · boolean | Procesamiento de alta calidad |
Cuerpo multipart/form-data
| file* | body · file | Archivo PDF a anonimizar |
Respuestas
- 200 PDF anonimizado exitosamenteapplication/pdf
- 400 Solicitud inválida - Verificar IDs de patrones/wordsetsapplication/json
- 401 Token JWT o API Key inválidaapplication/json
- 403 Sin permisos para acceder a los patrones/wordsets especificadosapplication/json
- 404 Patrones o wordsets no encontradosapplication/json
POST/api/public/documents/anonymize-patternsAnonimizar PDF con Patrones Regex Directos
Funcionalidad Principal:
Anonimiza documentos PDF utilizando patrones regex personalizados para detectar y ocultar información sensible.
Casos de Uso:
- Anonimización de contratos y documentos legales
- Protección de datos médicos en informes
- Ocultación de información comercial confidencial
- Preparación de documentos para auditorías
Proceso de Anonimización:
- El PDF se analiza página por página
- Se aplican los patrones regex especificados
- Las coincidencias se marcan para anonimización
- Se genera un PDF con las zonas sensibles ocultadas
Patrones Regex Comunes:
- DNI español:
\d{8}[A-Z] - Email:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} - Teléfono:
\+?[0-9]{9,15} - Tarjeta crédito:
\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}
Parámetros
| patterns | query · string | Patrones regex en formato JSON |
| wordSetIds | query · string | IDs de wordsets a aplicar |
| backgroundColor | query · string | Color de fondo para anonimización |
| textContent | query · string | Contenido de texto para zonas anonimizadas |
| highQuality | query · boolean | Procesamiento de alta calidad |
Cuerpo multipart/form-data
| file* | body · file | Archivo PDF a anonimizar |
Respuestas
- 200 PDF anonimizado exitosamenteapplication/pdf
- 400 Solicitud inválidaapplication/json
- 401 Token JWT o API Key inválidaapplication/json
Documentos clásicos (API pública)
POST/api/public/documents/anonymizeAnonimizar (compatibilidad)
Parámetros
| patterns | query · string | |
| redactionZones | query · string | |
| highQuality | query · boolean |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-completeAnonimización completa (patrones + zonas)
Parámetros
| patterns | query · string | |
| redactionZones* | query · string | |
| wordSetIds | query · integer[] | |
| wordSetMatchMode | query · string | |
| highQuality | query · boolean |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-complete-inverseAnonimización completa inversa
Parámetros
| patterns | query · string | |
| redactionZones* | query · string | |
| wordSetIds | query · integer[] | |
| wordSetMatchMode | query · string | |
| excludePatterns | query · string | |
| excludeWordSetIds | query · integer[] | |
| excludeWordSetMatchMode | query · string | |
| highQuality | query · boolean |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-specific-zonesAnonimizar zonas específicas (IA / coordenadas)
Parámetros
| zones* | query · string | |
| highQuality | query · boolean | |
| backgroundColor | query · string | |
| textContent | query · string | |
| censorHeightPadPx | query · integer | |
| aiOptions | query · string | |
| customWords | query · string | |
| patterns | query · string | |
| wordSetIds | query · string | |
| wordSetMatchMode | query · string | |
| pageOrientations | query · string | |
| ocrPreprocess | query · boolean | |
| autoOcr | query · boolean | |
| excludePatterns | query · string | |
| excludeWordSetIds | query · integer[] | |
| excludeWordSetMatchMode | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-whitelistAnonimización por lista blanca
Parámetros
| redactionZones* | query · string | |
| whitelistPatterns | query · string | |
| whitelistWordSetIds | query · integer[] | |
| whitelistWordSetMatchMode | query · string | |
| detectPattern | query · string | |
| backgroundColor | query · string | |
| textContent | query · string | |
| highQuality | query · boolean | |
| censorHeightPadPx | query · integer | |
| whitelistSuppressions | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-zonesAnonimizar solo zonas
Parámetros
| redactionZones* | query · string | |
| highQuality | query · boolean |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/pdf
POST/api/public/documents/previewPreview de anonimización
Parámetros
| patterns | query · string | |
| redactionZones | query · string | |
| wordSetIds | query · string | |
| wordSetMatchMode | query · string | |
| excludePatterns | query · string | |
| excludeWordSetIds | query · integer[] | |
| excludeWordSetMatchMode | query · string | |
| ocrPreprocess | query · boolean | |
| autoOcr | query · boolean | |
| highQuality | query · boolean | |
| backgroundColor | query · string | |
| textContent | query · string | |
| censorHeightPadPx | query · integer |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/json
POST/api/public/documents/preview-inversePreview inversa (lista blanca)
Parámetros
| redactionZones | query · string | |
| whitelistPatterns | query · string | |
| whitelistWordSetIds | query · integer[] | |
| whitelistWordSetMatchMode | query · string | |
| ocrPreprocess | query · boolean | |
| autoOcr | query · boolean | |
| highQuality | query · boolean | |
| backgroundColor | query · string | |
| textContent | query · string | |
| censorHeightPadPx | query · integer |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/json
POST/api/public/documents/result/searchableResultado buscable (OCR sobre PDF anonimizado)
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
Expedientes (API pública)
GET/api/public/casesListar los expedientes visibles para la clave
Del usuario de la clave o compartidos con su grupo, con recuentos por estado.
Respuestas
- 200 OK
GET/api/public/cases/{id}Estado de un expediente y de cada documento
UPLOADED, QUEUED, PROCESSING, DONE o FAILED por documento.
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
GET/api/public/cases/{id}/downloadDescargar el expediente anonimizado en un ZIP
Documentos terminados e índice CSV/PDF sin datos personales; mapas pseudo solo como LEEME. 204 si no hay documentos terminados.
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
Formatos (API pública)
POST/api/public/formats/email/analyzeAnalizar un correo (.eml/.msg)
Cabeceras, cuerpo y adjuntos. Sin cupo.
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/formats/email/anonymizeAnonimizar un correo (.eml/.msg) con sus adjuntos
ZIP (base64) con el correo en PDF, los adjuntos anonimizados y, con includeEml, el .eml.
Cuerpo multipart/form-data
| file* | body · file | |
| options | body · FormatOptionsForm |
Respuestas
- 200 OK
POST/api/public/formats/tiff/from-pdfPDF anonimizado → TIFF multipágina
Cupo de herramientas PDF.
Parámetros
| dpi | query · integer | |
| colorMode | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/formats/word/editableWord editable (.docx/.odt)
Documento con los datos sustituidos en el propio texto, verificado contra fugas.
Cuerpo multipart/form-data
| file* | body · file | |
| options | body · FormatOptionsForm |
Respuestas
- 200 OK
Gestión de Patrones
GET/api/public/patternsObtener Todos los Patrones
Biblioteca Completa de Patrones:
Lista paginada de todos los patrones regex disponibles para el usuario.
Información Incluida:
- 🆔 ID único del patrón
- Nombre y descripción
- Expresión regex
- Estadísticas de uso
- Estado activo/inactivo
- Fecha de creación y modificación
Parámetros
| page | query · integer | Número de página (empezando en 1) |
| size | query · integer | Elementos por página |
Respuestas
- 200 OK
POST/api/public/patternsCrear Nuevo Patrón
Creación de Patrón Personalizado:
Permite crear un nuevo patrón regex personalizado para detección de información sensible.
Campos Requeridos:
- Nombre descriptivo
- Expresión regex válida
- Descripción del propósito
- Tipo/categoría del patrón
Cuerpo application/json · PatternRequestDTO
Respuestas
- 200 OK
GET/api/public/patterns/{id}Obtener Patrón por ID
Detalles Completos del Patrón:
Obtiene toda la información de un patrón específico incluyendo metadatos y estadísticas.
Parámetros
| id* | path · integer | 🆔 ID único del patrón |
Respuestas
- 200 OK
PUT/api/public/patterns/{id}Actualizar Patrón Existente
Modificación de Patrón:
Permite actualizar un patrón existente modificando cualquiera de sus propiedades.
Parámetros
| id* | path · integer | 🆔 ID del patrón a actualizar |
Cuerpo application/json · PatternRequestDTO
Respuestas
- 200 OK
DELETE/api/public/patterns/{id}Eliminar Patrón
Eliminación de Patrón:
Elimina permanentemente un patrón de la biblioteca del usuario.
Advertencia:Esta acción no se puede deshacer.
Parámetros
| id* | path · integer | 🆔 ID del patrón a eliminar |
Respuestas
- 200 OK
Gestión de Wordsets
GET/api/public/wordsetsObtener Todos los Wordsets
Biblioteca Completa de Wordsets:
Lista todos los diccionarios de palabras disponibles para el usuario.
Información Incluida:
- 🆔 ID único del wordset
- Nombre y descripción
- Número de palabras
- Categoría/tipo
- Estado activo
- Última actualización
Respuestas
- 200 OK
POST/api/public/wordsetsCrear Nuevo Wordset
Creación de Diccionario:
Permite crear un nuevo wordset personalizado con una lista de palabras.
Campos Requeridos:
- Nombre descriptivo
- Descripción del propósito
- Lista inicial de palabras
- Categoría del wordset
Cuerpo application/json · WordSetRequestDTO
Respuestas
- 200 OK
GET/api/public/wordsets/{id}Obtener Wordset por ID
Detalles Completos del Wordset:
Obtiene toda la información de un wordset incluyendo la lista completa de palabras.
Parámetros
| id* | path · integer | 🆔 ID único del wordset |
Respuestas
- 200 OK
PUT/api/public/wordsets/{id}Actualizar Wordset
Modificación de Wordset:
Permite actualizar un wordset existente incluyendo su lista de palabras.
Parámetros
| id* | path · integer | 🆔 ID del wordset a actualizar |
Cuerpo application/json · WordSetRequestDTO
Respuestas
- 200 OK
DELETE/api/public/wordsets/{id}Eliminar Wordset
Eliminación de Wordset:
Elimina permanentemente un wordset y todas sus palabras asociadas.
Advertencia:Esta acción no se puede deshacer.
Parámetros
| id* | path · integer | 🆔 ID del wordset a eliminar |
Respuestas
- 200 OK
GET/api/public/wordsets/{id}/wordsObtener Palabras de Wordset
Lista de Palabras:
Obtiene todas las palabras de un wordset específico con paginación.
Parámetros
| id* | path · integer | 🆔 ID del wordset |
| page | query · integer | Número de página |
| size | query · integer | Elementos por página |
| search | query · string | Búsqueda por subcadena (opcional) |
Respuestas
- 200 OK
POST/api/public/wordsets/{id}/wordsAgregar Palabra a Wordset
Gestión de Palabras Individual:
Agrega una nueva palabra a un wordset existente.
Parámetros
| id* | path · integer | 🆔 ID del wordset |
| word* | query · string | Palabra a agregar |
Respuestas
- 200 OK
DELETE/api/public/wordsets/{id}/wordsEliminar Palabra de Wordset
Gestión de Palabras Individual:
Elimina una palabra específica de un wordset.
Parámetros
| id* | path · integer | 🆔 ID del wordset |
| word* | query · string | Palabra a eliminar |
Respuestas
- 200 OK
Hojas de cálculo por columnas (API pública)
POST/api/public/sheets/analyzeAnalizar las columnas de una hoja de cálculo (xlsx, xls, ods, csv)
Cabecera, muestra y tipo sugerido por columna. Sin cupo.
Parámetros
| hasHeader | query · boolean | |
| sampleRows | query · integer | |
| useAi | query · boolean |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/sheets/previewVista previa del tratamiento por columnas
Sin cupo.
Cuerpo multipart/form-data
| file* | body · file | |
| options | body · SheetOptionsForm |
Respuestas
- 200 OK
POST/api/public/sheets/processTratar una hoja de cálculo por columnas
Mismo formato de salida; cupo: 1 página por cada 50 filas de datos.
Cuerpo multipart/form-data
| file* | body · file | |
| options | body · SheetOptionsForm |
Respuestas
- 200 OK
Inteligencia Artificial
POST/api/public/ai/anonymizeAnonimizar documento con IA
Mismos parámetros que /ai/anonymize. Valida y registra uso de IA del grupo.
Parámetros
| aiOptions* | query · string | |
| zones | query · string | |
| highQuality | query · boolean | |
| backgroundColor | query · string | |
| textContent | query · string | |
| censorHeightPadPx | query · integer |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
GET/api/public/ai/optionsOpciones de anonimización con IA
Lista las opciones disponibles del motor de IA (mismas que /ai/options).
Respuestas
- 200 OK
POST/api/public/ai/previewPreview de anonimización con IA
Mismos parámetros que /ai/preview. Requiere X-API-Key o JWT.
Parámetros
| aiOptions* | query · string | |
| highQuality | query · boolean | |
| backgroundColor | query · string | |
| textContent | query · string | |
| censorHeightPadPx | query · integer | |
| customWords | query · string | |
| patterns | query · string | |
| wordSetIds | query · string | |
| ocrPreprocess | query · boolean |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
Lotes (API pública)
GET/api/public/batch-jobsListar trabajos del usuario
Respuestas
- 200 OK
POST/api/public/batch-jobsEncolar lote de documentos
Parámetros
| config* | query · string | |
| configs | query · string | |
| signatureHints | query · string |
Cuerpo multipart/form-data
| files* | body · file[] |
Respuestas
- 200 OK
DELETE/api/public/batch-jobs/{id}Eliminar trabajo
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
GET/api/public/batch-jobs/{id}/outputDescargar PDF de un trabajo
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
GET/api/public/batch-jobs/{id}/output-bundleDescargar bundle ZIP de un trabajo pseudo
El mapa nunca va en claro: con la cabecera X-Map-Password se incluye cifrado (<documento>_pseudo-map.enc, mismo formato que /pseudo/export?format=enc); sin ella, solo LEEME-mapa.txt.
Parámetros
| id* | path · integer | |
| X-Map-Password | header · string |
Respuestas
- 200 OK
GET/api/public/batch-jobs/download-completedDescargar ZIP de trabajos completados
X-Map-Password (opcional) cifra los mapas pseudo incluidos. Un trabajo cuyo mapa no está en la bóveda y llega sin contraseña se conserva en la cola para no perder el mapa.
Parámetros
| X-Map-Password | header · string |
Respuestas
- 200 OK
Patrones de figura (API pública)
GET/api/public/figure-patternsListar patrones de figura del usuario
Respuestas
- 200 OK
POST/api/public/figure-patternsCrear patrón de figura
Cuerpo application/json · CreateFigurePatternDTO
Respuestas
- 200 OK
GET/api/public/figure-patterns/{id}Obtener patrón de figura por ID
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
PUT/api/public/figure-patterns/{id}Actualizar patrón de figura
Parámetros
| id* | path · integer |
Cuerpo application/json · CreateFigurePatternDTO
Respuestas
- 200 OK
DELETE/api/public/figure-patterns/{id}Eliminar patrón de figura
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
GET/api/public/figure-patterns/{id}/zonesZonas del patrón como RedactionZoneDTO
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
PDF tools (API pública)
POST/api/public/pdf-tools/analyze-text-layerAnalizar capa de texto del PDF
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/json
POST/api/public/pdf-tools/compressComprimir un PDF
Recomprime las imágenes embebidas a JPEG y reduce su resolución efectiva sin tocar el texto vectorial. level: low (calidad 0.85, máx. 200 ppp), medium (0.7, 150 ppp, por defecto) o high (0.5, 100 ppp). Si el resultado no es más pequeño se devuelve el original. Cabeceras X-Original-Size y X-Compressed-Size en bytes.
Parámetros
| level | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/pdf-tools/convert-to-pdfConvertir documento/imagen a PDF
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/pdf-tools/images-to-pdfImágenes a PDF
Parámetros
| files* | query · file[] |
Respuestas
- 200 OK
POST/api/public/pdf-tools/mergeFusionar PDFs
Parámetros
| files* | query · file[] |
Respuestas
- 200 OK
POST/api/public/pdf-tools/metadataEditar los metadatos de un PDF
metadata: JSON con los campos de /metadata/read; un campo null o vacío se borra. custom null conserva los personalizados y un objeto los sustituye (un valor null o vacío no se escribe). removeAll=true borra antes Info, XMP y personalizados. El XMP se elimina siempre para que no contradiga los valores nuevos.
Parámetros
| metadata | query · string | |
| removeAll | query · boolean |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/pdf-tools/metadata/readLeer los metadatos de un PDF
Devuelve título, autor, asunto, palabras clave, creador, productor, fechas de creación y modificación (ISO-8601 o null) y los campos personalizados (custom). No consume cupo.
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OKapplication/json
POST/api/public/pdf-tools/page-numbersNumerar las páginas de un PDF
position: bottom-center (por defecto), bottom-right, bottom-left, top-center, top-right o top-left, sobre la página tal como se ve (respeta el giro). format: plantilla con {n} (número de página + startNumber - 1) y {total} (páginas del documento), p. ej. "Página {n} de {total}"; por defecto {n}. startNumber: número que corresponde a la página 1 (1). fontSize: 6–48 (11). margin: distancia al borde en puntos (24). pages: páginas a numerar ("2-10"); vacía = todas.
Parámetros
| position | query · string | |
| format | query · string | |
| startNumber | query · integer | |
| fontSize | query · integer | |
| margin | query · number | |
| pages | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/pdf-tools/pdf-to-imagesConvertir páginas de un PDF a imágenes
format: jpg (por defecto) o png. dpi: 72–300 (por defecto 150). pages: expresión opcional ("1-3,5"); vacía = todas. Una sola página devuelve la imagen (pagina-N.jpg); varias, un ZIP paginas-imagenes.zip con pagina-001.jpg, pagina-002.jpg...
Parámetros
| format | query · string | |
| dpi | query · integer | |
| pages | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/pdf-tools/pdf-to-searchable-pdfPDF a PDF buscable (OCR)
Parámetros
| pages | query · integer[] |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/pdf-tools/splitExtraer páginas de un PDF
Parámetros
| pages* | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
Plan y uso
GET/api/public/dashboardDashboard del plan/uso del grupo
Respuestas
- 200 OK
GET/api/public/permissionsPermisos del grupo de la API key
Respuestas
- 200 OK
GET/api/public/planPlan del grupo asociado a la API key
Devuelve el plan/límites del grupo Anonimatum vinculado a la API key.
Respuestas
- 200 OK
GET/api/public/usage/currentUso del mes actual del grupo
Documentos/páginas consumidos en el mes en curso para el grupo de la API key.
Respuestas
- 200 OK
GET/api/public/usage/historyHistorial de uso del grupo
Respuestas
- 200 OK
GET/api/public/usage/remainingUso restante del mes
Respuestas
- 200 OK
POST/api/public/usage/validate-operationValidar si una operación está permitida
Parámetros
| operationType* | query · string |
Respuestas
- 200 OK
Pseudoanonimización (API pública)
POST/api/public/pseudo/anonymizePseudoanonimizar documento
outputMode: RASTER_TEXT (defecto) o VECTOR. Devuelve verification, vaultStored y contextId.
Parámetros
| profileId | query · string | |
| pseudoMethod | query · string | |
| seed | query · string | |
| projectId | query · string | |
| patterns | query · string | |
| wordSetIds | query · string | |
| wordSetMatchMode | query · string | |
| aiOptions | query · string | |
| customWords | query · string | |
| excludePatterns | query · string | |
| excludeWordSetIds | query · string | |
| excludeWordSetMatchMode | query · string | |
| exclusionWords | query · string | |
| excludeOfficeOccurrences | query · string | |
| highQuality | query · boolean | |
| selectedOriginals | query · string | |
| replacementOverrides | query · string | |
| redactionZones | query · string | |
| ocrPreprocess | query · boolean | |
| autoOcr | query · boolean | |
| outputMode | query · string | |
| methodsByType | query · string | |
| language | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
GET/api/public/pseudo/config/defaultsDefaults de configuración
Respuestas
- 200 OK
GET/api/public/pseudo/contextsContextos de la bóveda visibles para el usuario
Parámetros
| projectId | query · string |
Respuestas
- 200 OK
DELETE/api/public/pseudo/contexts/{contextId}Borrar un contexto de la bóveda
Parámetros
| contextId* | path · string |
Respuestas
- 200 OK
POST/api/public/pseudo/deanonymizeDesanonimizar con mapa o con contextId de la bóveda
Parámetros
| X-Map-Password | header · string | |
| password | query · string | |
| highQuality | query · boolean | |
| contextId | query · string |
Cuerpo multipart/form-data
| file* | body · file | |
| map | body · file |
Respuestas
- 200 OK
GET/api/public/pseudo/export/{contextId}Exportar mapa de contexto
Parámetros
| contextId* | path · string | |
| format | query · string | |
| X-Map-Password | header · string | |
| password | query · string |
Respuestas
- 200 OK
GET/api/public/pseudo/lookup/{contextId}Lookup valor original desde pseudo
Parámetros
| contextId* | path · string | |
| value* | query · string |
Respuestas
- 200 OK
POST/api/public/pseudo/previewPreview de pseudoanonimización
methodsByType: JSON {"<EntityType>":"<modo>"}; language: es|en|ca|gl|eu|ro.
Parámetros
| profileId | query · string | |
| pseudoMethod | query · string | |
| seed | query · string | |
| projectId | query · string | |
| patterns | query · string | |
| wordSetIds | query · string | |
| wordSetMatchMode | query · string | |
| aiOptions | query · string | |
| customWords | query · string | |
| excludePatterns | query · string | |
| excludeWordSetIds | query · string | |
| excludeWordSetMatchMode | query · string | |
| selectedOriginals | query · string | |
| replacementOverrides | query · string | |
| redactionZones | query · string | |
| ocrPreprocess | query · boolean | |
| autoOcr | query · boolean | |
| outputMode | query · string | |
| methodsByType | query · string | |
| language | query · string |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
POST/api/public/pseudo/preview-documentPrevisualizar una página pseudoanonimizada (application/pdf)
Mismos parámetros que /anonymize más page (1-based). Sin bóveda ni cuota. Solo PDF/imagen.
Parámetros
| profileId | query · string | |
| pseudoMethod | query · string | |
| seed | query · string | |
| projectId | query · string | |
| patterns | query · string | |
| wordSetIds | query · string | |
| wordSetMatchMode | query · string | |
| aiOptions | query · string | |
| customWords | query · string | |
| excludePatterns | query · string | |
| excludeWordSetIds | query · string | |
| excludeWordSetMatchMode | query · string | |
| highQuality | query · boolean | |
| selectedOriginals | query · string | |
| replacementOverrides | query · string | |
| redactionZones | query · string | |
| ocrPreprocess | query · boolean | |
| autoOcr | query · boolean | |
| outputMode | query · string | |
| methodsByType | query · string | |
| language | query · string | |
| page | query · integer |
Cuerpo multipart/form-data
| file* | body · file |
Respuestas
- 200 OK
GET/api/public/pseudo/profilesListar perfiles de pseudoanonimización
Respuestas
- 200 OK
GET/api/public/pseudo/profiles/{id}Detalle de perfil
Parámetros
| id* | path · string |
Respuestas
- 200 OK
Webhooks (API pública)
GET/api/public/webhooksWebhooks de esta API key
Respuestas
- 200 OK
POST/api/public/webhooksCrear webhook
Eventos: batch.completed, batch.failed, publication.completed, publication.failed. Devuelve el secreto de firma una sola vez. Firma: X-Anonimatum-Signature t=<unix>,v1=<hex HMAC-SHA256(secreto, t.cuerpo)>; rechaza marcas de más de 5 minutos.
Cuerpo application/json · WebhookRequest
Respuestas
- 200 OK
PUT/api/public/webhooks/{id}Cambiar webhook
Parámetros
| id* | path · integer |
Cuerpo application/json · WebhookRequest
Respuestas
- 200 OK
DELETE/api/public/webhooks/{id}Borrar webhook
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
GET/api/public/webhooks/{id}/deliveriesRegistro de entregas
Parámetros
| id* | path · integer | |
| limit | query · integer |
Respuestas
- 200 OK
POST/api/public/webhooks/{id}/rotate-secretNuevo secreto de firma
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
POST/api/public/webhooks/{id}/testEnviar prueba
Parámetros
| id* | path · integer |
Respuestas
- 200 OK
Webhooks
Un webhook avisa a tu sistema con un POST JSON firmado cuando termina un lote de la cola o una publicación. El aviso nunca lleva nombres de fichero, títulos, textos ni correos: solo identificadores, estados y, en los lotes, un enlace de descarga que se usa con tu API key.
Eventos
| batch.completed | Un trabajo de la cola termina bien: jobId, páginas y download.url (GET con X-API-Key). |
|---|---|
| batch.failed | Un trabajo de la cola falla: jobId y errorCategory (PLAN_EXPIRED, QUOTA, PERMISSION o PROCESSING), nunca el mensaje. |
| publication.completed | Una publicación en un gestor de expedientes o portal termina bien: publicationId, destino, estado HTTP y SHA-256. |
| publication.failed | Una publicación falla, con los mismos campos. |
| webhook.test | Solo al pulsar «Enviar prueba» o llamar a /{id}/test; no se puede suscribir. |
Alta con tu API key
POST /api/public/webhooks devuelve el secreto (whsec_…) una sola vez; guárdalo como variable de entorno. Un webhook creado con una API key solo recibe los eventos del usuario de esa clave; el administrador del grupo puede crear webhooks para todo el grupo desde el panel de la App. También: GET, PUT y DELETE /{id}, POST /{id}/rotate-secret, POST /{id}/test y GET /{id}/deliveries. Máximo 10 por grupo; la URL debe ser https.
curl -X POST https://api.anonimatum.com/api/public/webhooks \
-H "X-API-Key: $ANONIMATUM_API_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://erp.ejemplo.es/anonimatum/webhook","events":["batch.completed","batch.failed"]}'Verificar la firma
Cada aviso lleva la cabecera X-Anonimatum-Signature: t=<unix>,v1=<hex>, donde v1 es HMAC-SHA256 con el secreto completo (incluido el prefijo whsec_) sobre «t.cuerpo». También llegan X-Anonimatum-Event, X-Anonimatum-Event-Id y X-Anonimatum-Delivery.
- Lee el cuerpo crudo, sin parsear ni reformatear el JSON.
- Separa t y v1 de la cabecera y rechaza el aviso si t se aleja más de 300 segundos de tu reloj.
- Calcula HMAC-SHA256(secreto, t + "." + cuerpo) en hexadecimal y compáralo con v1 en tiempo constante.
- Deduplica por X-Anonimatum-Event-Id: un reintento trae el mismo id.
- Responde 2xx en menos de 5 segundos y procesa después.
Node.js (Express)
import crypto from "node:crypto";
import express from "express";
const app = express();
const SECRET = process.env.ANONIMATUM_WEBHOOK_SECRET; // whsec_… completo
app.post("/anonimatum/webhook", express.raw({ type: "application/json" }), (req, res) => {
const parts = Object.fromEntries(
(req.get("X-Anonimatum-Signature") ?? "").split(",").map((p) => p.split("=", 2))
);
const t = Number(parts.t);
if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > 300) return res.sendStatus(400);
const expected = crypto.createHmac("sha256", SECRET).update(t + ".").update(req.body).digest("hex");
const given = Buffer.from(parts.v1 ?? "", "utf8");
const ok = given.length === expected.length && crypto.timingSafeEqual(Buffer.from(expected, "utf8"), given);
if (!ok) return res.sendStatus(401);
// Deduplica por req.get("X-Anonimatum-Event-Id") y procesa después.
res.sendStatus(204);
});Python (Flask)
import hashlib, hmac, os, time
from flask import Flask, abort, request
app = Flask(__name__)
SECRET = os.environ["ANONIMATUM_WEBHOOK_SECRET"].encode() # whsec_… completo
@app.post("/anonimatum/webhook")
def webhook():
body = request.get_data() # cuerpo crudo, sin parsear
header = request.headers.get("X-Anonimatum-Signature", "")
parts = dict(p.split("=", 1) for p in header.split(",") if "=" in p)
try:
t = int(parts["t"])
except (KeyError, ValueError):
abort(400)
if abs(time.time() - t) > 300:
abort(400)
expected = hmac.new(SECRET, f"{t}.".encode() + body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, parts.get("v1", "")):
abort(401)
# Deduplica por request.headers["X-Anonimatum-Event-Id"] y procesa después.
return "", 204Cualquier respuesta que no sea 2xx (las redirecciones no se siguen) o que tarde más de 5 segundos cuenta como fallo. Tras el primer intento se reintenta a 1 min, 5 min, 30 min, 2 h y 6 h (6 intentos en total); el registro de entregas muestra el estado, el código HTTP y el siguiente intento.
Si prefieres no exponer un endpoint, consulta el estado de los lotes con GET /api/public/batch-jobs y descarga los terminados con GET /api/public/batch-jobs/{id}/output.
Conector MCP para asistentes de IA
Anonimatum expone la misma API como servidor MCP (Model Context Protocol). El asistente actúa con tu usuario y tu grupo, tras autorizarlo en la App.
URL del servidor MCP
https://gateway.politeiasoft.com/anonimatum/mcp
- Claude
- En claude.ai → Configuración → Conectores, añade un conector personalizado con la URL MCP y autoriza el acceso en la pantalla de consentimiento de Anonimatum.
- ChatGPT
- En chatgpt.com → Configuración → Conectores, añade la URL MCP y completa la autorización OAuth. La disponibilidad de conectores personalizados depende de tu plan de ChatGPT.
- Grok
- En grok.com → Conectores, añade la URL MCP y autoriza el acceso.
- Cursor, Claude Code y otros clientes MCP
- Si el cliente admite OAuth con redirección local, basta con la URL. Si no, usa la concesión manual en la App (Perfil → Conectores): te da un token y un mcp.json listo para pegar.
Herramientas que expone
listar_operaciones— Lista las operaciones disponibles para tu usuario (mismo catálogo que la referencia, sin administración ni endpoints internos).describir_operacion— Método, ruta, parámetros y cómo enviar ficheros a una operación.ejecutar_operacion— Ejecuta una operación; las respuestas binarias incluyen un enlace de descarga de un solo uso.iniciar_subida_fichero— Devuelve una URL de subida de un solo uso, recomendada para documentos grandes (hasta 250 MB).subir_fichero— Sube un fichero pequeño en Base64 en una sola llamada.iniciar_subida_por_partes / subir_parte_fichero— Subida por partes para clientes que no pueden hacer un POST directo.
Las operaciones irreversibles (borrar, desanonimizar) exigen confirmación explícita del usuario en ese turno. Con el plan expirado, el asistente recibe PLAN_EXPIRED y debe transmitir el mensaje sin reintentar. Puedes revocar cada conexión en Perfil → Conectores.
Ejemplo de mcp.json (concesión manual)
{
"mcpServers": {
"anonimatum": {
"url": "https://gateway.politeiasoft.com/anonimatum/mcp",
"headers": { "Authorization": "Bearer <token de la concesión manual>" }
}
}
}SDK
Acceso bajo petición
SDK oficiales para Python (síncrono y asyncio) y TypeScript/JavaScript (Node 18+) sobre esta misma referencia. El repositorio es privado: pide acceso a Politeia desde el formulario de contacto. También puedes generar un cliente a partir del OpenAPI.
¿Necesitas ayuda con la integración?
Cuéntanos tu caso (gestor documental, volumen, formatos) y te ayudamos a diseñar el flujo.
