Webhooks de Talana

Los Webhooks de Talana permiten integraciones ágiles y eficientes al ofrecer notificaciones en tiempo real de los eventos críticos del sistema, evitando el polling constante hacia nuestra API.

¿Qué son y cómo funcionan?

Los webhooks funcionan como una notificación de empuje (push notification). Cuando ocurre un evento en Talana (por ejemplo, la creación, modificación o eliminación de un recurso), nuestro sistema realiza una solicitud HTTP POST al endpoint que hayas definido previamente, con Content-Type: application/json.

El cuerpo del mensaje (payload) incluye la información detallada del evento, permitiendo que su aplicación procese los cambios de forma instantánea.

Los webhooks cuentan con un timeout configurado de 600 segundos (10 minutos) para la recepción de respuestas por parte de los sistemas integradores. Esto con el objetivo de mejorar la estabilidad y confiabilidad del procesamiento de eventos, especialmente en escenarios donde existen demoras operacionales, alta concurrencia o procesos downstream más extensos.

Reintentos: los webhooks de Talana no cuentan con reintentos automáticos. Si tu endpoint responde con un código HTTP >= 400, el error queda registrado en los logs de Talana, pero el evento no se reenvía. Se recomienda que tu integración devuelva 2xx rápidamente y procese el payload de forma asíncrona si es necesario.

Autenticación y seguridad

La seguridad de los datos es una prioridad para Talana. Por ello, todos los endpoints que reciban notificaciones deben implementar Autenticación Básica (Basic Auth).

Durante la configuración, deberás proporcionar las credenciales (usuario y contraseña), las cuales se incluirán en el encabezado de la solicitud HTTP.

Authorization: Basic (username:password)

Importante: Este método permite que tu servicio verifique que la notificación proviene legítimamente de la plataforma de Talana.

Cómo solicitar

  1. Comunícate con el SAC para que puedan derivarte al equipo de Back.
  2. El equipo de Back configurará el webhook que necesites, según los modelos que se muestran más abajo.
  3. Se te comunicará cuando el webhook esté configurado.

Estructura del mensaje

Todos los eventos comparten esta estructura de envoltura (envelope):

{
  "type": "<nombre del modelo>",
  "event": "created | modified | deleted",
  "companyId": 123,
  "instance": { ... }
}
CampoTipoDescripción
typestringNombre del modelo que disparó el evento (ej: "persona")
eventstring"created", "modified" o "deleted"
companyIdintegerID interno de la empresa en Talana
instanceobjectObjeto serializado con todos los campos del modelo

Eventos disponibles

ModeloEventos disponiblesDescripción breve
personacreated, modified, deletedCambios en la ficha del trabajador
personaEmpresacreated, modified, deletedContrato / relación laboral del trabajador con la empresa
vacacionesSolicitudcreated, modified, deletedSolicitudes y cambios de vacaciones
razonSocialcreated, modified, deletedCambios en los datos de la razón social
personaAusenciacreated, modified, deletedCreación, modificación o eliminación de ausencias
centroCostocreated, modified, deletedActualizaciones en centros de costo
sucursalcreated, modified, deletedCambios en sucursales
unidadOrganizacionalcreated, modified, deletedCambios en gerencias o áreas
documentocreated, modified, deletedCreación, modificación o eliminación de documentos
SigningRequestcreated, modified, deletedEventos del proceso de firma digital (a nivel de solicitud)
SigningRequestDetailcreatedCambios de estado por firmante dentro de una solicitud de firma

Modelos de Webhooks

Cada webhook incluye en el campo instance un objeto JSON con la información del modelo afectado. A continuación se detallan los modelos disponibles.


1. persona — Trabajador

Disparado cuando se crea, modifica o elimina un trabajador.

