> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ugps.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Guardar la excepción de un activo en una tarea de la pauta

> Excepción de pauta: `follow` («Sigue la pauta»), `change` («Cambia»: intervalo propio por tipo de condición, que reemplaza ese tipo de la pauta y hereda los demás, aunque la pauta cambie después) o `not_applicable` («No aplica»: la tarea sale de los vencimientos, las cifras y la ficha del activo, sin borrar su último servicio; al volver a `follow` o `change` vuelve con él). `change` solo acepta tipos que la tarea tiene en la pauta (400 `MAINTENANCE_PROGRAM_EXCEPTION_INVALID`); sin «recordar antes» pone el 10 % del intervalo. Responde 404 `MAINTENANCE_PROGRAM_ASSET_NOT_FOUND` o `MAINTENANCE_PROGRAM_TASK_NOT_FOUND`; 409 `MAINTENANCE_PROGRAM_IN_OPEN_WORK_ORDER` al marcar «No aplica» si su mantención abierta está en una orden de trabajo abierta; 409 `MAINTENANCE_PROGRAM_TASK_IN_OTHER_PROGRAM` al reactivarla si otra pauta ya la tiene activa en el activo; 409 `MAINTENANCE_PROGRAM_ARCHIVED` si la pauta está archivada.



## OpenAPI

````yaml /openapi.json put /api/maintenance/programs/{id}/assets/{assetId}/tasks/{taskId}/exception
openapi: 3.0.0
info:
  title: UGPS Atlas API
  version: 1.0.0
  description: >-
    Documentación de la API REST principal de UGPS Atlas (plataforma de rastreo
    GPS)
servers:
  - url: https://api.ugps.io
    description: Servidor de producción
security:
  - bearerAuth: []
  - cookieAuth: []
