CMS Link - API

Documentación de endpoints, parámetros y JSON requerido.

Flujo recomendado: POST /v1/auth/token ➜ usar Bearer token en endpoints protegidos.

POST /v1/auth/token Pública

Generar token

Valida credenciales del cliente y devuelve access_token.

Body JSON

{
  "client_id": "mi_cliente",
  "client_secret": "mi_secreto"
}

Respuesta ejemplo

{
  "access_token": "<jwt>",
  "token_type": "Bearer",
  "expires_in": 3600
}

Errores posibles

HTTP Código Mensaje
401 UNAUTHORIZED Credenciales inválidas
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
GET /v1/asistencias Bearer JWT

Consultar asistencias

Consulta asistencias por rango de fechas del cliente autenticado. inicio/fin en formato YYYY-MM-DD.

Query: inicio=2026-03-01&fin=2026-03-31&empleado=123

Respuesta ejemplo

{
  "items": [
    {
      "GRUPO_COMERCIAL": "Grupo ABC",
      "CLIENTE": "Cliente Demo",
      "INSTALACION": "Planta Norte",
      "UBICACION": "Acceso principal",
      "CARGO": "Guardia de seguridad",
      "COD_EMP": "123",
      "EMPLEADO": "Juan Pérez",
      "TURNO_ID": 7,
      "TURNO_HORA": "08:00 - 17:00",
      "FECHA_INICIO": "2026-03-20",
      "HORA_ENTRADA": "08:05",
      "FECHA_FIN": "2026-03-20",
      "HORA_SALIDA": "17:02",
      "ASISTENCIA": "Asistencia",
      "ENTRADA": "Sí",
      "SALIDA": "Sí",
      "TIEMPO_EXTRA": "No"
    }
  ]
}

Errores posibles

HTTP Código Mensaje
400 VALIDATION_ERROR Debes enviar fecha inicial y fecha final.
400 VALIDATION_ERROR Las fechas deben venir en formato YYYY-MM-DD (ejemplo: 2026-02-27).
400 VALIDATION_ERROR Las fechas enviadas no son válidas. Revisa el formato y el calendario.
400 VALIDATION_ERROR La fecha final no puede ser menor que la fecha inicial.
400 VALIDATION_ERROR La fecha inicial no puede ser anterior a 30 días.
400 VALIDATION_ERROR El empleado debe ser numérico.
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
GET /v1/reporte-asistencias Bearer JWT

Reporte de asistencias del turno anterior

Consulta las asistencias del turno del día anterior del cliente autenticado, incluyendo a todos los empleados sin filtro.

Respuesta ejemplo

{
  "items": [
    {
      "GRUPO_COMERCIAL": "Grupo ABC",
      "CLIENTE": "Cliente Demo",
      "INSTALACION": "Planta Norte",
      "UBICACION": "Acceso principal",
      "CARGO": "Guardia de seguridad",
      "COD_EMP": "123",
      "EMPLEADO": "Juan Pérez",
      "TURNO_ID": 7,
      "TURNO_HORA": "08:00 - 17:00",
      "FECHA_INICIO": "2026-03-20",
      "HORA_ENTRADA": "08:05",
      "FECHA_FIN": "2026-03-20",
      "HORA_SALIDA": "17:02",
      "ASISTENCIA": "Asistencia",
      "ENTRADA": "Sí",
      "SALIDA": "Sí",
      "TIEMPO_EXTRA": "No"
    }
  ]
}

Errores posibles

HTTP Código Mensaje
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
GET /v1/listado-vacantes Bearer JWT

Listado de vacantes

Obtiene vacantes activas del cliente autenticado.

Respuesta ejemplo

{
  "items": [
    {
      "EMPRESA": "Empresa XYZ",
      "GRUPO_COMERCIAL": "Grupo ABC",
      "CLIENTE_ID": 1,
      "CLIENTE": "Cliente Demo",
      "INSTALACION_ID": 10,
      "INSTALACION": "Planta Norte",
      "ESTADO": "Estado Demo",
      "CIUDAD": "Ciudad Demo",
      "PUESTO_ID": 44,
      "UBICACION": "Acceso principal",
      "CARGO": "Guardia de seguridad",
      "SALARIO": "9524.32",
      "PLAZA_ID": 95,
      "POSICION": "A",
      "PROGRAMACION": "Programación 1"
    }
  ]
}

Errores posibles

HTTP Código Mensaje
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
GET /v1/listado-empleados Bearer JWT

Listado de empleados

Obtiene los datos de un empleado asignado del cliente autenticado, filtrado por el parámetro empleado.