{
  "id": 1234,
  "fechaCreacion": "2024-01-15T10:30:00Z",
  "rut": "12345678-9",
  "nombre": "Juan",
  "apellidoPaterno": "González",
  "apellidoMaterno": "Pérez",
  "sexo": "M",
  "fechaNacimiento": "1990-05-20",
  "nacionalidad": 1,
  "username": "[email protected]",
  "email": "[email protected]",
  "anexo": "123",
  "permisos": [
    { "nombre": "Permiso A", "vigente": true }
  ],
  "detalles": [
    {
      "id": 5678,
      "foto": "url/to/photo.jpg",
      "idiomas": [{ "id": 0, "nombre": "string" }],
      "codigoUbicacion": "CL-RM",
      "fechaCreacion": "2024-01-15T10:30:00Z",
      "validoDesde": "2024-01-15",
      "email": "[email protected]",
      "emailPersonal": "[email protected]",
      "telefono": "+56222345678",
      "celular": "+56912345678",
      "direccionCalle": "Av. Principal",
      "direccionNumero": "123",
      "direccionDepartamento": "4B",
      "nivelEducacional": "sin info",
      "colegio": "string",
      "institucionEstudiosSuperiores": "string",
      "profesion": "Ingeniero",
      "observaciones": "string",
      "contactosDeEmergencia": "string",
      "sangre": "ap",
      "alergias": "string",
      "discapacidades": "string",
      "enfermedades_cronicas": "string",
      "medicamentos_permanentes": "string",
      "direccionComuna": 0,
      "direccionCiudad": 10,
      "estadoCivil": "soltero"
    }
  ],
  "empresa": {
    "id": 99,
    "fechaCreacion": "2020-01-01T00:00:00Z",
    "nombre": "Empresa Demo S.A.",
    "vigente": true,
    "url": "string",
    "logo": "string",
    "logoWebPublica": "string",
    "ordenWebPublica": 0,
    "esPrueba": false,
    "tier": "tier2",
    "tags": {},
    "company_group": 0,
    "calendarioDeFeriados": 0,
    "pais": "string"
  },
  "externalReference": [
    { "localId": 1234, "remoteId": "EXT-001", "model": "persona", "integration": "MiIntegracion" }
  ],
  "userDefinedFields": [
    {
      "id": 1,
      "fieldName": "Campo personalizado",
      "userDefinedFieldValue": [{ "id": 10, "value": "valor" }]
    }
  ]
}
CampoTipoDescripción
idintegerID único del trabajador
fechaCreaciondatetimeFecha/hora de creación
rutstringRUT/DNI del trabajador
nombrestringNombre(s)
apellidoPaternostringApellido paterno
apellidoMaternostringApellido materno
sexostring"M" Masculino, "F" Femenino, "N" No especificado
fechaNacimientodateFecha de nacimiento (YYYY-MM-DD)
nacionalidadintegerID de país de nacionalidad
usernamestringNombre de usuario (login)
emailstringCorreo corporativo
anexostringAnexo telefónico
permisosarrayLista de permisos asignados
detallesarrayDatos personales adicionales (ver tabla abajo)
empresaobjectEmpresa a la que pertenece
externalReferencearray|nullReferencia a IDs externos de integración. Es null si no hay referencias configuradas (no [])
userDefinedFieldsarrayCampos personalizados definidos por la empresa. [] si no hay UDFs configurados

Sub-objeto detalles:

CampoTipoDescripción
fotostringURL de la foto de perfil
idiomasarrayIdiomas que domina
codigoUbicacionstringCódigo de la ubicación geográfica
validoDesdedateFecha desde la que el registro es válido
emailstringCorreo (laboral, dentro de detalles)
emailPersonalstringCorreo personal
telefonostringTeléfono fijo
celularstringNúmero de celular
direccionCallestringCalle de residencia
direccionNumerostringNúmero de la dirección
direccionDepartamentostringDepartamento/Piso
nivelEducacionalstringNivel educacional
colegiostringColegio
institucionEstudiosSuperioresstringInstitución de estudios superiores
profesionstringProfesión
observacionesstringObservaciones
contactosDeEmergenciastringContactos de emergencia
sangrestringGrupo sanguíneo
alergiasstringAlergias
discapacidadesstringDiscapacidades
enfermedades_cronicasstringEnfermedades crónicas
medicamentos_permanentesstringMedicamentos permanentes
direccionComunaintegerID de comuna
direccionCiudadintegerID de ciudad
estadoCivilstring"soltero", "casado", "divorciado", "viudo", "AUC"

2. personaEmpresa — Contrato de trabajo

