Plataforma
API y webhooks
Todo lo que hace el panel pasa por la misma API REST que cualquiera puede llamar. Los eventos salen como webhooks firmados que se reintentan hasta que llegan.
Autenticación
- La cookie de sesión emitida por el flujo de código de un solo uso, o el mismo token firmado como cabecera bearer.
- Un token de API personal como cabecera bearer. Actúa como su titular, de modo que todas las comprobaciones de rol y alcance se aplican sin cambios; a los tokens de ámbito de lectura se les rechazan las mutaciones.
- Cada ruta declara su rol mínimo: cualquier usuario autenticado, gerente o superior, administrador o superadministrador. Las rutas de datos acotan después por el árbol de quien llama.
curl -H "Authorization: Bearer <token>" https://inroots.example.com/api/export/hours.csv?from=2026-08-01&to=2026-08-31
Descubrirla
El esquema OpenAPI se genera a partir de las rutas y se sirve, restringido a administradores, con un explorador interactivo dentro del producto. Los resúmenes y descripciones proceden de las definiciones de las rutas, así que no pueden desviarse del código.
GET /api/openapi.json GET /api/docs
| Eficiencia, Objetivos, Salud laboral, Línea de tiempo | puntuaciones, metas, referencias, objetivos, señales sobre personas, riesgo de sobrecarga, evidencia de un día |
|---|---|
| Permisos, Guardias, Equipos, Festivos | reglas y solicitudes de permiso, rotaciones y cobertura, ajustes de equipo, calendarios |
| Mensajes directos, Contacto, Consentimiento | envíos y programaciones, datos de contacto, acuerdos y firmas |
| Proveedores de IA, Informes, Alertas | cambio de proveedor y orden de conmutación, exportaciones PDF, transporte de correo |
| Integraciones, Exportación | tokens, webhooks, CSV |
| ML | predict, feedback, decisions, metrics, models, promote, train |
Webhooks salientes
- Se crean con una URL de destino y un secreto que nunca vuelve a devolverse; la lista muestra solo si existe un secreto.
- Cada entrega lleva una cabecera de firma con un HMAC SHA-256 sobre el cuerpo exacto, una cabecera de evento y un ID de entrega para deduplicar.
- La emisión viaja en la transacción de quien llama, de modo que un evento nunca se entrega por una decisión que se revirtió, y un endpoint receptor caído nunca bloquea una aprobación.
- Una tarea de vaciado publica cada minuto y reintenta a 1, 5, 15, 60 y 360 minutos antes de abandonar con el motivo registrado. Veinte fallos consecutivos abren el circuito del endpoint hasta que un administrador lo vuelve a habilitar.
- El botón de prueba encola un ping firmado por la ruta real. Eventos emitidos actualmente: pto.approved y pto.declined.
expected = hmac.new(secret, body, sha256).hexdigest() compare(header, "sha256=" + expected)
Entrantes
- Eventos y acciones interactivas de Slack; actividades de Teams; el webhook de WhatsApp.
- Tickets de soporte desde sistemas externos, deduplicados por una referencia externa para que los seguimientos actualicen un único ticket.
- Cualquier webhook puede disparar un flujo de trabajo de n8n que llame de vuelta a la API con un token.
Flujo en vivo
Un flujo de eventos enviados por el servidor lleva los eventos de asistencia y las notificaciones personales al panel y a cualquier cliente que se escriba. Los eventos personales llegan solo a la persona a la que conciernen.
GET /api/events