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

# Envía comandos sin conexión

> Aplica hasta 100 comandos (máximo 1 MB en total) como el miembro, en el orden enviado. Cada uno se aplica exactamente igual que el mismo cambio hecho en la app. Cada comando responde `applied`, `rejected` o `deferred`. `applied` viene con el resultado. `rejected` es definitivo y viene con un `code`, un `message` y los `fields` inválidos. `deferred` significa que el comando no se ejecutó: una dependencia está sin terminar en otro lote, el mismo comando se está ejecutando en otra solicitud, o el lote agotó su presupuesto de 20 segundos. Envía de nuevo un comando diferido después de `retry_after` segundos.

Un comando enviado otra vez devuelve su resultado almacenado con `replayed: true` y no ejecuta nada. El mismo id con otro payload se rechaza con `command_id_reused`. Un comando cuya dependencia fue rechazada se rechaza con `dependency_rejected`. Un comando creado hace más de 90 días se rechaza con `command_expired`, y uno que el servidor no conoce con `unknown_command`.

Requiere un token de un dispositivo registrado con `sync:write`, y cada comando necesita su propio permiso, función del plan y alcance cuando se aplica.



## OpenAPI

````yaml /openapi.es.json post /sync/commands
openapi: 3.1.2
info:
  title: StockShift API
  version: 1.0.0
  description: >-
    La API REST de StockShift. Empieza con las guías de autenticación, alcances,
    paginación, errores y webhooks.
servers:
  - url: https://app.stockshift.io/api/v1
    description: Producción
  - url: https://app.beta.stockshift.io/api/v1
    description: Beta
security:
  - apiKey: []
  - oauth2: []
tags:
  - name: Acciones de existencias con testigo
    description: >-
      Retiene una acción de existencias para una segunda persona, que recuenta a
      ciegas y firma, y lee ambas firmas. Las existencias solo cambian cuando el
      testigo firma.
  - name: Existencias del artículo
    description: >-
      Todo sobre las existencias de un artículo: dónde están, qué está
      prometido, cómo se rastrean y cuánto cuestan.
  - name: Transferencias
    description: >-
      Mueve existencias de una ubicación a otra, con tiempo en tránsito entre el
      envío y la recepción.
  - name: Costos de importación
    description: >-
      Agrega flete, aranceles y otros cargos al costo de las existencias que
      recibiste.
  - name: Conteos de existencias
    description: >-
      Cuenta lo que hay en el estante, compáralo con lo que StockShift espera y
      contabiliza la diferencia cuando alguien la apruebe.
  - name: Ubicaciones
    description: >-
      Los almacenes, salas y contenedores donde se guardan las existencias. La
      mayoría de las llamadas de existencias necesitan un ID de ubicación de
      aquí.
  - name: Periodos
    description: >-
      Cierra cada mes una vez informado: bloquea lo que tiene fecha en él,
      comprueba que no quede nada abierto y conserva el valor de las existencias
      al final.
  - name: Importaciones de inventario
    description: >-
      Carga las existencias iniciales desde un archivo CSV, con una vista previa
      antes de contabilizar nada.
  - name: Solicitudes de liberación
    description: >-
      Pide a Calidad que libere existencias retenidas, y rechaza o retira la
      solicitud. Liberar las existencias la cierra.
  - name: Firmantes
    description: >-
      Quién puede firmar acciones de existencias con testigo: de quién se
      verificó la identidad, cómo y cuándo, y las firmas fallidas que deben ver
      los revisores.
  - name: Existencias
    description: >-
      Cuánto hay de cada artículo y dónde. Consulta los niveles, ahora o en una
      fecha pasada, y contabiliza ajustes cuando se encuentren, pierdan o dañen
      existencias.
  - name: Reglas de testigo
    description: >-
      Qué acciones de existencias esperan a que una segunda persona vuelva a
      contar y firme, como retirar una sustancia controlada.
  - name: Reglas de asignación
    description: >-
      Qué lotes se toman primero cuando se reservan o se envían existencias,
      como primero en caducar, primero en salir.
  - name: Configuración de inventario
    description: >-
      Cómo maneja la organización las existencias, por ejemplo si pueden quedar
      en negativo y cómo se costean.
  - name: Lotes
    description: Lotes de existencias que comparten un número de lote, y cuándo vencen.
  - name: Movimientos
    description: >-
      El libro detrás de cada nivel de existencias. Los movimientos nunca se
      editan; se corrigen revirtiéndolos.
  - name: Números de serie
    description: Unidades con seguimiento individual y dónde está cada una ahora.
  - name: Movimientos de existencias
    description: >-
      Mueve existencias de una ubicación a otra en un solo paso, por ejemplo de
      un muelle a un estante, y deshaz un movimiento completo.
  - name: Vistas previas masivas
    description: >-
      Revisa una lista de líneas de existencias antes de un movimiento masivo,
      un ajuste, una retención o una impresión, y ve qué debe decidirse en cada
      línea.
  - name: Artículos
    description: >-
      Los productos y materiales que almacenas, compras, fabricas o vendes. El
      ID o el SKU de un artículo es lo que piden la mayoría de los demás
      endpoints.
  - name: Familias
    description: >-
      Grupos de artículos que solo se diferencian por opciones como la talla o
      el color, y las variantes que se hacen con ellos.
  - name: Importaciones de catálogo
    description: >-
      Crea o actualiza artículos desde un archivo CSV, con una vista previa
      antes de guardar nada.
  - name: Campos personalizados
    description: >-
      Campos adicionales que la organización agrega a sus artículos. Defínelos
      aquí y luego asigna sus valores en cada artículo.
  - name: Biblioteca de productos
    description: >-
      Busca un producto por su GTIN y crea un artículo con lo que la biblioteca
      sabe de él.
  - name: Unidades
    description: >-
      Unidades de medida, como each, box o kg. Los artículos se cuentan en una
      unidad base y se convierten desde las demás.
  - name: Escaneo
    description: >-
      Convierte un código de barras escaneado en el artículo, la unidad o la
      pieza etiquetada que identifica.
  - name: Proveedores
    description: >-
      Las empresas a las que compras, las personas con las que tratas allí y lo
      que te cobran.
  - name: Órdenes de compra
    description: >-
      Órdenes a proveedores. Crea un borrador, apruébalo, envíalo y recibe la
      mercancía contra él.
  - name: Importaciones de compras
    description: Carga proveedores y sus catálogos desde archivos CSV.
  - name: Configuración de compras
    description: >-
      Cómo compra la organización, por ejemplo el umbral de aprobación y cuánto
      puede superar una recepción a la orden.
  - name: Recepciones
    description: >-
      Mercancía recibida contra órdenes de compra. Revierte una recepción para
      corregirla o imprime etiquetas de lo que llegó.
  - name: Proveedores del artículo
    description: Qué proveedores venden un artículo, y a qué precio.
  - name: Exportaciones de compras
    description: >-
      Descarga proveedores o sus catálogos como CSV, en las mismas columnas que
      lee la importación.
  - name: Pedidos de venta
    description: >-
      Pedidos de clientes. Toma uno como borrador, confírmalo para reservar
      existencias, luego envíalo y factúralo.
  - name: Clientes
    description: Las empresas a las que vendes y las personas con las que tratas allí.
  - name: Facturas
    description: Facturas de lo que has vendido y los pagos registrados contra ellas.
  - name: Listas de precios
    description: >-
      Los precios que paga un cliente, con escalas por cantidad. Asígnale una
      lista de precios a un cliente y sus pedidos se calculan solos.
  - name: Cotizaciones
    description: >-
      Ofertas a clientes. Una cotización aceptada se convierte en un pedido de
      venta.
  - name: Tasas de impuestos
    description: Las tasas de impuesto sobre las ventas con las que se cobran las facturas.
  - name: Importaciones de ventas
    description: Carga clientes y listas de precios desde archivos CSV.
  - name: Devoluciones
    description: >-
      Mercancía que los clientes devuelven: autoriza la devolución, luego
      recíbela en las existencias y acredítala.
  - name: Envíos
    description: Lo que salió del edificio por cada pedido de venta.
  - name: Configuración de ventas
    description: >-
      Cómo vende la organización, por ejemplo cuándo se reservan las existencias
      y si las facturas pueden salir antes del envío.
  - name: Certificados de conformidad
    description: >-
      Certificados firmados de que los productos de un envío cumplen con el
      pedido, conservados exactamente como se firmaron.
  - name: Precios
    description: >-
      Consulta cuánto pagaría un cliente por una cantidad de un artículo antes
      de ponerlo en un pedido.
  - name: Exportaciones de ventas
    description: >-
      Descarga clientes y listas de precios como CSV, en las mismas columnas que
      lee la importación.
  - name: Órdenes de fabricación
    description: >-
      Órdenes para fabricar algo. Libera una orden de fabricación al piso,
      consume sus piezas y complétala hacia las existencias.
  - name: Reparaciones
    description: >-
      Reparaciones de unidades que los clientes devuelven: revisa la garantía,
      registra las piezas puestas y retiradas, y luego completa la reparación o
      factúrala.
  - name: Rutas
    description: >-
      Los pasos por los que pasa una orden de fabricación y el centro de trabajo
      en el que se ejecuta cada paso.
  - name: Centros de trabajo
    description: Las máquinas, celdas o equipos donde se hacen los pasos de una ruta.
  - name: Plazos de garantía
    description: >-
      Cuánto tiempo un artículo está en garantía y si cuenta desde el envío o la
      fabricación, con condiciones propias para algunos clientes.
  - name: Trazabilidad
    description: >-
      Rastrea un lote o número de serie hacia atrás hasta lo que entró en él, o
      hacia adelante hasta aquello en lo que entró.
  - name: Configuración de fabricación
    description: >-
      Cómo fabrica la organización, por ejemplo si las operaciones pueden
      superponerse y el estado en el que entran los productos terminados.
  - name: Programación
    description: Planifica las órdenes de fabricación abiertas en días hábiles.
  - name: Variaciones de costo
    description: >-
      Dónde una orden de fabricación completada costó más o menos que su costo
      estándar.
  - name: BOM
    description: >-
      Listas de materiales: las piezas y cantidades que forman un artículo,
      guardadas como revisiones.
  - name: Cambios de ingeniería
    description: >-
      Órdenes de cambio que proponen revisiones nuevas de BOM y las liberan una
      vez aprobadas.
  - name: Importaciones de ingeniería
    description: Carga listas de materiales desde un archivo CSV o una exportación de CAD.
  - name: Configuración de Ingeniería
    description: >-
      Cómo gestiona la organización los cambios de ingeniería, por ejemplo
      cuántas aprobaciones necesita una orden de cambio.
  - name: Exportaciones de ingeniería
    description: >-
      Descarga listas de materiales como CSV, en las mismas columnas que lee la
      importación.
  - name: Dónde se usa
    description: >-
      Encuentra todas las BOM en las que aparece un artículo, antes de cambiarlo
      o retirarlo.
  - name: Planes de inspección
    description: >-
      Qué revisar, en qué artículos y cuántos: las características, el muestreo
      y el punto de inspección de cada plan.
  - name: Inspecciones
    description: >-
      Inspecciones abiertas por recepciones, operaciones y órdenes de
      fabricación. Registra sus resultados para aprobar o rechazar las
      existencias que retienen.
  - name: Pronósticos
    description: >-
      La demanda esperada de cada artículo, semana por semana, y los cambios que
      hacen los planificadores.
  - name: Escenarios
    description: Copias del pronóstico para probar cambios sin tocar el plan real.
  - name: Demanda
    description: >-
      Demanda pasada de un artículo en una ubicación, a partir de la cual se
      construyen los pronósticos.
  - name: Sugerencias
    description: >-
      Lo que el plan dice que se compre o se fabrique. Acepta uno para generar
      la orden de compra o la orden de fabricación, o descártalo.
  - name: Reabastecimiento
    description: >-
      Cómo se mantiene cada artículo en existencias en cada ubicación: puntos de
      reorden, mínimos y máximos o revisión periódica.
  - name: Días festivos
    description: >-
      Días en que la organización no trabaja, que el plan omite al contar plazos
      de entrega.
  - name: Configuración de planificación
    description: >-
      Cómo planifica la organización, por ejemplo el horizonte del pronóstico y
      el nivel de servicio.
  - name: Automatizaciones
    description: >-
      Reglas que ejecutan pasos cuando ocurre algo o según una programación.
      Edita el borrador y luego publícalo para activarla.
  - name: Ejecuciones
    description: >-
      Cada vez que se ejecutó una automatización: qué la inició, qué hizo cada
      paso y dónde falló.
  - name: Aprobaciones
    description: >-
      Ejecuciones en pausa a la espera de que una persona las apruebe o rechace
      antes de continuar.
  - name: Configuración de automatización
    description: >-
      Límites de toda la organización para las automatizaciones, como las
      ejecuciones por minuto y si alguien puede aprobar su propia ejecución.
  - name: Plantillas de automatización
    description: Automatizaciones prediseñadas para empezar.
  - name: Eventos
    description: >-
      Los eventos que pueden activar una automatización y los datos que lleva
      cada uno.
  - name: Catálogo de pasos
    description: >-
      Todos los pasos que puede usar una automatización y las entradas que toma
      cada uno.
  - name: Vistas
    description: >-
      Reportes guardados: el conjunto de datos, los filtros, la agrupación y el
      gráfico que alguien configuró, listos para ejecutarse de nuevo.
  - name: Paneles
    description: Páginas de gráficos y KPI dispuestos en una cuadrícula.
  - name: Conjuntos de datos
    description: >-
      Los datos sobre los que puedes reportar y los campos de cada uno. Empieza
      aquí para crear un reporte.
  - name: Programaciones
    description: >-
      Envía un reporte por correo electrónico según una programación, o avisa a
      alguien cuando un valor cruza un umbral.
  - name: KPI
    description: >-
      Cifras individuales que vale la pena vigilar, definidas como una fórmula
      sobre un conjunto de datos.
  - name: Panel
    description: >-
      Las cifras de la pantalla de inicio de la app, por si quieres mostrar los
      mismos números en otro lugar.
  - name: Carpetas de vistas
    description: Carpetas que mantienen organizadas las vistas guardadas.
  - name: Exportaciones de Insights
    description: >-
      Exporta un informe a un archivo. Las exportaciones grandes se ejecutan en
      segundo plano y están listas para descargar más tarde.
  - name: Plantillas de reportes
    description: >-
      Reportes prediseñados, como el envejecimiento de existencias, para empezar
      una vista.
  - name: Reportes
    description: >-
      Ejecuta la definición de un reporte y obtén sus filas o su gráfico, sin
      guardarla antes.
  - name: Plantillas de panel
    description: Paneles prediseñados para empezar.
  - name: Fórmulas
    description: >-
      Comprueba una fórmula contra un conjunto de datos antes de guardarla en un
      KPI o en un campo calculado.
  - name: Conexiones
    description: >-
      Cuentas conectadas en otros sistemas, qué sincroniza cada una y el
      historial de sus ejecuciones de sincronización.
  - name: Envío
    description: >-
      Tarifas de transportistas, las etiquetas compradas para pedidos y
      devoluciones, y los escaneos que rastrean cada paquete.
  - name: Migraciones
    description: >-
      Trae registros de otro sistema: prepara archivos o una extracción, asigna
      las columnas, revisa las filas, confírmalas y deshaz la confirmación.
  - name: Abastecimiento
    description: >-
      Precios y existencias de piezas de distribuidores: busca en un
      distribuidor conectado, vincula artículos con sus piezas y calcula el
      precio de una revisión de BOM.
  - name: CAD
    description: >-
      Ensambles de CAD y PLM: lista los ensambles de una herramienta conectada y
      vigila aquellos cuyas liberaciones se convierten en importaciones de BOM.
  - name: Exportación de datos
    description: >-
      Todo lo que guarda la organización en un solo ZIP de archivos CSV y de
      líneas JSON, para que el propietario lo descargue.
  - name: Direcciones fiscales
    description: >-
      Las direcciones por las que un servicio de impuestos conectado calcula el
      impuesto de cada venta, comprobadas con él.
  - name: Conectores
    description: >-
      Los sistemas a los que puede conectarse StockShift y lo que puede
      sincronizar cada conector.
  - name: Conjuntos de etiquetas
    description: >-
      Todos los lotes de etiquetas impresos, para que puedas encontrar uno de
      nuevo y reimprimirlo.
  - name: Plantillas de etiquetas
    description: Los diseños con que se imprimen las etiquetas.
  - name: Piezas
    description: >-
      Busca una pieza etiquetada a partir del código de su etiqueta: el
      artículo, el lote o la serie y cuánto contiene.
  - name: Marca y plantillas
    description: >-
      El logotipo, los colores, los términos y los campos personalizados con que
      se imprime cada cotización, orden de compra, factura y lista de empaque.
  - name: Apps móviles
    description: >-
      Cómo las apps móviles de StockShift registran un dispositivo, inician
      sesión y se mantienen sincronizadas con el servidor.
  - name: Dispositivos
    description: >-
      Los teléfonos y escáneres registrados en la organización. Bloquea uno
      perdido, bórralo o retíralo.
  - name: Configuración del escáner
    description: >-
      Hojas imprimibles de códigos de barras que configuran un escáner de
      hardware, y las preferencias de escáner de cada persona.
  - name: Inscripciones
    description: Crea los códigos QR que inscriben dispositivos compartidos y quioscos.
  - name: Feeds de sincronización
    description: >-
      Descarga una instantánea de los datos que necesita un dispositivo y luego
      obtén los cambios desde entonces.
  - name: Comandos de sincronización
    description: >-
      Envía los cambios que un dispositivo hizo sin conexión. Cada comando se
      aplica una sola vez, sin importar cuántas veces se envíe.
  - name: Archivos de sincronización
    description: >-
      Descarga los archivos, como imágenes de artículos, a los que apunta un
      feed.
  - name: Perfil
    description: >-
      La cuenta propia de la persona que inició sesión: sus datos, contraseña,
      llaves de acceso, segundo factor y sesiones.
  - name: Notificaciones
    description: >-
      La bandeja de entrada del miembro que inició sesión: lo que lo necesita,
      lo que no ha leído, y de qué se le avisa y cómo.
  - name: Invitaciones
    description: Invita a personas a unirse a la organización y acepta una invitación.
  - name: Roles
    description: >-
      Roles y los permisos de cada uno. Un miembro puede hacer lo que sus roles
      permiten.
  - name: Acceso del personal
    description: >-
      Solicitudes del soporte de StockShift para ver los datos de la
      organización, que un propietario debe conceder.
  - name: Equipo
    description: Las personas de la organización y los roles que tienen.
  - name: Claves de API
    description: >-
      Crea y revoca las claves que usan los scripts y las integraciones para
      llamar a esta API.
  - name: Organizaciones
    description: Las organizaciones a las que pertenece la persona que inició sesión.
  - name: Firmas
    description: >-
      Algunas acciones necesitan una firma electrónica. Obtén aquí un token de
      firma y envíalo con la llamada.
  - name: Registro
    description: Regístrate para obtener una cuenta y una organización nuevas.
  - name: Organización
    description: >-
      Política de toda la organización: cuánto tiempo se conservan los
      registros, reglas de sesión, retenciones legales y cierre de la
      organización.
  - name: Aceptaciones legales
    description: >-
      Las versiones de los Términos de servicio y de la Política de privacidad
      que aceptó la organización, las versiones que esperan a un propietario y
      un certificado de cada aceptación.
  - name: Dirección
    description: >-
      La dirección de facturación que aparece en las facturas de la
      organización.
  - name: Historial
    description: Quién cambió qué campo de un registro, cuándo y a partir de qué.
  - name: Certificados de destrucción
    description: Comprueba que un certificado de destrucción de datos es auténtico.
  - name: Facturación
    description: >-
      Consulta o cambia el plan, compra paquetes de ejecuciones para
      automatizaciones, ve las facturas y actualiza el método de pago.
  - name: Webhooks
    description: >-
      Registra URL para que te avisen cuando pasen cosas, y consulta cada
      entrega y su respuesta.
  - name: Apps OAuth
    description: >-
      Las apps de terceros que los miembros conectaron mediante OAuth. Revoca
      una para cortar su acceso.
  - name: Hooks REST
    description: >-
      Para apps conectadas como Zapier: suscribe un evento a una URL y cancela
      la suscripción.
  - name: Servidor MCP
    description: >-
      Deja que un asistente de IA trabaje en StockShift a través del Model
      Context Protocol, con los mismos permisos que el miembro que lo conecta.
  - name: Eventos recientes
    description: >-
      Los últimos eventos de un tipo, tal como los envían las entregas, para
      consultar periódicamente o usar como muestras.
  - name: Eventos de webhook
    description: >-
      Todos los eventos que pueden enviar los webhooks y los REST hooks, con la
      forma de sus datos.