Query: empleado=123

Respuesta ejemplo

{
  "items": [
    {
      "EMPRESA": "Empresa XYZ",
      "GRUPO_COMERCIAL": "Grupo ABC",
      "CLIENTE_RFC": "CLI950821ABC",
      "CLIENTE": "Cliente Demo",
      "INSTALACION": "Planta Norte",
      "REGION": "Región Centro",
      "ESTADO": "Estado Demo",
      "CIUDAD": "Ciudad Demo",
      "COD_ALTERNO": "PT-01",
      "UBICACION": "Acceso principal",
      "PLAZA_ID": 95,
      "POSICION": "A",
      "EMPLEADO_ID": 123,
      "EMPLEADO": "Pérez Gómez Juan Carlos",
      "FECHA_INGRESO": "2026-03-30",
      "EMPLEADO_RFC": "PEGJ950821ABC",
      "CARGO": "Guardia de seguridad",
      "PROGRAMACION": "Programación 1"
    }
  ]
}

Errores posibles

HTTP Código Mensaje
400 VALIDATION_ERROR El empleado debe ser numérico.
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
GET /v1/estado-empleado Bearer JWT

Estado de empleado (activo/inactivo)

Obtiene los datos de un empleado del cliente autenticado buscando por RFC o número de empleado, incluyendo su estatus (Activo/Inactivo). Si el empleado está inactivo, solo se devuelven sus datos base (id, nombre, fecha de ingreso, RFC); el resto de los campos vienen vacíos.

Query: empleado=123 (o empleado=PEGJ950821ABC)

Respuesta ejemplo

{
  "items": [
    {
      "EMPRESA": "Empresa XYZ",
      "GRUPO_COMERCIAL": "Grupo ABC",
      "CLIENTE_RFC": "CLI950821ABC",
      "CLIENTE": "Cliente Demo",
      "INSTALACION": "Planta Norte",
      "REGION": "Región Centro",
      "ESTADO": "Estado Demo",
      "CIUDAD": "Ciudad Demo",
      "COD_ALTERNO": "PT-01",
      "UBICACION": "Acceso principal",
      "PLAZA_ID": 95,
      "POSICION": "A",
      "EMPLEADO_ID": 123,
      "EMPLEADO": "Pérez Gómez Juan Carlos",
      "FECHA_INGRESO": "2026-03-30",
      "EMPLEADO_RFC": "PEGJ950821ABC",
      "CARGO": "Guardia de seguridad",
      "PROGRAMACION": "Programación 1",
      "ESTATUS": "Activo"
    }
  ]
}

Errores posibles

HTTP Código Mensaje
400 VALIDATION_ERROR Debes enviar el RFC o número de empleado.
400 VALIDATION_ERROR El empleado no existe.
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
GET /v1/tipo-incidencias Bearer JWT

Listado de tipos de incidencia

Obtiene los tipos de incidencia activos (TPIN_ESTADO = 1) del cliente autenticado.

Respuesta ejemplo

{
  "items": [
    {
      "TIPO_INCIDENCIA_ID": 1,
      "INCIDENCIA": "Vacaciones",
      "AFECTA_NOMINA": "Sí",
      "TURNO_X_TURNO": "No"
    }
  ]
}

Errores posibles

HTTP Código Mensaje
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
GET /v1/incidencias Bearer JWT

Listado de incidencias

Consulta incidencias del cliente autenticado filtradas por el parámetro empleado (EMP_ID).

Query: empleado=123

Respuesta ejemplo

{
  "items": [
    {
      "INCIDENCIAS_ID": 10,
      "EMP_ID": 123,
      "EMPLEADO": "Pérez Gómez Juan Carlos",
      "DIAS_INCIDENCIA": 5,
      "TIPO_INCIDENCIA": "Vacaciones",
      "FECHA_INICIO": "2026-03-01",
      "FECHA_FIN": "2026-03-05",
      "OBSERVACIONES": null
    }
  ]
}

Errores posibles

HTTP Código Mensaje
400 VALIDATION_ERROR El empleado debe ser numérico.
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
POST /v1/agregar-incidencia Bearer JWT

Agregar incidencia

Registra una incidencia para un empleado del cliente autenticado. Valida que el empleado y el tipo de incidencia estén activos, exige empleado_cubrir cuando el tipo de incidencia es turno por turno, y rechaza incidencias que se traslapen en fecha con otra ya registrada para el mismo empleado.

Body JSON