Disparado cuando se crea, modifica o elimina un contrato (o anexo de contrato). Modelo complementario a persona: contiene la relación del trabajador con la empresa.

{
  "id": 9999,
  "empleado": 1234,
  "codigo": "EMP-001",
  "fechaCreacion": "2024-01-15T10:30:00Z",
  "fechaModificacion": "2024-06-01T09:00:00Z",
  "tipoContrato": 2,
  "tipoContratoDetails": { "id": 2, "nombre": "Contrato Indefinido" },
  "empleadorRazonSocial": 5,
  "cargo": "Analista de Sistemas",
  "fechaContratacion": "2023-01-01",
  "desde": "2023-01-01",
  "hasta": null,
  "unidadOrganizacional": 3,
  "unidadOrganizacionalDetails": {
    "id": 3, "parent": 1, "nombre": "Tecnología", "codigo": "TEC", "externalReference": []
  },
  "sucursal": { "id": 7, "nombre": "Casa Central" },
  "centroCosto": { "id": 12, "codigo": "CC-01", "nombre": "IT" },
  "jornada": 1,
  "horasDeLaJornada": 45,
  "sindicato": null,
  "jefe": 500,
  "esPensionado": "N",
  "isapre": 1,
  "montoPactadoIsapre": 3.0,
  "montoPactadoIsapreMoneda": "UF",
  "afp": 3,
  "sueldoBase": 1500000,
  "sueldoBanco": 1,
  "sueldoCuentaCorriente": "12345678",
  "sueldoCuentaCorrienteTipo": "cuenta corriente",
  "sueldoTipoPago": "transferencia",
  "asignacionMovilizacion": 50000,
  "asignacionColacion": 50000,
  "vacacionesReconocidoDesde": "2023-01-01",
  "finiquitado": false,
  "motivoEgreso": null,
  "INE": null,
  "externalReference": [],
  "userDefinedFields": { "campo1": "valor1" }
}
CampoTipoDescripción
idintegerID del contrato
empleadointegerID del trabajador
codigostringCódigo interno de la empresa
fechaCreaciondatetimeFecha de creación del registro
fechaModificaciondatetimeFecha de última modificación
tipoContratointegerID del tipo de contrato
tipoContratoDetailsobject{ id, nombre } del tipo de contrato
empleadorRazonSocialintegerID de la razón social empleadora
cargostringCargo del trabajador
fechaContrataciondateFecha oficial de contratación
desdedateInicio de vigencia del contrato
hastadate|nullFin de vigencia (null si es indefinido)
unidadOrganizacionalintegerID de la unidad organizacional
unidadOrganizacionalDetailsobjectObjeto expandido de la unidad organizacional
sucursalobjectSucursal asignada (expandida)
centroCostoobjectCentro de costo asignado (expandido)
jornadaintegerID de la jornada de trabajo
horasDeLaJornadaintegerHoras semanales de la jornada
sindicatointeger|nullID del sindicato
jefeinteger|nullID del jefe directo
esPensionadostring"N" No, "S" Sí (sin AFP), "C" Sí (con AFP)
isapreinteger|nullID de la ISAPRE
montoPactadoIsaprenumber|nullMonto pactado en ISAPRE
montoPactadoIsapreMonedastringMoneda: "UF", "$", "%", etc.
afpinteger|nullID de la AFP
sueldoBasenumberSueldo base
sueldoBancointegerID del banco de pago
sueldoCuentaCorrientestringNúmero de cuenta
sueldoCuentaCorrienteTipostringTipo de cuenta
sueldoTipoPagostringForma de pago (ej: "transferencia")
asignacionMovilizacionnumberAsignación de movilización
asignacionColacionnumberAsignación de colación
vacacionesReconocidoDesdedateFecha desde la cual se reconocen vacaciones
finiquitadobooleanSi el contrato está finiquitado
motivoEgresoobject|nullMotivo de egreso (si aplica)
INEobject|nullCódigo INE asociado
externalReferencearrayReferencias externas de integración
userDefinedFieldsobjectCampos personalizados ({ nombre_campo: valor })

3. razonSocial — Razón Social

Disparado cuando se crea, modifica o elimina una razón social de la empresa.

