> ## 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.

# Resolver el QR del activo escaneado

> Punto de entrada de la app al escanear el QR (`https://atlas.ugps.io/qr/i/{code}`) o cargar a
mano el código impreso bajo él. El QR es la identidad del activo: devuelve el QR, el activo y
las **funciones** que quien escanea puede usar sobre él. `inspection` trae los formularios
activos asignados y solo viene si la sesión tiene `access_inspections`; `immobilizer` (cortacorriente
por QR) viene solo en activos con la función habilitada, y por ahora siempre es `null`. Registra el
escaneo en el historial del QR. Acepta el código con o sin guion y en minúsculas. Solo activos dentro
de los trackers permitidos del usuario.

- `INSPECTION_QR_NOT_FOUND` (404): el código no existe, es de otro cliente o el activo está fuera
  del alcance del usuario.
- `INSPECTION_QR_REVOKED` (410): el QR fue reemplazado; la app muestra «Este QR ya no es válido».

**Permisos requeridos:** sesión válida (sin permiso de módulo). Reemplaza a
`GET /api/inspections/scan/{code}`.




## OpenAPI

````yaml /openapi.json get /api/assets/qr/{code}
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 - 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 - 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/assets/qr/{code}:
    get:
      tags:
        - Activos - QR
      summary: Resolver el QR del activo escaneado
      description: >
        Punto de entrada de la app al escanear el QR
        (`https://atlas.ugps.io/qr/i/{code}`) o cargar a

        mano el código impreso bajo él. El QR es la identidad del activo:
        devuelve el QR, el activo y

        las **funciones** que quien escanea puede usar sobre él. `inspection`
        trae los formularios

        activos asignados y solo viene si la sesión tiene `access_inspections`;
        `immobilizer` (cortacorriente

        por QR) viene solo en activos con la función habilitada, y por ahora
        siempre es `null`. Registra el

        escaneo en el historial del QR. Acepta el código con o sin guion y en
        minúsculas. Solo activos dentro

        de los trackers permitidos del usuario.


        - `INSPECTION_QR_NOT_FOUND` (404): el código no existe, es de otro
        cliente o el activo está fuera
          del alcance del usuario.
        - `INSPECTION_QR_REVOKED` (410): el QR fue reemplazado; la app muestra
        «Este QR ya no es válido».


        **Permisos requeridos:** sesión válida (sin permiso de módulo).
        Reemplaza a

        `GET /api/inspections/scan/{code}`.
      parameters:
        - name: code
          in: path
          required: true
          description: Código del QR del activo (8 caracteres, base32 de Crockford).
          schema:
            type: string
            example: K7Q2-PX9M
      responses:
        '200':
          description: QR, activo y funciones disponibles
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: success
                  data:
                    type: object
                    description: >-
                      QR del activo resuelto desde la app, con las funciones
                      disponibles para quien escanea.
                    properties:
                      qrCode:
                        type: object
                        properties:
                          id:
                            type: string
                          code:
                            type: string
                            example: K7Q2PX9M
                      asset:
                        type: object
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                          plate:
                            type: string
                          kind:
                            type: string
                          icon:
                            type: object
                            properties:
                              id:
                                type: string
                              color:
                                type: string
                      functions:
                        type: object
                        properties:
                          inspection:
                            nullable: true
                            description: Solo con `access_inspections`.
                            type: object
                            properties:
                              forms:
                                type: array
                                description: Formularios activos asignados al activo.
                                items:
                                  allOf:
                                    - type: object
                                      description: >-
                                        Cuerpo de creación y edición. En la
                                        creación `fieldId`/`optionId` se generan
                                        si no vienen; en la edición se conservan
                                        los existentes.
                                      required:
                                        - name
                                        - fields
                                      properties:
                                        name:
                                          type: string
                                          example: Inspección diaria
                                        description:
                                          type: string
                                        status:
                                          type: string
                                          enum:
                                            - active
                                            - inactive
                                          description: >-
                                            Solo en la edición. Un formulario
                                            inactivo no aparece al escanear.
                                        fields:
                                          type: array
                                          items:
                                            type: object
                                            description: >
                                              Campo del formulario. `type` fija qué
                                              parámetros aplican:

                                              text/textarea (`minLength`,
                                              `maxLength`), number (`min`, `max`),
                                              radio_group/dropdown (`options`),

                                              checkbox_group (`options`, `minChecked`,
                                              `maxChecked`), toggle (`criticalWhen`),
                                              rating (`maxStars`),

                                              date (`disableFuture`, `disablePast`),
                                              photo/signature (`maxFiles`), file
                                              (`maxFiles`, `allowedExtensions`),

                                              separator (sin respuesta).
                                            required:
                                              - fieldId
                                              - type
                                              - label
                                              - required
                                            properties:
                                              fieldId:
                                                type: string
                                                description: >-
                                                  Estable entre versiones; un fieldId
                                                  existente nunca cambia de `type`.
                                              type:
                                                type: string
                                                enum:
                                                  - text
                                                  - textarea
                                                  - number
                                                  - radio_group
                                                  - checkbox_group
                                                  - dropdown
                                                  - toggle
                                                  - rating
                                                  - date
                                                  - photo
                                                  - signature
                                                  - file
                                                  - separator
                                              label:
                                                type: string
                                                example: Estado de frenos
                                              required:
                                                type: boolean
                                              helperText:
                                                type: string
                                              minLength:
                                                type: integer
                                              maxLength:
                                                type: integer
                                              min:
                                                type: number
                                              max:
                                                type: number
                                              options:
                                                type: array
                                                items:
                                                  type: object
                                                  description: >-
                                                    Opción de un campo radio_group,
                                                    checkbox_group o dropdown. `optionId` es
                                                    estable entre versiones.
                                                  required:
                                                    - optionId
                                                    - label
                                                  properties:
                                                    optionId:
                                                      type: string
                                                      example: 3f1c2a8e-4b8d-4c1a-9a6e-7d2f0b1c9e55
                                                    label:
                                                      type: string
                                                      example: Dañado
                                                    critical:
                                                      type: boolean
                                                      description: >-
                                                        Elegir esta opción vuelve «no apta» la
                                                        inspección.
                                                      example: true
                                              minChecked:
                                                type: integer
                                              maxChecked:
                                                type: integer
                                              criticalWhen:
                                                type: boolean
                                                description: >-
                                                  Valor del toggle que se considera
                                                  crítico.
                                              maxStars:
                                                type: integer
                                              disableFuture:
                                                type: boolean
                                              disablePast:
                                                type: boolean
                                              maxFiles:
                                                type: integer
                                              allowedExtensions:
                                                type: array
                                                items:
                                                  type: string
                                                example:
                                                  - pdf
                                    - type: object
                                      required:
                                        - _id
                                        - clientId
                                        - status
                                      properties:
                                        _id:
                                          type: string
                                        clientId:
                                          type: string
                                        assetIds:
                                          type: array
                                          items:
                                            type: string
                                          description: >-
                                            Activos donde el formulario aparece al
                                            escanear el QR. Se edita con `PATCH
                                            /api/dynamic-forms/assignments`.
                                        status:
                                          type: string
                                          enum:
                                            - active
                                            - inactive
                                            - archived
                                        createdAt:
                                          type: string
                                          format: date-time
                                        updatedAt:
                                          type: string
                                          format: date-time
                          immobilizer:
                            nullable: true
                            description: >-
                              Cortacorriente por QR; solo en activos con la
                              función habilitada. Por ahora siempre `null`.
                            type: object
                            properties:
                              state:
                                type: string
                                enum:
                                  - cut
                                  - released
                                  - unknown
                              hasPendingChange:
                                type: boolean
                              updatedAt:
                                type: string
                                format: date-time
                                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
        '404':
          description: Recurso no encontrado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Recurso no encontrado
        '410':
          description: El QR de inspección fue reemplazado y ya no es válido
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: failed
                  code:
                    type: string
                    example: INSPECTION_QR_REVOKED
                  message:
                    type: string
                    example: Este QR ya no es válido
        '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
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.