tags:
  - name: Auth - Autenticación
    description: Operaciones de autenticación
  - name: Usuarios - Usuarios
    description: Operaciones relacionadas con usuarios
  - name: Usuarios - Roles
    description: Operaciones relacionadas con roles
  - name: Usuarios - Permisos
    description: Operaciones relacionadas con permisos
  - name: Activos - Assets
    description: Operaciones relacionadas con activos
  - name: Activos - Tipos
    description: Operaciones relacionadas con tipos de activos
  - name: Activos - Grupos
    description: Operaciones relacionadas con grupos de activos
  - name: Activos - Campos personalizados
    description: >-
      Campos propios que cada empresa define para sus activos (nombre interno,
      tipo, reglas y opciones)
  - name: Activos - Grupos de campos
    description: Grupos que ordenan los campos personalizados de la empresa
  - name: Activos - Vehículos
    description: Operaciones relacionadas con tipos de vehículos
  - name: Activos - QR
    description: >-
      QR del activo (identidad escaneable del activo): resolver, stickers,
      reemplazo e historial
  - name: Tracking - Trackers
    description: Operaciones relacionadas con trackers
  - name: Tracking - Viajes
    description: Operaciones relacionadas con viajes y paradas
  - name: Tracking - Geocercas
    description: Operaciones relacionadas con geocercas
  - name: Alertas - Alertas
    description: Operaciones relacionadas con alertas
  - name: Alertas - Disparadores
    description: Operaciones relacionadas con disparadores de alertas
  - name: Alertas - Notificaciones
    description: Operaciones relacionadas con notificaciones
  - name: Clientes - Clientes
    description: Operaciones relacionadas con clientes
  - name: Clientes - Restricciones
    description: Operaciones relacionadas con restricciones
  - name: Integraciones - Flespi
    description: Operaciones relacionadas con Flespi
  - name: Otros - Conductores
    description: Operaciones relacionadas con conductores
  - name: Formularios dinámicos
    description: Plantillas de formulario propias de Atlas, asignables a activos
  - name: Inspecciones
    description: >-
      Inspecciones de activos enviadas desde la app al escanear el QR, con
      resultado apta / no apta
  - name: Otros - Capas
    description: Operaciones relacionadas con capas
  - name: User Tracker Access
    description: Operaciones de acceso personalizado a trackers por usuario
  - name: Reportes - Historial de Posiciones
    description: Estadísticas y detalle de posiciones GPS por activo
  - name: Reportes - Excesos de Velocidad
    description: Reportes de excesos de velocidad por tracker
  - name: Reportes - Ralentí
    description: Reportes de ralentí (motor encendido sin movimiento) por tracker
  - name: Reportes - Horas de Trabajo
    description: >-
      Reportes de horas de trabajo (conducción + paradas dentro de horario
      laboral) por tracker
  - name: Reportes - Última Actividad
    description: Reporte de estado de comunicación y última posición de activos
  - name: Reportes - Reportes Programados
    description: Gestión de reportes programados (CRUD)
  - name: Device Health
    description: Operaciones de salud de dispositivos del cliente
  - name: Activity Log
    description: Registro de actividad del cliente
  - name: Work - Importaciones
    description: Operaciones de importación de datos
  - name: Work - Plantillas
    description: Operaciones de plantillas de importación
  - name: Cargo - Transportistas
    description: Gestión de transportistas
  - name: Cargo - Pedidos
    description: Gestión de pedidos de carga
  - name: Cargo - Monitoreo
    description: Monitoreo en vivo de carga y transporte
  - name: Integraciones - Navixy
    description: Integración con plataforma Navixy
  - name: Mantenimiento - Dashboard
    description: Dashboard y métricas generales de mantenimiento
  - name: Mantenimiento - Proveedores
    description: Gestión de proveedores de servicio
  - name: Mantenimiento - Tareas
    description: Catálogo de tareas con que se arman las pautas de mantención
  - name: Mantenimiento - Pautas
    description: Pautas de mantención, con sus tareas del catálogo y su familia de activos
  - name: Mantenimiento - Estado
    description: Estado de mantenimiento de activos
  - name: Mantenimiento - Perfiles
    description: Perfiles de mantenimiento por activo
  - name: Mantenimiento - Fallas
    description: Gestión de fallas activas
  - name: Mantenimiento - DVIR
    description: Driver Vehicle Inspection Reports
  - name: Mantenimiento - Defectos
    description: Gestión de defectos detectados
  - name: Mantenimiento - Programaciones
    description: Programación de mantenimientos preventivos
  - name: Mantenimiento - Próximos
    description: Ítems de mantenimiento próximos
  - name: Mantenimiento - Órdenes de Trabajo
    description: Gestión de órdenes de trabajo
  - name: Mantenimiento - Registros de Servicio
    description: Registros históricos de servicios realizados
  - name: Mantenimiento - Problemas
    description: Gestión de problemas de mantenimiento
  - name: Mantenimiento - Tareas de Servicio
    description: Tareas específicas dentro de órdenes de trabajo
  - name: Mantenimiento - Inventario
    description: Gestión de partes, ubicaciones y stock
  - name: Mantenimiento - Costos
    description: Gestión y agregación de costos de mantenimiento
  - name: Trabajo - Tareas
    description: Gestión de tareas, tareas recurrentes, rutas y operaciones en lote
  - name: Trabajo - Empleados
    description: Gestión de empleados, departamentos y sus catálogos (tags, trackers)
  - name: Otros - Lugares
    description: Gestión de lugares (places) del cliente
  - name: Cargo - Activos
    description: Disponibilidad de activos de carga
  - name: Cargo - Ubicaciones
    description: Gestión de ubicaciones de carga
  - name: Cargo - Rendimiento
    description: Métricas de rendimiento de pedidos de carga
  - name: Reportes - Check-ins
    description: Reporte de check-ins de tareas
  - name: Reportes - Utilización
    description: Reporte de utilización de activos
  - name: Reportes - Visitas por Geocercas
    description: Reporte de visitas a geocercas
  - name: Reportes - Visitas por Trackers
    description: Reporte de visitas por tracker/activo
  - name: Reportes - Progreso de Geozonas
    description: Reporte de progreso de cobertura de geozonas (agricultura)
  - name: Reportes - Temperatura
    description: Reporte de temperatura por activo
  - name: Reportes - Exportación
    description: Exportación de reportes a archivo
  - name: Público - Business Time
    description: Reloj de servidor (endpoint público, sin autenticación)
  - name: Formularios
    description: Definiciones y envíos de formularios de la app
  - name: Sistema
    description: Endpoints de salud del servicio (liveness/readiness), sin autenticación
  - name: Facturación
    description: >-
      Portal del cliente — facturas publicadas de la empresa (proyección de
      Raúl)
  - name: Tienda de módulos
    description: >-
      Catálogo de módulos y productos UGPS con el estado de cada uno para el
      usuario
  - name: Soporte
    description: Portal del cliente — tickets de soporte de la empresa (proyección de Raúl)
  - name: Asistente
    description: Historial de conversaciones del Asistente de Atlas (spec
paths:
  /api/maintenance/programs/{id}/assets/{assetId}/tasks/{taskId}/exception:
    put:
      tags:
        - Mantenimiento - Pautas
      summary: Guardar la excepción de un activo en una tarea de la pauta
      description: >-
        Excepción de pauta: `follow` («Sigue la pauta»), `change` («Cambia»:
        intervalo propio por tipo de condición, que reemplaza ese tipo de la
        pauta y hereda los demás, aunque la pauta cambie después) o
        `not_applicable` («No aplica»: la tarea sale de los vencimientos, las
        cifras y la ficha del activo, sin borrar su último servicio; al volver a
        `follow` o `change` vuelve con él). `change` solo acepta tipos que la
        tarea tiene en la pauta (400 `MAINTENANCE_PROGRAM_EXCEPTION_INVALID`);
        sin «recordar antes» pone el 10 % del intervalo. Responde 404
        `MAINTENANCE_PROGRAM_ASSET_NOT_FOUND` o
        `MAINTENANCE_PROGRAM_TASK_NOT_FOUND`; 409
        `MAINTENANCE_PROGRAM_IN_OPEN_WORK_ORDER` al marcar «No aplica» si su
        mantención abierta está en una orden de trabajo abierta; 409
        `MAINTENANCE_PROGRAM_TASK_IN_OTHER_PROGRAM` al reactivarla si otra pauta
        ya la tiene activa en el activo; 409 `MAINTENANCE_PROGRAM_ARCHIVED` si
        la pauta está archivada.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: assetId
          in: path
          required: true
          schema:
            type: string
        - name: taskId
          in: path
          required: true
          description: Id de la tarea de la pauta (la Maintenance schedule).
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - mode
              properties:
                mode:
                  type: string
                  enum:
                    - follow
                    - change
                    - not_applicable
                conditions:
                  type: object
                  description: >-
                    Intervalo de una tarea de pauta: vence con la primera
                    condición que se cumpla, desde su último servicio. Siempre
                    «Se repite» y sin primer vencimiento por fecha (`dueDate`).
                    Sin «recordar antes», el backend pone el 10 % del intervalo
                    (por fecha, en días).
                  additionalProperties: false
                  properties:
                    odometer:
                      type: object
                      additionalProperties: false
                      required:
                        - everyKm
                      properties:
                        everyKm:
                          type: integer
                          minimum: 1
                          example: 40000
                        remindBeforeKm:
                          type: integer
                          minimum: 0
                          example: 4000
                    engineHours:
                      type: object
                      additionalProperties: false
                      required:
                        - everyHours
                      properties:
                        everyHours:
                          type: integer
                          minimum: 1
                        remindBeforeHours:
                          type: integer
                          minimum: 0
                    date:
                      type: object
                      additionalProperties: false
                      required:
                        - every
                        - unit
                      properties:
                        every:
                          type: integer
                          minimum: 1
                        unit:
                          type: string
                          enum:
                            - days
                            - weeks
                            - months
                        remindBefore:
                          type: integer
                          minimum: 0
                        remindUnit:
                          type: string
                          enum:
                            - days
                            - weeks
                            - months
      responses:
        '200':
          description: La pauta con la excepción guardada
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: success
                  data:
                    allOf:
                      - type: object
                        description: Pauta de mantención con sus conteos.
                        properties:
                          id:
                            type: string
                            example: 507f1f77bcf86cd799439011
                          name:
                            type: string
                            description: >-
                              Único entre las pautas activas, sin distinguir
                              tildes ni mayúsculas.
                            example: Volvo
                          description:
                            type: string
                          status:
                            type: string
                            enum:
                              - active
                              - archived
                          sourceGroup:
                            type: object
                            nullable: true
                            description: >-
                              Grupo del que se tomaron los activos una vez. La
                              pauta no lo sigue después.
                            properties:
                              id:
                                type: string
                              name:
                                type: string
                                nullable: true
                                description: '`null` si el grupo ya no existe.'
                              takenAt:
                                type: string
                                format: date-time
                          taskCount:
                            type: integer
                          assetCount:
                            type: integer
                          dueCounts:
                            type: object
                            description: >-
                              Cifras de vencimiento de los ítems abiertos:
                              vencidas, próximas, al día y sin último servicio
                              («Falta el último servicio»: sin referencia ni
                              Supuesto al entrar, no vencen hasta tener su
                              primera lectura). Son una partición: cada ítem
                              abierto cuenta en una sola de `overdue`,
                              `dueSoon`, `ok`, `assumedOk` y
                              `missingLastService`. `assumedLastService` cuenta
                              además todo lo supuesto (≈), en cualquier estado.
                            required:
                              - overdue
                              - dueSoon
                              - ok
                              - assumedOk
                              - missingLastService
                              - assumedLastService
                            properties:
                              overdue:
                                type: integer
                              dueSoon:
                                type: integer
                              ok:
                                type: integer
                                description: Al día con dato real, sin los supuestos (≈).
                              assumedOk:
                                type: integer
                                description: Al día con alguna referencia supuesta (≈).
                              missingLastService:
                                type: integer
                              assumedLastService:
                                type: integer
                                description: Ítems con alguna referencia supuesta (≈).
                          toScheduleAssetCount:
                            type: integer
                            description: >-
                              Camiones por programar: con alguna vencida o
                              próxima pendiente de la pauta y sin OT abierta.
                          recipients:
                            type: object
                            description: >-
                              Destinatarios del aviso por correo cuando un
                              activo pasa a próxima a vencer o vence. Al
                              enviarlo se reemplazan las dos listas. Hasta 50
                              usuarios y 20 correos.
                            properties:
                              userIds:
                                type: array
                                description: Usuarios activos de la empresa.
                                maxItems: 50
                                items:
                                  type: string
                                  example: 507f1f77bcf86cd799439011
                              emails:
                                type: array
                                description: >-
                                  Correos sueltos; se guardan en minúscula y sin
                                  repetidos.
                                maxItems: 20
                                items:
                                  type: string
                                  format: email
                                  example: taller@empresa.cl
                          requiresAttachment:
                            type: boolean
                            description: >-
                              «Exigir adjunto al cerrar» para las OT que cierran
                              tareas de la pauta.
                          requiresCost:
                            type: boolean
                            description: >-
                              «Exigir costo al cerrar» para las OT que cierran
                              tareas de la pauta.
                          createdAt:
                            type: string
                            format: date-time
                          updatedAt:
                            type: string
                            format: date-time
                      - type: object
                        properties:
                          recipientUsers:
                            type: array
                            description: >-
                              Los usuarios de `recipients.userIds` con nombre y
                              correo, en el mismo orden; sin los que ya no están
                              en la empresa.
                            items:
                              type: object
                              properties:
                                id:
                                  type: string
                                name:
                                  type: string
                                  example: Jefe Taller
                                email:
                                  type: string
                                  nullable: true
                          tasks:
                            type: array
                            items:
                              type: object
                              description: >-
                                Tarea de la pauta; su `id` es el de la
                                Maintenance schedule que la representa.
                              properties:
                                id:
                                  type: string
                                taskDefinition:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    code:
                                      type: string
                                      example: ACM
                                    name:
                                      type: string
                                      example: Cambio de aceite de motor
                                    status:
                                      type: string
                                      enum:
                                        - active
                                        - archived
                                conditions:
                                  type: object
                                  description: >-
                                    Intervalo de una tarea de pauta: vence con
                                    la primera condición que se cumpla, desde su
                                    último servicio. Siempre «Se repite» y sin
                                    primer vencimiento por fecha (`dueDate`).
                                    Sin «recordar antes», el backend pone el 10
                                    % del intervalo (por fecha, en días).
                                  additionalProperties: false
                                  properties:
                                    odometer:
                                      type: object
                                      additionalProperties: false
                                      required:
                                        - everyKm
                                      properties:
                                        everyKm:
                                          type: integer
                                          minimum: 1
                                          example: 40000
                                        remindBeforeKm:
                                          type: integer
                                          minimum: 0
                                          example: 4000
                                    engineHours:
                                      type: object
                                      additionalProperties: false
                                      required:
                                        - everyHours
                                      properties:
                                        everyHours:
                                          type: integer
                                          minimum: 1
                                        remindBeforeHours:
                                          type: integer
                                          minimum: 0
                                    date:
                                      type: object
                                      additionalProperties: false
                                      required:
                                        - every
                                        - unit
                                      properties:
                                        every:
                                          type: integer
                                          minimum: 1
                                        unit:
                                          type: string
                                          enum:
                                            - days
                                            - weeks
                                            - months
                                        remindBefore:
                                          type: integer
                                          minimum: 0
                                        remindUnit:
                                          type: string
                                          enum:
                                            - days
                                            - weeks
                                            - months
                                exceptionCounts:
                                  type: object
                                  description: >-
                                    Cuántos activos tienen Excepción de pauta en
                                    esta tarea.
                                  properties:
                                    notApplicable:
                                      type: integer
                                    ownInterval:
                                      type: integer
                                      description: Con intervalo propio («Cambia»).
                          assets:
                            type: array
                            items:
                              type: object
                              properties:
                                id:
                                  type: string
                                name:
                                  type: string
                                plate:
                                  type: string
                                  nullable: true
                                make:
                                  type: string
                                  nullable: true
                                model:
                                  type: string
                                  nullable: true
                                year:
                                  type: integer
                                  nullable: true
                                kilometer:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Odómetro actual por la regla de Mantención:
                                    el tracker, el kilometraje del activo o el
                                    perfil. `null` sin dato (un 0 que no viene
                                    del tracker no es una lectura).
                                kilometerSource:
                                  type: string
                                  nullable: true
                                  enum:
                                    - tracker
                                    - asset
                                    - profile
                                    - null
                                addedAt:
                                  type: string
                                  format: date-time
                                exceptions:
                                  type: array
                                  description: >-
                                    Sus Excepciones de pauta, solo de las tareas
                                    que la tienen.
                                  items:
                                    type: object
                                    description: >-
                                      Excepción de pauta de un activo en una
                                      tarea.
                                    properties:
                                      taskId:
                                        type: string
                                        description: >-
                                          Id de la tarea de la pauta (la
                                          Maintenance schedule).
                                      notApplicable:
                                        type: boolean
                                      conditions:
                                        description: >-
                                          Intervalo propio, solo de los tipos que
                                          cambia; `null` en «No aplica».
                                        nullable: true
                                        allOf:
                                          - type: object
                                            description: >-
                                              Intervalo de una tarea de pauta: vence
                                              con la primera condición que se cumpla,
                                              desde su último servicio. Siempre «Se
                                              repite» y sin primer vencimiento por
                                              fecha (`dueDate`). Sin «recordar antes»,
                                              el backend pone el 10 % del intervalo
                                              (por fecha, en días).
                                            additionalProperties: false
                                            properties:
                                              odometer:
                                                type: object
                                                additionalProperties: false
                                                required:
                                                  - everyKm
                                                properties:
                                                  everyKm:
                                                    type: integer
                                                    minimum: 1
                                                    example: 40000
                                                  remindBeforeKm:
                                                    type: integer
                                                    minimum: 0
                                                    example: 4000
                                              engineHours:
                                                type: object
                                                additionalProperties: false
                                                required:
                                                  - everyHours
                                                properties:
                                                  everyHours:
                                                    type: integer
                                                    minimum: 1
                                                  remindBeforeHours:
                                                    type: integer
                                                    minimum: 0
                                              date:
                                                type: object
                                                additionalProperties: false
                                                required:
                                                  - every
                                                  - unit
                                                properties:
                                                  every:
                                                    type: integer
                                                    minimum: 1
                                                  unit:
                                                    type: string
                                                    enum:
                                                      - days
                                                      - weeks
                                                      - months
                                                  remindBefore:
                                                    type: integer
                                                    minimum: 0
                                                  remindUnit:
                                                    type: string
                                                    enum:
                                                      - days
                                                      - weeks
                                                      - months
                          groupDifference:
                            type: object
                            nullable: true
                            description: >-
                              Activos del grupo de origen que no están en la
                              pauta; `null` si no falta ninguno.
                            properties:
                              groupId:
                                type: string
                              groupName:
                                type: string
                              missingAssets:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    name:
                                      type: string
                                    plate:
                                      type: string
                                      nullable: true
        '400':
          description: Error de validación
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      error:
                        type: string
                        example: El email es requerido
                  - type: object
                    properties:
                      status:
                        type: string
                        example: failed
                      message:
                        type: string
                        example: Error de validación
                      errors:
                        type: array
                        items:
                          type: object
                          properties:
                            path:
                              type: string
                            message:
                              type: string
        '401':
          description: No autorizado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Token inválido o expirado
        '403':
          description: Sin permisos
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: No tiene permisos para realizar esta acción
        '404':
          description: Recurso no encontrado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Recurso no encontrado
        '409':
          description: Conflicto con el estado actual del recurso
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: failed
                  code:
                    type: string
                    example: TRACKER_SENSOR_DIN_CONFLICT
                  message:
                    type: string
                    example: >-
                      Esa entrada digital ya está asignada a otro sensor del
                      dispositivo
        '500':
          description: Error interno del servidor
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      message:
                        type: string
                        example: Error interno del servidor
                  - type: object
                    properties:
                      status:
                        type: string
                        example: failed
                      message:
                        type: string
                        example: Error interno del servidor
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Token de sesión Better Auth o API token (`atk_...`) en el header
        `Authorization: Bearer <token>`. Los JWT legacy ya no son válidos.
    cookieAuth:
      type: apiKey
      in: cookie
      name: better-auth.session_token
      description: >-
        Cookie de sesión Better Auth emitida al iniciar sesión en el frontend
        web. En producción el nombre lleva prefijo `__Secure-`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.