paths:
  /sync/commands:
    post:
      tags:
        - Comandos de sincronización
      summary: Envía comandos sin conexión
      description: >-
        Aplica hasta 100 comandos (máximo 1 MB en total) como el miembro, en el
        orden enviado. Cada uno se aplica exactamente igual que el mismo cambio
        hecho en la app. Cada comando responde `applied`, `rejected` o
        `deferred`. `applied` viene con el resultado. `rejected` es definitivo y
        viene con un `code`, un `message` y los `fields` inválidos. `deferred`
        significa que el comando no se ejecutó: una dependencia está sin
        terminar en otro lote, el mismo comando se está ejecutando en otra
        solicitud, o el lote agotó su presupuesto de 20 segundos. Envía de nuevo
        un comando diferido después de `retry_after` segundos.


        Un comando enviado otra vez devuelve su resultado almacenado con
        `replayed: true` y no ejecuta nada. El mismo id con otro payload se
        rechaza con `command_id_reused`. Un comando cuya dependencia fue
        rechazada se rechaza con `dependency_rejected`. Un comando creado hace
        más de 90 días se rechaza con `command_expired`, y uno que el servidor
        no conoce con `unknown_command`.


        Requiere un token de un dispositivo registrado con `sync:write`, y cada
        comando necesita su propio permiso, función del plan y alcance cuando se
        aplica.
      operationId: v1.sync.commands.submit
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitCommandsRequest'
      responses:
        '200':
          description: '`CommandResultsResource`'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/CommandResultsResource'
                required:
                  - data
          headers:
            X-RateLimit-Limit:
              description: >-
                Solicitudes por minuto permitidas para este token, o para la
                dirección si no tiene uno.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Solicitudes que quedan este minuto.
              schema:
                type: integer
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '403':
          $ref: '#/components/responses/DeviceRequired'
        '413':
          $ref: '#/components/responses/BatchTooLarge'
        '422':
          $ref: '#/components/responses/ValidationException'
        '429':
          description: Demasiadas solicitudes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
          headers:
            Retry-After:
              description: Segundos hasta que se restablece el límite.
              schema:
                type: integer
            X-RateLimit-Limit:
              description: Solicitudes por minuto permitidas.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: 'Solicitudes que quedan este minuto: ninguna.'
              schema:
                type: integer
      x-codeSamples:
        - lang: typescript
          label: TypeScript SDK
          source: >-
            import { StockShift } from "@stockshift/sdk";


            const stockshift = new StockShift({ token:
            process.env.STOCKSHIFT_TOKEN! });


            const result = await stockshift.post("/sync/commands", {
              body: { commands: [] },
            });
