API REST de OpenJornada
Documentacion tecnica completa para integrar OpenJornada con otros sistemas. API RESTful con autenticacion JWT y respuestas en formato JSON.
URL Base
Todos los endpoints estan bajo el prefijo /api. La documentacion interactiva esta disponible en /api/docs (Swagger UI) y /api/redoc (ReDoc).
Contenido
Autenticacion
La API utiliza tokens JWT (JSON Web Tokens) para la autenticacion. Los tokens se obtienen mediante el endpoint /api/token y deben incluirse en el header Authorization de todas las peticiones protegidas.
/api/tokenObtener token de accesoAutentica un usuario administrador y devuelve un token JWT.
# Request (form-data)
username: admin@example.com
password: tu_contraseña
# Response
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer"
}Uso del Token
Incluye el token en todas las peticiones protegidas:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
/api/users/meUsuario actualDevuelve la informacion del usuario autenticado actualmente.
/api/forgot-passwordSolicitar reset de passwordEnvia un email con instrucciones para restablecer la contrasena (usuarios admin).
/api/reset-passwordRestablecer passwordRestablece la contrasena usando el token recibido por email.
Trabajadores
Gestion de trabajadores: crear, actualizar, listar y eliminar trabajadores. Los trabajadores pueden pertenecer a multiples empresas.
/api/workers/ AuthListar todos los trabajadores activos/api/workers/ AuthCrear nuevo trabajador{
"first_name": "string",
"last_name": "string",
"email": "string",
"password": "string",
"id_number": "string (DNI/NIE)",
"phone_number": "string (opcional)",
"company_ids": [
"string"
],
"send_welcome_email": "boolean (opcional)"
}/api/workers/{worker_id} AuthObtener trabajador por ID/api/workers/{worker_id} AuthActualizar trabajador/api/workers/{worker_id} AuthEliminar trabajador (soft delete)/api/workers/change-passwordCambiar contrasena (endpoint publico para trabajadores){
"email": "string",
"current_password": "string",
"new_password": "string"
}/api/workers/forgot-passwordSolicitar reset de password de trabajador/api/workers/my-companiesObtener empresas del trabajador autenticado{
"email": "string",
"password": "string"
}Empresas
Gestion de empresas. Cada trabajador debe estar asociado al menos a una empresa. Las empresas no pueden eliminarse si tienen trabajadores asociados.
/api/companies/ AuthListar todas las empresas- • include_deleted: boolean (opcional)
/api/companies/ AuthCrear nueva empresa{
"name": "string"
}/api/companies/{company_id} AuthObtener empresa por ID/api/companies/{company_id} AuthActualizar empresa/api/companies/{company_id} AuthEliminar empresa (soft delete)Registros de Jornada
Registro de entrada, salida y pausas. El sistema detecta automaticamente el tipo de registro basandose en el estado actual del trabajador.
Tipos de Registro
entry- Entrada/inicio de jornadaexit- Salida/fin de jornadapause_start- Inicio de pausapause_end- Fin de pausa
/api/time-records/ AuthCrear registro de tiempo (entrada/salida/pausa){
"email": "string",
"password": "string",
"company_id": "string",
"action": "entry | exit | pause_start | pause_end (opcional)",
"pause_type_id": "string (requerido para pause_start)",
"timezone": "string (opcional, default: UTC)"
}/api/time-records/ AuthListar todos los registros (admin)- • start_date: YYYY-MM-DD
- • end_date: YYYY-MM-DD
- • company_id: string
- • worker_name: string
- • timezone: string
/api/time-records/worker/{worker_id} AuthRegistros de un trabajador especifico- • start_date: YYYY-MM-DD
- • end_date: YYYY-MM-DD
/api/time-records/current-statusEstado actual del trabajador (webapp){
"email": "string",
"password": "string",
"company_id": "string"
}/api/time-records/worker/historyHistorial del trabajador autenticado{
"email": "string",
"password": "string",
"company_id": "string",
"start_date": "YYYY-MM-DD",
"end_date": "YYYY-MM-DD"
}Tipos de Pausa
Configuracion de tipos de pausa por empresa. Cada tipo puede ser "dentro de jornada" (cuenta como tiempo trabajado) o "fuera de jornada".
Tipos de Pausa
inside_shift- Dentro de jornada (descanso remunerado)outside_shift- Fuera de jornada (no remunerado)
/api/pause-types/ AuthListar tipos de pausa- • include_deleted: boolean
- • company_id: string
/api/pause-types/ AuthCrear tipo de pausa{
"name": "string",
"type": "inside_shift | outside_shift",
"description": "string (opcional)",
"company_ids": [
"string"
]
}/api/pause-types/{pause_type_id} AuthActualizar tipo de pausa/api/pause-types/{pause_type_id} AuthEliminar tipo de pausa (soft delete)/api/pause-types/availablePausas disponibles para trabajador (webapp){
"email": "string",
"password": "string",
"company_id": "string"
}Incidencias
Sistema de reporte de incidencias. Los trabajadores pueden reportar problemas y los administradores pueden gestionarlos.
Estados de Incidencia
pending- Pendiente de revisionin_progress- En procesoresolved- Resuelta
/api/incidents/ AuthCrear incidencia (trabajador){
"email": "string",
"password": "string",
"description": "string"
}/api/incidents/ AuthListar incidencias- • status: pending|in_progress|resolved
- • worker_id: string
- • start_date: YYYY-MM-DD
- • end_date: YYYY-MM-DD
/api/incidents/{incident_id} AuthObtener incidencia por ID/api/incidents/{incident_id} AuthActualizar incidencia (admin){
"status": "pending | in_progress | resolved",
"admin_notes": "string (opcional)"
}Solicitudes de Cambio
Los trabajadores pueden solicitar correcciones en sus registros de tiempo. Los administradores revisan y aprueban/rechazan las solicitudes.
Estados de Solicitud
pending- Pendiente de revisionaccepted- Aceptada y aplicadarejected- Rechazada
/api/change-requests/ AuthCrear solicitud de cambio{
"email": "string",
"password": "string",
"time_record_id": "string",
"company_id": "string",
"date": "YYYY-MM-DD",
"new_timestamp": "ISO 8601 datetime",
"reason": "string"
}/api/change-requests/pending/check AuthVerificar si tiene solicitud pendiente/api/change-requests/ AuthListar solicitudes de cambio- • status: pending|accepted|rejected
- • worker_id: string
- • start_date: YYYY-MM-DD
- • end_date: YYYY-MM-DD
/api/change-requests/{id} AuthObtener solicitud por ID/api/change-requests/{id} AuthAprobar o rechazar solicitud{
"status": "accepted | rejected",
"admin_internal_notes": "string (opcional)",
"admin_public_comment": "string (opcional)"
}Configuracion
Configuracion general de la aplicacion: email de contacto y configuracion de backups automaticos.
/api/settings/ AuthObtener configuracion actual/api/settings/ AuthActualizar configuracion{
"contact_email": "string (opcional)",
"backup_config": {
"enabled": "boolean",
"schedule": {
"hour": "number",
"minute": "number"
},
"retention_days": "number",
"storage_type": "local | s3 | sftp"
}
}Backups
Gestion de copias de seguridad. Soporta almacenamiento local, S3 y SFTP. Los backups se realizan en formato comprimido con verificacion de integridad.
/api/backups/ AuthListar todos los backups/api/backups/trigger AuthCrear backup manual/api/backups/{backup_id} AuthObtener detalles de backup/api/backups/{backup_id} AuthEliminar backup/api/backups/{backup_id}/restore AuthRestaurar desde backup{
"confirm": "boolean (debe ser true)"
}/api/backups/{backup_id}/download AuthDescargar backup (local storage)/api/backups/{backup_id}/download-url AuthObtener URL de descarga (S3)/api/backups/test-connection AuthProbar conexion de almacenamiento/api/backups/schedule/status AuthEstado de backups programadosRGPD (Derechos ARCO)
Endpoints para cumplimiento del RGPD. Permiten exportar y anonimizar datos de trabajadores respetando los periodos legales de retencion.
Derechos Implementados
- Derecho de acceso (Art. 15 RGPD)
- Derecho a la portabilidad (Art. 20 RGPD)
- Derecho al olvido (Art. 17 RGPD) - con retencion legal
/api/gdpr/worker/{worker_id}/export AuthExportar todos los datos del trabajador/api/gdpr/worker/{worker_id}/data AuthObtener datos personales (simplificado)/api/gdpr/worker/{worker_id}/anonymize AuthAnonimizar datos del trabajador{
"reason": "string (min 5 caracteres)"
}Importante
La anonimizacion preserva los registros de jornada de forma anonima para cumplir con la obligacion legal de conservarlos durante 4 anos (Art. 34.9 del Estatuto de los Trabajadores).
Codigos de Error
| Codigo | Descripcion |
|---|---|
400 | Bad Request - Datos invalidos o faltantes |
401 | Unauthorized - Token invalido o expirado |
403 | Forbidden - Sin permisos para esta accion |
404 | Not Found - Recurso no encontrado |
409 | Conflict - Conflicto con estado actual |
429 | Too Many Requests - Rate limit excedido |
500 | Internal Server Error - Error del servidor |
La documentacion interactiva completa esta disponible en tu instancia de OpenJornada.