{
  "id": 5,
  "empresa": 99,
  "rut": "76543210-9",
  "razonSocial": "Empresa Demo S.A.",
  "nombreComercial": "Empresa Demo",
  "giro": "Servicios de Tecnología",
  "direccion": "Av. Providencia 1234, Santiago",
  "calleCasaMatriz": "Av. Providencia",
  "numeroCasaMatriz": "1234",
  "regionCasaMatriz": 15,
  "comunaCasaMatriz": 120,
  "cajaCompensacion": 1,
  "mutual": 2,
  "mutualPorcentajeDescuento": 0.0093,
  "mutualCodigoSucursal": "001",
  "comuna": 120,
  "telefono": "+5622123456",
  "bancoPagoNomina": 1,
  "cuentaCorrientePagoNomina": "12345678",
  "representanteLegal": "Pedro Soto",
  "rutRepresentanteLegal": "9876543-2",
  "representanteEmail": "[email protected]",
  "representanteTelefono": "+56912345678",
  "logo": "url/to/logo.png",
  "fechaCreacion": "2020-01-01T00:00:00Z",
  "empresa_est": false,
  "appeal_days_for_rejected_requests": 0,
  "appeal_area_for_rejected_requests": "string"
}
CampoTipoDescripción
idintegerID de la razón social
empresaintegerID de la empresa
rutstringRUT/RUC de la razón social
razonSocialstringNombre legal
nombreComercialstring|nullNombre de fantasía
girostring|nullGiro o actividad económica
direccionstringDirección legal
calleCasaMatrizstring|nullCalle de casa matriz
numeroCasaMatrizstring|nullNúmero de casa matriz
regionCasaMatrizinteger|nullID de región
comunaCasaMatrizinteger|nullID de comuna
cajaCompensacioninteger|nullID de caja de compensación
mutualinteger|nullID de mutual de seguridad
mutualPorcentajeDescuentofloatTasa de cotización de accidentes (ej: 0.0093)
mutualCodigoSucursalstring|nullCódigo de sucursal de la mutual
comunainteger|nullID de comuna
telefonostringTeléfono
bancoPagoNominainteger|nullID del banco para nóminas
cuentaCorrientePagoNominastringNúmero de cuenta para nóminas
representanteLegalstringNombre del representante legal
rutRepresentanteLegalstringRUT del representante legal
representanteEmailstring|nullEmail del representante legal
representanteTelefonostring|nullTeléfono del representante legal
logostringURL del logo
fechaCreaciondatetimeFecha de creación
empresa_estbooleanSi es una empresa de servicios transitorios (EST)
appeal_days_for_rejected_requestsinteger|nullDías de plazo para apelar solicitudes rechazadas
appeal_area_for_rejected_requestsstring|nullÁrea a cargo de apelaciones

Campos excluidos del webhook (existen en el modelo pero no se envían): formaDePagoDeGratificacion, formaDePagoDeMovilizacionYColacion, tipoDeEmpresa, vigente, autor, principal.


4. sucursal — Sucursal

Disparado cuando se crea, modifica o elimina una sucursal.

{
  "id": 7,
  "empresa": 99,
  "nombre": "Casa Central",
  "desde": "2020-01-01",
  "fechaCreacion": "2020-01-01T00:00:00Z",
  "creadoPor": 1,
  "vigente": true,
  "direccionCalle": "Av. Providencia",
  "direccionNumero": "1234",
  "direccionDepartamento": "Piso 5",
  "direccionComuna": 120,
  "direccionCiudad": 15,
  "telefono": "+5622123456",
  "location": "POINT (-70.6483 -33.4372)",
  "location_parseado": { "lat": -33.4372, "lng": -70.6483 },
  "rango": 100,
  "beacons": ["uuid-beacon-1"],
  "timezone": "America/Santiago",
  "externalReference": []
}
CampoTipoDescripción
idintegerID de la sucursal
empresaintegerID de la empresa
nombrestringNombre de la sucursal
desdedateFecha de inicio de vigencia
fechaCreaciondatetimeFecha de creación
creadoPorintegerID del trabajador que creó la sucursal
vigentebooleanSi la sucursal está activa
direccionCallestringCalle
direccionNumerostringNúmero
direccionDepartamentostringDepartamento/Piso
direccionComunainteger|nullID de la comuna
direccionCiudadinteger|nullID de la ciudad
telefonostringTeléfono
locationstring|nullCoordenadas en formato WKT (POINT (lng lat))
location_parseadoobject|nullCoordenadas como { "lat": float, "lng": float }
rangointegerRadio en metros para control de asistencia geolocalizada
beaconsarrayLista de identificadores de beacons asociados
timezonestring|nullZona horaria (ej: "America/Santiago")
externalReferencearrayReferencias externas de integración