components:
  schemas:
    SubmitCommandsRequest:
      type: object
      description: >-
        Un lote de comandos que envía un dispositivo, en el orden en que se
        ejecutan.
      properties:
        commands:
          type: array
          description: Los comandos, de 1 a 100 y 1 MB en total. Se ejecutan en este orden.
          items:
            oneOf:
              - $ref: '#/components/schemas/SyncCommandInventoryCountsAddLine'
              - $ref: '#/components/schemas/SyncCommandInventoryCountsRecord'
              - $ref: '#/components/schemas/SyncCommandInventoryReleaseRequestsCreate'
              - $ref: '#/components/schemas/SyncCommandInventoryStockAdjust'
              - $ref: '#/components/schemas/SyncCommandInventoryStockChangeStatus'
              - $ref: '#/components/schemas/SyncCommandInventoryStockMove'
              - $ref: '#/components/schemas/SyncCommandInventoryStockReverse'
              - $ref: '#/components/schemas/SyncCommandInventoryStockReverseMove'
              - $ref: '#/components/schemas/SyncCommandInventoryTransfersCreate'
              - $ref: '#/components/schemas/SyncCommandInventoryTransfersReceive'
              - $ref: '#/components/schemas/SyncCommandInventoryTransfersShip'
              - $ref: '#/components/schemas/SyncCommandInventoryVerificationsCancel'
              - $ref: '#/components/schemas/SyncCommandInventoryVerificationsCount'
              - $ref: '#/components/schemas/SyncCommandInventoryVerificationsDecline'
              - $ref: '#/components/schemas/SyncCommandInventoryVerificationsReject'
              - $ref: '#/components/schemas/SyncCommandInventoryVerificationsRequest'
              - $ref: '#/components/schemas/SyncCommandInventoryVerificationsSubmit'
              - $ref: '#/components/schemas/SyncCommandInventoryVerificationsWitness'
              - $ref: '#/components/schemas/SyncCommandLabelsSetsPrint'
              - $ref: '#/components/schemas/SyncCommandManufacturingBuildsComplete'
              - $ref: '#/components/schemas/SyncCommandManufacturingBuildsIssueParts'
              - $ref: >-
                  #/components/schemas/SyncCommandManufacturingBuildsReportProblem
              - $ref: >-
                  #/components/schemas/SyncCommandManufacturingOperationsComplete
              - $ref: '#/components/schemas/SyncCommandManufacturingOperationsPause'
              - $ref: '#/components/schemas/SyncCommandManufacturingOperationsStart'
              - $ref: '#/components/schemas/SyncCommandPurchasingOrdersReceive'
              - $ref: '#/components/schemas/SyncCommandSalesOrdersShip'
          minItems: 1
          maxItems: 100
          uniqueItems: true
      required:
        - commands
      title: SubmitCommandsRequest
    CommandResultsResource:
      type: object
      properties:
        results:
          type: array
          description: >-
            Lo que pasó con cada comando del lote, en el orden en que se
            enviaron.
          items:
            $ref: '#/components/schemas/CommandResultResource'
      required:
        - results
      title: CommandResultsResource
      description: Lo que pasó con cada comando de un lote, en el orden en que se enviaron.
    ProblemDetails:
      type: object
      description: >-
        Un error, como detalles del problema RFC 9457. Decide según `code`, que
        es estable; `detail` está escrito para personas y puede cambiar.
      properties:
        type:
          type: string
          format: uri
          description: Enlaces a la documentación de este código.
        title:
          type: string
          description: El texto de estado HTTP.
        status:
          type: integer
          description: El código de estado HTTP.
        code:
          type: string
          description: Un nombre estable legible por máquina, como validation_failed.
        detail:
          type: string
          description: Qué salió mal, para las personas.
        errors:
          type: object
          description: >-
            Errores por campo. En validation_failed, y en un rechazo con un
            código propio como insufficient_stock o document_closed.
          additionalProperties:
            type: array
            items:
              type: string
        feature:
          type: string
          description: La función del plan que se necesita. Solo en plan_upgrade_required.
        reason:
          type: string
          description: >-
            Por qué un dispositivo debe descargar un feed de nuevo. Solo en
            resync_required.
        attempts_left:
          type: integer
          description: >-
            Cuántas firmas rechazadas quedan antes de que el miembro se bloquee
            en el dispositivo. Solo en signature_assertion_invalid.
        rule_ids:
          type: array
          description: >-
            Las reglas de testigo que cubren las existencias. Solo en
            verification_required.
          items:
            type: string
        witness:
          type: string
          description: >-
            Dónde firma el testigo: same_device, remote o either. Solo en
            verification_required.
        blind_recount:
          type: boolean
          description: >-
            Si el testigo vuelve a contar antes de ver la cantidad. Solo en
            verification_required.
        flags:
          type: array
          description: >-
            Las marcas que dejan abiertas las decisiones de una línea masiva,
            tal como las nombra la vista previa masiva. Solo en
            decision_required.
          items:
            type: object
            properties:
              flag:
                type: string
                description: El nombre de la marca, tal como lo da la vista previa masiva.
              facts:
                type: object
                description: >-
                  Los hechos de la marca, como en la vista previa masiva; los
                  demás son null.
                additionalProperties:
                  anyOf:
                    - type: string
                    - type: integer
                    - type: array
                      items:
                        type: string
                    - type: 'null'
              choices:
                type: array
                description: >-
                  Las decisiones que resolverían la marca, tal como las nombra
                  la vista previa masiva.
                items:
                  type: string
            required:
              - flag
              - facts
              - choices
      required:
        - type
        - title
        - status
        - code
        - detail
      title: ProblemDetails
    SyncCommandInventoryCountsAddLine:
      type: object
      title: SyncCommandInventoryCountsAddLine
      description: >-
        Existencias encontradas que el conteo no esperaba: un artículo, su lote,
        cuánto se contó y, si quien cuenta lo indica, cuándo y después de qué
        contacto.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.counts.add_line
          description: El nombre del comando, siempre `inventory.counts.add_line`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            count_id:
              type: string
              description: >-
                El ID del conteo abierto en el que se encontraron las
                existencias.
            item:
              type: string
              description: >-
                El artículo, por su ID o su SKU. Un SKU coincide sin distinguir
                mayúsculas.
            quantity:
              type: string
              description: >-
                Lo contado, como decimal exacto de cero o más, enviado como
                cadena, con hasta 20 dígitos a cada lado del punto. Está en
                `unit`, o en la unidad base del artículo cuando se omite `unit`.
            unit:
              type:
                - string
                - 'null'
              description: >-
                La unidad en la que está la cantidad, como `case`. Debe ser una
                unidad desde la que el artículo se convierte. Si no se envía, se
                usa la unidad base del artículo.
            lot:
              type:
                - string
                - 'null'
              description: El número de lote, para un artículo con seguimiento por lote.
            counted_at:
              type:
                - string
                - 'null'
              format: date-time
              description: >-
                Cuándo se contó la línea, como marca de tiempo ISO 8601 según el
                reloj del dispositivo anclado al servidor. Un dispositivo que
                contó sin conexión lo envía para que la aprobación compare la
                línea con los libros tal como estaban entonces. Debe ser
                posterior a `contact_at` y al inicio del conteo, y no posterior
                al momento en que llega el comando. Si se omite, se usa la hora
                del servidor.
            contact_at:
              type:
                - string
                - 'null'
              format: date-time
              description: >-
                El último contacto del dispositivo con el servidor antes de
                contar la línea, como marca de tiempo ISO 8601. Es obligatorio
                con `counted_at` y debe ser un contacto que el servidor registró
                para el dispositivo que envía el comando.
          required:
            - count_id
            - item
            - quantity
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.counts.add_line
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            count_id: 0199a0d0-0000-7000-8000-00000000f002
            item: 0199a0d0-0000-7000-8000-00000000f003
            quantity: '40'
    SyncCommandInventoryCountsRecord:
      type: object
      title: SyncCommandInventoryCountsRecord
      description: >-
        El comando `inventory.counts.record`, que un dispositivo envía para
        cambiar algo mientras puede estar sin conexión.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.counts.record
          description: El nombre del comando, siempre `inventory.counts.record`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            count_id:
              type: string
              description: El ID del conteo abierto al que pertenecen las líneas.
            lines:
              type: array
              items:
                type: object
                properties:
                  line_id:
                    type: string
                    description: El ID de la línea de conteo que se contó.
                  quantity:
                    type: string
                    description: >-
                      Lo contado, como decimal exacto de cero o más, enviado
                      como cadena, con hasta 20 dígitos a cada lado del punto.
                      Está en `unit`, o en la unidad base del artículo cuando se
                      omite `unit`.
                  unit:
                    type:
                      - string
                      - 'null'
                    description: >-
                      La unidad en la que está la cantidad, como `case`. Debe
                      ser una unidad desde la que el artículo se convierte. Si
                      no se envía, se usa la unidad base del artículo.
                  counted_at:
                    type:
                      - string
                      - 'null'
                    format: date-time
                    description: >-
                      Cuándo se contó la línea, como marca de tiempo ISO 8601
                      según el reloj del dispositivo anclado al servidor. Un
                      dispositivo que contó sin conexión lo envía para que la
                      aprobación compare la línea con los libros tal como
                      estaban entonces. Debe ser posterior a `contact_at` y al
                      inicio del conteo, y no posterior al momento en que llega
                      el comando. Si se omite, se usa la hora del servidor.
                  contact_at:
                    type:
                      - string
                      - 'null'
                    format: date-time
                    description: >-
                      El último contacto del dispositivo con el servidor antes
                      de contar la línea, como marca de tiempo ISO 8601. Es
                      obligatorio con `counted_at` y debe ser un contacto que el
                      servidor registró para el dispositivo que envía el
                      comando.
                required:
                  - line_id
                  - quantity
              description: Las líneas contadas, de 1 a 500.
          required:
            - count_id
            - lines
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.counts.record
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            count_id: 0199a0d0-0000-7000-8000-00000000f002
            lines:
              - line_id: 0199a0d0-0000-7000-8000-00000000f003
                quantity: '9'
              - line_id: 0199a0d0-0000-7000-8000-00000000f004
                quantity: '1'
                unit: each
    SyncCommandInventoryReleaseRequestsCreate:
      type: object
      title: SyncCommandInventoryReleaseRequestsCreate
      description: >-
        Pide a las personas que pueden liberar existencias retenidas que las
        liberen: el artículo por id o SKU, dónde está, el estado en que se
        retiene, cuánto, su lote, número de serie o pieza etiquetada, una nota y
        el comando del dispositivo que espera la liberación. También es el
        payload del comando de sincronización
        `inventory.release_requests.create`, así que sus claves van en snake
        case.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.release_requests.create
          description: El nombre del comando, siempre `inventory.release_requests.create`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            item:
              type: string
              description: >-
                El artículo, por su ID o su SKU. Un SKU coincide sin distinguir
                mayúsculas.
            location_id:
              type: string
              description: El ID de la ubicación donde se retienen las existencias.
            held_status:
              enum:
                - available
                - quarantined
                - rejected
              description: >-
                El estado en el que se retienen las existencias: `quarantined` o
                `rejected`.
            quantity:
              type: string
              description: >-
                Un decimal exacto positivo, enviado como cadena, con hasta 20
                dígitos a cada lado del punto. Está en `unit`, o en la unidad
                base del artículo cuando se omite `unit`.
            unit:
              type:
                - string
                - 'null'
              description: >-
                La unidad en la que está la cantidad, como `case`. Debe ser una
                unidad desde la que el artículo se convierte. Si no se envía, se
                usa la unidad base del artículo.
            lot:
              type:
                - string
                - 'null'
              description: El número de lote, para un artículo con seguimiento por lote.
            serial:
              type:
                - string
                - 'null'
              description: >-
                El número de serie, para un artículo con seguimiento por número
                de serie.
            piece:
              type:
                - string
                - 'null'
              description: El ID de pieza de la etiqueta que se escaneó.
            note:
              type:
                - string
                - 'null'
              description: >-
                Una nota para los miembros que pueden liberar las existencias,
                de hasta 1000 caracteres.
            waiting_command_id:
              type:
                - string
                - 'null'
              description: El ID del comando del dispositivo que espera la liberación.
          required:
            - item
            - location_id
            - held_status
            - quantity
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d1-4a10-7000-8000-000000000001
          name: inventory.release_requests.create
          depends_on: []
          created_at: '2026-10-23T11:20:00+00:00'
          payload:
            item: N4BT-NVGY
            location_id: 0199a0c0-0000-7000-8000-000000000a12
            held_status: quarantined
            quantity: '12'
            piece: P-7Q2K9
            note: Moving it to A12-04-B
            waiting_command_id: 0199a0d0-0000-7000-8000-0000000000aa
    SyncCommandInventoryStockAdjust:
      type: object
      title: SyncCommandInventoryStockAdjust
      description: >-
        Un ajuste de existencias: una recepción o una salida de una cantidad
        positiva, en cualquier unidad desde la que el artículo se convierta (su
        unidad base si no se da ninguna), en un estado (available si no se da
        ninguno).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.stock.adjust
          description: El nombre del comando, siempre `inventory.stock.adjust`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            item:
              type: string
              description: >-
                El artículo, por su ID o su SKU. Un SKU coincide sin distinguir
                mayúsculas.
            location_id:
              type: string
              description: >-
                El ID de la ubicación cuyas existencias cambian. La ubicación no
                puede estar archivada.
            direction:
              enum:
                - receipt
                - issue
              description: 'Si el ajuste suma existencias o las quita: `receipt` o `issue`.'
            quantity:
              type: string
              description: >-
                Un decimal exacto positivo, enviado como cadena, con hasta 20
                dígitos a cada lado del punto. Está en `unit`, o en la unidad
                base del artículo cuando se omite `unit`.
            unit:
              type:
                - string
                - 'null'
              description: >-
                La unidad en la que está la cantidad, como `case`. Debe ser una
                unidad desde la que el artículo se convierte. Si no se envía, se
                usa la unidad base del artículo.
            reason:
              enum:
                - found
                - damaged
                - lost
                - destroyed
                - correction
                - opening_balance
                - other
                - reversal
                - status_change
                - transfer
                - move
                - cycle_count
                - receipt
                - shipment
                - return
                - production_issue
                - production_receipt
                - repair_issue
                - revaluation
                - cost_correction
                - landed_cost
              description: >-
                Por qué cambiaron las existencias: `found`, `damaged`, `lost`,
                `destroyed`, `correction`, `opening_balance` u `other`.
            note:
              type:
                - string
                - 'null'
              description: >-
                Una nota que se guarda con el movimiento, de hasta 1000
                caracteres. Obligatoria cuando el motivo es `other`.
            status:
              enum:
                - available
                - quarantined
                - rejected
              description: >-
                El estado de las existencias que se agregan o se sacan:
                `available`, `quarantined` o `rejected`. Si no se envía, las
                existencias quedan `available`.
            lot:
              type:
                - string
                - 'null'
              description: >-
                El número de lote, para un artículo con seguimiento por lote.
                Los números de lote coinciden sin distinguir mayúsculas. En una
                recepción, se crea un lote que el artículo todavía no tiene; en
                una salida, el lote debe existir.
            lot_expires_on:
              type:
                - string
                - 'null'
              format: date
              description: >-
                La fecha de vencimiento de un lote nuevo, como `YYYY-MM-DD`.
                Solo se guarda cuando la recepción crea el lote.
            serials:
              type: array
              items:
                type: string
              description: >-
                Los números de serie, para un artículo con seguimiento por
                número de serie. Envía uno por unidad, de modo que la cantidad
                coincida con la cantidad en la unidad base. Máximo 25 en un
                comando.
            unit_cost:
              type:
                - string
                - 'null'
              description: >-
                El costo de una unidad de `unit`, como decimal exacto de cero o
                más en la moneda de la organización. Solo una recepción lleva
                costo. Se guarda por unidad base.
            bulk_id:
              type:
                - string
                - 'null'
              description: >-
                El ID de la lista masiva de la que este comando es una línea, un
                UUID que el cliente elige para toda la lista. Omítelo para un
                comando fuera de una lista masiva; entonces no se ejecutan las
                comprobaciones masivas.
            bulk_line:
              type:
                - integer
                - 'null'
              description: La posición de la línea en la lista masiva, de 0 a 99.
            decisions:
              type: object
              additionalProperties:
                type: string
              description: >-
                La decisión para cada marca que el miembro resolvió en la vista
                previa masiva, como `{"reserved": "leave"}`. Solo se pueden
                decidir `reserved`, `mixed_lots` y `short_dated`.
            bulk_undo_of:
              type:
                - string
                - 'null'
              description: >-
                En una línea de un "Deshacer todo", el `bulk_id` de la lista
                masiva que deshace.
          required:
            - item
            - location_id
            - direction
            - quantity
            - reason
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.stock.adjust
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            item: 0199a0d0-0000-7000-8000-000000000201
            location_id: 0199a0d0-0000-7000-8000-000000000101
            direction: issue
            quantity: '3'
            reason: damaged
            note: Crushed in the tote
    SyncCommandInventoryStockChangeStatus:
      type: object
      title: SyncCommandInventoryStockChangeStatus
      description: >-
        Mueve una cantidad positiva de un artículo en una ubicación de un estado
        a otro, por ejemplo al liberar existencias en cuarentena.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.stock.change_status
          description: El nombre del comando, siempre `inventory.stock.change_status`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            item:
              type: string
              description: >-
                El artículo, por su ID o su SKU. Un SKU coincide sin distinguir
                mayúsculas.
            location_id:
              type: string
              description: >-
                El ID de la ubicación donde están las existencias. Las
                existencias se quedan allí.
            from:
              enum:
                - available
                - quarantined
                - rejected
              description: >-
                El estado que dejan las existencias: `available`, `quarantined`
                o `rejected`. Las existencias en él no pueden bajar de cero.
            to:
              enum:
                - available
                - quarantined
                - rejected
              description: >-
                El estado que toman las existencias: `available`, `quarantined`
                o `rejected`. Debe ser distinto de `from`. Pasar existencias
                retenidas a `available` cierra las solicitudes abiertas para
                liberarlas.
            quantity:
              type: string
              description: >-
                Un decimal exacto positivo, enviado como cadena, con hasta 20
                dígitos a cada lado del punto. Está en `unit`, o en la unidad
                base del artículo cuando se omite `unit`.
            unit:
              type:
                - string
                - 'null'
              description: >-
                La unidad en la que está la cantidad, como `case`. Debe ser una
                unidad desde la que el artículo se convierte. Si no se envía, se
                usa la unidad base del artículo.
            note:
              type:
                - string
                - 'null'
              description: >-
                Una nota que se guarda con los movimientos, de hasta 1000
                caracteres.
            lot:
              type:
                - string
                - 'null'
              description: >-
                El número de lote, para un artículo con seguimiento por lote.
                Debe ser un lote que el artículo ya tenga; los números de lote
                coinciden sin distinguir mayúsculas.
            serials:
              type: array
              items:
                type: string
              description: >-
                Los números de serie, para un artículo con seguimiento por
                número de serie. Envía uno por unidad, de modo que la cantidad
                coincida con la cantidad en la unidad base. Máximo 25 en un
                comando.
            bulk_id:
              type:
                - string
                - 'null'
              description: >-
                El ID de la lista masiva de la que este comando es una línea, un
                UUID que el cliente elige para toda la lista. Omítelo para un
                comando fuera de una lista masiva; entonces no se ejecutan las
                comprobaciones masivas.
            bulk_line:
              type:
                - integer
                - 'null'
              description: La posición de la línea en la lista masiva, de 0 a 99.
            decisions:
              type: object
              additionalProperties:
                type: string
              description: >-
                La decisión para cada marca que el miembro resolvió en la vista
                previa masiva, como `{"reserved": "leave"}`. Solo se pueden
                decidir `reserved`, `mixed_lots` y `short_dated`.
            bulk_undo_of:
              type:
                - string
                - 'null'
              description: >-
                En una línea de un "Deshacer todo", el `bulk_id` de la lista
                masiva que deshace.
          required:
            - item
            - location_id
            - from
            - to
            - quantity
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.stock.change_status
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            item: 0199a0d0-0000-7000-8000-000000000201
            location_id: 0199a0d0-0000-7000-8000-000000000101
            from: available
            to: quarantined
            quantity: '4'
            note: Rust on the threads
    SyncCommandInventoryStockMove:
      type: object
      title: SyncCommandInventoryStockMove
      description: >-
        Mueve una cantidad positiva de un artículo de una ubicación a otra en un
        solo paso, con el mismo estado y lote.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.stock.move
          description: El nombre del comando, siempre `inventory.stock.move`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            item:
              type: string
              description: >-
                El artículo, por su ID o su SKU. Un SKU coincide sin distinguir
                mayúsculas.
            from_location_id:
              type: string
              description: >-
                El ID de la ubicación de la que salen las existencias. No puede
                estar archivada.
            to_location_id:
              type: string
              description: >-
                El ID de la ubicación a la que van las existencias. No puede
                estar archivada ni ser la misma que `from_location_id`.
            quantity:
              type: string
              description: >-
                Un decimal exacto positivo, enviado como cadena, con hasta 20
                dígitos a cada lado del punto. Está en `unit`, o en la unidad
                base del artículo cuando se omite `unit`.
            unit:
              type:
                - string
                - 'null'
              description: >-
                La unidad en la que está la cantidad, como `case`. Debe ser una
                unidad desde la que el artículo se convierte. Si no se envía, se
                usa la unidad base del artículo.
            status:
              enum:
                - available
                - quarantined
                - rejected
              description: >-
                El estado en el que están las existencias y en el que se quedan:
                `available`, `quarantined` o `rejected`. Si no se envía, las
                existencias quedan `available`.
            note:
              type:
                - string
                - 'null'
              description: >-
                Una nota que se guarda con los movimientos, de hasta 1000
                caracteres.
            lot:
              type:
                - string
                - 'null'
              description: >-
                El número de lote, para un artículo con seguimiento por lote. El
                lote sigue igual en el destino.
            serials:
              type: array
              items:
                type: string
              description: >-
                Los números de serie, para un artículo con seguimiento por
                número de serie. Envía uno por unidad, de modo que la cantidad
                coincida con la cantidad en la unidad base. Máximo 25 en un
                comando.
            bulk_id:
              type:
                - string
                - 'null'
              description: >-
                El ID de la lista masiva de la que este comando es una línea, un
                UUID que el cliente elige para toda la lista. Omítelo para un
                comando fuera de una lista masiva; entonces no se ejecutan las
                comprobaciones masivas.
            bulk_line:
              type:
                - integer
                - 'null'
              description: La posición de la línea en la lista masiva, de 0 a 99.
            bulk_undo_of:
              type:
                - string
                - 'null'
              description: >-
                En una línea de un "Deshacer todo", el `bulk_id` de la lista
                masiva que deshace.
            decisions:
              type: object
              additionalProperties:
                type: string
              description: >-
                La decisión para cada marca que el miembro resolvió en la vista
                previa masiva, como `{"reserved": "leave"}`. Solo se pueden
                decidir `reserved`, `mixed_lots` y `short_dated`.
          required:
            - item
            - from_location_id
            - to_location_id
            - quantity
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.stock.move
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            item: 0199a0d0-0000-7000-8000-000000000201
            from_location_id: 0199a0d0-0000-7000-8000-000000000101
            to_location_id: 0199a0d0-0000-7000-8000-000000000102
            quantity: '4'
            note: To the pick face
            bulk_id: 0199a0d0-0000-7000-8000-00000000b001
            bulk_line: 1
            decisions:
              short_dated: accept
    SyncCommandInventoryStockReverse:
      type: object
      title: SyncCommandInventoryStockReverse
      description: >-
        El movimiento de existencias a revertir, y el lote masivo cuyo "Deshacer
        todo" lo revierte.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.stock.reverse
          description: El nombre del comando, siempre `inventory.stock.reverse`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            movement_id:
              type: string
              description: >-
                El ID del movimiento de existencias que se revierte. Un
                movimiento se revierte como máximo una vez. Las reversiones, los
                cambios de estado, los tramos de un movimiento y los movimientos
                que solo afectan el valor no se pueden revertir.
            bulk_id:
              type:
                - string
                - 'null'
              description: >-
                El ID de la lista masiva de la que este comando es una línea, un
                UUID que el cliente elige para toda la lista. Omítelo para un
                comando fuera de una lista masiva; entonces no se ejecutan las
                comprobaciones masivas.
            bulk_line:
              type:
                - integer
                - 'null'
              description: La posición de la línea en la lista masiva, de 0 a 99.
            bulk_undo_of:
              type:
                - string
                - 'null'
              description: >-
                En una línea de un "Deshacer todo", el `bulk_id` de la lista
                masiva que deshace.
          required:
            - movement_id
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.stock.reverse
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            movement_id: 0199a0d0-0000-7000-8000-00000000f002
            bulk_id: 0199a0d0-0000-7000-8000-00000000b001
            bulk_line: 1
            bulk_undo_of: 0199a0d0-0000-7000-8000-00000000b001
    SyncCommandInventoryStockReverseMove:
      type: object
      title: SyncCommandInventoryStockReverseMove
      description: >-
        El movimiento a deshacer, y el lote masivo cuyo "Deshacer todo" lo
        deshace.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.stock.reverse_move
          description: El nombre del comando, siempre `inventory.stock.reverse_move`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            move_id:
              type: string
              description: >-
                El ID del movimiento que se deshace. Todos los movimientos de
                existencias del movimiento se revierten juntos.
            bulk_id:
              type:
                - string
                - 'null'
              description: >-
                El ID de la lista masiva de la que este comando es una línea, un
                UUID que el cliente elige para toda la lista. Omítelo para un
                comando fuera de una lista masiva; entonces no se ejecutan las
                comprobaciones masivas.
            bulk_line:
              type:
                - integer
                - 'null'
              description: La posición de la línea en la lista masiva, de 0 a 99.
            bulk_undo_of:
              type:
                - string
                - 'null'
              description: >-
                En una línea de un "Deshacer todo", el `bulk_id` de la lista
                masiva que deshace.
          required:
            - move_id
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.stock.reverse_move
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            move_id: 0199a0d0-0000-7000-8000-00000000f002
            bulk_id: 0199a0d0-0000-7000-8000-00000000b001
            bulk_line: 1
            bulk_undo_of: 0199a0d0-0000-7000-8000-00000000b001
    SyncCommandInventoryTransfersCreate:
      type: object
      title: SyncCommandInventoryTransfersCreate
      description: >-
        Una transferencia en borrador: de dónde sale, adónde va y sus líneas.
        Con un ID de transferencia, reemplaza el contenido de un borrador.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.transfers.create
          description: El nombre del comando, siempre `inventory.transfers.create`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            from_location_id:
              type: string
              description: >-
                El ID de la ubicación desde la que se envían las existencias.
                Debe estar activa.
            to_location_id:
              type: string
              description: >-
                El ID de la ubicación donde se reciben las existencias. Debe
                estar activa y ser distinta de `from_location_id`.
            lines:
              type: array
              items:
                type: object
                properties:
                  item:
                    type: string
                    description: >-
                      El artículo, por su ID o su SKU. Un SKU coincide sin
                      distinguir mayúsculas.
                  quantity:
                    type: string
                    description: >-
                      Un decimal exacto positivo, enviado como cadena, con hasta
                      20 dígitos a cada lado del punto. Está en `unit`, o en la
                      unidad base del artículo cuando se omite `unit`.
                  unit:
                    type:
                      - string
                      - 'null'
                    description: >-
                      La unidad en la que está la cantidad, como `case`. Debe
                      ser una unidad desde la que el artículo se convierte. Si
                      no se envía, se usa la unidad base del artículo.
                  lot:
                    type:
                      - string
                      - 'null'
                    description: >-
                      El número de lote, para un artículo con seguimiento por
                      lote.
                  serials:
                    type: array
                    items:
                      type: string
                    description: >-
                      Los números de serie, para un artículo con seguimiento por
                      número de serie, uno por unidad.
                required:
                  - item
                  - quantity
              description: >-
                Las líneas de la transferencia, de 1 a 20. Todas las líneas
                juntas pueden nombrar como máximo 25 números de serie.
            note:
              type:
                - string
                - 'null'
              description: >-
                Una nota que se guarda con la transferencia, de hasta 1000
                caracteres.
            id:
              type:
                - string
                - 'null'
              description: >-
                Un UUIDv7 que el dispositivo eligió para la transferencia nueva,
                para poder nombrarla antes de recibir respuesta.
          required:
            - from_location_id
            - to_location_id
            - lines
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.transfers.create
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            id: 0199a0d0-0000-7000-8000-00000000f002
            from_location_id: 0199a0d0-0000-7000-8000-000000000101
            to_location_id: 0199a0d0-0000-7000-8000-000000000102
            note: For the morning run
            lines:
              - item: 0199a0d0-0000-7000-8000-000000000201
                quantity: '4'
              - item: 0199a0d0-0000-7000-8000-000000000202
                quantity: '2'
    SyncCommandInventoryTransfersReceive:
      type: object
      title: SyncCommandInventoryTransfersReceive
      description: >-
        El comando `inventory.transfers.receive`, que un dispositivo envía para
        cambiar algo mientras puede estar sin conexión.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.transfers.receive
          description: El nombre del comando, siempre `inventory.transfers.receive`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            transfer_id:
              type: string
              description: >-
                El ID de la transferencia enviada para la que llegaron las
                existencias.
            lines:
              type: array
              items:
                type: object
                properties:
                  line_id:
                    type: string
                    description: El ID de la línea de la transferencia.
                  quantity:
                    type: string
                    description: >-
                      Cuánto de la línea llegó, en la unidad base del artículo,
                      como decimal exacto positivo enviado como cadena. No puede
                      superar lo que le queda por recibir a la línea.
                  serials:
                    type: array
                    items:
                      type: string
                    description: >-
                      Los números de serie que llegaron, para un artículo con
                      seguimiento por número de serie, uno por unidad y máximo
                      25.
                required:
                  - line_id
                  - quantity
              description: >-
                Las líneas que llegaron, de 1 a 20. Las líneas omitidas no
                reciben nada esta vez.
          required:
            - transfer_id
            - lines
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.transfers.receive
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            transfer_id: 0199a0d0-0000-7000-8000-00000000f002
            lines:
              - line_id: 0199a0d0-0000-7000-8000-00000000f003
                quantity: '3'
    SyncCommandInventoryTransfersShip:
      type: object
      title: SyncCommandInventoryTransfersShip
      description: >-
        El comando `inventory.transfers.ship`, que un dispositivo envía para
        cambiar algo mientras puede estar sin conexión.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.transfers.ship
          description: El nombre del comando, siempre `inventory.transfers.ship`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            transfer_id:
              type: string
              description: El ID de la transferencia en borrador que se envía.
          required:
            - transfer_id
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.transfers.ship
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            transfer_id: 0199a0d0-0000-7000-8000-00000000f002
    SyncCommandInventoryVerificationsCancel:
      type: object
      title: SyncCommandInventoryVerificationsCancel
      description: >-
        Cerrar o dejar una verificación con un motivo: una cancelación, un
        rechazo o un descarte.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.verifications.cancel
          description: El nombre del comando, siempre `inventory.verifications.cancel`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            verification_id:
              type: string
              description: >-
                El ID de la verificación que se cancela, se rechaza o se
                declina.
            reason:
              type: string
              description: >-
                Por qué el miembro cancela, rechaza o desestima la verificación,
                hasta 500 caracteres. Se conserva con la verificación.
          required:
            - verification_id
            - reason
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.verifications.cancel
          depends_on: []
          created_at: '2026-11-02T10:00:30+00:00'
          payload:
            verification_id: 0199a0d0-0000-7000-8000-000000000401
            reason: Asked by mistake
    SyncCommandInventoryVerificationsCount:
      type: object
      title: SyncCommandInventoryVerificationsCount
      description: >-
        Un reconteo a ciegas del testigo: la cantidad de la acción, o cada línea
        de un conteo por su ID.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.verifications.count
          description: El nombre del comando, siempre `inventory.verifications.count`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            verification_id:
              type: string
              description: El ID de la verificación para la que cuenta el testigo.
            count:
              type:
                - string
                - 'null'
              description: >-
                Lo que contó el testigo, en la unidad de la acción retenida,
                como decimal de cero o más con hasta 12 dígitos antes del punto
                y 6 después. No se usa en un conteo de existencias.
            lines:
              type: object
              additionalProperties:
                type: string
              description: >-
                Para un conteo de existencias: lo que contó el testigo en cada
                línea, con el ID de la línea de conteo como clave, hasta 500
                líneas. Cada valor es un decimal de cero o más con hasta 12
                dígitos antes del punto y 6 después.
          required:
            - verification_id
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.verifications.count
          depends_on: []
          created_at: '2026-11-02T10:00:30+00:00'
          payload:
            verification_id: 0199a0d0-0000-7000-8000-000000000401
            count: '3'
    SyncCommandInventoryVerificationsDecline:
      type: object
      title: SyncCommandInventoryVerificationsDecline
      description: >-
        Cerrar o dejar una verificación con un motivo: una cancelación, un
        rechazo o un descarte.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.verifications.decline
          description: El nombre del comando, siempre `inventory.verifications.decline`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            verification_id:
              type: string
              description: >-
                El ID de la verificación que se cancela, se rechaza o se
                declina.
            reason:
              type: string
              description: >-
                Por qué el miembro cancela, rechaza o desestima la verificación,
                hasta 500 caracteres. Se conserva con la verificación.
          required:
            - verification_id
            - reason
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.verifications.decline
          depends_on: []
          created_at: '2026-11-02T10:00:30+00:00'
          payload:
            verification_id: 0199a0d0-0000-7000-8000-000000000401
            reason: Going off shift
    SyncCommandInventoryVerificationsReject:
      type: object
      title: SyncCommandInventoryVerificationsReject
      description: >-
        Cerrar o dejar una verificación con un motivo: una cancelación, un
        rechazo o un descarte.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.verifications.reject
          description: El nombre del comando, siempre `inventory.verifications.reject`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            verification_id:
              type: string
              description: >-
                El ID de la verificación que se cancela, se rechaza o se
                declina.
            reason:
              type: string
              description: >-
                Por qué el miembro cancela, rechaza o desestima la verificación,
                hasta 500 caracteres. Se conserva con la verificación.
          required:
            - verification_id
            - reason
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.verifications.count
          depends_on: []
          created_at: '2026-11-02T10:00:30+00:00'
          payload:
            verification_id: 0199a0d0-0000-7000-8000-000000000401
            count: '2'
    SyncCommandInventoryVerificationsRequest:
      type: object
      title: SyncCommandInventoryVerificationsRequest
      description: >-
        La solicitud del ejecutor: la acción retenida y el resumen de ella que
        vio en la vista previa y firma.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.verifications.request
          description: El nombre del comando, siempre `inventory.verifications.request`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            command:
              type: string
              description: >-
                El comando de sincronización de la acción retenida, como
                `inventory.stock.adjust`.
            payload:
              type: object
              additionalProperties: {}
              description: >-
                El payload que recibe ese comando, tal como lo documenta su
                propio esquema de comando de sincronización, como
                `SyncCommandInventoryStockAdjust`.
            digest:
              type: string
              description: >-
                El resumen SHA-256 de la declaración, como 64 caracteres
                hexadecimales, que la vista previa devolvió para esta acción. La
                solicitud se rechaza cuando la declaración cambió desde
                entonces.
            locale:
              type: string
              description: El idioma en que se muestra y se almacena la declaración.
          required:
            - command
            - payload
            - digest
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.verifications.request
          depends_on: []
          created_at: '2026-11-02T10:00:30+00:00'
          payload:
            command: inventory.stock.adjust
            payload:
              item: OXY-5
              location_id: 0199a0d0-0000-7000-8000-000000000301
              direction: issue
              quantity: '2'
              reason: damaged
            digest: abc
    SyncCommandInventoryVerificationsSubmit:
      type: object
      title: SyncCommandInventoryVerificationsSubmit
      description: >-
        Una verificación presenciada sin conexión en un dispositivo compartido:
        la acción retenida, las firmas de ambas personas como aserciones que
        firmó la clave del dispositivo después de comprobar cada PIN en el
        dispositivo, cada reconteo y cada intento fallido de PIN, solo por hora.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.verifications.submit
          description: El nombre del comando, siempre `inventory.verifications.submit`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            command:
              type: string
              description: >-
                El comando de sincronización de la acción retenida, como
                `inventory.stock.adjust`.
            payload:
              type: object
              additionalProperties: {}
              description: >-
                El payload que recibe ese comando, tal como lo documenta su
                propio esquema de comando de sincronización, como
                `SyncCommandInventoryStockAdjust`.
            digest:
              type: string
              description: >-
                El resumen de la acción retenida que firmaron las dos personas,
                tal como lo calculó el dispositivo, de 64 caracteres.
            locale:
              type: string
              description: El idioma en que se mostraron ambas declaraciones.
            performer_assertion:
              type: string
              description: >-
                La firma del ejecutor: una aserción que la clave del dispositivo
                firmó con el significado `PERFORMED`, de hasta 8192 caracteres.
            witness_assertion:
              type: string
              description: >-
                La firma del testigo: una aserción que la clave del dispositivo
                firmó con el significado `WITNESSED`, de hasta 8192 caracteres.
            attempts:
              type: array
              items:
                type: object
                properties:
                  at:
                    type: string
                    format: date-time
                    description: >-
                      Cuándo lo contó el dispositivo, como marca de tiempo ISO
                      8601 según su reloj anclado.
                  count:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Lo que contó el testigo, en la unidad de la acción
                      retenida, como decimal de cero o más con hasta 12 dígitos
                      antes del punto y 6 después. No se usa en un conteo de
                      existencias.
                  lines:
                    type: object
                    additionalProperties:
                      type: string
                    description: >-
                      Para un conteo de existencias: lo que contó el testigo en
                      cada línea, con el ID de la línea de conteo como clave,
                      hasta 500 líneas. Cada valor es un decimal de cero o más
                      con hasta 12 dígitos antes del punto y 6 después.
                required:
                  - at
              description: >-
                Todos los reconteos que ingresó el testigo, en orden, de uno a
                tres. El último es el que firmó.
            failed_pins:
              type: array
              items:
                type: object
                properties:
                  role:
                    type: string
                    description: >-
                      A quién le tocaba firmar cuando se ingresó el PIN
                      incorrecto: `performer` o `witness`.
                  at:
                    type: string
                    format: date-time
                    description: >-
                      Cuándo se ingresó el PIN incorrecto, como marca de tiempo
                      ISO 8601 según el reloj anclado del dispositivo.
                required:
                  - role
                  - at
              description: >-
                Todos los PIN incorrectos ingresados al firmar, por de quién era
                el turno y cuándo, hasta 50. El PIN en sí nunca se envía.
          required:
            - command
            - payload
            - digest
            - locale
            - performer_assertion
            - witness_assertion
            - attempts
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.verifications.submit
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            command: inventory.stock.adjust
            payload:
              item: OXY-5
              location_id: 0199a0d0-0000-7000-8000-000000000301
              direction: issue
              quantity: '2'
              reason: damaged
            digest: 11e29cde467d3cde7dfbf4cccf925b590ec17dc5faccec79e2b8c4f7f9c1a99d
            locale: en
            performer_assertion: >-
              A JWS of type device-offline-signature+jwt the device key signed
              when the performer's PIN was checked, with the meaning PERFORMED
            witness_assertion: >-
              A JWS of type device-offline-signature+jwt the device key signed
              when the witness's PIN was checked, with the meaning WITNESSED
            attempts:
              - count: '3'
                at: '2026-11-02T09:11:00+00:00'
              - count: '2'
                at: '2026-11-02T09:11:40+00:00'
            failed_pins:
              - role: witness
                at: '2026-11-02T09:11:50+00:00'
    SyncCommandInventoryVerificationsWitness:
      type: object
      title: SyncCommandInventoryVerificationsWitness
      description: >-
        La firma del testigo: el resumen de la acción retenida y el de la
        declaración, de modo que la firma vincula al testigo exactamente con lo
        que vio.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: inventory.verifications.witness
          description: El nombre del comando, siempre `inventory.verifications.witness`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            verification_id:
              type: string
              description: El ID de la verificación que firma el testigo.
            digest:
              type: string
              description: >-
                El resumen de la acción retenida, como 64 caracteres
                hexadecimales, tal como lo muestra la verificación.
            statement_digest:
              type: string
              description: >-
                El resumen SHA-256 de la declaración del testigo que mostró la
                verificación, como 64 caracteres hexadecimales.
            locale:
              type: string
              description: >-
                El idioma de esa declaración. Si se omite, se usa el idioma
                propio del miembro.
          required:
            - verification_id
            - digest
            - statement_digest
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: inventory.verifications.count
          depends_on: []
          created_at: '2026-11-02T10:01:00+00:00'
          payload:
            verification_id: 0199a0d0-0000-7000-8000-000000000401
            count: '2'
    SyncCommandLabelsSetsPrint:
      type: object
      title: SyncCommandLabelsSetsPrint
      description: >-
        Una impresión masiva: un conjunto de etiquetas para cada línea de una
        lista, donde cada línea es un artículo de existencias disponibles.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: labels.sets.print
          description: El nombre del comando, siempre `labels.sets.print`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            lines:
              type: array
              items:
                type: object
                properties:
                  item:
                    type: string
                    description: El ID del artículo.
                  quantity:
                    type: string
                    description: >-
                      Lo que contiene cada pieza, en la unidad base del
                      artículo, como decimal exacto positivo enviado como
                      cadena. La pieza de un número de serie contiene 1.
                  pieces:
                    type: integer
                    description: >-
                      Cuántas piezas etiquetar, cada una con su propio ID de
                      pieza, hasta 250. Es 1 si se omite, y siempre 1 para un
                      número de serie.
                  lot:
                    type:
                      - string
                      - 'null'
                    description: >-
                      El número de lote, para un artículo con seguimiento por
                      lote.
                  serial:
                    type:
                      - string
                      - 'null'
                    description: >-
                      El número de serie, para un artículo con seguimiento por
                      número de serie.
                required:
                  - item
                  - quantity
              description: Las líneas para las que imprimir etiquetas, de 1 a 100.
            bulk_id:
              type:
                - string
                - 'null'
              description: >-
                La lista masiva que imprime, como un UUIDv7 que eligió el
                dispositivo. Se registra en el historial de auditoría.
          required:
            - lines
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: labels.sets.print
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            bulk_id: 0199a0d0-0000-7000-8000-00000000f002
            lines:
              - item: 0199a0d0-0000-7000-8000-000000000201
                quantity: '5'
                pieces: 3
              - item: 0199a0d0-0000-7000-8000-000000000202
                quantity: '1'
    SyncCommandManufacturingBuildsComplete:
      type: object
      title: SyncCommandManufacturingBuildsComplete
      description: >-
        Una orden de fabricación por completar, con los números de lote o de
        serie que toma su producción.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: manufacturing.builds.complete
          description: El nombre del comando, siempre `manufacturing.builds.complete`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            build_id:
              type: string
              description: El ID de la orden de fabricación que se completa.
            lot:
              type:
                - string
                - 'null'
              description: >-
                El lote de la salida, obligatorio para un artículo con
                seguimiento por lote. Se crea un lote nuevo.
            lot_expires_on:
              type:
                - string
                - 'null'
              format: date
              description: >-
                Cuándo caduca el lote de la producción, como fecha en formato
                `Y-m-d`.
            serials:
              type: array
              items:
                type: string
              description: >-
                Los números de serie de la salida, uno por unidad producida,
                obligatorios para un artículo con seguimiento por número de
                serie.
            as_recorded:
              type: boolean
              description: >-
                Ponlo en `true` cuando los pasos ya registrados fueron toda la
                fabricación, de modo que no se consuma nada más.
            reasons:
              type: object
              additionalProperties:
                type: string
              description: >-
                Por qué una línea usó menos que su lista de piezas, por ID de la
                línea. Se usa al completar tal como se registró.
            links:
              type: array
              items:
                type: object
                properties:
                  output:
                    type: string
                    description: >-
                      La unidad de salida: uno de los números de serie
                      producidos, o el lote de salida.
                  item:
                    type: string
                    description: La parte, por ID o SKU.
                  lot:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Un lote de la pieza que usó la orden de fabricación. Envía
                      `lot` o `serial`.
                  serial:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Un número de serie de la pieza que usó la orden de
                      fabricación. Envía `lot` o `serial`.
                required:
                  - output
                  - item
              description: >-
                Qué lotes y números de serie que usó la orden de fabricación
                entraron en qué unidades de producción, cuando el plan registra
                el consumo.
          required:
            - build_id
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: manufacturing.builds.complete
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            build_id: 0199a0d0-0000-7000-8000-000000000601
            lot: B-2611
            lot_expires_on: '2028-01-31'
    SyncCommandManufacturingBuildsIssueParts:
      type: object
      title: SyncCommandManufacturingBuildsIssueParts
      description: >-
        Un paso de consumo registrado: piezas consumidas por una orden de
        fabricación antes de completarla.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: manufacturing.builds.issue_parts
          description: El nombre del comando, siempre `manufacturing.builds.issue_parts`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            build_id:
              type: string
              description: >-
                El ID de la orden de fabricación a la que se consumen las
                piezas.
            entries:
              type: array
              items:
                type: object
                properties:
                  line:
                    type: string
                    description: >-
                      El ID de la línea de la lista de piezas a la que
                      corresponde la entrada.
                  item:
                    type: string
                    description: >-
                      El componente de la línea o uno de sus alternativos, por
                      ID o SKU. Los alternativos se usan por orden de prioridad.
                  quantity:
                    type: string
                    description: >-
                      Cuánto se consume, en la unidad base del artículo, como
                      decimal exacto mayor que cero.
                  lot:
                    type:
                      - string
                      - 'null'
                    description: >-
                      El lote usado, para un artículo con seguimiento por lote.
                      Si se omite, se usan los lotes que tiene la orden de
                      fabricación.
                  serials:
                    type: array
                    items:
                      type: string
                    description: >-
                      Los números de serie usados, para un artículo con
                      seguimiento por número de serie, uno por unidad.
                  reason:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Por qué la línea usa más que su lista de piezas. Es
                      obligatorio cuando lo hace.
                required:
                  - line
                  - item
                  - quantity
              description: >-
                Lo que se consume, en orden, de 1 a 200 entradas. Un alternativo
                se revisa contra lo que usaron las entradas anteriores.
          required:
            - build_id
            - entries
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: manufacturing.builds.issue_parts
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            build_id: 0199a0d0-0000-7000-8000-000000000601
            entries:
              - line: 0199a0d0-0000-7000-8000-000000000604
                item: M4-10
                quantity: '4'
                lot: null
    SyncCommandManufacturingBuildsReportProblem:
      type: object
      title: SyncCommandManufacturingBuildsReportProblem
      description: >-
        Un problema reportado en una orden de fabricación o en una de sus
        operaciones. El contenido de la foto no se incluye en las entradas de
        auditoría.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: manufacturing.builds.report_problem
          description: >-
            El nombre del comando, siempre
            `manufacturing.builds.report_problem`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            build_id:
              type: string
              description: El ID de la orden de fabricación en la que está el problema.
            operation:
              type:
                - string
                - 'null'
              description: >-
                El ID de la operación de la orden de fabricación a la que se
                refiere el problema. Si se omite, el problema se refiere a toda
                la orden.
            reason:
              enum:
                - material
                - machine
                - quality
                - instructions
                - other
              description: >-
                Qué tipo de problema es: `material`, `machine`, `quality`,
                `instructions` o `other`.
            note:
              type: string
              description: Lo que pasó, hasta 5,000 caracteres.
            id:
              type:
                - string
                - 'null'
              description: >-
                Un UUIDv7 que el dispositivo eligió para el problema, para que
                los comandos posteriores puedan referirse a él.
          required:
            - build_id
            - reason
            - note
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: manufacturing.builds.report_problem
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            build_id: 0199a0d0-0000-7000-8000-000000000601
            operation: 0199a0d0-0000-7000-8000-000000000602
            reason: machine
            note: The saw stalls.
    SyncCommandManufacturingOperationsComplete:
      type: object
      title: SyncCommandManufacturingOperationsComplete
      description: >-
        Cómo terminó una operación de una orden de fabricación: cuántas salieron
        buenas, cuántas se desecharon y, cuando hubo, por qué.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: manufacturing.operations.complete
          description: El nombre del comando, siempre `manufacturing.operations.complete`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            build_id:
              type: string
              description: >-
                El ID de la orden de fabricación a la que pertenece la
                operación.
            operation_id:
              type: string
              description: >-
                El ID de la operación de la orden de fabricación que se
                completa.
            good_quantity:
              type: string
              description: >-
                Cuántas salieron buenas, en la unidad base del artículo, como
                decimal exacto de cero o más. La siguiente operación puede tomar
                como máximo esta cantidad.
            scrap_quantity:
              type: string
              description: >-
                Cuántas se desecharon, como decimal exacto de cero o más. Es `0`
                si se omite. Las buenas y las desechadas juntas no pueden
                superar lo que la operación podía tomar.
            scrap_reason:
              type:
                - string
                - 'null'
              description: >-
                Por qué se desecharon unidades, hasta 1,000 caracteres. Es
                obligatorio cuando se desechó alguna.
            checks:
              type: array
              items:
                type: object
                properties:
                  check_id:
                    type: string
                    description: La comprobación, como la nombra el dispositivo.
                  result:
                    enum:
                      - pass
                      - fail
                      - na
                    description: 'Cómo salió la verificación: `pass`, `fail` o `na`.'
                  value:
                    type:
                      - string
                      - 'null'
                    description: Qué se midió, cuando la inspección toma un valor.
                  note:
                    type:
                      - string
                      - 'null'
                    description: Una nota sobre la comprobación, de hasta 1,000 caracteres.
                required:
                  - check_id
                  - result
              description: >-
                Las comprobaciones registradas al terminar la operación. Una
                comprobación fallida se guarda y no detiene la operación.
          required:
            - build_id
            - operation_id
            - good_quantity
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: manufacturing.operations.complete
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            build_id: 0199a0d0-0000-7000-8000-000000000601
            operation_id: 0199a0d0-0000-7000-8000-000000000602
            good_quantity: '2'
            checks:
              - check_id: length
                result: pass
                value: '400.2'
              - check_id: burr
                result: fail
                note: Deburred by hand
              - check_id: label
                result: na
    SyncCommandManufacturingOperationsPause:
      type: object
      title: SyncCommandManufacturingOperationsPause
      description: Una operación de una orden de fabricación.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: manufacturing.operations.pause
          description: El nombre del comando, siempre `manufacturing.operations.pause`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            build_id:
              type: string
              description: >-
                El ID de la orden de fabricación a la que pertenece la
                operación.
            operation_id:
              type: string
              description: El ID de la operación de la orden de fabricación.
          required:
            - build_id
            - operation_id
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: manufacturing.operations.pause
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            build_id: 0199a0d0-0000-7000-8000-000000000601
            operation_id: 0199a0d0-0000-7000-8000-000000000602
    SyncCommandManufacturingOperationsStart:
      type: object
      title: SyncCommandManufacturingOperationsStart
      description: Una operación de una orden de fabricación.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: manufacturing.operations.start
          description: El nombre del comando, siempre `manufacturing.operations.start`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            build_id:
              type: string
              description: >-
                El ID de la orden de fabricación a la que pertenece la
                operación.
            operation_id:
              type: string
              description: El ID de la operación de la orden de fabricación.
          required:
            - build_id
            - operation_id
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: manufacturing.operations.start
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            build_id: 0199a0d0-0000-7000-8000-000000000601
            operation_id: 0199a0d0-0000-7000-8000-000000000602
    SyncCommandPurchasingOrdersReceive:
      type: object
      title: SyncCommandPurchasingOrdersReceive
      description: >-
        El comando `purchasing.orders.receive`, que un dispositivo envía para
        cambiar algo mientras puede estar sin conexión.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: purchasing.orders.receive
          description: El nombre del comando, siempre `purchasing.orders.receive`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            order_id:
              type: string
              description: >-
                El ID de la orden de compra contra la que se reciben los
                productos.
            lines:
              type: array
              items:
                type: object
                properties:
                  order_line_id:
                    type: string
                    description: >-
                      El ID de la línea de orden de compra contra la que se
                      reciben los productos.
                  quantity:
                    type: string
                    description: >-
                      Cuánto entró, en `unit`, como cadena decimal mayor que
                      cero.
                  unit:
                    type:
                      - string
                      - 'null'
                    description: >-
                      El código de la unidad en la que está `quantity`.
                      Cualquier unidad desde la que el artículo se convierta; la
                      unidad de la línea del pedido si se omite.
                  status:
                    enum:
                      - available
                      - quarantined
                      - rejected
                    description: >-
                      El estado con el que entran las existencias: `available`,
                      `quarantined` para retenerlas para inspección o
                      `rejected`. Si no se envía, es `available`.
                  lot:
                    type:
                      - string
                      - 'null'
                    description: >-
                      El número de lote, de hasta 64 caracteres, para un
                      artículo con seguimiento por lote.
                  lot_expires_on:
                    type:
                      - string
                      - 'null'
                    format: date
                    description: >-
                      El día en que vence el lote, como `YYYY-MM-DD`, para un
                      artículo con seguimiento por lote.
                  serials:
                    type: array
                    items:
                      type: string
                    description: >-
                      Los números de serie recibidos, uno por unidad y hasta 25,
                      para un artículo con seguimiento por número de serie.
                  origin_country:
                    type:
                      - string
                      - 'null'
                    description: >-
                      El país de donde provienen los productos, como código ISO
                      3166-1 alfa-2. Si se omite, se usa el país de la entrada
                      del catálogo del proveedor.
                required:
                  - order_line_id
                  - quantity
              description: >-
                Lo que entró, de 1 a 50 líneas, cada una contra una línea del
                pedido.
            received_on:
              type:
                - string
                - 'null'
              format: date
              description: >-
                El día en que llegaron los productos, como `YYYY-MM-DD`. Hoy si
                se omite.
            note:
              type:
                - string
                - 'null'
              description: Una nota sobre la recepción, de máximo 1,000 caracteres.
            id:
              type:
                - string
                - 'null'
              description: >-
                Un UUIDv7 que el dispositivo elige para la recepción, para que
                los comandos posteriores puedan nombrarla. Se genera uno si se
                omite.
          required:
            - order_id
            - lines
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: purchasing.orders.receive
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            order_id: 0199a0d0-0000-7000-8000-000000000301
            received_on: '2026-11-02'
            note: Box 2 of 3
            lines:
              - order_line_id: 0199a0d0-0000-7000-8000-000000000302
                quantity: '6'
                lot: L-2611
                lot_expires_on: '2028-01-31'
                origin_country: DE
              - order_line_id: 0199a0d0-0000-7000-8000-000000000303
                quantity: '4'
                status: quarantined
    SyncCommandSalesOrdersShip:
      type: object
      title: SyncCommandSalesOrdersShip
      description: >-
        El comando `sales.orders.ship`, que un dispositivo envía para cambiar
        algo mientras puede estar sin conexión.
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Un UUIDv7 que el dispositivo genera para el comando. Es la clave de
            idempotencia, así que enviar el mismo ID otra vez no ejecuta el
            comando dos veces.
        name:
          type: string
          const: sales.orders.ship
          description: El nombre del comando, siempre `sales.orders.ship`.
        depends_on:
          type:
            - array
            - 'null'
          items:
            type: string
            format: uuid
          description: >-
            Los IDs de los comandos que deben terminar antes de que se ejecute
            este.
        created_at:
          type: string
          format: date-time
          description: >-
            Cuándo generó el dispositivo el comando, según el reloj del propio
            dispositivo. Es solo una referencia, porque el reloj de un
            dispositivo puede estar mal.
        payload:
          type: object
          properties:
            order_id:
              type: string
              description: El ID del pedido de venta contra el que se envían los productos.
            lines:
              type: array
              items:
                type: object
                properties:
                  order_line_id:
                    type: string
                    description: >-
                      El ID de la línea del pedido de venta contra la que se
                      envió.
                  quantity:
                    type: string
                    description: >-
                      La cantidad enviada, como cadena decimal en `unit`. Mayor
                      que cero.
                  unit:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Cualquier unidad desde la que se convierta el artículo; la
                      de la línea del pedido si se omite.
                  lot:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Un lote elegido por número; si se omite, lo que tiene la
                      línea.
                  serials:
                    type: array
                    items:
                      type: string
                    description: >-
                      Los números de serie enviados, uno por unidad y hasta 25,
                      para un artículo con seguimiento por número de serie.
                required:
                  - order_line_id
                  - quantity
              description: >-
                Lo que se envió, de 1 a 50 líneas. Ninguna línea puede enviar
                más de lo que queda en su línea del pedido.
            shipped_on:
              type:
                - string
                - 'null'
              format: date
              description: Hoy si no se envía.
            carrier:
              type:
                - string
                - 'null'
              description: >-
                El transportista que recogió los productos, como UPS, de hasta
                64 caracteres.
            tracking_number:
              type:
                - string
                - 'null'
              description: >-
                El número de seguimiento del transportista, de hasta 128
                caracteres. También se puede definir después de contabilizar.
            note:
              type:
                - string
                - 'null'
              description: >-
                Una nota impresa en la lista de empaque, de hasta 1,000
                caracteres.
            packages:
              type: array
              items:
                type: object
                properties:
                  weight:
                    type: object
                    properties:
                      value:
                        type: string
                        description: >-
                          La medida como cadena decimal, mayor que cero, con
                          hasta 8 dígitos y 4 decimales.
                      unit:
                        type: string
                        description: >-
                          La unidad: `g`, `kg`, `oz` o `lb` para un peso, o
                          `mm`, `cm` o `in` para una longitud.
                    required:
                      - value
                      - unit
                    description: El peso del bulto, como `value` y `unit`.
                  length:
                    type:
                      - object
                      - 'null'
                    properties:
                      value:
                        type: string
                        description: >-
                          La medida como cadena decimal, mayor que cero, con
                          hasta 8 dígitos y 4 decimales.
                      unit:
                        type: string
                        description: >-
                          La unidad: `g`, `kg`, `oz` o `lb` para un peso, o
                          `mm`, `cm` o `in` para una longitud.
                    required:
                      - value
                      - unit
                    description: >-
                      El largo del bulto, como `value` y `unit`. Es null cuando
                      no se midió.
                  width:
                    type:
                      - object
                      - 'null'
                    properties:
                      value:
                        type: string
                        description: >-
                          La medida como cadena decimal, mayor que cero, con
                          hasta 8 dígitos y 4 decimales.
                      unit:
                        type: string
                        description: >-
                          La unidad: `g`, `kg`, `oz` o `lb` para un peso, o
                          `mm`, `cm` o `in` para una longitud.
                    required:
                      - value
                      - unit
                    description: >-
                      El ancho del bulto, como `value` y `unit`. Es null cuando
                      no se midió.
                  height:
                    type:
                      - object
                      - 'null'
                    properties:
                      value:
                        type: string
                        description: >-
                          La medida como cadena decimal, mayor que cero, con
                          hasta 8 dígitos y 4 decimales.
                      unit:
                        type: string
                        description: >-
                          La unidad: `g`, `kg`, `oz` o `lb` para un peso, o
                          `mm`, `cm` o `in` para una longitud.
                    required:
                      - value
                      - unit
                    description: >-
                      El alto del bulto, como `value` y `unit`. Es null cuando
                      no se midió.
                  package_preset_id:
                    type:
                      - string
                      - 'null'
                    description: La caja guardada en la que se empacó.
                required:
                  - weight
              description: Los bultos en los que salió, tal como se empacaron.
            id:
              type:
                - string
                - 'null'
              description: >-
                El ID del envío, un UUIDv7 que eligió el dispositivo para que
                los comandos posteriores puedan nombrarlo.
          required:
            - order_id
            - lines
          description: Los campos del cambio que hace el comando.
      required:
        - id
        - name
        - created_at
        - payload
      examples:
        - id: 0199a0d0-0000-7000-8000-00000000f001
          name: sales.orders.ship
          depends_on: []
          created_at: '2026-11-02T10:00:00+00:00'
          payload:
            order_id: 0199a0d0-0000-7000-8000-000000000301
            shipped_on: '2026-11-02'
            carrier: UPS
            tracking_number: 1Z999AA10123456784
            note: Left at the dock
            lines:
              - order_line_id: 0199a0d0-0000-7000-8000-000000000302
                quantity: '6'
              - order_line_id: 0199a0d0-0000-7000-8000-000000000303
                quantity: '4'
            packages:
              - weight:
                  value: '1.2'
                  unit: kg
                length:
                  value: '30'
                  unit: cm
                width:
                  value: '20'
                  unit: cm
                height:
                  value: '10'
                  unit: cm
              - weight:
                  value: '0.4'
                  unit: kg
    CommandResultResource:
      type: object
      properties:
        id:
          type: string
          description: El id del comando, tal como lo envió el dispositivo.
        status:
          type: string
          description: 'Lo que pasó con el comando: `applied`, `rejected` o `deferred`.'
          enum:
            - applied
            - rejected
            - deferred
        replayed:
          type: boolean
          description: >-
            Si este es el resultado almacenado de una solicitud anterior. Un
            comando reproducido no se ejecutó de nuevo.
        result:
          description: >-
            El resultado del comando, solo cuando se ejecutó en esta solicitud;
            es null para una repetición.
        result_ids:
          type: array
          description: >-
            Los IDs de lo que el comando creó o cambió. Vacío en un rechazo o un
            aplazamiento.
          items:
            type: string
        code:
          type:
            - string
            - 'null'
          description: >-
            El código de un rechazo, como `command_id_reused` o
            `validation_failed`. Es null en cualquier otro caso.
        message:
          type:
            - string
            - 'null'
          description: >-
            Qué salió mal con un comando rechazado, para las personas. Es null
            en otro caso.
        fields:
          type: object
          description: Los campos no válidos de un rechazo, cada uno con sus mensajes.
          additionalProperties:
            type: array
            items:
              type: string
        retry_after:
          type:
            - integer
            - 'null'
          description: >-
            Para un comando diferido, cuántos segundos esperar antes de enviarlo
            otra vez. Es null en los demás casos.
      required:
        - id
        - status
        - replayed
        - result
        - result_ids
        - code
        - message
        - fields
        - retry_after
      title: CommandResultResource
      description: Lo que pasó con un comando.
  responses:
    AuthenticationException:
      description: No autenticado
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    DeviceRequired:
      description: Se requiere un dispositivo
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    BatchTooLarge:
      description: Lote demasiado grande
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    ValidationException:
      description: Error de validación
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
  securitySchemes:
    apiKey:
      type: http
      description: >-
        Para tus propios scripts e integraciones de servidor a servidor. Crea
        una clave en la app en Configuración > Acceso > Claves de API y cópiala
        entonces, porque se muestra una sola vez. Envíala como `Authorization:
        Bearer <key>`. La clave actúa como el miembro que la creó, en la
        organización en la que se creó. Una llamada necesita el permiso del
        miembro y uno de los alcances de la clave, como `inventory:read` o
        `sales:write`. Una clave con `*` tiene todos los alcances.
      scheme: bearer
    oauth2:
      type: oauth2
      description: >-
        Para apps que otras personas conectan a su cuenta de StockShift. Usa el
        flujo de código de autorización OAuth 2.1 con PKCE (S256); no hay
        secreto de cliente. Descubre los endpoints en
        `/.well-known/oauth-authorization-server` (RFC 8414) y registra tu app
        en `POST /oauth/register` (RFC 7591). El miembro elige la organización y
        aprueba los alcances en la página de consentimiento, y el token nunca
        puede hacer más de lo que podría hacer el miembro. Envíalo como
        `Authorization: Bearer <token>`, igual que una clave de API. Los tokens
        de acceso duran una hora; cada actualización devuelve un token de
        actualización nuevo, así que guárdalo.
      flows:
        authorizationCode:
          authorizationUrl: https://app.stockshift.io/oauth/authorize
          tokenUrl: https://app.stockshift.io/oauth/token
          refreshUrl: https://app.stockshift.io/oauth/token
          scopes:
            access:read: Access read
            audit:read: Audit read
            address:read: Address read
            address:write: Address write
            billing:read: Billing read
            catalog:read: Catalog read
            catalog:write: Catalog write
            dashboard:read: Dashboard read
            dashboard:write: Dashboard write
            developer:read: Developer read
            developer:write: Developer write
            devices:read: Devices read
            devices:write: Devices write
            documents:read: Documents read
            documents:write: Documents write
            notifications:read: Notifications read
            notifications:write: Notifications write
            inventory:read: Inventory read
            inventory:write: Inventory write
            purchasing:read: Purchasing read
            purchasing:write: Purchasing write
            quality:read: Quality read
            quality:write: Quality write
            sales:read: Sales read
            sales:write: Sales write
            engineering:read: Engineering read
            engineering:write: Engineering write
            manufacturing:read: Manufacturing read
            manufacturing:write: Manufacturing write
            automation:read: Automation read
            automation:write: Automation write
            insights:read: Insights read
            insights:write: Insights write
            integrations:read: Integrations read
            integrations:write: Integrations write
            labels:read: Labels read
            labels:write: Labels write
            library:read: Library read
            organization:read: Organization read
            organization:write: Organization write
            planning:read: Planning read
            planning:write: Planning write
            sync:read: Sync read
            sync:write: Sync write

````

## Related topics

- [Envía las existencias ahora](https://docs.stockshift.io/es/api-reference/conexiones/envía-las-existencias-ahora.md)
- [Sincroniza un flujo ahora](https://docs.stockshift.io/es/api-reference/conexiones/sincroniza-un-flujo-ahora.md)
- [Vuelve a sincronizar un flujo desde una fecha](https://docs.stockshift.io/es/api-reference/conexiones/vuelve-a-sincronizar-un-flujo-desde-una-fecha.md)


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