Developers · Public API 1.9.0
Integrate Anonimatum into your systems
REST API with a stable contract under /api/public/**, downloadable OpenAPI reference and an MCP connector for AI assistants. The same engine as the App, in the European Union.
Quick start
Three steps: create the API key, check it and anonymize your first document.
- Create an API key in the App: Profile → API keys → «Generate API key». Copy it right away: it is not shown again. If you do not see the section, your plan does not include API access or your group administrator manages it.
- Store it as an environment variable and check your group's plan with GET /api/public/plan.
- Send the document to POST /api/public/ai/anonymize with the AI options you need. The response is the anonymized document in its original format.
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.pdfParameters of multipart endpoints are sent as form fields (-F). Usage is deducted from the plan of the key's group.
Authentication
- X-API-Key
- Header for machine-to-machine integrations. Each key belongs to a user and a group: it uses their permissions, plan and quota.
- Authorization: Bearer
- User session JWT, the same the App uses. Useful if you embed Anonimatum in an application with Politeia sign-in.
- Isolation
- A resource from another group returns 404, never 403: the API does not reveal whether it exists.
- Revocation
- Revoke a key in Profile → API keys; it stops working immediately. Never commit keys to code or repositories.
Limits
Technical limits in version 1.9.0 (per IP address or per request):
| 300 / min | Requests to /api/public/** per IP. |
|---|---|
| 60 / min | Anonymizations (anonymize-patterns, -zones, -complete, -whitelist) per IP. |
| 250 MB | Maximum file size per request. |
| 20 MB · 100,000 rows · 200 columns · 50 sheets | Spreadsheets by column (/api/public/sheets/**). |
Each operation also deducts pages or documents from the group's plan. Check usage with GET /api/public/usage/current and /usage/remaining, or validate beforehand with POST /usage/validate-operation.
Errors
Errors use the standard format { errorCode, message, status }. The most common ones:
| 400 INVALID_REQUEST | Missing or malformed parameter, empty file or unsupported type. |
|---|---|
| 401 UNAUTHORIZED | Missing API key or JWT, or the key has been revoked. |
| 403 PLAN_EXPIRED | The group's plan has expired. Every quota-consuming operation is rejected; downloading results already produced and de-anonymizing remain available. Do not retry. |
| 403 INSUFFICIENT_PERMISSIONS / FORBIDDEN | The key is not allowed to run that operation or the user has no active plan. |
| 404 NOT_FOUND | The resource does not exist or belongs to another group. |
| 409 CONFLICT | Conflict with the current state (e.g. duplicate name). |
| 413 SHEET_LIMIT_EXCEEDED | The spreadsheet exceeds the allowed size, rows, columns or sheets. |
| 415 SHEET_FORMAT_UNSUPPORTED | The file sent to /sheets/** is not a spreadsheet (xlsx, xls, ods, csv). |
| 429 | Monthly or yearly plan quota exhausted (errorCode FORBIDDEN with the limit in the message) or per-minute request limit (body { error, status }). |
| 500 INTERNAL_ERROR | Unexpected error. If it persists, write to us with the time and 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
}Branch on errorCode, not on the message text, which may change or be translated.
OpenAPI reference
Generated from the 1.9.0 backend (springdoc group «public-api»), only /api/public/** routes; no internal or admin endpoints.
85 operations across 71 routes · Download OpenAPI 3.1 (JSON). Import it into Postman, Insomnia, Bruno or your OpenAPI client generator. Endpoint descriptions come from the API source and are in Spanish.
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
Parameters
| 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 |
Body multipart/form-data
| file* | body · file | Archivo PDF a anonimizar |
Responses
- 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}
Parameters
| 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 |
Body multipart/form-data
| file* | body · file | Archivo PDF a anonimizar |
Responses
- 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)
Parameters
| patterns | query · string | |
| redactionZones | query · string | |
| highQuality | query · boolean |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-completeAnonimización completa (patrones + zonas)
Parameters
| patterns | query · string | |
| redactionZones* | query · string | |
| wordSetIds | query · integer[] | |
| wordSetMatchMode | query · string | |
| highQuality | query · boolean |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-complete-inverseAnonimización completa inversa
Parameters
| patterns | query · string | |
| redactionZones* | query · string | |
| wordSetIds | query · integer[] | |
| wordSetMatchMode | query · string | |
| excludePatterns | query · string | |
| excludeWordSetIds | query · integer[] | |
| excludeWordSetMatchMode | query · string | |
| highQuality | query · boolean |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-specific-zonesAnonimizar zonas específicas (IA / coordenadas)
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-whitelistAnonimización por lista blanca
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/pdf
POST/api/public/documents/anonymize-zonesAnonimizar solo zonas
Parameters
| redactionZones* | query · string | |
| highQuality | query · boolean |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/pdf
POST/api/public/documents/previewPreview de anonimización
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/json
POST/api/public/documents/preview-inversePreview inversa (lista blanca)
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OKapplication/json
POST/api/public/documents/result/searchableResultado buscable (OCR sobre PDF anonimizado)
Body multipart/form-data
| file* | body · file |
Responses
- 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.
Responses
- 200 OK
GET/api/public/cases/{id}Estado de un expediente y de cada documento
UPLOADED, QUEUED, PROCESSING, DONE o FAILED por documento.
Parameters
| id* | path · integer |
Responses
- 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.
Parameters
| id* | path · integer |
Responses
- 200 OK
Formatos (API pública)
POST/api/public/formats/email/analyzeAnalizar un correo (.eml/.msg)
Cabeceras, cuerpo y adjuntos. Sin cupo.
Body multipart/form-data
| file* | body · file |
Responses
- 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.
Body multipart/form-data
| file* | body · file | |
| options | body · FormatOptionsForm |
Responses
- 200 OK
POST/api/public/formats/tiff/from-pdfPDF anonimizado → TIFF multipágina
Cupo de herramientas PDF.
Parameters
| dpi | query · integer | |
| colorMode | query · string |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
POST/api/public/formats/word/editableWord editable (.docx/.odt)
Documento con los datos sustituidos en el propio texto, verificado contra fugas.
Body multipart/form-data
| file* | body · file | |
| options | body · FormatOptionsForm |
Responses
- 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
Parameters
| page | query · integer | Número de página (empezando en 1) |
| size | query · integer | Elementos por página |
Responses
- 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
Body application/json · PatternRequestDTO
Responses
- 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.
Parameters
| id* | path · integer | 🆔 ID único del patrón |
Responses
- 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.
Parameters
| id* | path · integer | 🆔 ID del patrón a actualizar |
Body application/json · PatternRequestDTO
Responses
- 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.
Parameters
| id* | path · integer | 🆔 ID del patrón a eliminar |
Responses
- 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
Responses
- 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
Body application/json · WordSetRequestDTO
Responses
- 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.
Parameters
| id* | path · integer | 🆔 ID único del wordset |
Responses
- 200 OK
PUT/api/public/wordsets/{id}Actualizar Wordset
Modificación de Wordset:
Permite actualizar un wordset existente incluyendo su lista de palabras.
Parameters
| id* | path · integer | 🆔 ID del wordset a actualizar |
Body application/json · WordSetRequestDTO
Responses
- 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.
Parameters
| id* | path · integer | 🆔 ID del wordset a eliminar |
Responses
- 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.
Parameters
| 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) |
Responses
- 200 OK
POST/api/public/wordsets/{id}/wordsAgregar Palabra a Wordset
Gestión de Palabras Individual:
Agrega una nueva palabra a un wordset existente.
Parameters
| id* | path · integer | 🆔 ID del wordset |
| word* | query · string | Palabra a agregar |
Responses
- 200 OK
DELETE/api/public/wordsets/{id}/wordsEliminar Palabra de Wordset
Gestión de Palabras Individual:
Elimina una palabra específica de un wordset.
Parameters
| id* | path · integer | 🆔 ID del wordset |
| word* | query · string | Palabra a eliminar |
Responses
- 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.
Parameters
| hasHeader | query · boolean | |
| sampleRows | query · integer | |
| useAi | query · boolean |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
POST/api/public/sheets/previewVista previa del tratamiento por columnas
Sin cupo.
Body multipart/form-data
| file* | body · file | |
| options | body · SheetOptionsForm |
Responses
- 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.
Body multipart/form-data
| file* | body · file | |
| options | body · SheetOptionsForm |
Responses
- 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.
Parameters
| aiOptions* | query · string | |
| zones | query · string | |
| highQuality | query · boolean | |
| backgroundColor | query · string | |
| textContent | query · string | |
| censorHeightPadPx | query · integer |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
GET/api/public/ai/optionsOpciones de anonimización con IA
Lista las opciones disponibles del motor de IA (mismas que /ai/options).
Responses
- 200 OK
POST/api/public/ai/previewPreview de anonimización con IA
Mismos parámetros que /ai/preview. Requiere X-API-Key o JWT.
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
Lotes (API pública)
GET/api/public/batch-jobsListar trabajos del usuario
Responses
- 200 OK
POST/api/public/batch-jobsEncolar lote de documentos
Parameters
| config* | query · string | |
| configs | query · string | |
| signatureHints | query · string |
Body multipart/form-data
| files* | body · file[] |
Responses
- 200 OK
DELETE/api/public/batch-jobs/{id}Eliminar trabajo
Parameters
| id* | path · integer |
Responses
- 200 OK
GET/api/public/batch-jobs/{id}/outputDescargar PDF de un trabajo
Parameters
| id* | path · integer |
Responses
- 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.
Parameters
| id* | path · integer | |
| X-Map-Password | header · string |
Responses
- 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.
Parameters
| X-Map-Password | header · string |
Responses
- 200 OK
Patrones de figura (API pública)
GET/api/public/figure-patternsListar patrones de figura del usuario
Responses
- 200 OK
POST/api/public/figure-patternsCrear patrón de figura
Body application/json · CreateFigurePatternDTO
Responses
- 200 OK
GET/api/public/figure-patterns/{id}Obtener patrón de figura por ID
Parameters
| id* | path · integer |
Responses
- 200 OK
PUT/api/public/figure-patterns/{id}Actualizar patrón de figura
Parameters
| id* | path · integer |
Body application/json · CreateFigurePatternDTO
Responses
- 200 OK
DELETE/api/public/figure-patterns/{id}Eliminar patrón de figura
Parameters
| id* | path · integer |
Responses
- 200 OK
GET/api/public/figure-patterns/{id}/zonesZonas del patrón como RedactionZoneDTO
Parameters
| id* | path · integer |
Responses
- 200 OK
PDF tools (API pública)
POST/api/public/pdf-tools/analyze-text-layerAnalizar capa de texto del PDF
Body multipart/form-data
| file* | body · file |
Responses
- 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.
Parameters
| level | query · string |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
POST/api/public/pdf-tools/convert-to-pdfConvertir documento/imagen a PDF
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
POST/api/public/pdf-tools/images-to-pdfImágenes a PDF
Parameters
| files* | query · file[] |
Responses
- 200 OK
POST/api/public/pdf-tools/mergeFusionar PDFs
Parameters
| files* | query · file[] |
Responses
- 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.
Parameters
| metadata | query · string | |
| removeAll | query · boolean |
Body multipart/form-data
| file* | body · file |
Responses
- 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.
Body multipart/form-data
| file* | body · file |
Responses
- 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.
Parameters
| position | query · string | |
| format | query · string | |
| startNumber | query · integer | |
| fontSize | query · integer | |
| margin | query · number | |
| pages | query · string |
Body multipart/form-data
| file* | body · file |
Responses
- 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...
Parameters
| format | query · string | |
| dpi | query · integer | |
| pages | query · string |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
POST/api/public/pdf-tools/pdf-to-searchable-pdfPDF a PDF buscable (OCR)
Parameters
| pages | query · integer[] |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
POST/api/public/pdf-tools/splitExtraer páginas de un PDF
Parameters
| pages* | query · string |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
Plan y uso
GET/api/public/dashboardDashboard del plan/uso del grupo
Responses
- 200 OK
GET/api/public/permissionsPermisos del grupo de la API key
Responses
- 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.
Responses
- 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.
Responses
- 200 OK
GET/api/public/usage/historyHistorial de uso del grupo
Responses
- 200 OK
GET/api/public/usage/remainingUso restante del mes
Responses
- 200 OK
POST/api/public/usage/validate-operationValidar si una operación está permitida
Parameters
| operationType* | query · string |
Responses
- 200 OK
Pseudoanonimización (API pública)
POST/api/public/pseudo/anonymizePseudoanonimizar documento
outputMode: RASTER_TEXT (defecto) o VECTOR. Devuelve verification, vaultStored y contextId.
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
GET/api/public/pseudo/config/defaultsDefaults de configuración
Responses
- 200 OK
GET/api/public/pseudo/contextsContextos de la bóveda visibles para el usuario
Parameters
| projectId | query · string |
Responses
- 200 OK
DELETE/api/public/pseudo/contexts/{contextId}Borrar un contexto de la bóveda
Parameters
| contextId* | path · string |
Responses
- 200 OK
POST/api/public/pseudo/deanonymizeDesanonimizar con mapa o con contextId de la bóveda
Parameters
| X-Map-Password | header · string | |
| password | query · string | |
| highQuality | query · boolean | |
| contextId | query · string |
Body multipart/form-data
| file* | body · file | |
| map | body · file |
Responses
- 200 OK
GET/api/public/pseudo/export/{contextId}Exportar mapa de contexto
Parameters
| contextId* | path · string | |
| format | query · string | |
| X-Map-Password | header · string | |
| password | query · string |
Responses
- 200 OK
GET/api/public/pseudo/lookup/{contextId}Lookup valor original desde pseudo
Parameters
| contextId* | path · string | |
| value* | query · string |
Responses
- 200 OK
POST/api/public/pseudo/previewPreview de pseudoanonimización
methodsByType: JSON {"<EntityType>":"<modo>"}; language: es|en|ca|gl|eu|ro.
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 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.
Parameters
| 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 |
Body multipart/form-data
| file* | body · file |
Responses
- 200 OK
GET/api/public/pseudo/profilesListar perfiles de pseudoanonimización
Responses
- 200 OK
GET/api/public/pseudo/profiles/{id}Detalle de perfil
Parameters
| id* | path · string |
Responses
- 200 OK
Webhooks (API pública)
GET/api/public/webhooksWebhooks de esta API key
Responses
- 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.
Body application/json · WebhookRequest
Responses
- 200 OK
PUT/api/public/webhooks/{id}Cambiar webhook
Parameters
| id* | path · integer |
Body application/json · WebhookRequest
Responses
- 200 OK
DELETE/api/public/webhooks/{id}Borrar webhook
Parameters
| id* | path · integer |
Responses
- 200 OK
GET/api/public/webhooks/{id}/deliveriesRegistro de entregas
Parameters
| id* | path · integer | |
| limit | query · integer |
Responses
- 200 OK
POST/api/public/webhooks/{id}/rotate-secretNuevo secreto de firma
Parameters
| id* | path · integer |
Responses
- 200 OK
POST/api/public/webhooks/{id}/testEnviar prueba
Parameters
| id* | path · integer |
Responses
- 200 OK
Webhooks
A webhook notifies your system with a signed JSON POST when a queue batch or a publication finishes. The notification never carries file names, titles, text or email addresses: only identifiers, statuses and, for batches, a download link used with your API key.
Events
| batch.completed | A queue job finishes successfully: jobId, pages and download.url (GET with X-API-Key). |
|---|---|
| batch.failed | A queue job fails: jobId and errorCategory (PLAN_EXPIRED, QUOTA, PERMISSION or PROCESSING), never the message. |
| publication.completed | A publication to a case management system or portal succeeds: publicationId, destination, HTTP status and SHA-256. |
| publication.failed | A publication fails, with the same fields. |
| webhook.test | Only when you press «Send test» or call /{id}/test; it cannot be subscribed to. |
Register with your API key
POST /api/public/webhooks returns the secret (whsec_…) only once; store it as an environment variable. A webhook created with an API key only receives that key's user events; the group administrator can create group-wide webhooks from the App panel. Also: GET, PUT and DELETE /{id}, POST /{id}/rotate-secret, POST /{id}/test and GET /{id}/deliveries. Up to 10 per group; the URL must be 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"]}'Verify the signature
Each notification carries the X-Anonimatum-Signature: t=<unix>,v1=<hex> header, where v1 is HMAC-SHA256 keyed with the full secret (including the whsec_ prefix) over «t.body». X-Anonimatum-Event, X-Anonimatum-Event-Id and X-Anonimatum-Delivery are also sent.
- Read the raw body, without parsing or reformatting the JSON.
- Split t and v1 from the header and reject the notification if t is more than 300 seconds away from your clock.
- Compute HMAC-SHA256(secret, t + "." + body) as hex and compare it with v1 in constant time.
- Deduplicate by X-Anonimatum-Event-Id: a retry carries the same id.
- Answer 2xx within 5 seconds and process afterwards.
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 "", 204Any non-2xx response (redirects are not followed) or one slower than 5 seconds counts as a failure. After the first attempt, retries happen at 1 min, 5 min, 30 min, 2 h and 6 h (6 attempts in total); the delivery log shows the status, HTTP code and next attempt.
If you would rather not expose an endpoint, poll batch status with GET /api/public/batch-jobs and download finished jobs with GET /api/public/batch-jobs/{id}/output.
MCP connector for AI assistants
Anonimatum exposes the same API as an MCP (Model Context Protocol) server. The assistant acts as your user and group after you authorize it in the App.
MCP server URL
https://gateway.politeiasoft.com/anonimatum/mcp
- Claude
- In claude.ai → Settings → Connectors, add a custom connector with the MCP URL and authorize access on Anonimatum's consent screen.
- ChatGPT
- In chatgpt.com → Settings → Connectors, add the MCP URL and complete the OAuth authorization. Custom connector availability depends on your ChatGPT plan.
- Grok
- In grok.com → Connectors, add the MCP URL and authorize access.
- Cursor, Claude Code and other MCP clients
- If the client supports OAuth with a local redirect, the URL is enough. Otherwise use the manual grant in the App (Profile → Connectors): it gives you a token and a ready-to-paste mcp.json.
Tools it exposes
listar_operaciones— Lists the operations available to your user (same catalogue as the reference, without admin or internal endpoints).describir_operacion— Method, path, parameters and how to send files for an operation.ejecutar_operacion— Runs an operation; binary responses include a single-use download link.iniciar_subida_fichero— Returns a single-use upload URL, recommended for large documents (up to 250 MB).subir_fichero— Uploads a small file as Base64 in a single call.iniciar_subida_por_partes / subir_parte_fichero— Chunked upload for clients that cannot POST directly.
Irreversible operations (delete, de-anonymize) require the user's explicit confirmation in that turn. With an expired plan the assistant receives PLAN_EXPIRED and must relay the message without retrying. You can revoke each connection in Profile → Connectors.
Sample mcp.json (manual grant)
{
"mcpServers": {
"anonimatum": {
"url": "https://gateway.politeiasoft.com/anonimatum/mcp",
"headers": { "Authorization": "Bearer <token de la concesión manual>" }
}
}
}SDK
Access on request
Official SDKs for Python (sync and asyncio) and TypeScript/JavaScript (Node 18+) built on this same reference. The repository is private: ask Politeia for access through the contact form. You can also generate a client from the OpenAPI file.
Need help with your integration?
Tell us about your case (document management system, volume, formats) and we will help you design the flow.