{
  "empleado": 123,
  "tipo_incidencia": 1,
  "dias": 5,
  "fecha_inicio": "2026-03-01",
  "fecha_fin": "2026-03-05",
  "observaciones": "Vacaciones anuales",
  "empleado_cubrir": 456
}

Respuesta ejemplo

{
  "id": 789,
  "message": "Incidencia registrada correctamente."
}

Errores posibles

HTTP Código Mensaje
400 VALIDATION_ERROR Debes indicar el empleado.
400 VALIDATION_ERROR Debes indicar el tipo de incidencia.
400 VALIDATION_ERROR Debes indicar fecha de inicio y fecha de fin.
400 VALIDATION_ERROR Las fechas deben ser válidas y venir en formato YYYY-MM-DD.
400 VALIDATION_ERROR La fecha de fin no puede ser menor que la fecha de inicio.
400 VALIDATION_ERROR El empleado no existe o no está activo.
400 VALIDATION_ERROR El tipo de incidencia no existe o no está activo.
400 VALIDATION_ERROR Este tipo de incidencia es turno por turno: debes indicar el empleado a cubrir.
400 VALIDATION_ERROR El empleado a cubrir no puede ser el mismo empleado de la incidencia.
400 VALIDATION_ERROR El empleado a cubrir no existe o no está activo.
400 VALIDATION_ERROR El empleado ya tiene una incidencia registrada en esa fecha.
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
POST /v1/agregar-justificacion Bearer JWT

Agregar justificación

Registra una justificación para un turno (TURNO_ID) de un empleado del cliente autenticado. Las justificaciones creadas por esta vía siempre quedan aprobadas de forma automática: se limpia la incidencia del turno, se marca como asistencia tomada y se guarda el motivo capturado. Solo puede existir una justificación por turno.

Body JSON

{
  "empleado": 123,
  "turno_id": 98765,
  "motivo": "Olvido de marcaje",
  "descripcion": "El empleado marcó entrada tarde por falla en la app.",
  "comentario_aprobacion": "Justificación aprobada automáticamente vía integración."
}

Respuesta ejemplo

{
  "id": 321,
  "message": "Justificación registrada y aprobada correctamente."
}

Errores posibles

HTTP Código Mensaje
400 VALIDATION_ERROR Debes indicar el empleado.
400 VALIDATION_ERROR Debes indicar el turno a justificar.
400 VALIDATION_ERROR Debes indicar el motivo.
400 VALIDATION_ERROR Debes indicar la descripción.
400 VALIDATION_ERROR El empleado no existe o no está activo.
400 VALIDATION_ERROR El turno no existe o no pertenece al empleado indicado.
400 VALIDATION_ERROR Ya existe una justificación registrada para este turno.
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno
POST /v1/agregar-empleado Bearer JWT

Agregar empleado

Inserta un empleado en integracion_empleados para el cliente del token. El campo "adicional" es un JSON con datos extra que se guardan tal cual en la base de datos para ese empleado, útil para integraciones personalizadas.

Body JSON

{
  "codemp": 123,
  "apaterno": "Pérez",
  "amaterno": "Gómez",
  "nombres": "Juan Carlos",
  "fecnac": "1995-08-21",
  "rfc": "PEGJ950821ABC",
  "curp": "PEGJ950821HDFRMR09",
  "imss": "12345678901",
  "correo": "juan.perez@empresa.com",
  "telefono": "5512345678",
  "fecing": "2026-03-30",
  "adicional": {
    "fuente": "integracion_MAAT",
    "comentarios": "Ingreso por API",
    "empresa": "Empresa XYZ",
    "grupo_comercial": "Grupo ABC",
    "cliente_id": 1,
    "cliente": "Cliente Demo",
    "instalacion_id": 10,
    "instalacion": "Planta Norte",
    "estado": "Estado Demo",
    "ciudad": "Ciudad Demo",
    "puesto_id": 44,
    "ubicacion": "Acceso principal",
    "cargo": "Guardia de seguridad",
    "salario": "9524.32",
    "plaza_id": 95,
    "posicion": "A",
    "programacion": "Programación 1"
  }
}

Respuesta ejemplo

{
  "id": 456,
  "message": "Empleado agregado correctamente."
}

Errores posibles

HTTP Código Mensaje
400 VALIDATION_ERROR Las fechas deben estar en formato YYYY-MM-DD.
400 VALIDATION_ERROR Empleado existente.
400 VALIDATION_ERROR RFC existente.
401 UNAUTHORIZED Token inválido o expirado.
429 RATE_LIMITED Demasiadas solicitudes
500 INTERNAL_ERROR Error interno