5. vacacionesSolicitud — Solicitud de Vacaciones

Disparado cuando se crea, modifica o elimina una solicitud de vacaciones.

{
  "id": 8888,
  "empleado": 1234,
  "vacacionesDesde": "2024-07-01",
  "numeroDias": 15,
  "jornada": "M",
  "mediosDias": false,
  "vacacionesHasta": "2024-07-21",
  "vacacionesRetorno": "2024-07-22",
  "aprobada": "A",
  "aprobadaPor": 500,
  "creadaPor": 1234,
  "tipoVacaciones": 1,
  "fechaAprobacion": "2024-06-20T14:00:00Z",
  "fechaCreacion": "2024-06-18T09:00:00Z",
  "read_person": true,
  "read_boss": true,
  "type": "holidays",
  "detallesTrabajador": { "...": "mismo formato que instance de persona" },
  "externalReference": []
}
CampoTipoDescripción
idintegerID de la solicitud
empleadointegerID del trabajador
vacacionesDesdedateFecha de inicio de vacaciones
numeroDiasintegerNúmero de días solicitados
jornadastring"M" (Mañana) o "T" (Tarde), para medio día
mediosDiasbooleanSi la solicitud es de medio día
vacacionesHastadateFecha de término de vacaciones
vacacionesRetornodate|nullFecha de retorno al trabajo
aprobadastring"A" Aprobada, "R" Rechazada, "P" Pendiente, "O" Esperando 2ª aprobación
aprobadaPorinteger|nullID del trabajador que aprobó
creadaPorinteger|nullID del trabajador que creó la solicitud
tipoVacacionesintegerID del tipo de vacaciones (ej: normales, progresivos)
fechaAprobaciondatetime|nullFecha y hora de aprobación
fechaCreaciondatetimeFecha de creación de la solicitud
read_personbooleanSi el trabajador leyó la notificación
read_bossbooleanSi el jefe leyó la notificación
typestringTipo de solicitud (ej: "holidays")
detallesTrabajadorobjectObjeto completo del trabajador (mismo formato que persona)
externalReferencearrayReferencias externas de integración

6. personaAusencia — Ausencia / Licencia

Disparado cuando se crea, modifica o elimina una ausencia o licencia médica.

{
  "id": 7777,
  "empleado": 1234,
  "fechaDesde": "2024-06-01",
  "numeroDias": 7,
  "fechaHasta": "2024-06-07",
  "aprobada": true,
  "aprobadaPor": 500,
  "fechaAprobacion": "2024-06-01",
  "tipoAusencia": 1,
  "documentacion": "url/to/licencia.pdf",
  "rebajaSalario": true,
  "esContinuacion": false,
  "creadoPor": 500,
  "fechaCreacion": "2024-06-01T08:00:00Z",
  "fechaRetorno": "2024-06-08",
  "numeroLicencia": "LIC-2024-001",
  "medicoLicencia": "Dr. Pedro González",
  "horaDesde": "09:00:00",
  "numeroHoras": 8,
  "numeroMinutos": 0,
  "horaHasta": "17:00:00",
  "motivo": "Enfermedad común",
  "mediosDias": false,
  "detallesTrabajador": { "...": "mismo formato que instance de persona" },
  "externalReference": []
}
CampoTipoDescripción
idintegerID de la ausencia
empleadointegerID del trabajador
fechaDesdedateFecha de inicio (inclusiva)
numeroDiasintegerNúmero de días de ausencia
fechaHastadateFecha de término (inclusiva)
aprobadabooleanSi está aprobada
aprobadaPorinteger|nullID del aprobador
fechaAprobaciondate|nullFecha de aprobación
tipoAusenciainteger|nullID del tipo de ausencia
documentacionstring|nullURL del documento adjunto (ej: licencia médica)
rebajaSalariobooleanSi se rebaja el salario
esContinuacionbooleanSi es continuación de una licencia anterior
creadoPorinteger|nullID de quien registró la ausencia
fechaCreaciondatetimeFecha de creación
fechaRetornodate|nullFecha de retorno al trabajo
numeroLicenciastring|nullNúmero de la licencia médica
medicoLicenciastring|nullNombre del médico
horaDesdetime|nullHora de inicio (para ausencias horarias)
numeroHorasinteger|nullDuración en horas
numeroMinutosinteger|nullDuración en minutos
horaHastatime|nullHora de término
motivostring|nullDescripción del motivo
mediosDiasbooleanSi es sólo medio día
detallesTrabajadorobjectObjeto completo del trabajador (mismo formato que persona)
externalReferencearrayReferencias externas de integración

