API REST d'OpenJornada
Documentació tècnica completa per integrar OpenJornada amb altres sistemes. API RESTful amb autenticació JWT i respostes en format JSON.
URL base
Tots els endpoints estan sota el prefix /api. La documentació interactiva està disponible a /api/docs (Swagger UI) i /api/redoc (ReDoc).
Contingut
Autenticació
L'API utilitza tokens JWT (JSON Web Tokens) per a l'autenticació. Els tokens s'obtenen mitjançant l'endpoint /api/token i s'han d'incloure a la capçalera Authorization de totes les peticions protegides.
/api/tokenObtenir token d'accésAutentica un usuari administrador i retorna un token JWT.
# Request (form-data)
username: admin@example.com
password: tu_contraseña
# Response
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer"
}Ús del token
Inclou el token a totes les peticions protegides:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
/api/users/meUsuari actualRetorna la informació de l'usuari autenticat actualment.
/api/forgot-passwordSol·licitar restabliment de contrasenyaEnvia un correu amb instruccions per restablir la contrasenya (usuaris admin).
/api/reset-passwordRestablir contrasenyaRestableix la contrasenya utilitzant el token rebut per correu.
Treballadors
Gestió de treballadors: crear, actualitzar, llistar i eliminar treballadors. Els treballadors poden pertànyer a múltiples empreses.
/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"
}Empreses
Gestió d'empreses. Cada treballador ha d'estar associat com a mínim a una empresa. Les empreses no es poden eliminar si tenen treballadors associats.
/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)Registres de jornada
Registre d'entrada, sortida i pauses. El sistema detecta automàticament el tipus de registre basant-se en l'estat actual del treballador.
Tipus de registre
entry- Entrada/inici de jornadaexit- Sortida/fi de jornadapause_start- Inici de pausapause_end- Fi 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"
}Tipus de pausa
Configuració de tipus de pausa per empresa. Cada tipus pot ser "dins de jornada" (compta com a temps treballat) o "fora de jornada".
Tipus de pausa
inside_shift- Dins de jornada (descans remunerat)outside_shift- Fora de jornada (no remunerat)
/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"
}Incidències
Sistema de report d'incidències. Els treballadors poden reportar problemes i els administradors poden gestionar-los.
Estats d'incidència
pending- Pendent de revisióin_progress- En cursresolved- Resolta
/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)"
}Sol·licituds de canvi
Els treballadors poden sol·licitar correccions als seus registres de temps. Els administradors revisen i accepten/rebutgen les sol·licituds.
Estats de la sol·licitud
pending- Pendent de revisióaccepted- Acceptada i aplicadarejected- Rebutjada
/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)"
}Sol·licituds d'absència
Gestió d'absències i vacances. Els treballadors creen sol·licituds que els administradors accepten o rebutgen.
/absences/ AuthLlista les absències d'una empresa (admin). Filtra per estat, treballador i dates.- * company_id*, status, worker_id, start_date, end_date
/absences/Crea una sol·licitud d'absència. El treballador s'autentica amb correu/contrasenya.{
"email": "string",
"password": "string",
"company_id": "string",
"absence_type_code": "string",
"start_date": "YYYY-MM-DD",
"end_date": "YYYY-MM-DD",
"worker_comment": "string (optional)"
}/absences/meHistorial d'absències del treballador autenticat.{
"email": "string",
"password": "string",
"company_id": "string (optional)",
"status_filter": "pending|accepted|rejected|cancelled (optional)",
"limit": "number (optional)"
}/absences/attachmentsPuja un justificant (PDF o imatge, màx. 5 MB). Retorna attachment_id./absences/attachments/{attachment_id} AuthDescarrega un justificant per ID. Admin./absences/calendar AuthCalendari d'absències de l'equip (admin). Només absències acceptades.- * company_id*, start_date*, end_date*
/absences/{id} AuthAccepta o rebutja una sol·licitud (admin). Registra auditoria.{
"status": "accepted | rejected",
"admin_internal_notes": "string (optional)",
"admin_public_comment": "string (optional)"
}/absences/me/{id}/cancelCancel·la una sol·licitud pendent del propi treballador.{
"email": "string",
"password": "string"
}Polítiques d'absència
Configuració de la política d'absències per empresa. Esembra automàtica en el primer accés.
/absence-policies/{company_id} AuthObté la política d'absències d'una empresa./absence-policies/{company_id} AuthCrea o actualitza la política d'absències d'una empresa (admin).{
"annual_vacation_days": "number",
"computation_mode": "business_days | calendar_days",
"reference_year_mode": "calendar | hire_date",
"minimum_advance_days": "number",
"allow_half_day": "boolean",
"allow_hourly": "boolean",
"max_overlap": "number",
"absence_types": "array"
}Configuració
Configuració general de l'aplicació: correu de contacte i configuració de còpies de seguretat automàtiques.
/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"
}
}Còpies de seguretat
Gestió de còpies de seguretat. Suporta emmagatzematge local, S3 i SFTP. Les còpies es creen en format comprimit amb verificació d'integritat.
/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 (Drets ARCO)
Endpoints per al compliment del RGPD. Permeten exportar i anonimitzar dades de treballadors respectant els períodes legals de retenció.
Drets implementats
- Dret d'accés (Art. 15 RGPD)
- Dret a la portabilitat de les dades (Art. 20 RGPD)
- Dret a l'oblit (Art. 17 RGPD) - amb retenció 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
L'anonimització preserva els registres de jornada de forma anònima per complir l'obligació legal de conservar-los durant 4 anys (Art. 34.9 de l'Estatut dels Treballadors).
Codis d'error
| Codi | Descripció |
|---|---|
400 | Bad Request - Dades no vàlides o que falten |
401 | Unauthorized - Token no vàlid o caducat |
403 | Forbidden - Sense permisos per a aquesta acció |
404 | Not Found - Recurs no trobat |
409 | Conflict - Conflicte amb l'estat actual |
429 | Too Many Requests - Límit de peticions superat |
500 | Internal Server Error - Error del servidor |
La documentació interactiva completa està disponible a la teva instància d'OpenJornada.