API de Embed / Iframe
La API de Embed permite integrar el visor de extracciones de Docmind directamente en tu aplicación mediante un iframe seguro con tokens temporales.
Flujo de integración
- Crea un token de embed con los permisos deseados (
POST /api/embed/token/create) - Usa la URL del iframe devuelta (
/api/embed/view?token=...) - Escucha eventos postMessage del iframe para sincronizar tu aplicación
POST /api/embed/token/create
Crea un token de acceso temporal para visualizar una extracción en un iframe. Requiere JWT o API Key.
/api/embed/token/createHeaders
Content-Type: application/json
Authorization: Bearer JWT_TOKEN (o x-api-key: TU_API_KEY) Body (JSON)
{
"extraction_id": "b67162ac-8a79-4dc0-9bb5-87c245e4f779",
"permissions": {
"can_edit": true,
"can_download": true,
"can_change_status": true
},
"expires_in_hours": 24,
"allowed_origins": ["https://mi-aplicacion.com"]
} extraction_id: (obligatorio) ID de la extracción a visualizar.permissions: (opcional) Permisos del token: can_edit, can_download, can_change_status.expires_in_hours: (opcional) Horas de validez. Por defecto: 24.allowed_origins: (opcional) Lista de orígenes permitidos para el iframe.
Ejemplos
curl -X POST https://api-docmind.devol.es/api/embed/token/create \
-H "Content-Type: application/json" \
-H "x-api-key: TU_API_KEY" \
-d '{
"extraction_id": "b67162ac-8a79-4dc0-9bb5-87c245e4f779",
"permissions": {"can_edit": true, "can_download": true, "can_change_status": true},
"expires_in_hours": 24
}' Respuesta exitosa
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"embed_url": "https://api-docmind.devol.es/api/embed/view?token=eyJhbGciOiJIUzI1NiIs...",
"expires_at": "2025-07-25T15:30:00Z",
"permissions": {
"can_edit": true,
"can_download": true,
"can_change_status": true
}
} Devuelve el token y la URL completa para usar en el iframe.
Respuestas de error
400 Bad RequestFalta extraction_id o datos inválidos.
{"error": "extraction_id es obligatorio"}401 UnauthorizedToken JWT o API Key inválida.
{"error": "No autorizado"}404 Not FoundExtracción no encontrada.
{"error": "Extracción no encontrada"}500 Internal Server ErrorError al crear el token.
{"error": "Error interno del servidor"}POST /api/embed/token/{token_id}/invalidate
Invalida un token de embed existente para revocar el acceso.
/api/embed/token/{token_id}/invalidateHeaders
Authorization: Bearer JWT_TOKEN (o x-api-key: TU_API_KEY) Ejemplos
curl -X POST https://api-docmind.devol.es/api/embed/token/TOKEN_ID/invalidate \
-H "x-api-key: TU_API_KEY" Respuesta exitosa
{"message": "Token invalidado exitosamente"} El token queda inmediatamente inválido y no se puede usar más.
Respuestas de error
401 UnauthorizedNo autorizado.
{"error": "No autorizado"}404 Not FoundToken no encontrado.
{"error": "Token no encontrado"}GET /api/embed/tokens/{extraction_id}
Lista todos los tokens de embed activos para una extracción específica.
/api/embed/tokens/{extraction_id}Headers
Authorization: Bearer JWT_TOKEN (o x-api-key: TU_API_KEY) Ejemplos
curl -X GET https://api-docmind.devol.es/api/embed/tokens/EXTRACTION_ID \
-H "x-api-key: TU_API_KEY" Respuesta exitosa
{
"tokens": [
{
"id": "token-uuid-1",
"created_at": "2025-07-24T15:30:00Z",
"expires_at": "2025-07-25T15:30:00Z",
"is_active": true,
"permissions": {"can_edit": true, "can_download": true, "can_change_status": true}
}
],
"count": 1
} Lista de tokens activos con sus permisos y fechas de expiración.
Respuestas de error
401 UnauthorizedNo autorizado.
{"error": "No autorizado"}404 Not FoundExtracción no encontrada.
{"error": "Extracción no encontrada"}GET /api/embed/view
Renderiza la vista HTML del iframe para visualizar la extracción. Se accede directamente desde el navegador.
/api/embed/viewQuery Parameters
token: (obligatorio) Token de embed válido obtenido con POST /api/embed/token/create
Ejemplos
Devuelve una página HTML completa con el visor de la extracción. No es una respuesta JSON.
Respuestas de error
401 UnauthorizedToken inválido o expirado.
Página HTML de error404 Not FoundExtracción no encontrada.
Página HTML de errorGET /api/embed/data
Obtiene los datos de la extracción en formato JSON para uso dentro del iframe.
/api/embed/dataQuery Parameters
token: (obligatorio) Token de embed válido
Ejemplos
curl -X GET "https://api-docmind.devol.es/api/embed/data?token=TU_EMBED_TOKEN" Respuesta exitosa
{
"extraction": {
"id": "b67162ac-...",
"origin_name": "factura.pdf",
"status": "completado",
"fields": [...]
},
"permissions": {
"can_edit": true,
"can_download": true,
"can_change_status": true
}
} Datos de la extracción y permisos del token.
Respuestas de error
401 UnauthorizedToken inválido o expirado.
{"error": "Token inválido o expirado"}POST /api/embed/action
Ejecuta una acción dentro del iframe (editar campo, cambiar status, descargar).
/api/embed/actionHeaders
Content-Type: application/json Body (JSON)
{
"token": "TU_EMBED_TOKEN",
"action": "update_field",
"data": {
"field_id": "field-uuid-123",
"value": "nuevo valor"
}
} token: (obligatorio) Token de embed válido.action: (obligatorio) Acción: "update_field", "change_status", "download".data: (obligatorio) Datos de la acción (varía según la acción).
Ejemplos
curl -X POST https://api-docmind.devol.es/api/embed/action \
-H "Content-Type: application/json" \
-d '{
"token": "TU_EMBED_TOKEN",
"action": "update_field",
"data": {"field_id": "field-uuid-123", "value": "nuevo valor"}
}' Respuesta exitosa
{"message": "Acción ejecutada exitosamente", "result": {...}} Resultado de la acción ejecutada.
Respuestas de error
400 Bad RequestAcción inválida o datos faltantes.
{"error": "Acción no válida"}401 UnauthorizedToken inválido o sin permisos.
{"error": "No tienes permisos para esta acción"}403 ForbiddenEl token no tiene permisos para esta acción.
{"error": "Permiso can_edit no habilitado"}Eventos postMessage
El iframe envía eventos a la ventana padre mediante window.postMessage. Escúchalos para sincronizar tu aplicación:
window.addEventListener("message", (event) => {
if (event.origin !== "https://api-docmind.devol.es") return;
const { type, data } = event.data;
switch (type) {
case "docmind:field_updated":
console.log("Campo actualizado:", data.field_id, data.value);
break;
case "docmind:status_changed":
console.log("Status cambiado a:", data.status);
break;
case "docmind:download_requested":
console.log("Descarga solicitada");
break;
case "docmind:ready":
console.log("Iframe cargado y listo");
break;
}
}); Tipos de evento
docmind:ready— El iframe se cargó correctamentedocmind:field_updated— Un campo fue editado (data: field_id, value)docmind:status_changed— El status de la extracción cambió (data: status)docmind:download_requested— El usuario solicitó descargar el documentodocmind:error— Ocurrió un error (data: message)