7. centroCosto — Centro de Costo

Disparado cuando se crea, modifica o elimina un centro de costo.

{
  "id": 12,
  "parent": null,
  "empresa": 99,
  "codigo": "CC-IT",
  "nombre": "Tecnología",
  "vigente": true,
  "externalReference": [],
  "user_defined_fields": { "campo1": "valor1" }
}
CampoTipoDescripción
idintegerID del centro de costo
parentinteger|nullID del centro de costo padre (estructura jerárquica)
empresaintegerID de la empresa
codigostringCódigo del centro de costo
nombrestringNombre del centro de costo
vigentebooleanSi está activo
externalReferencearrayReferencias externas de integración
user_defined_fieldsobjectCampos personalizados

8. unidadOrganizacional — Unidad Organizacional / Gerencia

Disparado cuando se crea, modifica o elimina una unidad organizacional (gerencia, área, departamento).

{
  "id": 3,
  "parent": 1,
  "nombre": "Tecnología",
  "codigo": "TEC",
  "externalReference": [
    { "localId": 3, "remoteId": "UA-003", "model": "unidadOrganizacional", "integration": "MiIntegracion" }
  ]
}
CampoTipoDescripción
idintegerID de la unidad organizacional
parentinteger|nullID de la unidad padre (estructura jerárquica)
nombrestringNombre
codigostring|nullCódigo alfanumérico
externalReferencearrayReferencias externas de integración

9. documento — Documento de Trabajador

Disparado cuando se crea, modifica o elimina un documento en la carpeta de un trabajador.

Nota: este webhook no incluye el archivo adjunto en el payload. En su lugar, entrega una URL desde la cual el documento puede descargarse.

{
  "id": 6666,
  "empleado": 1234,
  "empleado_detalles": {
    "id": 1234,
    "nombre": "Juan",
    "apellidoPaterno": "González",
    "apellidoMaterno": "Pérez",
    "cargo": "",
    "gerencia": "",
    "avatar": "",
    "rut": "12345678-9",
    "full_name": "Juan González Pérez"
  },
  "nombre": "Contrato de Confidencialidad",
  "fechaCreacion": "2024-03-01T10:00:00Z",
  "categoria": "Contratos",
  "puedeVerloElTrabajador": true,
  "adjunto": "https://app.talana.com/remuneraciones/documento/download/abc123",
  "creadoPor": 500,
  "user_defined_fields": {}
}
CampoTipoDescripción
idintegerID del documento
empleadointegerID del trabajador al que pertenece
empleado_detallesobjectDatos básicos del trabajador (ver tabla abajo)
nombrestringNombre o título del documento
fechaCreaciondatetimeFecha de creación
categoriastringCategoría del documento (ej: "Contratos", "Otros Documentos")
puedeVerloElTrabajadorbooleanSi el trabajador puede visualizarlo
adjuntostringURL para descargar el archivo adjunto
creadoPorintegerID del trabajador que subió el documento
user_defined_fieldsobjectCampos personalizados

Sub-objeto empleado_detalles:

CampoTipoDescripción
idintegerID del trabajador
nombrestringNombre
apellidoPaternostringApellido paterno
apellidoMaternostringApellido materno
cargostringSiempre "" en este webhook — el serializer sobreescribe el getter para retornar vacío
gerenciastringSiempre "" en este webhook — el serializer sobreescribe el getter para retornar vacío
avatarstringSiempre "" en este webhook — el serializer sobreescribe el getter para retornar vacío
rutstringRUT del trabajador
full_namestringNombre completo

Nota técnica: el webhook usa PersonaDocumentoSerializer (subclase de PersonaSimpleSerializer) que sobreescribe explícitamente get_cargo, get_gerencia y get_avatar para retornar siempre "". Estos tres campos están presentes en el payload pero nunca traen datos reales — no depender de ellos para lógica de negocio.


10. SigningRequestDetail — Detalle de Solicitud de Firma Digital

Disparado cuando cambia el estado de una solicitud de firma dirigida a un trabajador específico.

Importante: los valores dentro del array details se serializan todos como string (incluso booleanos, fechas e IDs), ya que se convierten con str() antes de enviarse. Tu integración debe parsear estos valores en lugar de esperar tipos nativos.

{
  "id": 5555,
  "details": [
    {
      "id": "101",
      "signingRequest": "5555",
      "requestedUser": "1234",
      "signed": "False",
      "status": "P",
      "token": "abc123token",
      "signatureTS": "None",
      "TSASignature": "None",
      "ip": "None",
      "userAgent": "None",
      "passVerification": "None",
      "huella": "",
      "rejection_reason": "None"
    }
  ]
}
CampoTipoDescripción
idintegerID del SigningRequest (solicitud padre)
detailsarrayLista con un objeto por cada detalle del firmante
details[].idstringID del SigningRequestDetail
details[].signingRequeststringID de la solicitud padre
details[].requestedUserstringID del trabajador al que se solicitó la firma
details[].signedstring"True" o "False"
details[].statusstring"P" Pendiente, "FR" Firmando, "F" Firmada, "R" Rechazada, "E" Esperando, "C" Cancelada, "SC" Programado
details[].tokenstringToken único para acceder al documento a firmar
details[].signatureTSstringTimestamp de la firma ("None" si no ha firmado)
details[].TSASignaturestringSello de tiempo de la firma (TSA), si aplica
details[].ipstringIP desde la que se firmó
details[].userAgentstringUser agent del firmante
details[].passVerificationstringVerificación de clave, si aplica
details[].huellastringRuta del archivo de huella/hash del documento (FileField). "" si está vacío — no "None" como los demás campos
details[].rejection_reasonstringMotivo de rechazo ("None" si no aplica)

Nota técnica: el serializer de details usa model_to_dict(obj) de Django, que incluye FileField (como huella) devolviendo la ruta del archivo como string, o "" si está vacío. El resto de los campos vienen de getters que aplican str() sobre el valor, por eso los None de Python aparecen literalmente como el string "None" — mientras que huella, al venir de model_to_dict, usa "" en su lugar.


11. SigningRequest — Solicitud de Firma Digital

Disparado cuando se crea o modifica la solicitud de firma en general (no a un firmante específico).

Nota: este evento no se dispara para documentos de tipo DocumentoLibreria (documentos de biblioteca móvil).

{
  "signingRequest": 5555,
  "documentType": "Contrato o Anexo",
  "documentReference": "9999",
  "requestTS": "2024-06-15T14:00:00Z"
}
CampoTipoDescripción
signingRequestintegerID de la solicitud de firma
documentTypestring"Contrato o Anexo", "Documento", "Vacaciones", "Dias Administrativos", "Venta Dias Progresivos", "Liquidacion", "Boleta", "Certificado"
documentReferencestringID del documento referenciado (según el documentType)
requestTSdatetimeTimestamp de creación de la solicitud

Campos comunes

externalReference

Específico de integraciones configuradas. Permite mapear IDs de Talana con IDs de sistemas externos (localId, remoteId, model, integration).

userDefinedFields

Campos personalizados definidos por cada empresa. La estructura varía según el modelo (array de objetos en persona, objeto plano {campo: valor} en personaEmpresa y centroCosto).