{
  "components": {
    "schemas": {
      "AccountClosure": {
        "additionalProperties": false,
        "properties": {
          "case_id": {
            "format": "uuid",
            "type": "string"
          },
          "completed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "confirmed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "due_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "scope": {
            "enum": [
              "account",
              "workspace"
            ],
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "AccountClosureInput": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "const": true,
            "type": "boolean"
          },
          "current_password": {
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "scope": {
            "enum": [
              "account",
              "workspace"
            ],
            "type": "string"
          }
        },
        "required": [
          "scope",
          "current_password",
          "confirm",
          "request_id"
        ],
        "type": "object"
      },
      "AccountClosureList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/AccountClosure"
            },
            "type": "array"
          },
          "now": {
            "format": "date-time",
            "type": "string"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "AccountClosureReview": {
        "additionalProperties": false,
        "properties": {
          "acknowledge_finance": {
            "type": "boolean"
          },
          "approve": {
            "type": "boolean"
          },
          "decision": {
            "type": "string"
          }
        },
        "required": [
          "approve",
          "decision"
        ],
        "type": "object"
      },
      "AccountCorrection": {
        "additionalProperties": false,
        "properties": {
          "current_password": {
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          },
          "name": {
            "maxLength": 120,
            "type": "string"
          }
        },
        "required": [
          "name",
          "current_password"
        ],
        "type": "object"
      },
      "Activation": {
        "additionalProperties": false,
        "example": {
          "created_at": "2026-10-18T00:00:00Z",
          "device_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "device_name": "Office PC",
          "generation": 1,
          "id": "44444444-4444-4444-8444-444444444444",
          "last_seen_at": "2026-10-18T00:00:00Z",
          "license_id": "33333333-3333-4333-8333-333333333333",
          "product_id": "11111111-1111-4111-8111-111111111111",
          "released_at": null,
          "status": "active",
          "virtual_machine": false
        },
        "properties": {
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "device_id": {
            "description": "Huella de dispositivo con alcance de producto, normalmente de 64 caracteres hexadecimales minúsculos, derivada por el SDK.",
            "type": "string"
          },
          "device_name": {
            "description": "Etiqueta de dispositivo legible para personas, no una identidad de seguridad.",
            "type": "string"
          },
          "generation": {
            "description": "Generación de activación usada para invalidar credenciales antiguas de dispositivos.",
            "type": "integer"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "last_seen_at": {
            "description": "Marca temporal de la última actividad de dispositivo observada por el servidor, UTC.",
            "format": "date-time",
            "type": "string"
          },
          "lease_expires_at": {
            "anyOf": [
              {
                "description": "Vencimiento del arrendamiento de un puesto flotante; los puestos vencidos pueden recuperarse.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Vencimiento del arrendamiento de un puesto flotante; los puestos vencidos pueden recuperarse.",
                "type": "null"
              }
            ],
            "description": "Vencimiento del arrendamiento de un puesto flotante; los puestos vencidos pueden recuperarse."
          },
          "license_id": {
            "description": "UUID de licencia, distinto del secreto lv_lic_.",
            "format": "uuid",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "released_at": {
            "anyOf": [
              {
                "description": "Marca temporal de liberación; null hasta que se libere.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de liberación; null hasta que se libere.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de liberación; null hasta que se libere."
          },
          "session_id": {
            "description": "Identificador de sesión de una instancia flotante; puede omitirse para licencias vinculadas a un dispositivo.",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "active",
              "released"
            ],
            "type": "string"
          },
          "virtual_machine": {
            "description": "Indica si el SDK detectó una máquina virtual.",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "product_id",
          "license_id",
          "device_id",
          "virtual_machine",
          "device_name",
          "status",
          "generation",
          "created_at",
          "last_seen_at",
          "released_at"
        ],
        "type": "object"
      },
      "ActivationList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Activation"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "AdminPlanList": {
        "additionalProperties": false,
        "properties": {
          "currencies": {
            "items": {
              "pattern": "^[A-Z]{3}$",
              "type": "string"
            },
            "type": "array"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/Price"
            },
            "type": "array"
          },
          "settings": {
            "$ref": "#/components/schemas/DefaultPlan"
          }
        },
        "required": [],
        "type": "object"
      },
      "AttemptList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "anyOf": [
              {
                "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
                "items": {
                  "$ref": "#/components/schemas/WebhookAttempt"
                },
                "type": "array"
              },
              {
                "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
                "type": "null"
              }
            ],
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo."
          }
        },
        "required": [],
        "type": "object"
      },
      "Audit": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "description": "Identificador de la acción de auditoría, como product.create o license.renew.",
            "type": "string"
          },
          "actor_id": {
            "description": "UUID de la cuenta responsable de la acción.",
            "format": "uuid",
            "type": "string"
          },
          "actor_kind": {
            "description": "Origen de la acción: session, api_key o system.",
            "enum": [
              "session",
              "api_key",
              "system"
            ],
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "request_id": {
            "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
            "type": "string"
          },
          "resource_id": {
            "description": "UUID del recurso afectado.",
            "maxLength": 36,
            "type": "string"
          }
        },
        "required": [
          "id",
          "action",
          "resource_id",
          "created_at"
        ],
        "type": "object"
      },
      "AuditList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Audit"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "AutoRenewal": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "description": "Importe en centésimas; los asientos contables pueden ser abonos positivos o cargos negativos.",
            "minimum": 0,
            "type": "integer"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "type": "string"
          },
          "enabled": {
            "description": "Indica si el endpoint del webhook está habilitado.",
            "type": "boolean"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "plan_name": {
            "description": "Nombre visible del plan.",
            "type": "string"
          },
          "policy_version": {
            "description": "Revisión de la política de servicio aceptada al guardar la renovación automática.",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "disabled",
              "enabled",
              "insufficient_balance",
              "price_changed",
              "plan_changed",
              "plan_unavailable",
              "account_unavailable"
            ],
            "type": "string"
          },
          "term_months": {
            "description": "Número de meses del plazo comprado.",
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "description": "Revisión de la configuración de renovación automática.",
            "type": "string"
          }
        },
        "required": [
          "mode",
          "enabled",
          "plan",
          "plan_name",
          "currency",
          "price_version",
          "term_months",
          "amount_cents",
          "status",
          "version",
          "updated_at"
        ],
        "type": "object"
      },
      "AutoRenewalInput": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "expected_version": {
            "type": "string"
          },
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "plan": {
            "type": "string"
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "price_version": {
            "type": "string"
          },
          "term_months": {
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "expected_version"
        ],
        "type": "object"
      },
      "AutoRenewalResult": {
        "additionalProperties": false,
        "properties": {
          "next_renewal_at": {
            "anyOf": [
              {
                "description": "Marca temporal UTC prevista para la próxima renovación; puede ser null si está deshabilitada o no es necesaria.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal UTC prevista para la próxima renovación; puede ser null si está deshabilitada o no es necesaria.",
                "type": "null"
              }
            ],
            "description": "Marca temporal UTC prevista para la próxima renovación; puede ser null si está deshabilitada o no es necesaria."
          },
          "setting": {
            "$ref": "#/components/schemas/AutoRenewal",
            "description": "Configuración actual de renovación automática."
          }
        },
        "required": [
          "setting",
          "next_renewal_at"
        ],
        "type": "object"
      },
      "BatchInput": {
        "additionalProperties": false,
        "properties": {
          "days": {
            "description": "Obligatorio para renew: días adicionales de validez, 1–36500; no lo usan las demás operaciones.",
            "maximum": 36500,
            "minimum": 1,
            "type": "integer"
          },
          "duration_days": {
            "description": "Duración común para entradas create que omiten duration_days. Cada entrada puede sustituirla. Obligatoria para entradas timed/trial sin duración propia; omitir para crear perpetual.",
            "maximum": 36500,
            "minimum": 1,
            "type": [
              "integer",
              "null"
            ]
          },
          "entries": {
            "description": "Obligatorio para create: 1–100 entradas de clientes; omitir en las demás operaciones.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "customer": {
                  "description": "Etiqueta del cliente definida por el proveedor, distinta del correo del portal de clientes.",
                  "maxLength": 120,
                  "type": "string"
                },
                "customer_email": {
                  "description": "Correo vinculado del portal de clientes; vacío cuando no está asignado.",
                  "maxLength": 254,
                  "type": "string"
                },
                "duration_days": {
                  "description": "Duración de creación por licencia; sustituye BatchInput.duration_days. Omita el valor para usar la duración común de creación.",
                  "maximum": 36500,
                  "minimum": 1,
                  "type": [
                    "integer",
                    "null"
                  ]
                }
              },
              "required": [],
              "type": "object"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          },
          "ids": {
            "description": "Obligatorio para renew, revoke y apply_policy: 1–100 UUID de licencia distintos; omitir para create.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          },
          "operation": {
            "description": "Nombre de operación; los lotes admiten create/renew/revoke/apply_policy y las solicitudes sin conexión activate/deactivate.",
            "enum": [
              "create",
              "renew",
              "revoke",
              "apply_policy"
            ],
            "type": "string"
          },
          "policy_id": {
            "description": "Obligatorio para create y apply_policy: UUID de la política de licencias de destino.",
            "format": "uuid",
            "type": "string"
          },
          "preview_token": {
            "description": "Token cifrado de confirmación de vista previa obligatorio para apply_policy; válido durante 600 segundos e invalidado por cambios en los recursos.",
            "type": "string",
            "writeOnly": true
          },
          "product_id": {
            "description": "Obligatorio para create: UUID del producto de las licencias nuevas.",
            "format": "uuid",
            "type": "string"
          },
          "request_id": {
            "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "request_id",
          "operation"
        ],
        "type": "object"
      },
      "BatchItem": {
        "additionalProperties": false,
        "example": {
          "customer": "Order #1001",
          "customer_email": "buyer@example.com",
          "duration_days": 30,
          "expires_at": null,
          "first_activated_at": null,
          "id": "33333333-3333-4333-8333-333333333333",
          "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
        },
        "properties": {
          "customer": {
            "description": "Etiqueta del cliente definida por el proveedor, distinta del correo del portal de clientes.",
            "type": "string"
          },
          "customer_email": {
            "description": "Correo vinculado del portal de clientes; vacío cuando no está asignado.",
            "type": "string"
          },
          "duration_days": {
            "description": "Días propios de cada licencia desde la primera activación. Se requieren 1–36500 para emitir timed/trial; ausente/null para perpetual. Nunca se guardan en la política.",
            "type": [
              "integer",
              "null"
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "type": "null"
              }
            ],
            "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial."
          },
          "first_activated_at": {
            "anyOf": [
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de la primera activación correcta; null antes de activar y no cambia con una renovación o transferencia.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de la primera activación correcta; null antes de activar y no cambia con una renovación o transferencia."
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "license_key": {
            "description": "Clave de licencia completa del cliente proporcionada al activar. El código de inicialización del producto y los ejemplos descargados no contienen este secreto. Las solicitudes sin conexión usan la credencial proporcionada por el SDK.",
            "type": "string"
          },
          "operation": {
            "description": "Nombre de operación; los lotes admiten create/renew/revoke/apply_policy y las solicitudes sin conexión activate/deactivate.",
            "enum": [
              "create",
              "renew",
              "revoke",
              "apply_policy"
            ],
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "BatchResult": {
        "additionalProperties": false,
        "properties": {
          "count": {
            "description": "Recuento del grupo actual o número de registros procesados por un lote.",
            "type": "integer"
          },
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/BatchItem"
            },
            "type": "array"
          },
          "operation": {
            "description": "Nombre de operación; los lotes admiten create/renew/revoke/apply_policy y las solicitudes sin conexión activate/deactivate.",
            "enum": [
              "create",
              "renew",
              "revoke",
              "apply_policy"
            ],
            "type": "string"
          },
          "request_id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "request_id",
          "operation",
          "items",
          "count"
        ],
        "type": "object"
      },
      "BillingEmailPreview": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "link": {
            "format": "uri",
            "type": "string"
          },
          "reply_to": {
            "description": "Correo público de asistencia y Reply-To para el correo de facturación. Vacío oculta el contacto. No cambia la dirección SMTP From existente ni crea un buzón.",
            "maxLength": 254,
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "to": {
            "format": "email",
            "type": "string"
          }
        },
        "required": [
          "id",
          "to",
          "subject",
          "body",
          "link"
        ],
        "type": "object"
      },
      "BillingEmailTestInput": {
        "additionalProperties": false,
        "properties": {
          "kind": {
            "enum": [
              "purchase_success",
              "expiry_reminder",
              "auto_renewal_success",
              "auto_renewal_problem"
            ],
            "type": "string"
          },
          "locale": {
            "default": "zh",
            "enum": [
              "zh",
              "zh-hant",
              "en",
              "es",
              "hi",
              "ar",
              "fr",
              "bn",
              "pt",
              "id",
              "ur"
            ],
            "type": "string"
          },
          "to": {
            "format": "email",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "to"
        ],
        "type": "object"
      },
      "BillingJob": {
        "additionalProperties": false,
        "properties": {
          "attempts": {
            "description": "Recuento acumulado de intentos de tarea.",
            "type": "integer"
          },
          "available_at": {
            "description": "Primera hora UTC en que puede ejecutarse la tarea.",
            "format": "date-time",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "last_error": {
            "description": "Categoría del fallo más reciente; puede estar vacía.",
            "type": "string"
          },
          "month": {
            "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "pending",
              "running",
              "done",
              "failed"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "month",
          "status"
        ],
        "type": "object"
      },
      "BillingJobList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/BillingJob"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "BillingNotificationPreference": {
        "additionalProperties": false,
        "properties": {
          "auto_renewal_problem": {
            "default": true,
            "type": "boolean"
          },
          "auto_renewal_success": {
            "default": true,
            "type": "boolean"
          },
          "expiry_reminder": {
            "default": true,
            "type": "boolean"
          },
          "locale": {
            "enum": [
              "zh",
              "zh-hant",
              "en",
              "es",
              "hi",
              "ar",
              "fr",
              "bn",
              "pt",
              "id",
              "ur"
            ],
            "type": "string"
          },
          "purchase_success": {
            "default": true,
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "purchase_success",
          "expiry_reminder",
          "auto_renewal_success",
          "auto_renewal_problem",
          "locale",
          "version",
          "updated_at"
        ],
        "type": "object"
      },
      "BillingNotificationPreferenceInput": {
        "additionalProperties": false,
        "properties": {
          "auto_renewal_problem": {
            "default": true,
            "type": "boolean"
          },
          "auto_renewal_success": {
            "default": true,
            "type": "boolean"
          },
          "expected_version": {
            "description": "Versión de GET; vacía para una preferencia aún no guardada. Un valor obsoleto devuelve BILLING_EMAIL_PREFERENCE_CONFLICT.",
            "type": "string"
          },
          "expiry_reminder": {
            "default": true,
            "type": "boolean"
          },
          "locale": {
            "enum": [
              "zh",
              "zh-hant",
              "en",
              "es",
              "hi",
              "ar",
              "fr",
              "bn",
              "pt",
              "id",
              "ur"
            ],
            "type": "string"
          },
          "purchase_success": {
            "default": true,
            "type": "boolean"
          }
        },
        "required": [
          "expected_version"
        ],
        "type": "object"
      },
      "BillingNotificationPreferencesResult": {
        "additionalProperties": false,
        "properties": {
          "platform": {
            "$ref": "#/components/schemas/BillingNotificationSettings"
          },
          "preferences": {
            "$ref": "#/components/schemas/BillingNotificationPreference"
          },
          "recipient": {
            "format": "email",
            "type": "string"
          }
        },
        "required": [
          "preferences",
          "platform",
          "recipient"
        ],
        "type": "object"
      },
      "BillingNotificationSettings": {
        "additionalProperties": false,
        "properties": {
          "auto_renewal_problem": {
            "default": true,
            "type": "boolean"
          },
          "auto_renewal_success": {
            "default": true,
            "type": "boolean"
          },
          "expiry_reminder": {
            "default": true,
            "type": "boolean"
          },
          "purchase_success": {
            "default": true,
            "type": "boolean"
          },
          "reminder_days": {
            "default": [
              7
            ],
            "description": "Umbrales anteriores al fin de la cobertura continua, en días de 24 horas. Se guardan en orden ascendente. Un worker iniciado tarde selecciona solo el umbral restante más cercano, no todos los recordatorios omitidos.",
            "items": {
              "maximum": 90,
              "minimum": 1,
              "type": "integer"
            },
            "maxItems": 10,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          },
          "support_email": {
            "description": "Correo público de asistencia y Reply-To para el correo de facturación. Vacío oculta el contacto. No cambia la dirección SMTP From existente ni crea un buzón.",
            "maxLength": 254,
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "purchase_success",
          "expiry_reminder",
          "auto_renewal_success",
          "auto_renewal_problem",
          "reminder_days",
          "support_email",
          "version"
        ],
        "type": "object"
      },
      "BillingNotificationSettingsInput": {
        "additionalProperties": false,
        "properties": {
          "auto_renewal_problem": {
            "default": true,
            "type": "boolean"
          },
          "auto_renewal_success": {
            "default": true,
            "type": "boolean"
          },
          "expected_version": {
            "description": "Versión de GET. Un valor obsoleto devuelve BILLING_EMAIL_SETTINGS_CONFLICT.",
            "type": "string"
          },
          "expiry_reminder": {
            "default": true,
            "type": "boolean"
          },
          "purchase_success": {
            "default": true,
            "type": "boolean"
          },
          "reminder_days": {
            "default": [
              7
            ],
            "description": "Umbrales anteriores al fin de la cobertura continua, en días de 24 horas. Se guardan en orden ascendente. Un worker iniciado tarde selecciona solo el umbral restante más cercano, no todos los recordatorios omitidos.",
            "items": {
              "maximum": 90,
              "minimum": 1,
              "type": "integer"
            },
            "maxItems": 10,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          },
          "support_email": {
            "description": "Correo público de asistencia y Reply-To para el correo de facturación. Vacío oculta el contacto. No cambia la dirección SMTP From existente ni crea un buzón.",
            "maxLength": 254,
            "type": "string"
          }
        },
        "required": [
          "expected_version"
        ],
        "type": "object"
      },
      "BundleInput": {
        "additionalProperties": false,
        "properties": {
          "language": {
            "description": "Identificador del lenguaje SDK para el paquete de descarga.",
            "enum": [
              "go",
              "java",
              "c",
              "cpp",
              "csharp",
              "python",
              "javascript",
              "rust",
              "ruby"
            ],
            "type": "string"
          }
        },
        "required": [
          "language"
        ],
        "type": "object"
      },
      "BuyPlan": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "plan": {
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "type": "string"
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "price_version": {
            "type": "string"
          },
          "renewal": {
            "default": false,
            "description": "Renovación anticipada explícita. El pago se cobra ahora y la cobertura prepagada se amplía inmediatamente. El próximo ciclo de cuota sigue a la cobertura pagada o regalada existente. No se reinicia el uso actual. Renueve el último plan pagado y su moneda; los clientes con paquetes vencidos también pueden comprar normalmente.",
            "type": "boolean"
          },
          "request_id": {
            "maxLength": 80,
            "type": "string"
          },
          "term_months": {
            "default": 1,
            "description": "Duración del contrato. La omisión usa un mes por defecto. Cambiar la duración al reutilizar request_id devuelve 409.",
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          }
        },
        "required": [
          "plan",
          "currency",
          "price_version",
          "request_id"
        ],
        "type": "object"
      },
      "CSRF": {
        "additionalProperties": false,
        "properties": {
          "csrf_token": {
            "type": "string"
          }
        },
        "required": [
          "csrf_token"
        ],
        "type": "object"
      },
      "CancelCustomerRefund": {
        "additionalProperties": false,
        "properties": {
          "confirm_service_stays_cancelled": {
            "description": "Obligatorio cuando la cancelación del servicio ya se ejecutó antes de la revisión. Una solicitud explícita pendiente con alcance definido puede retirarse sin detener ni restaurar el servicio.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "ChangePassword": {
        "additionalProperties": false,
        "properties": {
          "current_password": {
            "description": "12–128 bytes UTF-8, no caracteres",
            "type": "string",
            "writeOnly": true
          },
          "password": {
            "description": "12–128 bytes UTF-8, no caracteres",
            "type": "string",
            "writeOnly": true
          },
          "password_confirmation": {
            "description": "Obligatorio y debe coincidir exactamente con password",
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "current_password",
          "password",
          "password_confirmation"
        ],
        "type": "object"
      },
      "ClosureExportCredential": {
        "additionalProperties": false,
        "properties": {
          "download_url": {
            "type": "string"
          },
          "expires_at": {
            "format": "date-time",
            "type": "string"
          },
          "export_deadline": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "ClosureExportLogin": {
        "additionalProperties": false,
        "properties": {
          "current_password": {
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          }
        },
        "required": [
          "email",
          "current_password"
        ],
        "type": "object"
      },
      "CommerceNotice": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "description": "Cuerpo del aviso de servicio.",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "effective_at": {
            "anyOf": [
              {
                "description": "Hora de entrada en vigor del cambio notificado o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Hora de entrada en vigor del cambio notificado o null.",
                "type": "null"
              }
            ],
            "description": "Hora de entrada en vigor del cambio notificado o null."
          },
          "emailed_at": {
            "anyOf": [
              {
                "description": "Marca temporal de entrega del correo de aviso o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de entrega del correo de aviso o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de entrega del correo de aviso o null."
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "kind": {
            "description": "Identificador de categoría de asiento contable o aviso.",
            "type": "string"
          },
          "read_at": {
            "anyOf": [
              {
                "description": "Marca temporal de lectura del aviso o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de lectura del aviso o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de lectura del aviso o null."
          },
          "reference": {
            "description": "Referencia de negocio relacionada usada para el seguimiento.",
            "type": "string"
          },
          "title": {
            "description": "Título del aviso de servicio.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "CommerceNoticeList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/CommerceNotice"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "CommercePolicy": {
        "additionalProperties": false,
        "properties": {
          "documents": {
            "properties": {
              "privacy": {
                "type": "string"
              },
              "refunds": {
                "type": "string"
              },
              "terms": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "locale": {
            "type": "string"
          },
          "pending": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "created_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "effective_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "version": {
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "profile": {
            "$ref": "#/components/schemas/OperatorProfile"
          },
          "published": {
            "type": "boolean"
          },
          "ready": {
            "type": "boolean"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "CommercePolicyInput": {
        "additionalProperties": false,
        "properties": {
          "expected_version": {
            "type": "string"
          },
          "profile": {
            "$ref": "#/components/schemas/OperatorProfile"
          },
          "published": {
            "type": "boolean"
          }
        },
        "required": [
          "profile",
          "published",
          "expected_version"
        ],
        "type": "object"
      },
      "CommerceResult": {
        "additionalProperties": true,
        "type": "object"
      },
      "Confirmation": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "const": true,
            "type": "boolean"
          }
        },
        "required": [
          "confirm"
        ],
        "type": "object"
      },
      "Consumption": {
        "additionalProperties": false,
        "properties": {
          "feature": {
            "description": "Identificador de la función consumida.",
            "type": "string"
          },
          "limit": {
            "description": "Límite de uso de la función para este periodo de cuota.",
            "type": "integer"
          },
          "overage": {
            "description": "Unidades por encima del límite en este periodo, no dinero. La política controla el límite de exceso de la función.",
            "type": "integer"
          },
          "period": {
            "description": "Período: YYYY-MM mensual, YYYY-MM-DD diario, lifetime total. Límites diarios/mensuales en UTC.",
            "type": "string"
          },
          "quantity": {
            "description": "Unidades solicitadas para esta operación, entero 1–1000000000.",
            "type": "integer"
          },
          "remaining": {
            "description": "remaining = max(0, limit - used - reserved), sin unidades excedentes.",
            "type": "integer"
          },
          "reserved": {
            "description": "Unidades reservadas vigentes en este período, aún sin descontar.",
            "type": "integer"
          },
          "reset_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Próximo reinicio, UTC ISO 8601; null para lifetime."
          },
          "used": {
            "description": "Unidades confirmadas en este período, sin reservas.",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "ConsumptionResult": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "UUID de vinculación del dispositivo o sesión de ejecución. Guárdelo para futuras solicitudes de licencia; no es una clave de licencia.",
            "format": "uuid",
            "type": "string"
          },
          "consumption": {
            "$ref": "#/components/schemas/Consumption"
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0
              },
              {
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "Intervalo actual de heartbeat en segundos; la medición no actualiza la firma ni el temporizador.",
            "type": "integer"
          }
        },
        "required": [
          "activation_id",
          "consumption"
        ],
        "type": "object"
      },
      "CustomerAssignment": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "description": "Vacío elimina la vinculación al portal",
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "CustomerControlsInput": {
        "additionalProperties": false,
        "anyOf": [
          {
            "required": [
              "device_enabled"
            ]
          },
          {
            "required": [
              "api_enabled"
            ]
          }
        ],
        "properties": {
          "api_enabled": {
            "type": "boolean"
          },
          "device_enabled": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "CustomerControlsResult": {
        "additionalProperties": false,
        "properties": {
          "api_enabled": {
            "type": "boolean"
          },
          "device_enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "device_enabled",
          "api_enabled"
        ],
        "type": "object"
      },
      "CustomerDataExportInput": {
        "additionalProperties": false,
        "properties": {
          "current_password": {
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "type": "string"
          },
          "scope": {
            "enum": [
              "account",
              "workspace"
            ],
            "type": "string"
          }
        },
        "required": [
          "scope",
          "current_password",
          "reason"
        ],
        "type": "object"
      },
      "CustomerLicenses": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "type": "string"
          },
          "items": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "email",
          "items"
        ],
        "type": "object"
      },
      "CustomerOverageConsent": {
        "additionalProperties": false,
        "properties": {
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "price_version": {
            "type": "string"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          }
        },
        "required": [
          "price_version",
          "policy_version",
          "terms_accepted",
          "overage_accepted"
        ],
        "type": "object"
      },
      "CustomerRefundInput": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "string"
          },
          "change_id": {
            "type": "string"
          },
          "confirm_termination": {
            "type": "boolean"
          },
          "incident_id": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "order_id": {
            "type": "string"
          },
          "purchase_id": {
            "type": "string"
          },
          "quote_hash": {
            "type": "string"
          },
          "quoted_at": {
            "format": "date-time",
            "type": "string"
          },
          "reason": {
            "enum": [
              "customer_request",
              "future",
              "wallet",
              "usage_change",
              "platform_failure",
              "statutory",
              "billing_error",
              "failed_delivery"
            ],
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "scope": {
            "description": "El alcance explícito cancela en el momento de la aprobación; omitirlo permite una cancelación inmediata apta después de la confirmación explícita.",
            "enum": [
              "purchase",
              "service"
            ],
            "type": "string"
          }
        },
        "required": [
          "reason",
          "message",
          "request_id"
        ],
        "type": "object"
      },
      "CustomerRefundQuote": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/RefundQuote"
          },
          {
            "$ref": "#/components/schemas/ScopedRefundPreview"
          }
        ]
      },
      "CustomerRefundQuoteInput": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "string"
          },
          "change_id": {
            "type": "string"
          },
          "confirm_termination": {
            "type": "boolean"
          },
          "incident_id": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "order_id": {
            "type": "string"
          },
          "purchase_id": {
            "type": "string"
          },
          "quote_hash": {
            "type": "string"
          },
          "quoted_at": {
            "format": "date-time",
            "type": "string"
          },
          "reason": {
            "enum": [
              "customer_request",
              "future",
              "wallet",
              "usage_change",
              "platform_failure",
              "statutory",
              "billing_error",
              "failed_delivery"
            ],
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "scope": {
            "description": "El alcance explícito cancela en el momento de la aprobación; omitirlo permite una cancelación inmediata apta después de la confirmación explícita.",
            "enum": [
              "purchase",
              "service"
            ],
            "type": "string"
          }
        },
        "required": [
          "reason",
          "message"
        ],
        "type": "object"
      },
      "CustomerReleaseInput": {
        "additionalProperties": false,
        "description": "Confirme la liberación antes de enviar. send_email pone opcionalmente en cola el código temporal para la dirección verificada del cliente; generation protege frente a una vista obsoleta del dispositivo.",
        "properties": {
          "generation": {
            "minimum": 1,
            "type": "integer"
          },
          "send_email": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "CustomerReleaseResult": {
        "additionalProperties": false,
        "properties": {
          "email_queued": {
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "const": "released",
            "type": "string"
          },
          "transfer": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TransferCode"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "status",
          "transfer",
          "email_queued"
        ],
        "type": "object"
      },
      "CustomerSession": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "format": "email",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "DatabaseStatus": {
        "additionalProperties": false,
        "properties": {
          "connected": {
            "type": "boolean"
          },
          "database": {
            "type": "string"
          },
          "host": {
            "type": "string"
          },
          "open_connections": {
            "type": "integer"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "connected",
          "host",
          "database"
        ],
        "type": "object"
      },
      "DefaultPlan": {
        "additionalProperties": false,
        "properties": {
          "allow_customer_api_overage": {
            "default": false,
            "description": "Solo permite las opciones del cliente sobre excesos de API. Independiente del permiso de dispositivos. Cuando es false, el uso de API sigue las reglas del administrador. Las API ilimitadas siguen siendo ilimitadas.",
            "type": "boolean"
          },
          "allow_customer_device_overage": {
            "default": false,
            "description": "Solo permite las opciones del cliente sobre excesos de dispositivos. Cuando es false, el uso de dispositivos sigue las reglas del administrador y se ignoran las opciones guardadas del cliente hasta volver a habilitarlas.",
            "type": "boolean"
          },
          "default_currency": {
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "default_plan": {
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "type": "string"
          }
        },
        "required": [
          "default_plan",
          "default_currency"
        ],
        "type": "object"
      },
      "DeliveryList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "anyOf": [
              {
                "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
                "items": {
                  "$ref": "#/components/schemas/WebhookDelivery"
                },
                "type": "array"
              },
              {
                "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
                "type": "null"
              }
            ],
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo."
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "DeviceProfile": {
        "additionalProperties": false,
        "properties": {
          "hardware_id": {
            "description": "SHA-256 del producto y de la identidad de hardware. Vacío si no está disponible; las políticas que requieren hardware lo rechazan.",
            "type": "string"
          },
          "platform": {
            "description": "Sistema local: windows, linux o darwin (macOS).",
            "enum": [
              "windows",
              "linux",
              "darwin"
            ],
            "type": "string"
          },
          "system_id": {
            "description": "SHA-256 del producto e identidad del sistema: 64 caracteres hexadecimales minúsculos.",
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "version": {
            "const": 3,
            "description": "Versión del protocolo de huella de dispositivo, actualmente 3.",
            "type": "integer"
          },
          "virtual_machine": {
            "description": "Booleano: si el SDK detecta una máquina virtual.",
            "type": "boolean"
          }
        },
        "required": [
          "version",
          "system_id",
          "hardware_id",
          "virtual_machine",
          "platform"
        ],
        "type": "object"
      },
      "DeviceReleaseOperation": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "attempts": {
            "description": "Número de intentos de procesamiento fallidos conservado por Licentivo.",
            "type": "integer"
          },
          "available_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "completed_at": {
            "anyOf": [
              {
                "description": "Hora de creación del registro en UTC.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Hora de finalización de la operación; omitida mientras está pendiente.",
                "type": "null"
              }
            ],
            "description": "Hora de finalización de la operación; omitida mientras está pendiente."
          },
          "connection_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "error_code": {
            "description": "Motivo estable de procesamiento o revisión; vacío tras el éxito.",
            "type": "string"
          },
          "expected_generation": {
            "description": "Generación de vinculación de dispositivo esperada, comparada dentro de la transacción de revocación.",
            "minimum": 1,
            "type": "integer"
          },
          "license_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "operation_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "source": {
            "description": "Origen de esta operación de revocación.",
            "enum": [
              "logout",
              "launch",
              "admin"
            ],
            "type": "string"
          },
          "status": {
            "description": "Estado actual del ciclo de vida o del procesamiento controlado por el servidor.",
            "enum": [
              "pending",
              "succeeded",
              "stale",
              "manual_review"
            ],
            "type": "string"
          }
        },
        "required": [
          "operation_id",
          "license_id",
          "activation_id",
          "expected_generation",
          "source",
          "status"
        ],
        "type": "object"
      },
      "EligibleReleases": {
        "additionalProperties": false,
        "properties": {
          "authorization": {
            "additionalProperties": true,
            "type": "object"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/Release"
            },
            "type": "array"
          }
        },
        "required": [],
        "type": "object"
      },
      "Email": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "format": "email",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "EmailChangeConfirmation": {
        "additionalProperties": false,
        "properties": {
          "token": {
            "maxLength": 2048,
            "minLength": 32,
            "type": "string"
          }
        },
        "required": [
          "token"
        ],
        "type": "object"
      },
      "Empty": {
        "additionalProperties": false,
        "properties": {},
        "required": [],
        "type": "object"
      },
      "EmptyRefundPreviewInput": {
        "additionalProperties": false,
        "properties": {},
        "required": [],
        "type": "object"
      },
      "Error": {
        "additionalProperties": false,
        "example": {
          "error": {
            "code": "UNAUTHENTICATED",
            "message": "Please sign in again"
          },
          "request_id": "55555555-5555-4555-8555-555555555555"
        },
        "properties": {
          "error": {
            "additionalProperties": false,
            "description": "Objeto de error o categoría de fallo de entrega; consulte los campos secundarios o el tipo actual.",
            "properties": {
              "code": {
                "description": "Código de error estable legible por máquina.",
                "type": "string"
              },
              "message": {
                "description": "Mensaje de error legible para personas; use code para decidir las ramas de la lógica.",
                "type": "string"
              }
            },
            "required": [
              "code",
              "message"
            ],
            "type": "object"
          },
          "request_id": {
            "description": "UUID de solicitud HTTP generado por el servidor para buscar en los registros; no es un ID de licencia ni de idempotencia.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "error",
          "request_id"
        ],
        "type": "object"
      },
      "FeatureReservation": {
        "additionalProperties": false,
        "properties": {
          "consumption": {
            "$ref": "#/components/schemas/Consumption",
            "description": "Recibo de uso: unidades descontadas, uso acumulado, cuota restante y próximo reinicio."
          },
          "expires_at": {
            "description": "Vencimiento de reserva en UTC; confirma antes de ese momento.",
            "format": "date-time",
            "type": "string"
          },
          "operation_id": {
            "description": "ID original de tarea usado al reservar; mantenlo en los reintentos.",
            "type": "string"
          },
          "reservation_id": {
            "description": "ID de reserva; envíalo para confirmar o cancelar.",
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "description": "pending: ejecutar; committed: descontado; canceled y expired: cerrado sin descuento.",
            "enum": [
              "pending",
              "committed",
              "canceled",
              "expired"
            ],
            "type": "string"
          }
        },
        "required": [
          "reservation_id",
          "operation_id",
          "status",
          "expires_at",
          "consumption"
        ],
        "type": "object"
      },
      "FeatureUsage": {
        "additionalProperties": false,
        "properties": {
          "feature": {
            "description": "Identificador de función medida por consumo, que debe existir en las funciones de la política.",
            "type": "string"
          },
          "license_id": {
            "description": "UUID de licencia, distinto del secreto lv_lic_.",
            "format": "uuid",
            "type": "string"
          },
          "period": {
            "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
            "type": "string"
          },
          "quantity": {
            "description": "Cantidad acumulada usada para esta función y periodo.",
            "type": "integer"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "license_id",
          "feature",
          "period",
          "quantity",
          "updated_at"
        ],
        "type": "object"
      },
      "ForumAuthor": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "ForumImage": {
        "additionalProperties": false,
        "properties": {
          "height": {
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "size": {
            "type": "integer"
          },
          "url": {
            "type": "string"
          },
          "width": {
            "type": "integer"
          }
        },
        "required": [
          "id",
          "url",
          "width",
          "height",
          "size"
        ],
        "type": "object"
      },
      "ForumModerationInput": {
        "additionalProperties": false,
        "description": "Requiere una sesión de navegador de administrador de la plataforma. Proporcione al menos un campo; los campos omitidos mantienen sus valores actuales. La fijación se aplica a temas publicados u ocultos y no restaura contenido eliminado.",
        "minProperties": 1,
        "properties": {
          "hidden": {
            "type": "boolean"
          },
          "locked": {
            "type": "boolean"
          },
          "pinned": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "ForumReply": {
        "additionalProperties": false,
        "properties": {
          "author": {
            "$ref": "#/components/schemas/ForumAuthor"
          },
          "body": {
            "type": "string"
          },
          "can_delete": {
            "type": "boolean"
          },
          "can_edit": {
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "images": {
            "items": {
              "$ref": "#/components/schemas/ForumImage"
            },
            "type": "array"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "body",
          "author",
          "images",
          "created_at",
          "updated_at",
          "can_edit",
          "can_delete"
        ],
        "type": "object"
      },
      "ForumReplyInput": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "maxLength": 12000,
            "minLength": 1,
            "type": "string"
          },
          "image_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 6,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "ForumTopic": {
        "additionalProperties": false,
        "properties": {
          "author": {
            "$ref": "#/components/schemas/ForumAuthor"
          },
          "body": {
            "type": "string"
          },
          "can_delete": {
            "type": "boolean"
          },
          "can_edit": {
            "type": "boolean"
          },
          "can_moderate": {
            "type": "boolean"
          },
          "category": {
            "enum": [
              "integration",
              "help",
              "ideas",
              "showcase"
            ],
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "images": {
            "items": {
              "$ref": "#/components/schemas/ForumImage"
            },
            "type": "array"
          },
          "language": {
            "enum": [
              "en",
              "zh",
              "zh-hant",
              "hi",
              "es",
              "ar",
              "fr",
              "bn",
              "pt",
              "id",
              "ur"
            ],
            "type": "string"
          },
          "last_reply_at": {
            "format": "date-time",
            "type": "string"
          },
          "locked": {
            "type": "boolean"
          },
          "pinned": {
            "type": "boolean"
          },
          "reply_count": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "body",
          "category",
          "language",
          "locked",
          "pinned",
          "author",
          "images",
          "reply_count",
          "created_at",
          "updated_at",
          "last_reply_at",
          "can_edit",
          "can_delete",
          "can_moderate"
        ],
        "type": "object"
      },
      "ForumTopicDetail": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          },
          "replies": {
            "items": {
              "$ref": "#/components/schemas/ForumReply"
            },
            "type": "array"
          },
          "topic": {
            "$ref": "#/components/schemas/ForumTopic"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "topic",
          "replies",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "ForumTopicInput": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "maxLength": 12000,
            "minLength": 1,
            "type": "string"
          },
          "category": {
            "enum": [
              "integration",
              "help",
              "ideas",
              "showcase"
            ],
            "type": "string"
          },
          "image_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 6,
            "type": "array",
            "uniqueItems": true
          },
          "language": {
            "enum": [
              "en",
              "zh",
              "zh-hant",
              "hi",
              "es",
              "ar",
              "fr",
              "bn",
              "pt",
              "id",
              "ur"
            ],
            "type": "string"
          },
          "title": {
            "maxLength": 180,
            "minLength": 2,
            "type": "string"
          }
        },
        "required": [
          "title",
          "body",
          "category",
          "language"
        ],
        "type": "object"
      },
      "ForumTopicList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ForumTopic"
            },
            "type": "array"
          },
          "limit": {
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "ForumTranslationInput": {
        "additionalProperties": false,
        "properties": {
          "reply_id": {
            "format": "uuid",
            "type": "string"
          },
          "target_language": {
            "description": "Seleccione un idioma devuelto por GET /forum/translation.",
            "type": "string"
          }
        },
        "required": [
          "target_language"
        ],
        "type": "object"
      },
      "ForumTranslationResult": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "description": "Texto sin formato traducido. Muéstrelo con textContent, nunca como HTML.",
            "type": "string"
          },
          "cached": {
            "type": "boolean"
          },
          "provider": {
            "type": "string"
          },
          "source_language": {
            "description": "Idioma de origen detectado informado por DeepL.",
            "type": "string"
          },
          "target_language": {
            "description": "Idioma de destino del proveedor seleccionado.",
            "type": "string"
          },
          "title": {
            "description": "Título del tema traducido; vacío para respuestas.",
            "type": "string"
          }
        },
        "required": [
          "title",
          "body",
          "source_language",
          "target_language",
          "cached",
          "provider"
        ],
        "type": "object"
      },
      "Health": {
        "additionalProperties": false,
        "properties": {
          "status": {
            "enum": [
              "ok",
              "ready"
            ],
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "ID": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "Invite": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "format": "email",
            "type": "string"
          },
          "name": {
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "role": {
            "enum": [
              "owner",
              "read_only"
            ],
            "type": "string"
          }
        },
        "required": [
          "email",
          "name",
          "role"
        ],
        "type": "object"
      },
      "Invited": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "message"
        ],
        "type": "object"
      },
      "Invoice": {
        "additionalProperties": false,
        "properties": {
          "active_devices": {
            "description": "Recuento de dispositivos congelado para facturación a partir del máximo de ocupación del periodo predeterminado. No es la ocupación actual ni una lista acumulada de uso de dispositivos.",
            "type": "integer"
          },
          "base_covered": {
            "description": "Indica si un paquete comprado ya cubre el cargo base.",
            "type": "boolean"
          },
          "base_micros": {
            "description": "Cargo base en millonésimas de la unidad monetaria.",
            "type": "integer"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "finalized_at": {
            "anyOf": [
              {
                "description": "Marca temporal de finalización de la factura o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de finalización de la factura o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de finalización de la factura o null."
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "included_devices": {
            "description": "Cuota de dispositivos activos incluida.",
            "type": "integer"
          },
          "month": {
            "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
            "type": "string"
          },
          "overage_devices": {
            "description": "Dispositivos que superan la cuota incluida.",
            "type": "integer"
          },
          "paid_at": {
            "anyOf": [
              {
                "description": "Marca temporal del pago de la factura o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal del pago de la factura o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal del pago de la factura o null."
          },
          "payment_mode": {
            "description": "Entorno de pago, sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "plan_name": {
            "description": "Nombre visible del plan.",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          },
          "refunded_at": {
            "anyOf": [
              {
                "description": "Marca temporal del reembolso de la factura o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal del reembolso de la factura o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal del reembolso de la factura o null."
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "draft",
              "finalized",
              "void"
            ],
            "type": "string"
          },
          "total_cents": {
            "description": "Total de factura en centésimas; consulte paid_at para el estado del pago.",
            "type": "integer"
          },
          "total_micros": {
            "description": "Total de factura en millonésimas de la unidad monetaria.",
            "type": "integer"
          },
          "unit_micros": {
            "description": "Precio por dispositivo activo excedente en millonésimas.",
            "type": "integer"
          },
          "voided_at": {
            "anyOf": [
              {
                "description": "Marca temporal de anulación de la factura o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de anulación de la factura o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de anulación de la factura o null."
          }
        },
        "required": [
          "id",
          "month",
          "currency",
          "status",
          "total_cents"
        ],
        "type": "object"
      },
      "InvoiceList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Invoice"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "Key": {
        "additionalProperties": false,
        "properties": {
          "allow_http": {
            "description": "Permite a esta clave registrar o actualizar orígenes de sitios Launch HTTP, incluidos dominios de servidores de prueba, direcciones IP privadas y nombres de host internos. Las solicitudes a la API de Licentivo siguen usando HTTPS.",
            "type": "boolean"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "expires_at": {
            "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "type": "string"
          },
          "prefix": {
            "description": "Primeros 14 caracteres de la clave administrativa; solo identificación.",
            "type": "string"
          },
          "revoked": {
            "description": "Indica si está revocada; compruebe también expires_at para el vencimiento.",
            "type": "boolean"
          },
          "scope": {
            "description": "read permite lecturas; write permite lecturas y escrituras. Las escrituras también requieren que el creador sea un Owner activo.",
            "enum": [
              "read",
              "write"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "prefix",
          "scope",
          "revoked",
          "allow_http"
        ],
        "type": "object"
      },
      "KeyBundle": {
        "additionalProperties": false,
        "properties": {
          "keys": {
            "items": {
              "$ref": "#/components/schemas/SigningKey"
            },
            "type": "array"
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          },
          "protocol": {
            "type": "string"
          },
          "runtime_policy_source": {
            "const": "current_license_policy",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "keys"
        ],
        "type": "object"
      },
      "KeyCreate": {
        "additionalProperties": false,
        "properties": {
          "allow_http": {
            "default": false,
            "description": "Permite a esta clave registrar o actualizar orígenes de sitios Launch HTTP, incluidos dominios de servidores de prueba, direcciones IP privadas y nombres de host internos. Las solicitudes a la API de Licentivo siguen usando HTTPS.",
            "type": "boolean"
          },
          "expires_days": {
            "description": "Días desde la creación hasta el vencimiento, 1–365.",
            "maximum": 365,
            "minimum": 1,
            "type": "integer"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "scope": {
            "description": "read permite lecturas; write permite lecturas y escrituras. Las escrituras también requieren que el creador sea un Owner activo.",
            "enum": [
              "read",
              "write"
            ],
            "type": "string"
          }
        },
        "required": [
          "name",
          "scope",
          "expires_days"
        ],
        "type": "object"
      },
      "KeyList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Key"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "KeyRotated": {
        "additionalProperties": false,
        "example": {
          "id": "33333333-3333-4333-8333-333333333333",
          "key": "lv_api_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
          "prefix": "lv_api_BBBBBBB"
        },
        "properties": {
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "key": {
            "description": "Full secret returned on creation or rotation. Owners may also view saved license keys on demand in a browser session. Store privately; the prefix cannot authenticate.",
            "type": "string"
          },
          "prefix": {
            "description": "Primeros 14 caracteres de la clave administrativa; solo identificación.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "key",
          "prefix"
        ],
        "type": "object"
      },
      "KeySecret": {
        "additionalProperties": false,
        "example": {
          "expires_at": "2027-01-16T00:00:00Z",
          "id": "33333333-3333-4333-8333-333333333333",
          "key": "lv_api_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
          "prefix": "lv_api_AAAAAAA"
        },
        "properties": {
          "allow_http": {
            "description": "Permite a esta clave registrar o actualizar orígenes de sitios Launch HTTP, incluidos dominios de servidores de prueba, direcciones IP privadas y nombres de host internos. Las solicitudes a la API de Licentivo siguen usando HTTPS.",
            "type": "boolean"
          },
          "expires_at": {
            "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "key": {
            "description": "Solo se muestra al crear o rotar",
            "type": "string"
          },
          "prefix": {
            "description": "Primeros 14 caracteres de la clave administrativa; solo identificación.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "key",
          "prefix"
        ],
        "type": "object"
      },
      "KeyUpdate": {
        "additionalProperties": false,
        "properties": {
          "allow_http": {
            "description": "Permite a esta clave registrar o actualizar orígenes de sitios Launch HTTP, incluidos dominios de servidores de prueba, direcciones IP privadas y nombres de host internos. Las solicitudes a la API de Licentivo siguen usando HTTPS.",
            "type": "boolean"
          }
        },
        "required": [
          "allow_http"
        ],
        "type": "object"
      },
      "KeyUpdated": {
        "additionalProperties": false,
        "properties": {
          "allow_http": {
            "description": "Permite a esta clave registrar o actualizar orígenes de sitios Launch HTTP, incluidos dominios de servidores de prueba, direcciones IP privadas y nombres de host internos. Las solicitudes a la API de Licentivo siguen usando HTTPS.",
            "type": "boolean"
          },
          "id": {
            "description": "Unique record identifier.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "id",
          "allow_http"
        ],
        "type": "object"
      },
      "LaunchCommerceEvent": {
        "additionalProperties": false,
        "properties": {
          "account_ref": {
            "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
            "pattern": "^[A-Za-z0-9_-]{1,128}$",
            "type": "string"
          },
          "entitlement_ref": {
            "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
            "pattern": "^[A-Za-z0-9_-]{1,128}$",
            "type": "string"
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "event_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "launch_product_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "legacy_license_id": {
            "description": "Solo para entitlement.migrated. Se conservan la licencia, el vencimiento, las capacidades y los registros de dispositivos existentes; las claves y credenciales antiguas de dispositivos pierden acceso de ejecución.",
            "format": "uuid",
            "type": "string"
          },
          "plan_ref": {
            "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
            "pattern": "^[A-Za-z0-9_-]{1,128}$",
            "type": "string"
          },
          "type": {
            "description": "Tipo de evento comercial de instantánea completa con versión.",
            "enum": [
              "entitlement.created",
              "entitlement.renewed",
              "entitlement.upgraded",
              "entitlement.downgraded",
              "entitlement.refunded",
              "entitlement.suspended",
              "entitlement.expired",
              "entitlement.resumed",
              "entitlement.migrated"
            ],
            "type": "string"
          },
          "valid_from": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "valid_until": {
            "anyOf": [
              {
                "description": "Hora de creación del registro en UTC.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Vencimiento absoluto de la compra, UTC; null solo para una política perpetual.",
                "type": "null"
              }
            ],
            "description": "Vencimiento absoluto de la compra, UTC; null solo para una política perpetual."
          },
          "version": {
            "description": "Versión monótona de instantánea completa para esta referencia de derecho, no un número de intento de entrega.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "event_id",
          "environment",
          "type",
          "entitlement_ref",
          "account_ref",
          "launch_product_id",
          "plan_ref",
          "version",
          "valid_from"
        ],
        "type": "object"
      },
      "LaunchConnection": {
        "additionalProperties": false,
        "properties": {
          "audience": {
            "description": "Destinatario exacto previsto de las afirmaciones de inicio de sesión de Launch.",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "enabled": {
            "description": "Indica si esta conexión de confianza puede autorizar nuevos usos en ejecución.",
            "type": "boolean"
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "heartbeat_seconds": {
            "description": "Intervalo de verificación en línea seleccionado por el servidor, en segundos.",
            "type": "integer"
          },
          "id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "issuer": {
            "description": "Origen de Launch de confianza exacto.",
            "type": "string"
          },
          "offline_seconds": {
            "description": "Intervalo finito permitido sin conexión en segundos; cero requiere verificación en línea.",
            "type": "integer"
          },
          "session_seconds": {
            "description": "Duración máxima de sesión de autorización en segundos.",
            "type": "integer"
          },
          "updated_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "issuer",
          "audience",
          "environment",
          "enabled"
        ],
        "type": "object"
      },
      "LaunchConnectionInput": {
        "additionalProperties": false,
        "properties": {
          "audience": {
            "description": "Destinatario exacto previsto de las afirmaciones de inicio de sesión de Launch.",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "enabled": {
            "description": "Indica si esta conexión de confianza puede autorizar nuevos usos en ejecución.",
            "type": "boolean"
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "heartbeat_seconds": {
            "default": 600,
            "description": "Intervalo de verificación en línea seleccionado por el servidor, en segundos.",
            "maximum": 86400,
            "minimum": 600,
            "type": "integer"
          },
          "issuer": {
            "description": "Origen de Launch de confianza exacto, sin ruta ni barra final. HTTPS es el valor predeterminado. HTTP requiere allow_http en la clave API que realiza esta solicitud; se admiten IP privadas y nombres de host internos. No se realiza ninguna solicitud de callback o descubrimiento a este origen.",
            "format": "uri",
            "type": "string"
          },
          "offline_seconds": {
            "default": 0,
            "description": "0 requiere verificación en línea. Un plazo sin conexión positivo debe ser de al menos 3 × heartbeat_seconds. Las autorizaciones de cuenta permanentes sin conexión están deshabilitadas.",
            "maximum": 86400,
            "minimum": 0,
            "type": "integer"
          },
          "public_keys": {
            "additionalProperties": {
              "description": "Clave pública Ed25519 canónica Base64URL fijada, 32 bytes.",
              "type": "string"
            },
            "description": "Conjunto completo fijado de claves públicas Ed25519 de Launch, indexadas por ID de clave.",
            "maxProperties": 16,
            "minProperties": 1,
            "type": "object"
          },
          "session_seconds": {
            "default": 86400,
            "description": "Al menos 3 × heartbeat_seconds.",
            "maximum": 2592000,
            "minimum": 1800,
            "type": "integer"
          }
        },
        "required": [
          "issuer",
          "audience",
          "environment",
          "public_keys",
          "enabled"
        ],
        "type": "object"
      },
      "LaunchDeviceReleaseInput": {
        "additionalProperties": false,
        "properties": {
          "account_ref": {
            "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
            "pattern": "^[A-Za-z0-9_-]{1,128}$",
            "type": "string"
          },
          "entitlement_ref": {
            "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
            "pattern": "^[A-Za-z0-9_-]{1,128}$",
            "type": "string"
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "expected_generation": {
            "description": "Generación de vinculación de dispositivo esperada, comparada dentro de la transacción de revocación.",
            "minimum": 1,
            "type": "integer"
          },
          "operation_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "operation_id",
          "account_ref",
          "entitlement_ref",
          "environment",
          "expected_generation"
        ],
        "type": "object"
      },
      "LaunchEvent": {
        "additionalProperties": false,
        "properties": {
          "applied_at": {
            "anyOf": [
              {
                "description": "Hora de creación del registro en UTC.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Hora en que se aplicó la instantánea o se clasificó como stale.",
                "type": "null"
              }
            ],
            "description": "Hora en que se aplicó la instantánea o se clasificó como stale."
          },
          "attempts": {
            "description": "Número de intentos de procesamiento fallidos conservado por Licentivo.",
            "type": "integer"
          },
          "available_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "connection_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "error_code": {
            "description": "Motivo estable de procesamiento o revisión; vacío tras el éxito.",
            "type": "string"
          },
          "event_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del ciclo de vida o del procesamiento controlado por el servidor.",
            "enum": [
              "pending",
              "applied",
              "stale",
              "manual_review"
            ],
            "type": "string"
          }
        },
        "required": [
          "connection_id",
          "event_id",
          "status",
          "attempts",
          "available_at"
        ],
        "type": "object"
      },
      "LaunchExchangeInput": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "data.activation_id de la última activación correcta. Obligatorio para validación, heartbeat, consume y desactivación; omítalo solo en el primer activate.",
            "format": "uuid",
            "type": "string"
          },
          "app_version": {
            "description": "Versión actual de la aplicación, major.minor.patch, por ejemplo 1.0.0. Obligatoria para reglas de mantenimiento o de intervalo de versiones. No presente una aplicación más nueva como si fuera una versión antigua.",
            "pattern": "^$|^(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})$",
            "type": "string"
          },
          "device_id": {
            "description": "SHA-256 hexadecimal en minúsculas de 64 caracteres calculado por el SDK a partir de las identidades de producto, sistema y hardware. No lo sustituya por un valor fijo.",
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "device_name": {
            "description": "Nombre en la consola, hasta 120 caracteres. No determina la identidad del equipo.",
            "maxLength": 120,
            "type": "string"
          },
          "device_profile": {
            "$ref": "#/components/schemas/DeviceProfile",
            "description": "Perfil del equipo generado por el SDK. Proporciónelo según los requisitos de las políticas para identidad de hardware, rechazo de VM o migración de hardware."
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "feature": {
            "description": "Identificador de la función consumida.",
            "maxLength": 64,
            "type": "string"
          },
          "identity_token": {
            "description": "JWT de identidad de Launch Ed25519 tipado y de un solo uso; ninguna declaración de derechos se considera prueba fiable de derechos de compra.",
            "maxLength": 12288,
            "type": "string",
            "writeOnly": true
          },
          "launch_connection_id": {
            "description": "ID de conexión Launch de esta operación de autorización de Launch.",
            "format": "uuid",
            "type": "string"
          },
          "license_key": {
            "const": "",
            "description": "Omitir o dejar vacío. El intercambio de cuentas nunca usa una clave de licencia de larga duración.",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto; debe coincidir con el de la licencia.",
            "format": "uuid",
            "type": "string"
          },
          "quantity": {
            "description": "Unidades solicitadas para esta operación, entero 1–1000000000.",
            "maximum": 1000000000,
            "minimum": 1,
            "type": "integer"
          },
          "request_logout_ticket": {
            "description": "Negociación de capacidades del SDK. Solicite un ticket de cierre de sesión exclusivo de desvinculación cuando no se conserve ninguno para la vinculación actual. Omítalo cuando ya se conserve un ticket válido; los heartbeats en régimen estable evitan una consulta adicional de tickets.",
            "type": "boolean"
          },
          "reservation_id": {
            "description": "ID de reserva; envíalo para confirmar o cancelar.",
            "format": "uuid",
            "type": "string"
          },
          "reservation_seconds": {
            "default": 900,
            "description": "Duración opcional: 30–3600 segundos, 900 por defecto. Termina antes si se reinicia el período.",
            "maximum": 3600,
            "minimum": 30,
            "type": "integer"
          },
          "session_id": {
            "description": "Obligatorio para licencias flotantes: genere un UUID por instancia en ejecución y reutilícelo en las solicitudes de esa instancia. Opcional para licencias vinculadas a dispositivos.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "device_id",
          "identity_token",
          "launch_connection_id",
          "environment"
        ],
        "type": "object"
      },
      "LaunchPlanMappingInput": {
        "additionalProperties": false,
        "properties": {
          "launch_product_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "policy_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "policy_version": {
            "description": "Versión actual esperada de la política de autorización asignada.",
            "minimum": 1,
            "type": "integer"
          },
          "product_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "launch_product_id",
          "product_id",
          "policy_id",
          "policy_version"
        ],
        "type": "object"
      },
      "LaunchSessionRevocation": {
        "additionalProperties": false,
        "properties": {
          "account_ref": {
            "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
            "pattern": "^[A-Za-z0-9_-]{1,128}$",
            "type": "string"
          },
          "completed_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "connection_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación del registro en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "event_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "description": "Motivo de auditoría opcional; vacío equivale a omitirlo. forced_logout requiere alcance session; password_changed y account_disabled requieren alcance account.",
            "enum": [
              "",
              "forced_logout",
              "password_changed",
              "account_disabled"
            ],
            "type": "string"
          },
          "released_devices": {
            "description": "Generaciones actuales de vinculación de dispositivos liberadas; se conservan los inicios de sesión posteriores.",
            "minimum": 0,
            "type": "integer"
          },
          "revoked_before": {
            "description": "Presente para el alcance account. La nueva autenticación debe tener auth_time estrictamente mayor que este límite UTC, comparado con precisión de segundos Unix. Los valores sid conocidos previamente siguen revocados permanentemente.",
            "format": "date-time",
            "type": "string"
          },
          "revoked_credentials": {
            "description": "Credenciales de dispositivo recién revocadas por el evento original.",
            "minimum": 0,
            "type": "integer"
          },
          "revoked_sessions": {
            "description": "Sesiones de autorización recién revocadas por el evento original.",
            "minimum": 0,
            "type": "integer"
          },
          "scope": {
            "description": "session revoca un sid de Launch en todos los productos y dispositivos de esta conexión; account revoca todas las sesiones existentes de la cuenta y rechaza las afirmaciones de autenticación antiguas.",
            "enum": [
              "session",
              "account"
            ],
            "type": "string"
          },
          "sid": {
            "description": "Obligatorio y no vacío para el alcance session; omitir o dejar vacío para el alcance account. Es el sid de inicio de sesión de Launch, no una sesión de autorización de Licentivo ni un ID de dispositivo.",
            "pattern": "^[A-Za-z0-9_-]{0,128}$",
            "type": "string"
          },
          "status": {
            "const": "succeeded",
            "description": "Estado actual del ciclo de vida o del procesamiento controlado por el servidor.",
            "type": "string"
          }
        },
        "required": [
          "connection_id",
          "event_id",
          "environment",
          "account_ref",
          "scope",
          "status",
          "revoked_sessions",
          "revoked_credentials",
          "released_devices",
          "created_at",
          "completed_at"
        ],
        "type": "object"
      },
      "LaunchSessionRevocationInput": {
        "additionalProperties": false,
        "oneOf": [
          {
            "properties": {
              "reason": {
                "enum": [
                  "",
                  "forced_logout"
                ]
              },
              "scope": {
                "const": "session"
              },
              "sid": {
                "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
                "pattern": "^[A-Za-z0-9_-]{1,128}$",
                "type": "string"
              }
            },
            "required": [
              "sid"
            ]
          },
          {
            "properties": {
              "reason": {
                "enum": [
                  "",
                  "password_changed",
                  "account_disabled"
                ]
              },
              "scope": {
                "const": "account"
              },
              "sid": {
                "const": ""
              }
            }
          }
        ],
        "properties": {
          "account_ref": {
            "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
            "pattern": "^[A-Za-z0-9_-]{1,128}$",
            "type": "string"
          },
          "environment": {
            "description": "Comprobación opcional de coherencia. Omita el valor o déjelo vacío para usar el entorno de la conexión; un valor no vacío debe coincidir. Este campo no cambia la facturación ni ofrece pruebas gratuitas de autorización.",
            "enum": [
              "",
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "event_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "description": "Motivo de auditoría opcional; vacío equivale a omitirlo. forced_logout requiere alcance session; password_changed y account_disabled requieren alcance account.",
            "enum": [
              "",
              "forced_logout",
              "password_changed",
              "account_disabled"
            ],
            "type": "string"
          },
          "scope": {
            "description": "session revoca un sid de Launch en todos los productos y dispositivos de esta conexión; account revoca todas las sesiones existentes de la cuenta y rechaza las afirmaciones de autenticación antiguas.",
            "enum": [
              "session",
              "account"
            ],
            "type": "string"
          },
          "sid": {
            "description": "Obligatorio y no vacío para el alcance session; omitir o dejar vacío para el alcance account. Es el sid de inicio de sesión de Launch, no una sesión de autorización de Licentivo ni un ID de dispositivo.",
            "pattern": "^[A-Za-z0-9_-]{0,128}$",
            "type": "string"
          }
        },
        "required": [
          "event_id",
          "account_ref",
          "scope"
        ],
        "type": "object"
      },
      "Lease": {
        "additionalProperties": false,
        "properties": {
          "key_id": {
            "description": "UUID de la clave pública de firma; debe existir en trusted_keys del producto.",
            "format": "uuid",
            "type": "string"
          },
          "payload": {
            "description": "Codificación Base64URL sin relleno de los bytes JSON originales de la licencia. Decodificar solo permite leer; se requiere verificar la firma.",
            "type": "string"
          },
          "signature": {
            "description": "Firma Ed25519 en Base64URL. Verifique el texto LicenovaLease/v1, un salto de línea y los bytes JSON originales del payload decodificado. No vuelva a serializar JSON. La firma decodificada tiene 64 bytes.",
            "type": "string"
          },
          "version": {
            "const": 1,
            "description": "Versión del protocolo de la envoltura de firma, actualmente 1.",
            "type": "integer"
          }
        },
        "required": [
          "version",
          "key_id",
          "payload",
          "signature"
        ],
        "type": "object"
      },
      "LeaseClaims": {
        "additionalProperties": false,
        "description": "Decodifique los bytes originales del payload firmado. Sin runtime_policy, el TTL se limita a 86400 segundos; en otro caso, aplique la política firmada. Nunca confíe en el payload sin verificar firma/contexto.",
        "properties": {
          "activation_id": {
            "format": "uuid",
            "type": "string"
          },
          "capabilities": {
            "$ref": "#/components/schemas/SignedCapabilities"
          },
          "device_id": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "expires_at": {
            "maximum": 253402300799,
            "type": "integer"
          },
          "features": {
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "issued_at": {
            "type": "integer"
          },
          "key_id": {
            "format": "uuid",
            "type": "string"
          },
          "license_id": {
            "format": "uuid",
            "type": "string"
          },
          "max_devices": {
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "enum": [
              "perpetual",
              "timed",
              "trial"
            ],
            "type": "string"
          },
          "offline_request_id": {
            "format": "uuid",
            "type": "string"
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          },
          "runtime_policy": {
            "$ref": "#/components/schemas/RuntimePolicy"
          },
          "tenant_id": {
            "format": "uuid",
            "type": "string"
          },
          "version": {
            "const": 1,
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "LegalAcceptance": {
        "additionalProperties": false,
        "properties": {
          "accepted_at": {
            "format": "date-time",
            "type": "string"
          },
          "api_overage_accepted": {
            "type": "boolean"
          },
          "device_overage_accepted": {
            "type": "boolean"
          },
          "digest": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "type": "string"
          },
          "overage_accepted": {
            "type": "boolean"
          },
          "price_version": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "scope": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "LegalAcceptanceList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/LegalAcceptance"
            },
            "type": "array"
          },
          "now": {
            "format": "date-time",
            "type": "string"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "LegalConsent": {
        "additionalProperties": false,
        "properties": {
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "License": {
        "additionalProperties": false,
        "description": "El vencimiento es null hasta la primera activación correcta. La duración se fija en la emisión; reactivar nunca la reinicia.",
        "example": {
          "created_at": "2026-10-18T00:00:00Z",
          "customer": "Order #1001",
          "duration_days": 30,
          "expires_at": null,
          "features": [
            "export"
          ],
          "first_activated_at": null,
          "id": "33333333-3333-4333-8333-333333333333",
          "key_prefix": "lv_lic_AAAAAAA",
          "max_devices": 1,
          "mode": "timed",
          "policy_id": "22222222-2222-4222-8222-222222222222",
          "policy_version": 1,
          "product_id": "11111111-1111-4111-8111-111111111111",
          "status": "active",
          "updated_at": "2026-10-18T00:00:00Z"
        },
        "properties": {
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "customer": {
            "description": "Etiqueta del cliente definida por el proveedor, distinta del correo del portal de clientes.",
            "type": "string"
          },
          "duration_days": {
            "description": "Días propios de cada licencia desde la primera activación. Se requieren 1–36500 para emitir timed/trial; ausente/null para perpetual. Nunca se guardan en la política.",
            "type": [
              "integer",
              "null"
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "type": "null"
              }
            ],
            "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial."
          },
          "features": {
            "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "first_activated_at": {
            "anyOf": [
              {
                "description": "Marca temporal de la primera activación correcta; null antes de activar y no cambia con una renovación o transferencia.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de la primera activación correcta; null antes de activar y no cambia con una renovación o transferencia.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de la primera activación correcta; null antes de activar y no cambia con una renovación o transferencia."
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "key_prefix": {
            "description": "Prefijo corto de clave de licencia para identificar/buscar, no para autenticar.",
            "type": "string"
          },
          "max_devices": {
            "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
            "type": "integer"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "perpetual",
              "timed",
              "trial"
            ],
            "type": "string"
          },
          "policy_id": {
            "description": "UUID de política; debe pertenecer al producto en el momento de la emisión.",
            "format": "uuid",
            "type": "string"
          },
          "policy_version": {
            "description": "Revisión de la política; envíe el valor actual al editar todas las capacidades para impedir escrituras obsoletas.",
            "type": "integer"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "active",
              "expired",
              "suspended",
              "revoked"
            ],
            "type": "string"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "product_id",
          "key_prefix",
          "mode",
          "status"
        ],
        "type": "object"
      },
      "LicenseCapabilities": {
        "additionalProperties": false,
        "example": {
          "license_id": "33333333-3333-4333-8333-333333333333",
          "license_model": "node_locked",
          "maintenance_days": 0,
          "maintenance_until": null,
          "max_version": "",
          "min_version": "",
          "product_id": "11111111-1111-4111-8111-111111111111",
          "updated_at": "2026-10-18T00:00:00Z"
        },
        "properties": {
          "license_id": {
            "description": "UUID de licencia, distinto del secreto lv_lic_.",
            "format": "uuid",
            "type": "string"
          },
          "license_model": {
            "description": "Vinculación de dispositivo node_locked o puestos flotantes.",
            "enum": [
              "node_locked",
              "floating"
            ],
            "type": "string"
          },
          "maintenance_days": {
            "description": "Días de mantenimiento desde la primera activación; 0 significa que no hay fecha límite de mantenimiento.",
            "type": "integer"
          },
          "maintenance_until": {
            "anyOf": [
              {
                "description": "Fecha límite de mantenimiento para nuevas versiones; puede ser null antes de activar o cuando es ilimitado.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Fecha límite de mantenimiento para nuevas versiones; puede ser null antes de activar o cuando es ilimitado.",
                "type": "null"
              }
            ],
            "description": "Fecha límite de mantenimiento para nuevas versiones; puede ser null antes de activar o cuando es ilimitado."
          },
          "max_version": {
            "description": "Versión máxima permitida de la aplicación; vacío significa que no hay límite superior.",
            "type": "string"
          },
          "min_version": {
            "description": "Versión mínima permitida de la aplicación; vacío significa que no hay límite inferior.",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "license_id",
          "product_id",
          "license_model",
          "maintenance_days",
          "maintenance_until",
          "min_version",
          "max_version",
          "updated_at"
        ],
        "type": "object"
      },
      "LicenseCapabilityResult": {
        "additionalProperties": false,
        "example": {
          "customer_email": "buyer@example.com",
          "license": {
            "license_id": "33333333-3333-4333-8333-333333333333",
            "license_model": "node_locked",
            "maintenance_days": 0,
            "maintenance_until": null,
            "max_version": "",
            "min_version": "",
            "product_id": "11111111-1111-4111-8111-111111111111",
            "updated_at": "2026-10-18T00:00:00Z"
          },
          "meter_rules": [],
          "usage": null
        },
        "properties": {
          "customer_email": {
            "description": "Correo vinculado del portal de clientes; vacío cuando no está asignado.",
            "type": "string"
          },
          "license": {
            "$ref": "#/components/schemas/LicenseCapabilities",
            "description": "Instantánea de capacidades de la licencia."
          },
          "meter_rules": {
            "description": "Reglas de medición de funciones; vacío significa que no hay ninguna configurada.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "allow_overage": {
                  "description": "Indica si se permite el uso excedente de funciones.",
                  "type": "boolean"
                },
                "feature": {
                  "description": "Identificador de función medida por consumo, que debe existir en las funciones de la política.",
                  "pattern": "^[A-Za-z0-9_.-]{1,64}$",
                  "type": "string"
                },
                "limit": {
                  "description": "Usos de función incluidos por periodo de medición (no es un límite de paginación).",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "max_overage": {
                  "description": "Uso excedente máximo permitido; deshabilitado cuando allow_overage es false.",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "period": {
                  "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
                  "enum": [
                    "month",
                    "day",
                    "lifetime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "feature",
                "limit",
                "period"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "usage": {
            "anyOf": [
              {
                "description": "Registros reales de uso de funciones; pueden ser null cuando están vacíos.",
                "items": {
                  "$ref": "#/components/schemas/FeatureUsage"
                },
                "type": "array"
              },
              {
                "description": "Registros reales de uso de funciones; pueden ser null cuando están vacíos.",
                "type": "null"
              }
            ],
            "description": "Registros reales de uso de funciones; pueden ser null cuando están vacíos."
          }
        },
        "required": [],
        "type": "object"
      },
      "LicenseCreate": {
        "additionalProperties": false,
        "description": "Emite una licencia con su propio duration_days. Las licencias timed/trial requieren 1–36500 días; las perpetual requieren un valor ausente/null. El plazo empieza en la primera activación correcta.",
        "properties": {
          "customer": {
            "description": "Nombre del cliente o referencia del pedido para buscar en el panel, hasta 254 caracteres.",
            "maxLength": 254,
            "type": "string"
          },
          "customer_email": {
            "description": "Correo vinculado del portal de clientes; vacío cuando no está asignado.",
            "format": "email",
            "maxLength": 254,
            "type": "string"
          },
          "duration_days": {
            "description": "Duración de la licencia en días, desde la primera activación correcta. Obligatoria para emitir timed/trial; omita el valor o use null para licencias perpetual. Nunca se hereda de la política.",
            "maximum": 36500,
            "minimum": 1,
            "type": [
              "integer",
              "null"
            ]
          },
          "policy_id": {
            "description": "UUID de una política de licencia de este producto.",
            "format": "uuid",
            "type": "string"
          },
          "product_id": {
            "description": "ID de producto (UUID).",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "policy_id"
        ],
        "type": "object"
      },
      "LicenseKeyReveal": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "key": {
            "description": "Original full license key, revealed only to a current Owner session.",
            "type": "string"
          },
          "key_prefix": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "key",
          "key_prefix"
        ],
        "type": "object"
      },
      "LicenseList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/License"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "LicenseSecret": {
        "additionalProperties": false,
        "example": {
          "duration_days": 30,
          "expires_at": null,
          "first_activated_at": null,
          "id": "33333333-3333-4333-8333-333333333333",
          "key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
          "key_prefix": "lv_lic_AAAAAAA"
        },
        "properties": {
          "duration_days": {
            "description": "Días de validez desde la primera activación; null para perpetuas.",
            "type": [
              "integer",
              "null"
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "type": "null"
              }
            ],
            "description": "Vencimiento final de la licencia, UTC ISO 8601; null antes de la primera activación y para licencias perpetuas."
          },
          "first_activated_at": {
            "anyOf": [
              {
                "description": "Marca temporal de la primera activación correcta; null antes de activar y no cambia con una renovación o transferencia.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de la primera activación correcta; null antes de activar y no cambia con una renovación o transferencia.",
                "type": "null"
              }
            ],
            "description": "Primera activación correcta, UTC ISO 8601; null antes de la activación. La transferencia del dispositivo no la reinicia."
          },
          "id": {
            "description": "UUID del registro de licencia para consultas administrativas, renovación o revocación. No es una clave de activación.",
            "format": "uuid",
            "type": "string"
          },
          "key": {
            "description": "Clave de licencia completa que empieza por lv_lic_. Se muestra una sola vez al emitirla; el proveedor debe guardarla en privado y entregarla al cliente.",
            "type": "string"
          },
          "key_prefix": {
            "description": "Prefijo de clave para identificarla en el panel; no puede activar una licencia.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "key",
          "key_prefix"
        ],
        "type": "object"
      },
      "LicenseUpdate": {
        "additionalProperties": false,
        "properties": {
          "customer": {
            "description": "Etiqueta del cliente definida por el proveedor, distinta del correo del portal de clientes.",
            "maxLength": 254,
            "type": "string"
          },
          "features": {
            "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "max_devices": {
            "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "policy_id": {
            "description": "Cambia esta licencia a una política del mismo producto. El cambio requiere un preview_token vigente; conserva la clave de licencia, el plazo original y el uso.",
            "format": "uuid",
            "type": "string"
          },
          "preview_token": {
            "description": "Token devuelto por POST /licenses/policy-preview para esta licencia y la política de destino.",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "active",
              "suspended",
              "revoked"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "LicensingWebhook": {
        "additionalProperties": false,
        "properties": {
          "created_at": {
            "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
            "format": "date-time",
            "type": "string"
          },
          "enabled": {
            "description": "Indica si se permite HTTP, solo para desarrollo local.",
            "type": "boolean"
          },
          "events": {
            "description": "Tipos de evento suscritos distintos y no vacíos.",
            "items": {
              "enum": [
                "license.created",
                "license.updated",
                "license.renewed",
                "license.revoked",
                "license.activate",
                "license.deactivate",
                "license.consume",
                "license.expiring",
                "license.expired",
                "license.maintenance_expiring",
                "license.maintenance_expired"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "type": "string"
          },
          "updated_at": {
            "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
            "format": "date-time",
            "type": "string"
          },
          "url": {
            "description": "URL del receptor de eventos; use HTTPS público en producción.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "events",
          "enabled",
          "created_at",
          "updated_at"
        ],
        "type": "object"
      },
      "LicensingWebhookInput": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "description": "Indica si el endpoint del webhook está habilitado.",
            "type": "boolean"
          },
          "events": {
            "description": "Tipos de evento suscritos distintos y no vacíos.",
            "items": {
              "enum": [
                "license.created",
                "license.updated",
                "license.renewed",
                "license.revoked",
                "license.activate",
                "license.deactivate",
                "license.consume",
                "license.expiring",
                "license.expired",
                "license.maintenance_expiring",
                "license.maintenance_expired"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "type": "string"
          },
          "secret": {
            "description": "Secreto de verificación del webhook, 32–200 caracteres cuando se proporciona; omitirlo al actualizar lo conserva. Una salida vacía indica que no se ha reemitido.",
            "maxLength": 200,
            "minLength": 32,
            "type": "string",
            "writeOnly": true
          },
          "url": {
            "description": "URL del receptor de eventos; use HTTPS público en producción.",
            "format": "uri",
            "maxLength": 2000,
            "type": "string"
          }
        },
        "required": [
          "name",
          "url",
          "events",
          "enabled"
        ],
        "type": "object"
      },
      "LicensingWebhookList": {
        "additionalProperties": false,
        "properties": {
          "event_types": {
            "description": "Todos los tipos de evento de licencias admitidos.",
            "items": {
              "enum": [
                "license.created",
                "license.updated",
                "license.renewed",
                "license.revoked",
                "license.activate",
                "license.deactivate",
                "license.consume",
                "license.expiring",
                "license.expired",
                "license.maintenance_expiring",
                "license.maintenance_expired"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/LicensingWebhook"
            },
            "type": "array"
          }
        },
        "required": [],
        "type": "object"
      },
      "LicensingWebhookSecret": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "secret": {
            "description": "Se devuelve una vez para endpoints nuevos; vacío si se conserva",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "LoggedOut": {
        "additionalProperties": false,
        "properties": {
          "logged_out": {
            "type": "boolean"
          }
        },
        "required": [
          "logged_out"
        ],
        "type": "object"
      },
      "Login": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "format": "email",
            "type": "string"
          },
          "password": {
            "description": "12–128 bytes UTF-8, no caracteres",
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "email",
          "password"
        ],
        "type": "object"
      },
      "LogoutTicket": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "expected_generation": {
            "description": "Generación de vinculación de dispositivo esperada, comparada dentro de la transacción de revocación.",
            "minimum": 1,
            "type": "integer"
          },
          "operation_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "release_token": {
            "description": "Capacidad exclusiva de desvinculación. No puede activar, validar, actualizar ni consumir funciones. Consérvela solo en el registro de cierre de sesión del SDK mientras esté pendiente la revocación.",
            "pattern": "^lv_out_[A-Za-z0-9_-]{43}$",
            "type": "string"
          }
        },
        "required": [
          "operation_id",
          "product_id",
          "activation_id",
          "expected_generation",
          "release_token"
        ],
        "type": "object"
      },
      "MailConnection": {
        "additionalProperties": false,
        "properties": {
          "check_status": {
            "enum": [
              "verified",
              "limited"
            ],
            "type": "string"
          },
          "delivery_mode": {
            "enum": [
              "file",
              "smtp",
              "resend",
              "brevo",
              "postmark",
              "mailgun"
            ],
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "mode": {
            "enum": [
              "file",
              "smtp",
              "resend",
              "brevo",
              "postmark",
              "mailgun"
            ],
            "type": "string"
          },
          "ok": {
            "description": "False en una comprobación limitada: no se han confirmado las credenciales ni la entrega.",
            "type": "boolean"
          },
          "status": {
            "enum": [
              "connected"
            ],
            "type": "string"
          }
        },
        "required": [
          "status",
          "mode",
          "delivery_mode",
          "ok",
          "check_status"
        ],
        "type": "object"
      },
      "MailInput": {
        "additionalProperties": false,
        "description": "Actualización parcial de la configuración cifrada de correo de la plataforma. Se conservan los campos omitidos y las configuraciones de otros proveedores; las claves API y contraseñas SMTP vacías mantienen los secretos existentes. El servicio activo seleccionado debe estar completamente configurado. El modo de archivo no está disponible en producción. Requiere una sesión de administrador de la plataforma y un token CSRF; las claves API administrativas de los proveedores no pueden cambiar la configuración de correo de la plataforma.",
        "properties": {
          "from": {
            "type": "string"
          },
          "host": {
            "maxLength": 253,
            "type": "string"
          },
          "mode": {
            "enum": [
              "file",
              "smtp",
              "resend",
              "brevo",
              "postmark",
              "mailgun"
            ],
            "type": "string"
          },
          "password": {
            "description": "Omita el valor o déjelo vacío para conservar la contraseña SMTP existente.",
            "maxLength": 1000,
            "type": "string",
            "writeOnly": true
          },
          "port": {
            "maximum": 65535,
            "minimum": 1,
            "type": "integer"
          },
          "providers": {
            "additionalProperties": false,
            "properties": {
              "brevo": {
                "$ref": "#/components/schemas/MailProviderInput"
              },
              "mailgun": {
                "$ref": "#/components/schemas/MailgunInput"
              },
              "postmark": {
                "$ref": "#/components/schemas/MailProviderInput"
              },
              "resend": {
                "$ref": "#/components/schemas/MailProviderInput"
              }
            },
            "required": [],
            "type": "object"
          },
          "tls_mode": {
            "enum": [
              "starttls",
              "implicit"
            ],
            "type": "string"
          },
          "username": {
            "maxLength": 254,
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "MailJob": {
        "additionalProperties": false,
        "properties": {
          "attempts": {
            "type": "integer"
          },
          "cancel_reason": {
            "enum": [
              "",
              "platform_disabled",
              "customer_disabled",
              "coverage_changed",
              "reminder_window_changed",
              "renewal_state_changed",
              "purchase_unavailable",
              "workspace_unavailable",
              "recipient_unavailable",
              "unknown_notification"
            ],
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "delivered_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "kind": {
            "enum": [
              "",
              "purchase_success",
              "expiry_reminder",
              "auto_renewal_success",
              "auto_renewal_problem",
              "billing_test"
            ],
            "type": "string"
          },
          "mode": {
            "enum": [
              "",
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "recipient": {
            "type": "string"
          },
          "status": {
            "enum": [
              "pending",
              "running",
              "delivered",
              "failed",
              "cancelled"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "status",
          "attempts"
        ],
        "type": "object"
      },
      "MailJobList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/MailJob"
            },
            "maxItems": 50,
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "MailProviderInput": {
        "additionalProperties": false,
        "properties": {
          "api_key": {
            "description": "Clave API del proveedor; Postmark usa un Server API Token. Omita el valor o déjelo vacío para conservar el secreto guardado.",
            "maxLength": 4096,
            "type": "string",
            "writeOnly": true
          },
          "from": {
            "description": "Correo de remitente verificado; obligatorio al seleccionar este proveedor como activo.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "MailProviderSettings": {
        "additionalProperties": false,
        "properties": {
          "api_key_configured": {
            "type": "boolean"
          },
          "domain": {
            "description": "Dominio de envío de Mailgun; vacío para otros proveedores.",
            "type": "string"
          },
          "from": {
            "type": "string"
          },
          "region": {
            "description": "Región de Mailgun; vacía para otros proveedores.",
            "enum": [
              "",
              "us",
              "eu"
            ],
            "type": "string"
          }
        },
        "required": [
          "from",
          "domain",
          "region",
          "api_key_configured"
        ],
        "type": "object"
      },
      "MailQueued": {
        "additionalProperties": false,
        "properties": {
          "job_id": {
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "enum": [
              "pending"
            ],
            "type": "string"
          }
        },
        "required": [
          "job_id",
          "status"
        ],
        "type": "object"
      },
      "MailSettings": {
        "additionalProperties": false,
        "properties": {
          "from": {
            "type": "string"
          },
          "host": {
            "type": "string"
          },
          "mode": {
            "enum": [
              "file",
              "smtp",
              "resend",
              "brevo",
              "postmark",
              "mailgun"
            ],
            "type": "string"
          },
          "password_configured": {
            "type": "boolean"
          },
          "port": {
            "type": "integer"
          },
          "providers": {
            "additionalProperties": false,
            "properties": {
              "brevo": {
                "$ref": "#/components/schemas/MailProviderSettings"
              },
              "mailgun": {
                "$ref": "#/components/schemas/MailProviderSettings"
              },
              "postmark": {
                "$ref": "#/components/schemas/MailProviderSettings"
              },
              "resend": {
                "$ref": "#/components/schemas/MailProviderSettings"
              }
            },
            "required": [
              "resend",
              "brevo",
              "postmark",
              "mailgun"
            ],
            "type": "object"
          },
          "tls_mode": {
            "enum": [
              "starttls",
              "implicit"
            ],
            "type": "string"
          },
          "username": {
            "type": "string"
          }
        },
        "required": [
          "mode",
          "port",
          "password_configured",
          "providers"
        ],
        "type": "object"
      },
      "MailgunInput": {
        "additionalProperties": false,
        "properties": {
          "api_key": {
            "description": "Clave API de la cuenta Mailgun o clave de envío del dominio. Omita el valor o déjelo vacío para conservar el secreto guardado.",
            "maxLength": 4096,
            "type": "string",
            "writeOnly": true
          },
          "domain": {
            "description": "Dominio de envío, obligatorio cuando Mailgun está activo; sin esquema, ruta ni puerto.",
            "maxLength": 253,
            "type": "string"
          },
          "from": {
            "description": "Correo de remitente verificado; obligatorio cuando Mailgun está activo.",
            "type": "string"
          },
          "region": {
            "default": "us",
            "description": "Región que aloja el dominio de envío; US y EU usan endpoints API fijos separados.",
            "enum": [
              "us",
              "eu"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "ManagementKeyBundle": {
        "additionalProperties": false,
        "properties": {
          "keys": {
            "description": "Claves públicas de firma actuales e históricas del producto.",
            "items": {
              "$ref": "#/components/schemas/SigningKey"
            },
            "type": "array"
          },
          "product_id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "keys"
        ],
        "type": "object"
      },
      "ManualRefundInput": {
        "additionalProperties": false,
        "properties": {
          "customer_agreement": {
            "maxLength": 3000,
            "type": "string"
          },
          "evidence": {
            "maxLength": 3000,
            "type": "string"
          }
        },
        "required": [
          "customer_agreement",
          "evidence"
        ],
        "type": "object"
      },
      "Me": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "is_platform_admin": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "role": {
            "enum": [
              "owner",
              "read_only"
            ],
            "type": "string"
          },
          "tenant_id": {
            "format": "uuid",
            "type": "string"
          },
          "tenant_name": {
            "type": "string"
          }
        },
        "required": [
          "tenant_id",
          "id",
          "role",
          "is_platform_admin"
        ],
        "type": "object"
      },
      "Member": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "is_platform_admin": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "role": {
            "enum": [
              "owner",
              "read_only"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "active",
              "disabled"
            ],
            "type": "string"
          },
          "verified": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "role",
          "status",
          "verified"
        ],
        "type": "object"
      },
      "MemberList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/Member"
            },
            "type": "array"
          },
          "limit": {
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "MemberUpdate": {
        "additionalProperties": false,
        "properties": {
          "role": {
            "enum": [
              "owner",
              "read_only"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "active",
              "disabled"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "MonthInput": {
        "additionalProperties": false,
        "properties": {
          "month": {
            "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
            "pattern": "^[0-9]{4}-[0-9]{2}$",
            "type": "string"
          }
        },
        "required": [
          "month"
        ],
        "type": "object"
      },
      "Notice": {
        "additionalProperties": false,
        "properties": {
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ],
        "type": "object"
      },
      "OfflineReleaseResult": {
        "additionalProperties": false,
        "example": {
          "activation_id": "44444444-4444-4444-8444-444444444444",
          "deactivated": true
        },
        "properties": {
          "activation_id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "deactivated": {
            "description": "Indica si se permite HTTP, solo para desarrollo local.",
            "type": "boolean"
          }
        },
        "required": [
          "activation_id",
          "deactivated"
        ],
        "type": "object"
      },
      "OfflineRequest": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "UUID del registro de activación del dispositivo o de sesión flotante.",
            "format": "uuid",
            "type": "string"
          },
          "app_version": {
            "description": "Vacío para una activación normal. Proporcione la versión real publicada de la aplicación solo cuando use restricciones de versión o mantenimiento.",
            "pattern": "^$|^(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})$",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "type": "integer"
          },
          "device_id": {
            "description": "El SDK deriva las identidades de sistema operativo y hardware con alcance de producto usando LicenovaDevice/v3. La configuración no puede sustituir el equipo actual.",
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "device_name": {
            "description": "Etiqueta de dispositivo legible para personas, no una identidad de seguridad.",
            "maxLength": 120,
            "type": "string"
          },
          "device_profile": {
            "$ref": "#/components/schemas/DeviceProfile",
            "description": "Identidad de dispositivo generada por el SDK; si está presente, proporcione todos los campos secundarios obligatorios."
          },
          "license_key": {
            "description": "Clave de licencia original; código lv_tmp_ de un solo uso exclusivo para activate; después, una credencial lv_dev_ vinculada al equipo para las operaciones de ejecución. El SDK conserva las credenciales de forma persistente separadas de los arrendamientos.",
            "pattern": "^lv_(lic|tmp|dev)_[A-Za-z0-9_-]{43}$",
            "type": "string",
            "writeOnly": true
          },
          "operation": {
            "description": "Nombre de operación; los lotes admiten create/renew/revoke/apply_policy y las solicitudes sin conexión activate/deactivate.",
            "enum": [
              "activate",
              "deactivate"
            ],
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "request_id": {
            "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
            "format": "uuid",
            "type": "string"
          },
          "session_id": {
            "description": "Identificador de sesión de una instancia flotante; puede omitirse para licencias vinculadas a un dispositivo.",
            "format": "uuid",
            "type": "string"
          },
          "version": {
            "const": 1,
            "description": "Revisión de política, versión major.minor.patch del producto o versión 1 del protocolo sin conexión, según el objeto.",
            "type": "integer"
          }
        },
        "required": [
          "version",
          "request_id",
          "created_at",
          "operation",
          "product_id",
          "license_key",
          "device_id"
        ],
        "type": "object"
      },
      "OfflineResponse": {
        "additionalProperties": false,
        "example": {
          "operation": "deactivate",
          "request_id": "55555555-5555-4555-8555-555555555555",
          "result": {
            "activation_id": "44444444-4444-4444-8444-444444444444",
            "deactivated": true
          },
          "version": 1
        },
        "properties": {
          "operation": {
            "description": "Nombre de operación; los lotes admiten create/renew/revoke/apply_policy y las solicitudes sin conexión activate/deactivate.",
            "enum": [
              "activate",
              "deactivate"
            ],
            "type": "string"
          },
          "request_id": {
            "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
            "format": "uuid",
            "type": "string"
          },
          "result": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RuntimeResult",
                "description": "Resultado de operación sin conexión: la activación devuelve un arrendamiento firmado; la liberación devuelve deactivated."
              },
              {
                "$ref": "#/components/schemas/OfflineReleaseResult",
                "description": "Resultado de operación sin conexión: la activación devuelve un arrendamiento firmado; la liberación devuelve deactivated."
              }
            ],
            "description": "Resultado de operación sin conexión: la activación devuelve un arrendamiento firmado; la liberación devuelve deactivated."
          },
          "version": {
            "const": 1,
            "description": "Revisión de política, versión major.minor.patch del producto o versión 1 del protocolo sin conexión, según el objeto.",
            "type": "integer"
          }
        },
        "required": [
          "version",
          "request_id",
          "operation",
          "result"
        ],
        "type": "object"
      },
      "OnboardingInput": {
        "additionalProperties": false,
        "properties": {
          "description": {
            "description": "Descripción del producto; puede estar vacía.",
            "maxLength": 1000,
            "type": "string"
          },
          "duration_days": {
            "description": "Duración exclusiva de la licencia de prueba generada; 7 por defecto para timed/trial. No se guarda en la política generada.",
            "maximum": 36500,
            "minimum": 1,
            "type": [
              "integer",
              "null"
            ]
          },
          "features": {
            "default": [
              "export"
            ],
            "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0,
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión."
              },
              {
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión.",
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "0 deshabilita explícitamente los heartbeats periódicos; en otro caso, 600–86400 segundos (mínimo 10 minutos). Independiente de la duración sin conexión.",
            "type": "integer"
          },
          "license_model": {
            "default": "node_locked",
            "description": "Vinculación de dispositivo node_locked o puestos flotantes.",
            "enum": [
              "node_locked",
              "floating"
            ],
            "type": "string"
          },
          "max_devices": {
            "default": 1,
            "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "default": "trial",
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "perpetual",
              "timed",
              "trial"
            ],
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "offline_mode": {
            "description": "Uso sin conexión limited, none o permanent; se sigue aplicando el vencimiento de la licencia.",
            "enum": [
              "limited",
              "none",
              "permanent"
            ],
            "type": "string"
          },
          "offline_seconds": {
            "description": "Limited: 1–31536000 segundos y al menos 3 × heartbeat_seconds con los heartbeats habilitados; none/permanent: 0",
            "maximum": 31536000,
            "minimum": 0,
            "type": "integer"
          },
          "request_id": {
            "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "request_id",
          "name"
        ],
        "type": "object"
      },
      "OnboardingResult": {
        "additionalProperties": false,
        "example": {
          "config": {
            "allow_http": false,
            "app_version": "1.0.0",
            "base_url": "https://license.example.com",
            "cache_path": "",
            "device_name": "My application",
            "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
            "product_id": "11111111-1111-4111-8111-111111111111",
            "trusted_keys": {
              "66666666-6666-4666-8666-666666666666": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            }
          },
          "license_id": "33333333-3333-4333-8333-333333333333",
          "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
          "next": "Choose a language and download the configured SDK bundle.",
          "policy_id": "22222222-2222-4222-8222-222222222222",
          "product_id": "11111111-1111-4111-8111-111111111111"
        },
        "properties": {
          "config": {
            "$ref": "#/components/schemas/SDKConfig",
            "description": "Configuración SDK privada de prueba que contiene un secreto de licencia."
          },
          "license_id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "license_key": {
            "description": "Clave de licencia completa del cliente proporcionada al activar. El código de inicialización del producto y los ejemplos descargados no contienen este secreto. Las solicitudes sin conexión usan la credencial proporcionada por el SDK.",
            "type": "string"
          },
          "next": {
            "description": "Plan predeterminado programado para el mes siguiente o null.",
            "type": "string"
          },
          "policy_id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "product_id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "policy_id",
          "license_id",
          "license_key",
          "config",
          "next"
        ],
        "type": "object"
      },
      "OperatorProfile": {
        "additionalProperties": false,
        "properties": {
          "backup_region": {
            "maxLength": 500,
            "type": "string"
          },
          "contact": {
            "maxLength": 500,
            "type": "string"
          },
          "country": {
            "maxLength": 500,
            "type": "string"
          },
          "financial_retention_years": {
            "description": "Cero u omitido significa no confirmado y no se incluye en documentos públicos.",
            "maximum": 30,
            "minimum": 0,
            "type": "integer"
          },
          "hosting_provider": {
            "maxLength": 500,
            "type": "string"
          },
          "mail_provider": {
            "maxLength": 500,
            "type": "string"
          },
          "markets": {
            "maxLength": 500,
            "type": "string"
          },
          "operator": {
            "maxLength": 500,
            "type": "string"
          },
          "processing_grounds": {
            "maxLength": 500,
            "type": "string"
          },
          "server_region": {
            "maxLength": 500,
            "type": "string"
          },
          "transfer_safeguards": {
            "maxLength": 500,
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "OriginalRefundInput": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "pattern": "^[0-9]+(?:\\.[0-9]{1,2})?$",
            "type": "string"
          },
          "reason": {
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "amount",
          "reason",
          "request_id"
        ],
        "type": "object"
      },
      "OriginalRefundResult": {
        "additionalProperties": false,
        "properties": {
          "case_id": {
            "format": "uuid",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ProviderRefund"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "OveragePlan": {
        "additionalProperties": false,
        "properties": {
          "api_hard_limit": {
            "description": "Indica si las llamadas de ejecución se detienen al alcanzar el límite de cuota API.",
            "type": "boolean"
          },
          "api_unit_micros": {
            "description": "Precio por llamada de ejecución excedente en millonésimas.",
            "minimum": 0,
            "type": "integer"
          },
          "base_micros": {
            "description": "Cargo base en millonésimas de la unidad monetaria.",
            "type": "integer"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "type": "string"
          },
          "description": {
            "description": "Descripción de la oferta de facturación.",
            "type": "string"
          },
          "enabled": {
            "description": "Indica si la oferta de facturación está habilitada para comprar.",
            "type": "boolean"
          },
          "hard_limit": {
            "description": "Indica si se rechazan nuevos dispositivos facturables al alcanzar el límite de cuota.",
            "type": "boolean"
          },
          "included_api_calls": {
            "description": "null = ilimitado; 0 = ninguna llamada correcta incluida",
            "maximum": 1000000000000,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "included_devices": {
            "description": "Cuota de dispositivos activos incluida.",
            "type": "integer"
          },
          "name": {
            "description": "Nombre visible de la oferta de facturación.",
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          },
          "public": {
            "description": "Indica si la oferta de facturación se muestra públicamente.",
            "type": "boolean"
          },
          "renewal_only": {
            "description": "Los clientes existentes con paquetes pagados o regalados pueden renovar antes o después del vencimiento en el mismo entorno y moneda. No se muestra para nuevas compras públicas.",
            "type": "boolean"
          },
          "sort_order": {
            "description": "Orden de visualización de la oferta de facturación.",
            "type": "integer"
          },
          "terms": {
            "anyOf": [
              {
                "description": "Plazos de compra disponibles y sus precios.",
                "items": {
                  "$ref": "#/components/schemas/PlanTermPrice"
                },
                "type": "array"
              },
              {
                "description": "Plazos de compra disponibles y sus precios.",
                "type": "null"
              }
            ],
            "description": "Plazos de compra disponibles y sus precios."
          },
          "unit_micros": {
            "description": "Precio por dispositivo activo excedente en millonésimas.",
            "type": "integer"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "OveragePreference": {
        "additionalProperties": false,
        "properties": {
          "block_api_overage": {
            "description": "Indica si se bloquean las llamadas API de ejecución que superen la cuota incluida.",
            "type": "boolean"
          },
          "block_device_overage": {
            "description": "Indica si se bloquean los dispositivos facturables nuevos que superen la cuota incluida.",
            "type": "boolean"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "description": "Revisión de configuración de preferencias sobre excesos.",
            "type": "string"
          }
        },
        "required": [
          "mode",
          "block_device_overage",
          "block_api_overage",
          "version",
          "updated_at"
        ],
        "type": "object"
      },
      "OverageSettings": {
        "additionalProperties": false,
        "properties": {
          "customer_api_settings_enabled": {
            "description": "Indica si los clientes pueden configurar el bloqueo de excesos de API.",
            "type": "boolean"
          },
          "customer_device_settings_enabled": {
            "description": "Indica si los clientes pueden configurar el bloqueo de excesos de dispositivos.",
            "type": "boolean"
          },
          "plan": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OveragePlan",
                "description": "Identificador estable del plan de facturación del catálogo publicado."
              },
              {
                "description": "Identificador estable del plan de facturación del catálogo publicado.",
                "type": "null"
              }
            ],
            "description": "Reglas actuales de cuota comprada/predeterminada usadas para determinar excesos o null si no están disponibles."
          },
          "preference": {
            "$ref": "#/components/schemas/OveragePreference",
            "description": "Preferencias del cliente guardadas sobre excesos."
          }
        },
        "required": [
          "preference",
          "plan",
          "customer_device_settings_enabled",
          "customer_api_settings_enabled"
        ],
        "type": "object"
      },
      "OverageSettingsInput": {
        "additionalProperties": false,
        "properties": {
          "block_api_overage": {
            "type": "boolean"
          },
          "block_device_overage": {
            "type": "boolean"
          },
          "expected_version": {
            "description": "Use preference.version de GET. Vacío para el primer guardado. Los cambios desde otra pestaña devuelven 409; se requiere al menos una opción de exceso.",
            "type": "string"
          }
        },
        "required": [
          "expected_version"
        ],
        "type": "object"
      },
      "PaddleCheck": {
        "additionalProperties": false,
        "properties": {
          "connected": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          }
        },
        "required": [
          "connected",
          "mode"
        ],
        "type": "object"
      },
      "PaddleOrder": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
            "type": "integer"
          },
          "applied_at": {
            "anyOf": [
              {
                "description": "Hora UTC en que se guardó la intención local de pago.",
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hora UTC en que el pago verificado activó el servicio o abonó una recarga del monedero. purchase_id y upgrade_id null identifican una recarga."
          },
          "created_at": {
            "description": "Hora UTC en que se guardó la intención local de pago.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "id": {
            "description": "Identificador local del pago de servicio.",
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "paid_at": {
            "anyOf": [
              {
                "description": "Hora UTC en que se guardó la intención local de pago.",
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hora UTC en que el backend verificó una transacción Paddle completada."
          },
          "purchase_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Compra o renovación de servicio pendiente existente; mutuamente excluyente con upgrade_id."
          },
          "refunded_cents": {
            "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
            "type": "integer"
          },
          "request_id": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "status": {
            "description": "Ciclo de vida del pago, incluido paid_unapplied cuando los fondos cobrados requieren revisión y reembolso del operador.",
            "enum": [
              "creating",
              "created",
              "completed",
              "paid_unapplied",
              "partially_refunded",
              "refunded"
            ],
            "type": "string"
          },
          "transaction_id": {
            "anyOf": [
              {
                "description": "Nombre visible del servicio de pago.",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Identificador de transacción Paddle Billing vinculada o null mientras esté pendiente el resultado de creación original."
          },
          "upgrade_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cotización pendiente existente de cambio a plan superior; mutuamente excluyente con purchase_id."
          }
        },
        "required": [
          "id",
          "request_id",
          "mode",
          "transaction_id",
          "purchase_id",
          "upgrade_id",
          "currency",
          "amount_cents",
          "refunded_cents",
          "status",
          "paid_at",
          "applied_at",
          "created_at"
        ],
        "type": "object"
      },
      "PaddleOrderInput": {
        "additionalProperties": false,
        "description": "Paga una compra/cambio a plan superior congelado o crea una recarga del monedero con amount y currency sin ID de servicio. Un request_id estable devuelve el pago original; cambiar su intención, importe o moneda se rechaza. Solo los pagos completados verificados de forma independiente abonan un monedero o activan servicio. Los retornos de recargas van al monedero. Un resultado incierto de creación se recupera desde su webhook original y nunca se recrea a ciegas.",
        "oneOf": [
          {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "amount"
                  ]
                },
                {
                  "required": [
                    "currency"
                  ]
                }
              ]
            },
            "properties": {
              "purchase_id": {
                "format": "uuid",
                "type": "string"
              },
              "upgrade_id": {
                "type": "null"
              }
            },
            "required": [
              "purchase_id"
            ]
          },
          {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "amount"
                  ]
                },
                {
                  "required": [
                    "currency"
                  ]
                }
              ]
            },
            "properties": {
              "purchase_id": {
                "type": "null"
              },
              "upgrade_id": {
                "format": "uuid",
                "type": "string"
              }
            },
            "required": [
              "upgrade_id"
            ]
          },
          {
            "properties": {
              "purchase_id": {
                "type": "null"
              },
              "upgrade_id": {
                "type": "null"
              }
            },
            "required": [
              "amount",
              "currency"
            ]
          }
        ],
        "properties": {
          "amount": {
            "description": "Obligatorio solo para una recarga del monedero. Importe decimal mostrado dentro de los límites configurados. Los pedidos de servicio rechazan importes del cliente.",
            "pattern": "^\\d+(?:\\.\\d{1,2})?$",
            "type": "string"
          },
          "currency": {
            "description": "Obligatorio solo para una recarga del monedero y debe estar habilitado para este proveedor.",
            "type": "string"
          },
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "purchase_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Compra o renovación de servicio pendiente existente; mutuamente excluyente con upgrade_id."
          },
          "request_id": {
            "description": "Clave de solicitud estable generada por el llamante. Las repeticiones devuelven el proceso de pago original.",
            "maxLength": 80,
            "type": "string"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          },
          "upgrade_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cotización pendiente existente de cambio a plan superior; mutuamente excluyente con purchase_id."
          }
        },
        "required": [
          "request_id"
        ],
        "type": "object"
      },
      "PaddleOrderList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros visibles para este administrador o espacio de trabajo.",
            "items": {
              "$ref": "#/components/schemas/PaddleOrder"
            },
            "type": "array"
          },
          "total": {
            "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "PaddleOrderResult": {
        "additionalProperties": false,
        "properties": {
          "approval_url": {
            "description": "Página local de pago que abre la transacción Paddle vinculada.",
            "format": "uri",
            "type": "string"
          },
          "client_token": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "order": {
            "$ref": "#/components/schemas/PaddleOrder",
            "description": "Registro de pago de servicio Paddle limitado al espacio de trabajo."
          },
          "return_url": {
            "description": "URL del panel del monedero para una recarga; URL de conciliación de precios para un pago de servicio. Un URL de retorno por sí solo nunca demuestra un pago.",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "order",
          "client_token",
          "approval_url",
          "return_url"
        ],
        "type": "object"
      },
      "PaddleReconcileInput": {
        "additionalProperties": false,
        "properties": {
          "transaction_id": {
            "description": "ID txn_ original opcional, usado para recuperar una respuesta de creación perdida. El backend verifica independientemente su pedido local, tenant, producto, moneda e importe. No puede sustituir una transacción ya vinculada.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "PaddleSettings": {
        "additionalProperties": false,
        "properties": {
          "api_key_configured": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "checkout_url": {
            "description": "Use esta página de un dominio aprobado como enlace de pago predeterminado de Paddle.",
            "format": "uri",
            "type": "string"
          },
          "client_token": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "currencies": {
            "description": "Monedas distintas aceptadas por este canal; los importes usan dos posiciones decimales.",
            "items": {
              "description": "Nombre visible del servicio de pago.",
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "maximum_cents": {
            "description": "Recarga máxima del monedero en unidades monetarias menores; 100000 por defecto y no debe ser inferior a minimum_cents.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "minimum_cents": {
            "description": "Recarga mínima del monedero en unidades monetarias menores; 100 por defecto.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "product_id": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "version": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "webhook_secret_configured": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "webhook_url": {
            "description": "Registre este URL absoluto como destino de notificaciones de Paddle.",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "mode",
          "client_token",
          "product_id",
          "currencies",
          "api_key_configured",
          "webhook_secret_configured",
          "version",
          "webhook_url",
          "checkout_url"
        ],
        "type": "object"
      },
      "PaddleSettingsInput": {
        "additionalProperties": false,
        "properties": {
          "api_key": {
            "description": "Cifrada en reposo. Vacío conserva el valor existente salvo que clear_api_key sea true.",
            "maxLength": 1000,
            "type": "string",
            "writeOnly": true
          },
          "clear_api_key": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "clear_webhook_secret": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "client_token": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "currencies": {
            "description": "Monedas distintas aceptadas por este canal; los importes usan dos posiciones decimales.",
            "items": {
              "description": "Nombre visible del servicio de pago.",
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "expected_version": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "maximum_cents": {
            "description": "Recarga máxima del monedero en unidades monetarias menores; 100000 por defecto y no debe ser inferior a minimum_cents.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "minimum_cents": {
            "description": "Recarga mínima del monedero en unidades monetarias menores; 100 por defecto.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "product_id": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "webhook_secret": {
            "description": "Secreto privado del endpoint usado para autenticar el cuerpo bruto exacto del webhook.",
            "maxLength": 1000,
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "enabled",
          "mode",
          "client_token",
          "product_id",
          "currencies",
          "expected_version"
        ],
        "type": "object"
      },
      "PaddleWebhookEvent": {
        "description": "Evento Paddle Billing sin modificar, autenticado con Paddle-Signature y conciliado independientemente mediante la API de Paddle.",
        "type": "object"
      },
      "PasswordSet": {
        "additionalProperties": false,
        "properties": {
          "password_set": {
            "type": "boolean"
          }
        },
        "required": [
          "password_set"
        ],
        "type": "object"
      },
      "PayPalCheck": {
        "additionalProperties": false,
        "properties": {
          "connected": {
            "type": "boolean"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "PayPalInput": {
        "additionalProperties": false,
        "properties": {
          "clear_secret": {
            "type": "boolean"
          },
          "client_id": {
            "maxLength": 1000,
            "type": "string"
          },
          "client_secret": {
            "description": "Un valor vacío conserva el Secret guardado salvo que clear_secret=true",
            "maxLength": 1000,
            "type": "string",
            "writeOnly": true
          },
          "currencies": {
            "items": {
              "pattern": "^[A-Z]{3}$",
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "type": "boolean"
          },
          "expected_version": {
            "type": "string"
          },
          "maximum_cents": {
            "maximum": 100000000,
            "type": "integer"
          },
          "merchant_id": {
            "maxLength": 64,
            "type": "string"
          },
          "minimum_cents": {
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "webhook_id": {
            "maxLength": 1000,
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "mode",
          "client_id",
          "merchant_id",
          "webhook_id",
          "currencies",
          "minimum_cents",
          "maximum_cents",
          "expected_version"
        ],
        "type": "object"
      },
      "PayPalOrder": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "description": "Importe en centésimas; los asientos contables pueden ser abonos positivos o cargos negativos.",
            "type": "integer"
          },
          "approval_url": {
            "description": "URL de aprobación del pagador de PayPal; no es prueba de pago.",
            "format": "uri",
            "type": "string"
          },
          "capture_id": {
            "description": "Identificador de captura de PayPal.",
            "type": [
              "string",
              "null"
            ]
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "credited_at": {
            "anyOf": [
              {
                "description": "Hora en que se abonó la recarga o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Hora en que se abonó la recarga o null.",
                "type": "null"
              }
            ],
            "description": "Hora en que se abonó la recarga o null."
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "paypal_order_id": {
            "description": "Identificador del pedido PayPal, distinto del UUID del registro local.",
            "type": [
              "string",
              "null"
            ]
          },
          "purchase_id": {
            "description": "UUID de la compra de paquete relacionada.",
            "type": [
              "string",
              "null"
            ]
          },
          "refunded_cents": {
            "description": "Importe acumulado reembolsado en centésimas.",
            "type": "integer"
          },
          "request_id": {
            "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "creating",
              "created",
              "credited",
              "refunded"
            ],
            "type": "string"
          },
          "upgrade_id": {
            "anyOf": [
              {
                "description": "UUID del cambio a plan superior relacionado o vacío.",
                "format": "uuid",
                "type": "string"
              },
              {
                "description": "UUID del cambio a plan superior relacionado o vacío.",
                "type": "null"
              }
            ],
            "description": "UUID del cambio a plan superior relacionado o vacío."
          }
        },
        "required": [],
        "type": "object"
      },
      "PayPalOrderList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/PayPalOrder"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "PayPalRefund": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "description": "Reembolso en dinero solicitado por el método original, en céntimos.",
            "type": "integer"
          },
          "attempts": {
            "type": "integer"
          },
          "case_id": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "order_id": {
            "format": "uuid",
            "type": "string"
          },
          "paypal_refund_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "reason": {
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "reserved": {
            "description": "true mientras se retiene el importe del monedero. Un timeout de transporte mantiene la retención hasta conciliar la misma solicitud.",
            "type": "boolean"
          },
          "status": {
            "enum": [
              "pending",
              "completed",
              "failed"
            ],
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "order_id",
          "request_id",
          "mode",
          "currency",
          "amount_cents",
          "reason",
          "status",
          "reserved",
          "attempts",
          "paypal_refund_id",
          "created_at",
          "updated_at"
        ],
        "type": "object"
      },
      "PayPalSettings": {
        "additionalProperties": false,
        "properties": {
          "client_id": {
            "maxLength": 1000,
            "type": "string"
          },
          "currencies": {
            "items": {
              "pattern": "^[A-Z]{3}$",
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "type": "boolean"
          },
          "maximum_cents": {
            "maximum": 100000000,
            "type": "integer"
          },
          "merchant_id": {
            "maxLength": 64,
            "type": "string"
          },
          "minimum_cents": {
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "secret_configured": {
            "type": "boolean"
          },
          "version": {
            "type": "string"
          },
          "webhook_id": {
            "maxLength": 1000,
            "type": "string"
          },
          "webhook_url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "PaymentChannel": {
        "additionalProperties": false,
        "properties": {
          "currencies": {
            "description": "Monedas distintas aceptadas por este canal; los importes usan dos posiciones decimales.",
            "items": {
              "description": "Nombre visible del servicio de pago.",
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "name": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "provider": {
            "description": "Proveedor de pago: PayPal, Paddle o Waffo Pancake.",
            "enum": [
              "paypal",
              "paddle",
              "waffo"
            ],
            "type": "string"
          },
          "version": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "wallet_topup": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          }
        },
        "required": [
          "provider",
          "name",
          "enabled",
          "mode",
          "currencies",
          "wallet_topup"
        ],
        "type": "object"
      },
      "PaymentChannelInput": {
        "additionalProperties": false,
        "properties": {
          "paddle_enabled": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "paddle_version": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "paypal_enabled": {
            "description": "Indica si este canal acepta nuevos procesos de pago. La conciliación histórica sigue disponible con las credenciales conservadas.",
            "type": "boolean"
          },
          "paypal_version": {
            "description": "Nombre visible del servicio de pago.",
            "type": "string"
          },
          "waffo_enabled": {
            "description": "Interruptor opcional de Waffo; los campos omitidos conservan su estado actual.",
            "type": "boolean"
          },
          "waffo_version": {
            "description": "Versión de configuración obligatoria al cambiar el interruptor de Waffo.",
            "type": "string"
          }
        },
        "required": [
          "paypal_enabled",
          "paddle_enabled",
          "paypal_version",
          "paddle_version"
        ],
        "type": "object"
      },
      "PaymentChannels": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros visibles para este administrador o espacio de trabajo.",
            "items": {
              "$ref": "#/components/schemas/PaymentChannel"
            },
            "type": "array"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          }
        },
        "required": [
          "items",
          "mode"
        ],
        "type": "object"
      },
      "PendingPlan": {
        "additionalProperties": false,
        "properties": {
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "type": "string"
          },
          "effective_month": {
            "description": "Mes UTC YYYY-MM en que entra en vigor la programación.",
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "Period": {
        "additionalProperties": false,
        "properties": {
          "base_covered": {
            "description": "Indica si un paquete comprado ya cubre el cargo base.",
            "type": "boolean"
          },
          "base_micros": {
            "description": "Cargo base en millonésimas de la unidad monetaria.",
            "type": "integer"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "hard_limit": {
            "description": "Indica si se rechazan nuevos dispositivos facturables al alcanzar el límite de cuota.",
            "type": "boolean"
          },
          "included_devices": {
            "description": "Cuota de dispositivos activos incluida.",
            "type": "integer"
          },
          "month": {
            "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
            "type": "string"
          },
          "payment_mode": {
            "description": "Entorno de pago, sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "plan_name": {
            "description": "Nombre visible del plan.",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          },
          "unit_micros": {
            "description": "Precio por dispositivo activo excedente en millonésimas.",
            "type": "integer"
          }
        },
        "required": [
          "month",
          "plan",
          "currency",
          "price_version"
        ],
        "type": "object"
      },
      "PlanChange": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          }
        },
        "required": [
          "plan",
          "currency"
        ],
        "type": "object"
      },
      "PlanGift": {
        "additionalProperties": false,
        "properties": {
          "batch_id": {
            "format": "uuid",
            "type": "string"
          },
          "cancel_reason": {
            "type": "string"
          },
          "cancelled_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "cancelled_by": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "ends_at": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "purchase_id": {
            "format": "uuid",
            "type": "string"
          },
          "starts_at": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "enum": [
              "granted",
              "cancelled"
            ],
            "type": "string"
          },
          "tenant_id": {
            "format": "uuid",
            "type": "string"
          },
          "user_id": {
            "format": "uuid",
            "type": "string"
          },
          "value_cents": {
            "type": "integer"
          }
        },
        "required": [
          "id",
          "batch_id",
          "tenant_id",
          "user_id",
          "purchase_id",
          "value_cents",
          "status",
          "starts_at",
          "ends_at",
          "created_at",
          "cancelled_at"
        ],
        "type": "object"
      },
      "PlanGiftBatch": {
        "additionalProperties": false,
        "properties": {
          "actor_id": {
            "format": "uuid",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan": {
            "type": "string"
          },
          "plan_name": {
            "type": "string"
          },
          "price_version": {
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "start_mode": {
            "type": "string"
          },
          "tenant_count": {
            "type": "integer"
          },
          "term_months": {
            "default": 1,
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "user_count": {
            "type": "integer"
          }
        },
        "required": [
          "id",
          "actor_id",
          "request_id",
          "plan",
          "plan_name",
          "currency",
          "price_version",
          "term_months",
          "mode",
          "start_mode",
          "reason",
          "user_count",
          "tenant_count",
          "created_at"
        ],
        "type": "object"
      },
      "PlanGiftCancellation": {
        "additionalProperties": false,
        "properties": {
          "cancelled": {
            "type": "boolean"
          }
        },
        "required": [
          "cancelled"
        ],
        "type": "object"
      },
      "PlanGiftInput": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "maxLength": 3,
            "minLength": 3,
            "type": "string"
          },
          "fingerprint": {
            "maxLength": 64,
            "minLength": 64,
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan": {
            "type": "string"
          },
          "price_version": {
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "request_id": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "start_mode": {
            "default": "after_current",
            "enum": [
              "after_current",
              "immediate"
            ],
            "type": "string"
          },
          "term_months": {
            "default": 1,
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "user_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "user_ids",
          "term_months",
          "mode",
          "start_mode",
          "reason",
          "request_id",
          "fingerprint"
        ],
        "type": "object"
      },
      "PlanGiftList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PlanGiftRow"
            },
            "type": "array"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "PlanGiftPreview": {
        "additionalProperties": false,
        "properties": {
          "fingerprint": {
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/PlanGiftTarget"
            },
            "type": "array"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan_name": {
            "type": "string"
          },
          "start_mode": {
            "default": "after_current",
            "enum": [
              "after_current",
              "immediate"
            ],
            "type": "string"
          },
          "tenant_count": {
            "type": "integer"
          },
          "term_months": {
            "default": 1,
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "user_count": {
            "type": "integer"
          },
          "value_cents": {
            "type": "integer"
          }
        },
        "required": [
          "fingerprint",
          "plan_name",
          "value_cents",
          "user_count",
          "tenant_count",
          "mode",
          "term_months",
          "start_mode",
          "items"
        ],
        "type": "object"
      },
      "PlanGiftPreviewInput": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "maxLength": 3,
            "minLength": 3,
            "type": "string"
          },
          "fingerprint": {
            "maxLength": 64,
            "minLength": 64,
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan": {
            "type": "string"
          },
          "price_version": {
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "request_id": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "start_mode": {
            "default": "after_current",
            "enum": [
              "after_current",
              "immediate"
            ],
            "type": "string"
          },
          "term_months": {
            "default": 1,
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "user_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "user_ids",
          "mode",
          "reason"
        ],
        "type": "object"
      },
      "PlanGiftResult": {
        "additionalProperties": false,
        "properties": {
          "batch": {
            "$ref": "#/components/schemas/PlanGiftBatch"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/PlanGift"
            },
            "type": "array"
          }
        },
        "required": [
          "batch",
          "items"
        ],
        "type": "object"
      },
      "PlanGiftRow": {
        "additionalProperties": false,
        "properties": {
          "actor_email": {
            "type": "string"
          },
          "batch_id": {
            "format": "uuid",
            "type": "string"
          },
          "cancel_reason": {
            "type": "string"
          },
          "cancelled_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "cancelled_by": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "ends_at": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "plan": {
            "type": "string"
          },
          "plan_name": {
            "type": "string"
          },
          "purchase_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "starts_at": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "enum": [
              "granted",
              "cancelled"
            ],
            "type": "string"
          },
          "tenant_id": {
            "format": "uuid",
            "type": "string"
          },
          "tenant_name": {
            "type": "string"
          },
          "term_months": {
            "default": 1,
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "user_id": {
            "format": "uuid",
            "type": "string"
          },
          "value_cents": {
            "type": "integer"
          }
        },
        "required": [
          "id",
          "batch_id",
          "tenant_id",
          "user_id",
          "purchase_id",
          "value_cents",
          "status",
          "starts_at",
          "ends_at",
          "created_at",
          "cancelled_at"
        ],
        "type": "object"
      },
      "PlanGiftTarget": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "ends_at": {
            "format": "date-time",
            "type": "string"
          },
          "plan": {
            "type": "string"
          },
          "plan_name": {
            "type": "string"
          },
          "previous_end": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "price_version": {
            "type": "string"
          },
          "starts_at": {
            "format": "date-time",
            "type": "string"
          },
          "tenant_id": {
            "format": "uuid",
            "type": "string"
          },
          "tenant_name": {
            "type": "string"
          },
          "user_id": {
            "format": "uuid",
            "type": "string"
          },
          "value_cents": {
            "type": "integer"
          }
        },
        "required": [
          "user_id",
          "email",
          "tenant_id",
          "tenant_name",
          "starts_at",
          "ends_at",
          "previous_end",
          "plan",
          "plan_name",
          "currency",
          "price_version",
          "value_cents"
        ],
        "type": "object"
      },
      "PlanInput": {
        "additionalProperties": false,
        "properties": {
          "api_hard_limit": {
            "type": "boolean"
          },
          "api_unit_amount": {
            "description": "Decimal no negativo por llamada API correcta, máximo seis posiciones decimales",
            "type": "string"
          },
          "base_amount": {
            "description": "Decimal no negativo; máximo dos posiciones decimales",
            "type": "string"
          },
          "currency": {
            "description": "Debe configurarse; las ofertas del catálogo EUR están deshabilitadas",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "description": {
            "maxLength": 1000,
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "expected_version": {
            "description": "Versión actual; vacía al crear",
            "type": "string"
          },
          "hard_limit": {
            "type": "boolean"
          },
          "included_api_calls": {
            "description": "null = ilimitado; 0 = ninguna llamada correcta incluida",
            "maximum": 1000000000000,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "included_devices": {
            "maximum": 1000000000,
            "minimum": 0,
            "type": "integer"
          },
          "name": {
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "plan": {
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "type": "string"
          },
          "public": {
            "type": "boolean"
          },
          "renewal_only": {
            "description": "Los clientes existentes con paquetes pagados o regalados pueden renovar antes o después del vencimiento en el mismo entorno y moneda. No se muestra para nuevas compras públicas.",
            "type": "boolean"
          },
          "sort_order": {
            "maximum": 10000,
            "minimum": 0,
            "type": "integer"
          },
          "terms": {
            "description": "Exactamente una entrada para 1, 3, 6 y 12 meses, cada una con disponibilidad y precio total propios.",
            "items": {
              "$ref": "#/components/schemas/PlanTermInput"
            },
            "maxItems": 4,
            "minItems": 4,
            "type": "array"
          },
          "unit_amount": {
            "description": "Decimal no negativo; máximo seis posiciones decimales",
            "type": "string"
          }
        },
        "required": [
          "plan",
          "currency",
          "name",
          "base_amount",
          "unit_amount"
        ],
        "type": "object"
      },
      "PlanList": {
        "additionalProperties": false,
        "properties": {
          "billing_unit": {
            "type": "string"
          },
          "currencies": {
            "items": {
              "pattern": "^[A-Z]{3}$",
              "type": "string"
            },
            "type": "array"
          },
          "default_plan": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Price"
              },
              {
                "type": "null"
              }
            ]
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/Price"
            },
            "type": "array"
          },
          "maximum_cents": {
            "type": "integer"
          },
          "minimum_cents": {
            "type": "integer"
          },
          "payment_channels": {
            "description": "Configuración de canales de pago disponibles. Muestre solo los canales habilitados que coincidan con el entorno activo de facturación y la moneda de compra.",
            "items": {
              "$ref": "#/components/schemas/PaymentChannel"
            },
            "type": "array"
          },
          "paypal_enabled": {
            "type": "boolean"
          },
          "sandbox": {
            "type": "boolean"
          },
          "timezone": {
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "PlanPurchase": {
        "additionalProperties": false,
        "properties": {
          "api_calls": {
            "description": "Para PurchaseList.active: llamadas correctas del mes de cuota actual. Los elementos históricos contienen totales de toda la vigencia.",
            "type": "integer"
          },
          "api_hard_limit": {
            "description": "Indica si las llamadas de ejecución se detienen al alcanzar el límite de cuota API.",
            "type": "boolean"
          },
          "api_overage_cents": {
            "description": "Mes de cuota actual en la vista activa; cargos por exceso de API de toda la vigencia en los elementos históricos.",
            "type": "integer"
          },
          "api_unit_micros": {
            "description": "Precio por llamada de ejecución excedente en millonésimas.",
            "minimum": 0,
            "type": "integer"
          },
          "base_cents": {
            "description": "Cargo inicial real de todo el contrato; cero para un regalo. La vista activa del cambio efectivo contiene el precio completo de destino para la duración coincidente.",
            "type": "integer"
          },
          "cancelled_at": {
            "anyOf": [
              {
                "description": "Marca temporal de cancelación del contrato o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de cancelación del contrato o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de cancelación del contrato o null."
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "current_cycle_index": {
            "description": "Índice del ciclo de cuota actual.",
            "maximum": 11,
            "minimum": 0,
            "type": "integer"
          },
          "current_upgrade_id": {
            "description": "Vacío antes de un cambio a plan superior. En otro caso apunta al último PlanUpgrade aplicado. La respuesta activa incluye su instantánea de plan efectivo, mientras que las compras históricas conservan el precio de venta original.",
            "type": "string"
          },
          "cycle_ends_at": {
            "description": "Fin del ciclo de cuota actual, UTC.",
            "format": "date-time",
            "type": "string"
          },
          "cycle_starts_at": {
            "description": "Inicio del ciclo de cuota actual, UTC.",
            "format": "date-time",
            "type": "string"
          },
          "effective_included_devices": {
            "description": "Cuota de dispositivos tras el cambio a plan superior aplicado. Las instantáneas de compra originales no cambian.",
            "minimum": 0,
            "type": "integer"
          },
          "effective_plan": {
            "description": "Derecho actual tras una superposición explícita de cambio a plan superior. La lista de compras conserva plan/base_cents originales para el historial de pagos; use este campo para mostrar el nivel efectivo actual.",
            "type": "string"
          },
          "effective_plan_name": {
            "description": "Derecho actual tras una superposición explícita de cambio a plan superior. La lista de compras conserva plan/base_cents originales para el historial de pagos; use este campo para mostrar el nivel efectivo actual.",
            "type": "string"
          },
          "ends_at": {
            "anyOf": [
              {
                "description": "Marca temporal de fin del paquete o ciclo, UTC; puede ser null antes de activar.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de fin del paquete o ciclo, UTC; puede ser null antes de activar.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de fin del paquete o ciclo, UTC; puede ser null antes de activar."
          },
          "entitlement_cents": {
            "description": "Valor de beneficio del paquete efectivo actual para el crédito de cambio a plan superior, en céntimos de la moneda. Un plan regalado de 99 USD tiene 9900 céntimos de beneficio aunque su pago original base_cents sea cero. Este valor no es dinero reembolsable. Se rellena en las vistas de paquetes activos.",
            "minimum": 0,
            "type": "integer"
          },
          "gift_batch_id": {
            "description": "Identificador del lote de regalos; vacío para compras normales.",
            "type": "string"
          },
          "gift_follows_current": {
            "default": false,
            "description": "Indica un regalo emitido desde el nivel actual del cliente. El regalo conserva su valor de derecho original y un pago en dinero cero. Los cambios explícitos de toda la cobertura aplican superposiciones de derechos independientes a cada regalo no vencido y conservan el registro original del regalo sin pago en dinero.",
            "type": "boolean"
          },
          "hard_limit": {
            "description": "Indica si se rechazan nuevos dispositivos facturables al alcanzar el límite de cuota.",
            "type": "boolean"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "included_api_calls": {
            "description": "null = ilimitado; 0 = ninguna llamada correcta incluida",
            "maximum": 1000000000000,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "included_devices": {
            "description": "Cuota de dispositivos activos incluida.",
            "type": "integer"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "overage_cents": {
            "description": "Mes de cuota actual en la vista activa; cargos por exceso de dispositivos de toda la vigencia en los elementos históricos.",
            "type": "integer"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "type": "string"
          },
          "plan_name": {
            "description": "Nombre visible del plan.",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          },
          "refunded_cents": {
            "description": "Importe acumulado reembolsado en centésimas.",
            "type": "integer"
          },
          "renewal": {
            "description": "Indica si es un contrato de renovación.",
            "type": "boolean"
          },
          "renewal_of": {
            "description": "ID del paquete anterior pagado o regalado. Conserva la cadena de renovaciones y el historial de compra original.",
            "type": "string"
          },
          "request_id": {
            "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
            "type": "string"
          },
          "service_credit_basis_cents": {
            "description": "Importe base en centésimas para calcular créditos de servicio.",
            "type": "integer"
          },
          "service_credit_basis_seconds": {
            "description": "Base temporal en segundos para calcular créditos de servicio.",
            "type": "integer"
          },
          "source": {
            "description": "Origen del derecho, como purchase o gift.",
            "enum": [
              "purchase",
              "gift",
              "auto_renewal"
            ],
            "type": "string"
          },
          "starts_at": {
            "anyOf": [
              {
                "description": "Marca temporal de inicio del paquete o ciclo, UTC.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de inicio del paquete o ciclo, UTC.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de inicio del paquete o ciclo, UTC."
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "pending",
              "active",
              "cancelled",
              "expired"
            ],
            "type": "string"
          },
          "term_months": {
            "default": 1,
            "description": "Número de meses del plazo comprado.",
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          },
          "total_api_calls": {
            "description": "Llamadas de ejecución acumuladas durante todo el contrato.",
            "type": "integer"
          },
          "total_api_overage_cents": {
            "description": "Excesos acumulados de API del contrato en centésimas.",
            "type": "integer"
          },
          "total_device_overage_cents": {
            "description": "Excesos acumulados de dispositivos del contrato en centésimas.",
            "type": "integer"
          },
          "unit_micros": {
            "description": "Precio por dispositivo activo excedente en millonésimas.",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "PlanTermInput": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "Total no negativo de la duración; máximo dos posiciones decimales. El importe de un mes debe ser igual a base_amount.",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "months": {
            "default": 1,
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          }
        },
        "required": [
          "months",
          "enabled",
          "amount"
        ],
        "type": "object"
      },
      "PlanTermPrice": {
        "additionalProperties": false,
        "properties": {
          "base_cents": {
            "description": "Cargo total de la duración seleccionada en céntimos de la moneda. Las cuotas mensuales no se multiplican por esta duración.",
            "minimum": 0,
            "type": "integer"
          },
          "enabled": {
            "description": "Indica si el endpoint del webhook está habilitado.",
            "type": "boolean"
          },
          "months": {
            "default": 1,
            "description": "Número de meses del plazo de compra.",
            "enum": [
              1,
              3,
              6,
              12
            ],
            "type": "integer"
          }
        },
        "required": [
          "months",
          "enabled",
          "base_cents"
        ],
        "type": "object"
      },
      "PlanUpgrade": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "description": "Pago combinado de todos los elementos de parts. Se cobra atómicamente una sola vez. Los otros campos de prorrateo del elemento principal describen solo el periodo actual; consulte parts para conocer el valor original, el valor de destino, los segundos restantes y la diferencia individual de cada periodo.",
            "type": "integer"
          },
          "api_hard_limit": {
            "description": "Indica si las llamadas de ejecución se detienen al alcanzar el límite de cuota API.",
            "type": "boolean"
          },
          "api_unit_micros": {
            "description": "Nueva tarifa de exceso API en millonésimas de la moneda.",
            "type": "integer"
          },
          "applied_at": {
            "anyOf": [
              {
                "description": "Hora en que el cambio a plan superior entró en vigor o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Hora en que el cambio a plan superior entró en vigor o null.",
                "type": "null"
              }
            ],
            "description": "Hora en que el cambio a plan superior entró en vigor o null."
          },
          "base_cents": {
            "description": "Precio mensual de destino en céntimos, no el importe que debe pagarse ahora.",
            "type": "integer"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "La misma moneda que el paquete actual.",
            "type": "string"
          },
          "cycle_seconds": {
            "description": "Duración del ciclo comprado original en segundos.",
            "type": "integer"
          },
          "ends_at": {
            "description": "Marca temporal de fin del paquete o ciclo, UTC; puede ser null antes de activar.",
            "format": "date-time",
            "type": "string"
          },
          "expires_at": {
            "description": "15 minutos después de crear o al vencer el plan original, lo que ocurra primero.",
            "format": "date-time",
            "type": "string"
          },
          "hard_limit": {
            "description": "Indica si se rechazan nuevos dispositivos facturables al alcanzar el límite de cuota.",
            "type": "boolean"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "included_api_calls": {
            "anyOf": [
              {
                "description": "Cuota API total del ciclo existente. null significa ilimitada. Las llamadas anteriores siguen contando.",
                "type": "integer"
              },
              {
                "description": "Llamadas de ejecución correctas incluidas; null significa ilimitadas y 0 significa ninguna incluida.",
                "type": "null"
              }
            ],
            "description": "Llamadas de ejecución correctas incluidas; null significa ilimitadas y 0 significa ninguna incluida."
          },
          "included_devices": {
            "description": "Cuota total del ciclo existente; el uso anterior de dispositivos sigue contando.",
            "type": "integer"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "parent_id": {
            "description": "Las superposiciones internas de derechos aplicados apuntan al único cargo principal. Estos registros secundarios se excluyen del historial de cambios a planes superiores del cliente y de los recuentos de ventas.",
            "format": "uuid",
            "type": "string"
          },
          "parts": {
            "description": "Todos los periodos actuales y futuros pagados/regalados no vencidos, por orden de fecha. Cambio obligatorio de toda la cobertura; no se puede seleccionar un subconjunto de periodos.",
            "items": {
              "$ref": "#/components/schemas/UpgradePart"
            },
            "type": "array"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "plan_name": {
            "description": "Nombre visible del plan.",
            "type": "string"
          },
          "previous_base_cents": {
            "description": "Precio mensual efectivo actual en céntimos.",
            "type": "integer"
          },
          "previous_plan_name": {
            "description": "Nombre visible del plan antes del cambio a plan superior.",
            "type": "string"
          },
          "previous_upgrade_id": {
            "description": "ID del cambio a plan superior anterior o vacío para el primero. Se usa para rechazar cotizaciones obsoletas.",
            "type": "string"
          },
          "price_version": {
            "description": "Versión congelada del precio de destino.",
            "type": "string"
          },
          "purchase_id": {
            "description": "UUID de la compra de paquete relacionada.",
            "format": "uuid",
            "type": "string"
          },
          "remaining_seconds": {
            "description": "Segundos restantes al crear la cotización, redondeados hacia arriba.",
            "type": "integer"
          },
          "request_id": {
            "description": "Clave estable generada por el cliente. Reutilizarla con parámetros de cotización distintos devuelve 409.",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "pending",
              "applied",
              "expired"
            ],
            "type": "string"
          },
          "unit_micros": {
            "description": "Nueva tarifa de exceso por dispositivo en millonésimas de la moneda.",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "request_id",
          "mode",
          "purchase_id",
          "previous_upgrade_id",
          "plan",
          "plan_name",
          "previous_plan_name",
          "currency",
          "price_version",
          "previous_base_cents",
          "base_cents",
          "amount_cents",
          "included_devices",
          "unit_micros",
          "hard_limit",
          "included_api_calls",
          "api_unit_micros",
          "api_hard_limit",
          "remaining_seconds",
          "cycle_seconds",
          "ends_at",
          "expires_at",
          "status",
          "created_at",
          "applied_at"
        ],
        "type": "object"
      },
      "PlatformOperation": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "type": "string"
          },
          "actor_email": {
            "type": "string"
          },
          "actor_id": {
            "format": "uuid",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "details": {
            "description": "Cadena JSON que contiene solo cambios administrativos explícitos; nunca contraseñas, tokens ni credenciales de pago.",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "resource_id": {
            "type": "string"
          },
          "tenant_id": {
            "type": "string"
          },
          "user_email": {
            "type": "string"
          },
          "user_id": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "actor_id",
          "action",
          "user_id",
          "tenant_id",
          "resource_id",
          "reason",
          "details",
          "request_id",
          "created_at",
          "actor_email",
          "user_email"
        ],
        "type": "object"
      },
      "PlatformOperationList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PlatformOperation"
            },
            "type": "array"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "PlatformOverview": {
        "additionalProperties": false,
        "properties": {
          "at": {
            "format": "date-time",
            "type": "string"
          },
          "counts": {
            "additionalProperties": false,
            "properties": {
              "active_packages": {
                "type": "integer"
              },
              "active_workspaces": {
                "type": "integer"
              },
              "disabled_users": {
                "type": "integer"
              },
              "enabled_plans": {
                "type": "integer"
              },
              "expiring_packages": {
                "type": "integer"
              },
              "failed_mail": {
                "type": "integer"
              },
              "gift_packages": {
                "type": "integer"
              },
              "new_users": {
                "type": "integer"
              },
              "suspended_workspaces": {
                "type": "integer"
              },
              "users": {
                "type": "integer"
              },
              "verified_users": {
                "type": "integer"
              }
            },
            "required": [
              "users",
              "verified_users",
              "disabled_users",
              "new_users",
              "active_workspaces",
              "suspended_workspaces",
              "active_packages",
              "expiring_packages",
              "gift_packages",
              "failed_mail",
              "enabled_plans"
            ],
            "type": "object"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "paypal_enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "counts",
          "mode",
          "paypal_enabled",
          "at"
        ],
        "type": "object"
      },
      "PlatformReason": {
        "additionalProperties": false,
        "properties": {
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "PlatformRevocation": {
        "additionalProperties": false,
        "properties": {
          "revoked": {
            "type": "boolean"
          }
        },
        "required": [
          "revoked"
        ],
        "type": "object"
      },
      "PlatformUser": {
        "additionalProperties": false,
        "properties": {
          "admin_note": {
            "description": "Nota privada de la plataforma. Los campos del perfil del cliente no cambian.",
            "maxLength": 2000,
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "email": {
            "format": "email",
            "type": "string"
          },
          "email_verified_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "is_platform_admin": {
            "type": "boolean"
          },
          "last_login_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "type": "string"
          },
          "note_version": {
            "type": "string"
          },
          "role": {
            "enum": [
              "owner",
              "read_only"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "active",
              "disabled"
            ],
            "type": "string"
          },
          "tenant_id": {
            "format": "uuid",
            "type": "string"
          },
          "tenant_name": {
            "type": "string"
          },
          "tenant_status": {
            "enum": [
              "active",
              "suspended"
            ],
            "type": "string"
          },
          "tenant_updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "tenant_id",
          "tenant_name",
          "tenant_status",
          "tenant_updated_at",
          "email",
          "name",
          "role",
          "status",
          "is_platform_admin",
          "email_verified_at",
          "created_at",
          "updated_at",
          "last_login_at",
          "admin_note",
          "note_version"
        ],
        "type": "object"
      },
      "PlatformUserDetail": {
        "additionalProperties": false,
        "properties": {
          "counts": {
            "additionalProperties": false,
            "properties": {
              "licenses": {
                "type": "integer"
              },
              "products": {
                "type": "integer"
              },
              "users": {
                "type": "integer"
              }
            },
            "required": [
              "users",
              "products",
              "licenses"
            ],
            "type": "object"
          },
          "payments": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currency": {
                  "type": "string"
                },
                "mode": {
                  "enum": [
                    "sandbox",
                    "live"
                  ],
                  "type": "string"
                },
                "paid_cents": {
                  "type": "integer"
                },
                "refunded_cents": {
                  "type": "integer"
                }
              },
              "required": [
                "mode",
                "currency",
                "paid_cents",
                "refunded_cents"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "purchases": {
            "items": {
              "$ref": "#/components/schemas/PlanPurchase"
            },
            "type": "array"
          },
          "user": {
            "$ref": "#/components/schemas/PlatformUser"
          },
          "wallets": {
            "items": {
              "$ref": "#/components/schemas/Wallet"
            },
            "type": "array"
          }
        },
        "required": [
          "user",
          "counts",
          "wallets",
          "purchases",
          "payments"
        ],
        "type": "object"
      },
      "PlatformUserList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PlatformUser"
            },
            "type": "array"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "PlatformUserUpdate": {
        "additionalProperties": false,
        "anyOf": [
          {
            "required": [
              "status",
              "expected_updated_at"
            ]
          },
          {
            "required": [
              "admin_note",
              "expected_note_version"
            ]
          }
        ],
        "properties": {
          "admin_note": {
            "maxLength": 2000,
            "type": "string"
          },
          "expected_note_version": {
            "type": "string"
          },
          "expected_updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "enum": [
              "active",
              "disabled"
            ],
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "PlatformWorkspaceStatus": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "enum": [
              "active",
              "suspended"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "status"
        ],
        "type": "object"
      },
      "PlatformWorkspaceUpdate": {
        "additionalProperties": false,
        "properties": {
          "expected_updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "reason": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "enum": [
              "active",
              "suspended"
            ],
            "type": "string"
          }
        },
        "required": [
          "status",
          "reason",
          "expected_updated_at"
        ],
        "type": "object"
      },
      "Policy": {
        "additionalProperties": false,
        "example": {
          "created_at": "2026-10-18T00:00:00Z",
          "features": [
            "export"
          ],
          "heartbeat_seconds": 600,
          "id": "22222222-2222-4222-8222-222222222222",
          "max_devices": 1,
          "mode": "timed",
          "name": "One device",
          "offline_mode": "limited",
          "offline_seconds": 86400,
          "product_id": "11111111-1111-4111-8111-111111111111",
          "updated_at": "2026-10-18T00:00:00Z",
          "version": 1
        },
        "properties": {
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "features": {
            "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0,
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión."
              },
              {
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión.",
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "Intervalo de heartbeat en línea, en segundos. 0 deshabilita los heartbeats periódicos. La duración sin conexión se configura por separado.",
            "type": "integer"
          },
          "id": {
            "description": "UUID de la política, usado como policy_id al emitir una licencia.",
            "format": "uuid",
            "type": "string"
          },
          "max_devices": {
            "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
            "type": "integer"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "perpetual",
              "timed",
              "trial"
            ],
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "offline_mode": {
            "description": "limited: uso sin conexión de duración limitada; none: sin uso sin conexión; permanent: sin límite temporal adicional sin conexión, pero se sigue aplicando el vencimiento de la licencia.",
            "enum": [
              "limited",
              "none",
              "permanent"
            ],
            "type": "string"
          },
          "offline_seconds": {
            "description": "Segundos sin conexión permitidos: 1–31536000 para limited, 0 para none/permanent. No es el intervalo de heartbeat. Con los heartbeats habilitados, las nuevas políticas de uso limitado sin conexión deben cumplir offline_seconds \u003e= 3 × heartbeat_seconds; los arrendamientos de puestos flotantes también deben cubrir al menos tres intervalos de heartbeat.",
            "maximum": 31536000,
            "minimum": 0,
            "type": "integer"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "description": "La revisión de la política aumenta con cada edición. Al aplicarla a licencias existentes, comprueba que la vista previa sigue vigente.",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "product_id",
          "mode",
          "version"
        ],
        "type": "object"
      },
      "PolicyCapabilities": {
        "additionalProperties": false,
        "properties": {
          "allow_vm": {
            "description": "Indica si se permiten máquinas virtuales.",
            "type": "boolean"
          },
          "device_match": {
            "description": "Coincidencia de identidad system o de identidad hardware.",
            "enum": [
              "system",
              "hardware"
            ],
            "type": "string"
          },
          "license_model": {
            "description": "Vinculación de dispositivo node_locked o puestos flotantes.",
            "enum": [
              "node_locked",
              "floating"
            ],
            "type": "string"
          },
          "maintenance_days": {
            "description": "Días de mantenimiento desde la primera activación; 0 significa que no hay fecha límite de mantenimiento.",
            "maximum": 36500,
            "minimum": 0,
            "type": "integer"
          },
          "max_version": {
            "description": "Versión máxima permitida de la aplicación; vacío significa que no hay límite superior.",
            "type": "string"
          },
          "meter_rules": {
            "description": "Reglas de medición de funciones; vacío significa que no hay ninguna configurada.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "allow_overage": {
                  "description": "Indica si se permite el uso excedente de funciones.",
                  "type": "boolean"
                },
                "feature": {
                  "description": "Identificador de función medida por consumo, que debe existir en las funciones de la política.",
                  "pattern": "^[A-Za-z0-9_.-]{1,64}$",
                  "type": "string"
                },
                "limit": {
                  "description": "Usos de función incluidos por periodo de medición (no es un límite de paginación).",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "max_overage": {
                  "description": "Uso excedente máximo permitido; deshabilitado cuando allow_overage es false.",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "period": {
                  "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
                  "enum": [
                    "month",
                    "day",
                    "lifetime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "feature",
                "limit",
                "period"
              ],
              "type": "object"
            },
            "maxItems": 32,
            "type": "array"
          },
          "min_version": {
            "description": "Versión mínima permitida de la aplicación; vacío significa que no hay límite inferior.",
            "type": "string"
          },
          "policy_id": {
            "description": "UUID de política; debe pertenecer al producto en el momento de la emisión.",
            "format": "uuid",
            "type": "string"
          },
          "policy_version": {
            "description": "Revisión de la política; envíe el valor actual al editar todas las capacidades para impedir escrituras obsoletas.",
            "type": "integer"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "require_hardware": {
            "description": "Indica si se requiere una identidad de hardware utilizable.",
            "type": "boolean"
          },
          "self_release_limit": {
            "description": "Liberaciones de autoservicio permitidas por ventana móvil de 30 días, 0–100; 0 las deshabilita.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "session_seconds": {
            "description": "Segundos de arrendamiento de un puesto flotante sin heartbeat, 20–86400; deben cumplir las restricciones de ejecución de la política.",
            "maximum": 86400,
            "minimum": 20,
            "type": "integer"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "PolicyCapabilitiesInput": {
        "additionalProperties": false,
        "description": "Define el modo de emisión, los límites de dispositivos/puestos, las funciones y las reglas de ejecución. Las políticas no almacenan ninguna duración de validez. policy_version es obligatoria para impedir ediciones obsoletas.",
        "properties": {
          "allow_vm": {
            "description": "Indica si se permiten máquinas virtuales.",
            "type": "boolean"
          },
          "device_match": {
            "description": "Coincidencia de identidad system o de identidad hardware.",
            "enum": [
              "system",
              "hardware"
            ],
            "type": "string"
          },
          "features": {
            "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0,
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión."
              },
              {
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión.",
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "0 deshabilita explícitamente los heartbeats periódicos; en otro caso, 600–86400 segundos (mínimo 10 minutos). Independiente de la duración sin conexión.",
            "type": "integer"
          },
          "license_model": {
            "description": "Vinculación de dispositivo node_locked o puestos flotantes.",
            "enum": [
              "node_locked",
              "floating"
            ],
            "type": "string"
          },
          "maintenance_days": {
            "description": "Días de mantenimiento desde la primera activación; 0 significa que no hay fecha límite de mantenimiento.",
            "maximum": 36500,
            "minimum": 0,
            "type": "integer"
          },
          "max_devices": {
            "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "max_version": {
            "description": "Versión máxima permitida de la aplicación; vacío significa que no hay límite superior.",
            "type": "string"
          },
          "meter_rules": {
            "description": "Reglas de medición de funciones; vacío significa que no hay ninguna configurada.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "allow_overage": {
                  "description": "Indica si se permite el uso excedente de funciones.",
                  "type": "boolean"
                },
                "feature": {
                  "description": "Identificador de función medida por consumo, que debe existir en las funciones de la política.",
                  "pattern": "^[A-Za-z0-9_.-]{1,64}$",
                  "type": "string"
                },
                "limit": {
                  "description": "Usos de función incluidos por periodo de medición (no es un límite de paginación).",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "max_overage": {
                  "description": "Uso excedente máximo permitido; deshabilitado cuando allow_overage es false.",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "period": {
                  "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
                  "enum": [
                    "month",
                    "day",
                    "lifetime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "feature",
                "limit",
                "period"
              ],
              "type": "object"
            },
            "maxItems": 32,
            "type": "array"
          },
          "min_version": {
            "description": "Versión mínima permitida de la aplicación; vacío significa que no hay límite inferior.",
            "type": "string"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "perpetual",
              "timed",
              "trial"
            ],
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "offline_mode": {
            "description": "Uso sin conexión limited, none o permanent; se sigue aplicando el vencimiento de la licencia.",
            "enum": [
              "limited",
              "none",
              "permanent"
            ],
            "type": "string"
          },
          "offline_seconds": {
            "description": "Limited: 1–31536000 segundos y al menos 3 × heartbeat_seconds con los heartbeats habilitados; none/permanent: 0",
            "maximum": 31536000,
            "minimum": 0,
            "type": "integer"
          },
          "policy_version": {
            "description": "Revisión de la política; envíe el valor actual al editar todas las capacidades para impedir escrituras obsoletas.",
            "minimum": 1,
            "type": "integer"
          },
          "require_hardware": {
            "description": "Indica si se requiere una identidad de hardware utilizable.",
            "type": "boolean"
          },
          "self_release_limit": {
            "description": "Liberaciones de autoservicio permitidas por ventana móvil de 30 días, 0–100; 0 las deshabilita.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "session_seconds": {
            "description": "Segundos de arrendamiento de un puesto flotante sin heartbeat, 20–86400; deben cumplir las restricciones de ejecución de la política.",
            "maximum": 86400,
            "minimum": 20,
            "type": "integer"
          }
        },
        "required": [
          "policy_version"
        ],
        "type": "object"
      },
      "PolicyCreate": {
        "additionalProperties": false,
        "description": "Define el modo de emisión, los límites de dispositivos/puestos, las funciones y las reglas de ejecución. Las políticas no almacenan ninguna duración de validez.",
        "properties": {
          "allow_vm": {
            "description": "Indica si se permiten máquinas virtuales.",
            "type": "boolean"
          },
          "device_match": {
            "description": "Coincidencia de identidad system o de identidad hardware.",
            "enum": [
              "system",
              "hardware"
            ],
            "type": "string"
          },
          "features": {
            "description": "Identificadores de funciones permitidos, por ejemplo [\"export\"]. Deben coincidir con los argumentos CheckFeature de su aplicación.",
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0,
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión."
              },
              {
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión.",
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "Intervalo de heartbeat en línea, en segundos. 0 deshabilita los heartbeats periódicos. La duración sin conexión se configura por separado.",
            "type": "integer"
          },
          "license_model": {
            "description": "Vinculación de dispositivo node_locked o puestos flotantes.",
            "enum": [
              "node_locked",
              "floating"
            ],
            "type": "string"
          },
          "maintenance_days": {
            "description": "Días de mantenimiento desde la primera activación; 0 significa que no hay fecha límite de mantenimiento.",
            "maximum": 36500,
            "minimum": 0,
            "type": "integer"
          },
          "max_devices": {
            "description": "Límite de dispositivos por licencia, 1–10000; en modo floating es el límite de puestos simultáneos.",
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "max_version": {
            "description": "Versión máxima permitida de la aplicación; vacío significa que no hay límite superior.",
            "type": "string"
          },
          "meter_rules": {
            "description": "Reglas de medición de funciones; vacío significa que no hay ninguna configurada.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "allow_overage": {
                  "description": "Indica si se permite el uso excedente de funciones.",
                  "type": "boolean"
                },
                "feature": {
                  "description": "Identificador de función medida por consumo, que debe existir en las funciones de la política.",
                  "pattern": "^[A-Za-z0-9_.-]{1,64}$",
                  "type": "string"
                },
                "limit": {
                  "description": "Usos de función incluidos por periodo de medición (no es un límite de paginación).",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "max_overage": {
                  "description": "Uso excedente máximo permitido; deshabilitado cuando allow_overage es false.",
                  "maximum": 1000000000000,
                  "minimum": 0,
                  "type": "integer"
                },
                "period": {
                  "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
                  "enum": [
                    "month",
                    "day",
                    "lifetime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "feature",
                "limit",
                "period"
              ],
              "type": "object"
            },
            "maxItems": 32,
            "type": "array"
          },
          "min_version": {
            "description": "Versión mínima permitida de la aplicación; vacío significa que no hay límite inferior.",
            "type": "string"
          },
          "mode": {
            "description": "Tipo de licencia: perpetual, timed o trial. No es un tipo de suscripción a un plan de facturación.",
            "enum": [
              "perpetual",
              "timed",
              "trial"
            ],
            "type": "string"
          },
          "name": {
            "description": "Nombre de política, por ejemplo Pro 30 días.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "offline_mode": {
            "description": "limited: uso sin conexión de duración limitada; none: sin uso sin conexión; permanent: sin límite temporal adicional sin conexión, pero se sigue aplicando el vencimiento de la licencia.",
            "enum": [
              "limited",
              "none",
              "permanent"
            ],
            "type": "string"
          },
          "offline_seconds": {
            "description": "Segundos sin conexión permitidos: 1–31536000 para limited, 0 para none/permanent. No es el intervalo de heartbeat. Con los heartbeats habilitados, las nuevas políticas de uso limitado sin conexión deben cumplir offline_seconds \u003e= 3 × heartbeat_seconds; los arrendamientos de puestos flotantes también deben cubrir al menos tres intervalos de heartbeat.",
            "maximum": 31536000,
            "minimum": 0,
            "type": "integer"
          },
          "product_id": {
            "description": "ID de producto (UUID).",
            "format": "uuid",
            "type": "string"
          },
          "require_hardware": {
            "description": "Indica si se requiere una identidad de hardware utilizable.",
            "type": "boolean"
          },
          "self_release_limit": {
            "description": "Liberaciones de autoservicio permitidas por ventana móvil de 30 días, 0–100; 0 las deshabilita.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "session_seconds": {
            "description": "Segundos de arrendamiento de un puesto flotante sin heartbeat, 20–86400; deben cumplir las restricciones de ejecución de la política.",
            "maximum": 86400,
            "minimum": 20,
            "type": "integer"
          }
        },
        "required": [
          "product_id",
          "name",
          "mode",
          "max_devices"
        ],
        "type": "object"
      },
      "PolicyList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Policy"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "PolicyPreview": {
        "additionalProperties": false,
        "properties": {
          "changes": {
            "description": "Comparación antes/después y motivo de bloqueo por licencia.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "active": {
                  "description": "Indicador de clave de firma actual; en una vista previa de política, recuento de dispositivos/sesiones activos.",
                  "type": "integer"
                },
                "after": {
                  "additionalProperties": false,
                  "description": "Derechos después de aplicar la política de destino; la duración no cambia.",
                  "properties": {
                    "duration_days": {
                      "description": "Días propios de cada licencia desde la primera activación. Se requieren 1–36500 para emitir timed/trial; ausente/null para perpetual. Nunca se guardan en la política.",
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "expires_at": {
                      "anyOf": [
                        {
                          "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                          "format": "date-time",
                          "type": "string"
                        },
                        {
                          "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                          "type": "null"
                        }
                      ],
                      "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial."
                    },
                    "features": {
                      "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
                      "items": {
                        "type": "string"
                      },
                      "type": "array"
                    },
                    "license_model": {
                      "description": "Vinculación de dispositivo node_locked o puestos flotantes.",
                      "enum": [
                        "node_locked",
                        "floating"
                      ],
                      "type": "string"
                    },
                    "maintenance_until": {
                      "anyOf": [
                        {
                          "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                          "format": "date-time",
                          "type": "string"
                        },
                        {
                          "description": "Fecha límite de mantenimiento para nuevas versiones; puede ser null antes de activar o cuando es ilimitado.",
                          "type": "null"
                        }
                      ],
                      "description": "Fecha límite de mantenimiento para nuevas versiones; puede ser null antes de activar o cuando es ilimitado."
                    },
                    "max_devices": {
                      "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
                      "type": "integer"
                    },
                    "max_version": {
                      "description": "Versión máxima permitida de la aplicación; vacío significa que no hay límite superior.",
                      "type": "string"
                    },
                    "meter_rules": {
                      "description": "Reglas de medición de funciones; vacío significa que no hay ninguna configurada.",
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "allow_overage": {
                            "description": "Indica si se permite el uso excedente de funciones.",
                            "type": "boolean"
                          },
                          "feature": {
                            "description": "Identificador de función medida por consumo, que debe existir en las funciones de la política.",
                            "pattern": "^[A-Za-z0-9_.-]{1,64}$",
                            "type": "string"
                          },
                          "limit": {
                            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
                            "maximum": 1000000000000,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "max_overage": {
                            "description": "Uso excedente máximo permitido; deshabilitado cuando allow_overage es false.",
                            "maximum": 1000000000000,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "period": {
                            "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
                            "enum": [
                              "month",
                              "day",
                              "lifetime"
                            ],
                            "type": "string"
                          }
                        },
                        "required": [
                          "feature",
                          "limit",
                          "period"
                        ],
                        "type": "object"
                      },
                      "maxItems": 32,
                      "type": "array"
                    },
                    "min_version": {
                      "description": "Versión mínima permitida de la aplicación; vacío significa que no hay límite inferior.",
                      "type": "string"
                    },
                    "mode": {
                      "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
                      "enum": [
                        "perpetual",
                        "timed",
                        "trial"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "mode",
                    "max_devices",
                    "features",
                    "expires_at",
                    "duration_days",
                    "license_model",
                    "meter_rules",
                    "maintenance_until",
                    "min_version",
                    "max_version"
                  ],
                  "type": "object"
                },
                "before": {
                  "additionalProperties": false,
                  "description": "Derechos emitidos actuales y duración de la licencia.",
                  "properties": {
                    "capabilities": {
                      "$ref": "#/components/schemas/LicenseCapabilities",
                      "description": "Instantánea de capacidades de la licencia."
                    },
                    "duration_days": {
                      "description": "Días propios de cada licencia desde la primera activación. Se requieren 1–36500 para emitir timed/trial; ausente/null para perpetual. Nunca se guardan en la política.",
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "expires_at": {
                      "anyOf": [
                        {
                          "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                          "format": "date-time",
                          "type": "string"
                        },
                        {
                          "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                          "type": "null"
                        }
                      ],
                      "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial."
                    },
                    "features": {
                      "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
                      "items": {
                        "type": "string"
                      },
                      "type": "array"
                    },
                    "max_devices": {
                      "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
                      "type": "integer"
                    },
                    "meter_rules": {
                      "description": "Reglas de medición de funciones; vacío significa que no hay ninguna configurada.",
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "allow_overage": {
                            "description": "Indica si se permite el uso excedente de funciones.",
                            "type": "boolean"
                          },
                          "feature": {
                            "description": "Identificador de función medida por consumo, que debe existir en las funciones de la política.",
                            "pattern": "^[A-Za-z0-9_.-]{1,64}$",
                            "type": "string"
                          },
                          "limit": {
                            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
                            "maximum": 1000000000000,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "max_overage": {
                            "description": "Uso excedente máximo permitido; deshabilitado cuando allow_overage es false.",
                            "maximum": 1000000000000,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "period": {
                            "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
                            "enum": [
                              "month",
                              "day",
                              "lifetime"
                            ],
                            "type": "string"
                          }
                        },
                        "required": [
                          "feature",
                          "limit",
                          "period"
                        ],
                        "type": "object"
                      },
                      "maxItems": 32,
                      "type": "array"
                    },
                    "mode": {
                      "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
                      "enum": [
                        "perpetual",
                        "timed",
                        "trial"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "mode",
                    "max_devices",
                    "features",
                    "expires_at",
                    "duration_days",
                    "capabilities",
                    "meter_rules"
                  ],
                  "type": "object"
                },
                "blocked_reason": {
                  "description": "Motivo que bloquea el cambio; vacío indica que no hay impedimento actual.",
                  "type": "string"
                },
                "customer": {
                  "description": "Etiqueta del cliente definida por el proveedor, distinta del correo del portal de clientes.",
                  "type": "string"
                },
                "id": {
                  "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "customer",
                "before",
                "after",
                "blocked_reason",
                "active"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "expires_in": {
            "const": 600,
            "description": "Duración del token de vista previa en segundos, actualmente 600.",
            "type": "integer"
          },
          "note": {
            "description": "Orientación adicional para el desarrollador.",
            "type": "string"
          },
          "policy_version": {
            "description": "Revisión de la política; envíe el valor actual al editar todas las capacidades para impedir escrituras obsoletas.",
            "type": "integer"
          },
          "preview_token": {
            "description": "Token cifrado de confirmación de vista previa obligatorio para apply_policy; válido durante 600 segundos e invalidado por cambios en los recursos.",
            "type": "string"
          }
        },
        "required": [
          "changes",
          "policy_version",
          "preview_token",
          "expires_in",
          "note"
        ],
        "type": "object"
      },
      "PolicySyncResult": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "synced_licenses": {
            "description": "Número de licencias vinculadas no revocadas sincronizadas en la misma transacción.",
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "synced_licenses"
        ],
        "type": "object"
      },
      "PolicyUpdate": {
        "additionalProperties": false,
        "description": "Define el modo de emisión, los límites de dispositivos/puestos, las funciones y las reglas de ejecución. Las políticas no almacenan ninguna duración de validez.",
        "properties": {
          "features": {
            "description": "Hasta 32 identificadores de función distintos, cada uno con 1–64 caracteres entre letras ASCII, dígitos, puntos, guiones o guiones bajos.",
            "items": {
              "pattern": "^[A-Za-z0-9_.-]{1,64}$",
              "type": "string"
            },
            "maxItems": 32,
            "type": "array",
            "uniqueItems": true
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0,
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión."
              },
              {
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión.",
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "0 deshabilita explícitamente los heartbeats periódicos; en otro caso, 600–86400 segundos (mínimo 10 minutos). Independiente de la duración sin conexión.",
            "type": "integer"
          },
          "max_devices": {
            "description": "Máximo de dispositivos simultáneos o puestos flotantes por licencia.",
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "perpetual",
              "timed",
              "trial"
            ],
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "offline_mode": {
            "description": "Uso sin conexión limited, none o permanent; se sigue aplicando el vencimiento de la licencia.",
            "enum": [
              "limited",
              "none",
              "permanent"
            ],
            "type": "string"
          },
          "offline_seconds": {
            "description": "Limited: 1–31536000 segundos y al menos 3 × heartbeat_seconds con los heartbeats habilitados; none/permanent: 0",
            "maximum": 31536000,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "PreviewInput": {
        "additionalProperties": false,
        "properties": {
          "ids": {
            "description": "UUID de licencia distintos que se procesarán, 1–100.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          },
          "policy_id": {
            "description": "UUID de política; debe pertenecer al producto en el momento de la emisión.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "policy_id",
          "ids"
        ],
        "type": "object"
      },
      "Price": {
        "additionalProperties": false,
        "properties": {
          "api_hard_limit": {
            "description": "Indica si las llamadas de ejecución se detienen al alcanzar el límite de cuota API.",
            "type": "boolean"
          },
          "api_unit_micros": {
            "description": "Precio por llamada de ejecución excedente en millonésimas.",
            "minimum": 0,
            "type": "integer"
          },
          "base_micros": {
            "description": "Cargo base en millonésimas de la unidad monetaria.",
            "type": "integer"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "type": "string"
          },
          "description": {
            "description": "Descripción de la oferta de facturación.",
            "type": "string"
          },
          "enabled": {
            "description": "Indica si la oferta de facturación está habilitada para comprar.",
            "type": "boolean"
          },
          "hard_limit": {
            "description": "Indica si se rechazan nuevos dispositivos facturables al alcanzar el límite de cuota.",
            "type": "boolean"
          },
          "included_api_calls": {
            "description": "null = ilimitado; 0 = ninguna llamada correcta incluida",
            "maximum": 1000000000000,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "included_devices": {
            "description": "Cuota de dispositivos activos incluida.",
            "type": "integer"
          },
          "name": {
            "description": "Nombre visible de la oferta de facturación.",
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          },
          "public": {
            "description": "Indica si la oferta de facturación se muestra públicamente.",
            "type": "boolean"
          },
          "renewal_only": {
            "description": "Los clientes existentes con paquetes pagados o regalados pueden renovar antes o después del vencimiento en el mismo entorno y moneda. No se muestra para nuevas compras públicas.",
            "type": "boolean"
          },
          "sort_order": {
            "description": "Orden de visualización de la oferta de facturación.",
            "type": "integer"
          },
          "terms": {
            "description": "Plazos de compra disponibles y sus precios.",
            "items": {
              "$ref": "#/components/schemas/PlanTermPrice"
            },
            "type": "array"
          },
          "unit_micros": {
            "description": "Precio por dispositivo activo excedente en millonésimas.",
            "type": "integer"
          },
          "updated_at": {
            "description": "Marca temporal de la última actualización en UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "Product": {
        "additionalProperties": false,
        "example": {
          "created_at": "2026-10-18T00:00:00Z",
          "description": "Desktop reporting software",
          "id": "11111111-1111-4111-8111-111111111111",
          "name": "Report app",
          "status": "active",
          "updated_at": "2026-10-18T00:00:00Z"
        },
        "properties": {
          "created_at": {
            "description": "Fecha de creación, UTC ISO 8601.",
            "format": "date-time",
            "type": "string"
          },
          "description": {
            "description": "Descripción del producto.",
            "type": "string"
          },
          "id": {
            "description": "UUID del producto para configurar SDK y crear políticas.",
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "description": "Nombre del producto.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "description": "active permite activar; disabled rechaza solicitudes de licencia en ejecución.",
            "enum": [
              "active",
              "disabled"
            ],
            "type": "string"
          },
          "updated_at": {
            "description": "Última actualización, UTC ISO 8601.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "status"
        ],
        "type": "object"
      },
      "ProductCreate": {
        "additionalProperties": false,
        "properties": {
          "description": {
            "description": "Descripción opcional del software, hasta 1000 caracteres.",
            "maxLength": 1000,
            "type": "string"
          },
          "name": {
            "description": "Nombre del software, 1–120 caracteres.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "ProductList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Product"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "ProductUpdate": {
        "additionalProperties": false,
        "properties": {
          "description": {
            "description": "Descripción del producto; puede estar vacía.",
            "maxLength": 1000,
            "type": "string"
          },
          "name": {
            "description": "Nombre legible para personas; consulte los límites de longitud.",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "enum": [
              "active",
              "disabled"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "ProviderRefund": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "minimum": 0,
            "type": "integer"
          },
          "attempted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "attempts": {
            "minimum": 0,
            "type": "integer"
          },
          "case_id": {
            "format": "uuid",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "last_error": {
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "order_id": {
            "format": "uuid",
            "type": "string"
          },
          "provider": {
            "enum": [
              "waffo",
              "paddle"
            ],
            "type": "string"
          },
          "provider_refund_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "reason": {
            "type": "string"
          },
          "reserved": {
            "type": "boolean"
          },
          "settled_cents": {
            "minimum": 0,
            "type": "integer"
          },
          "status": {
            "enum": [
              "created",
              "submitting",
              "pending",
              "unknown",
              "completed",
              "failed"
            ],
            "type": "string"
          },
          "submitted_cents": {
            "minimum": 0,
            "type": "integer"
          },
          "unapplied": {
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "PurchaseList": {
        "additionalProperties": false,
        "properties": {
          "active": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PlanPurchase",
                "description": "Indicador de clave de firma actual; en una vista previa de política, recuento de dispositivos/sesiones activos."
              },
              {
                "description": "Indicador de clave de firma actual; en una vista previa de política, recuento de dispositivos/sesiones activos.",
                "type": "null"
              }
            ],
            "description": "Contrato del paquete comprado efectivo actual o null."
          },
          "active_devices": {
            "description": "Ocupación actual de productos/dispositivos registrados, independiente del historial mensual de uso de dispositivos. Los registros ordinarios siguen contándose sin conexión hasta liberarse. Las sesiones flotantes solo cuentan mientras sus arrendamientos son válidos y se deduplican por hardware, recurriendo a la identidad del dispositivo como alternativa. La liberación o el vencimiento de la última sesión flotante devuelve capacidad; los registros válidos continúan al cruzar límites de meses de cuota. Se excluyen los registros aislados de pruebas SDK.",
            "type": "integer"
          },
          "coverage_ends_at": {
            "anyOf": [
              {
                "description": "Fin de la cobertura continua de paquetes pagados o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Fin de la cobertura continua de paquetes pagados o null.",
                "type": "null"
              }
            ],
            "description": "Fin de toda la cobertura prepagada, incluidas renovaciones anticipadas pagadas y regalos programados. El paquete activo sigue informando de su propio periodo de cuota actual."
          },
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/PlanPurchase"
            },
            "type": "array"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "renewal_package": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PlanPurchase",
                "description": "Último contrato pagado apto para renovación o null."
              },
              {
                "description": "Último contrato pagado apto para renovación o null.",
                "type": "null"
              }
            ],
            "description": "Última cobertura pagada o regalada, incluido el cambio a plan superior aplicado. Use este plan efectivo y su moneda para seleccionar una renovación manual o automática. Es null hasta que se haya abierto un paquete."
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "RechargeInput": {
        "additionalProperties": false,
        "description": "Vincule purchase_id OR upgrade_id, nunca ambos. Un pago confirmado abona el monedero y liquida esa compra/cambio si la cotización sigue siendo válida. Los pagos tardíos de cambios a planes superiores permanecen en el monedero.",
        "properties": {
          "amount": {
            "description": "Valor decimal de recarga, máximo dos posiciones decimales",
            "type": "string"
          },
          "currency": {
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "purchase_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "request_id": {
            "maxLength": 80,
            "type": "string"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          },
          "upgrade_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "currency",
          "amount",
          "request_id"
        ],
        "type": "object"
      },
      "RecoverOriginalRefund": {
        "additionalProperties": false,
        "properties": {
          "confirm_unpaid_manual": {
            "const": true,
            "type": "boolean"
          },
          "expected_updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "confirm_unpaid_manual"
        ],
        "type": "object"
      },
      "RefundHistory": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/RefundHistoryItem"
            },
            "type": "array"
          },
          "limit": {
            "minimum": 0,
            "type": "integer"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "offset": {
            "minimum": 0,
            "type": "integer"
          },
          "total": {
            "minimum": 0,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "RefundHistoryItem": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "minimum": 0,
            "type": "integer"
          },
          "case_id": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "order_id": {
            "type": "string"
          },
          "provider": {
            "enum": [
              "paypal",
              "waffo",
              "paddle"
            ],
            "type": "string"
          },
          "provider_refund_id": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "settled_cents": {
            "minimum": 0,
            "type": "integer"
          },
          "status": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "RefundInboxItem": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "minimum": 0,
            "type": "integer"
          },
          "cancellation_scope": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "customer_email": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "manual_refund_pending": {
            "type": "boolean"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "order_id": {
            "type": "string"
          },
          "pending_review": {
            "type": "boolean"
          },
          "purchase_id": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "refund_totals": {
            "description": "Importes por moneda codificados en JSON para cancelaciones con alcance definido.",
            "type": "string"
          },
          "reviewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "scope": {
            "enum": [
              "wallet",
              "service"
            ],
            "type": "string"
          },
          "source": {
            "enum": [
              "wallet_request",
              "support_case"
            ],
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "tenant_name": {
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "RefundInboxList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/RefundInboxItem"
            },
            "type": "array"
          },
          "limit": {
            "minimum": 0,
            "type": "integer"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "offset": {
            "minimum": 0,
            "type": "integer"
          },
          "summary": {
            "additionalProperties": false,
            "properties": {
              "pending_review": {
                "minimum": 0,
                "type": "integer"
              },
              "service_pending_review": {
                "minimum": 0,
                "type": "integer"
              },
              "wallet_pending_review": {
                "minimum": 0,
                "type": "integer"
              }
            },
            "type": "object"
          },
          "total": {
            "minimum": 0,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "RefundInput": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "Importe positivo de reembolso en la moneda de captura; no puede superar los fondos capturados restantes ni el crédito disponible no gastado del monedero.",
            "pattern": "^[0-9]+(?:\\.[0-9]{1,2})?$",
            "type": "string"
          },
          "reason": {
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "request_id": {
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "amount",
          "reason",
          "request_id"
        ],
        "type": "object"
      },
      "RefundList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PayPalRefund"
            },
            "type": "array"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "RefundQuote": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "type": "integer"
          },
          "automatic_entitlement_cancellation": {
            "type": "boolean"
          },
          "currency": {
            "type": "string"
          },
          "purchase_id": {
            "format": "uuid",
            "type": "string"
          },
          "quoted_at": {
            "format": "date-time",
            "type": "string"
          },
          "requires_confirmation": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "RefundReview": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "string"
          },
          "amounts": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "amount": {
                  "type": "string"
                },
                "purchase_id": {
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "purchase_id",
                "amount"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "approve": {
            "type": "boolean"
          },
          "decision": {
            "maxLength": 3000,
            "type": "string"
          },
          "expected_updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "quote_hash": {
            "type": "string"
          },
          "quoted_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "approve",
          "decision"
        ],
        "type": "object"
      },
      "Register": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "format": "email",
            "type": "string"
          },
          "name": {
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "password": {
            "description": "12–128 bytes UTF-8, no caracteres",
            "type": "string",
            "writeOnly": true
          },
          "password_confirmation": {
            "description": "Obligatorio y debe coincidir exactamente con password",
            "type": "string",
            "writeOnly": true
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "tenant_name": {
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          }
        },
        "required": [
          "email",
          "password",
          "password_confirmation",
          "name",
          "tenant_name"
        ],
        "type": "object"
      },
      "Release": {
        "additionalProperties": false,
        "example": {
          "channel": "stable",
          "created_at": "2026-10-18T00:00:00Z",
          "download_url": "",
          "id": "33333333-3333-4333-8333-333333333333",
          "notes": "Initial release",
          "product_id": "11111111-1111-4111-8111-111111111111",
          "published_at": "2026-10-18T00:00:00Z",
          "sha256": "",
          "version": "1.0.0"
        },
        "properties": {
          "channel": {
            "description": "Canal de publicación, stable o preview; stable por defecto.",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "download_url": {
            "description": "URL de descarga HTTPS; sha256 es obligatorio cuando se proporciona un URL.",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "notes": {
            "description": "Notas de versión",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "published_at": {
            "description": "Marca temporal de publicación de la versión, UTC; por defecto, la hora del servidor.",
            "format": "date-time",
            "type": "string"
          },
          "sha256": {
            "description": "SHA-256 del archivo descargable, 64 caracteres hexadecimales minúsculos, distinto del algoritmo de firma.",
            "type": "string"
          },
          "version": {
            "description": "Revisión de política, versión major.minor.patch del producto o versión 1 del protocolo sin conexión, según el objeto.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "product_id",
          "version",
          "channel",
          "notes",
          "download_url",
          "sha256",
          "published_at",
          "created_at"
        ],
        "type": "object"
      },
      "ReleaseInput": {
        "additionalProperties": false,
        "properties": {
          "channel": {
            "description": "Canal de publicación, stable o preview; stable por defecto.",
            "enum": [
              "stable",
              "preview"
            ],
            "type": "string"
          },
          "download_url": {
            "description": "URL de descarga HTTPS; sha256 es obligatorio cuando se proporciona un URL.",
            "format": "uri",
            "maxLength": 2000,
            "type": "string"
          },
          "notes": {
            "description": "Notas de versión",
            "maxLength": 10000,
            "type": "string"
          },
          "published_at": {
            "description": "Marca temporal de publicación de la versión, UTC; por defecto, la hora del servidor.",
            "format": "date-time",
            "type": "string"
          },
          "sha256": {
            "description": "SHA-256 del archivo descargable, 64 caracteres hexadecimales minúsculos, distinto del algoritmo de firma.",
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "version": {
            "description": "Revisión de política, versión major.minor.patch del producto o versión 1 del protocolo sin conexión, según el objeto.",
            "pattern": "^(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})$",
            "type": "string"
          }
        },
        "required": [
          "version"
        ],
        "type": "object"
      },
      "ReleaseList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Release"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "limit",
          "offset"
        ],
        "type": "object"
      },
      "Renew": {
        "additionalProperties": false,
        "properties": {
          "days": {
            "description": "Días adicionales, 1–36500; las renovaciones de licencia y mantenimiento afectan a plazos distintos.",
            "maximum": 36500,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "days"
        ],
        "type": "object"
      },
      "RenewalPlans": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Price"
            },
            "type": "array"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          }
        },
        "required": [
          "items",
          "mode"
        ],
        "type": "object"
      },
      "Renewed": {
        "additionalProperties": false,
        "example": {
          "duration_days": 60,
          "expires_at": null,
          "id": "33333333-3333-4333-8333-333333333333"
        },
        "properties": {
          "duration_days": {
            "description": "Las renovaciones anteriores a la primera activación aumentan este valor. Después de activar conserva la duración original; use expires_at para la fecha límite real.",
            "maximum": 36500,
            "minimum": 1,
            "type": [
              "integer",
              "null"
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial.",
                "type": "null"
              }
            ],
            "description": "Vencimiento de licencia; null para licencias timed/trial sin activar o perpetual. En objetos de claves, vencimiento de la credencial."
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "id",
          "expires_at",
          "duration_days"
        ],
        "type": "object"
      },
      "ReservationResult": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "UUID de vinculación del dispositivo o sesión de ejecución. Guárdelo para futuras solicitudes de licencia; no es una clave de licencia.",
            "format": "uuid",
            "type": "string"
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0
              },
              {
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "Intervalo actual de heartbeat en segundos; la medición no actualiza la firma ni el temporizador.",
            "type": "integer"
          },
          "reservation": {
            "$ref": "#/components/schemas/FeatureReservation"
          }
        },
        "required": [
          "activation_id",
          "reservation"
        ],
        "type": "object"
      },
      "Revenue": {
        "additionalProperties": false,
        "properties": {
          "invoices": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currency": {
                  "pattern": "^[A-Z]{3}$",
                  "type": "string"
                },
                "email": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "type": "string"
                },
                "month": {
                  "type": "string"
                },
                "paid_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "plan": {
                  "type": "string"
                },
                "plan_name": {
                  "type": "string"
                },
                "refunded_at": {
                  "anyOf": [
                    {
                      "format": "date-time",
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "status": {
                  "type": "string"
                },
                "tenant_name": {
                  "type": "string"
                },
                "total_cents": {
                  "type": "integer"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "limit": {
            "type": "integer"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "month": {
            "type": "string"
          },
          "offset": {
            "type": "integer"
          },
          "paddle_totals": {
            "description": "Pagos brutos y reembolsos acumulados de compras de servicios y recargas del monedero, agrupados por mes del pago original y moneda; no es una liquidación bancaria.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "currency": {
                  "description": "Nombre visible del servicio de pago.",
                  "type": "string"
                },
                "paid_cents": {
                  "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
                  "type": "integer"
                },
                "refunded_cents": {
                  "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
                  "type": "integer"
                }
              },
              "required": [
                "currency",
                "paid_cents",
                "refunded_cents"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "paid_users": {
            "type": "integer"
          },
          "purchase_total": {
            "type": "integer"
          },
          "purchases": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "api_calls": {
                  "type": "integer"
                },
                "api_overage_cents": {
                  "type": "integer"
                },
                "base_cents": {
                  "type": "integer"
                },
                "currency": {
                  "pattern": "^[A-Z]{3}$",
                  "type": "string"
                },
                "email": {
                  "type": "string"
                },
                "ends_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "type": "string"
                },
                "overage_cents": {
                  "type": "integer"
                },
                "plan": {
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "type": "string"
                },
                "plan_name": {
                  "type": "string"
                },
                "source": {
                  "enum": [
                    "purchase",
                    "gift"
                  ],
                  "type": "string"
                },
                "starts_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "status": {
                  "enum": [
                    "pending",
                    "active",
                    "cancelled"
                  ],
                  "type": "string"
                },
                "tenant_name": {
                  "type": "string"
                },
                "term_months": {
                  "default": 1,
                  "enum": [
                    1,
                    3,
                    6,
                    12
                  ],
                  "type": "integer"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "recharged_users": {
            "type": "integer"
          },
          "registered_users": {
            "type": "integer"
          },
          "sales": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "currency": {
                  "pattern": "^[A-Z]{3}$",
                  "type": "string"
                },
                "plan": {
                  "type": "string"
                },
                "plan_name": {
                  "type": "string"
                },
                "quantity": {
                  "type": "integer"
                },
                "total_cents": {
                  "type": "integer"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "sold_subscriptions": {
            "type": "integer"
          },
          "timezone": {
            "type": "string"
          },
          "topup_total": {
            "type": "integer"
          },
          "topups": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "amount_cents": {
                  "type": "integer"
                },
                "credited_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "currency": {
                  "pattern": "^[A-Z]{3}$",
                  "type": "string"
                },
                "email": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "type": "string"
                },
                "provider": {
                  "description": "Proveedor original de la recarga del monedero; los reembolsos siguen vinculados a él.",
                  "enum": [
                    "paypal",
                    "paddle",
                    "waffo"
                  ],
                  "type": "string"
                },
                "refunded_cents": {
                  "type": "integer"
                },
                "status": {
                  "type": "string"
                },
                "tenant_name": {
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "total": {
            "type": "integer"
          },
          "totals": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "consumption_cents": {
                  "type": "integer"
                },
                "consumption_refund_cents": {
                  "type": "integer"
                },
                "currency": {
                  "pattern": "^[A-Z]{3}$",
                  "type": "string"
                },
                "paypal_refund_cents": {
                  "type": "integer"
                },
                "recharge_cents": {
                  "type": "integer"
                },
                "wallet_refund_cents": {
                  "description": "Reembolsos/reversiones de monedero ejecutados mediante PayPal, Paddle y Waffo; excluye retenciones temporales de reembolsos.",
                  "type": "integer"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "upgrade_total": {
            "description": "Número de cambios a planes superiores aplicados en el entorno y periodo de informe seleccionados, incluidos los gratuitos. Se cuentan por separado de las ventas iniciales de paquetes.",
            "type": "integer"
          },
          "upgrades": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "amount_cents": {
                  "description": "Importe prorrateado realmente pagado; no es el nuevo precio mensual completo.",
                  "type": "integer"
                },
                "applied_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "currency": {
                  "type": "string"
                },
                "email": {
                  "type": "string"
                },
                "ends_at": {
                  "description": "Vencimiento original del paquete, sin cambios por el cambio a plan superior.",
                  "format": "date-time",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "type": "string"
                },
                "plan_name": {
                  "description": "Nombre del paquete de destino.",
                  "type": "string"
                },
                "previous_plan_name": {
                  "description": "Paquete efectivo anterior a este cambio a plan superior.",
                  "type": "string"
                },
                "tenant_name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "email",
                "tenant_name",
                "plan_name",
                "previous_plan_name",
                "currency",
                "amount_cents",
                "applied_at",
                "ends_at"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "waffo_totals": {
            "description": "Pagos brutos y reembolsos acumulados de compras de servicios y recargas del monedero, agrupados por mes del pago original y moneda; no es una liquidación bancaria.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "currency": {
                  "description": "Identificador del comerciante que empieza por MER_.",
                  "type": "string"
                },
                "paid_cents": {
                  "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
                  "type": "integer"
                },
                "refunded_cents": {
                  "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
                  "type": "integer"
                }
              },
              "required": [
                "currency",
                "paid_cents",
                "refunded_cents"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [],
        "type": "object"
      },
      "RuntimeAPIPeriod": {
        "additionalProperties": false,
        "properties": {
          "api_calls": {
            "description": "Llamadas API de ejecución medidas correctas dentro del alcance; se excluyen las solicitudes administrativas.",
            "type": "integer"
          },
          "api_hard_limit": {
            "description": "Indica si las llamadas de ejecución se detienen al alcanzar el límite de cuota API.",
            "type": "boolean"
          },
          "api_overage_cents": {
            "description": "Cargo por exceso de API en centésimas en este ciclo.",
            "type": "integer"
          },
          "api_unit_micros": {
            "description": "Precio por llamada de ejecución excedente en millonésimas.",
            "minimum": 0,
            "type": "integer"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "included_api_calls": {
            "description": "null = ilimitado; 0 = ninguna llamada correcta incluida",
            "maximum": 1000000000000,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "month": {
            "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "type": "string"
          },
          "price_version": {
            "description": "Revisión de precio congelada; una entrada obsoleta puede provocar PLAN_VERSION_CONFLICT.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "RuntimeInput": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "data.activation_id de la última activación correcta. Obligatorio para validación, heartbeat, consume y desactivación; omítalo solo en el primer activate.",
            "format": "uuid",
            "type": "string"
          },
          "app_version": {
            "description": "Versión actual de la aplicación, major.minor.patch, por ejemplo 1.0.0. Obligatoria para reglas de mantenimiento o de intervalo de versiones. No presente una aplicación más nueva como si fuera una versión antigua.",
            "pattern": "^$|^(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})$",
            "type": "string"
          },
          "device_id": {
            "description": "SHA-256 hexadecimal en minúsculas de 64 caracteres calculado por el SDK a partir de las identidades de producto, sistema y hardware. No lo sustituya por un valor fijo.",
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "device_name": {
            "description": "Nombre en la consola, hasta 120 caracteres. No determina la identidad del equipo.",
            "maxLength": 120,
            "type": "string"
          },
          "device_profile": {
            "$ref": "#/components/schemas/DeviceProfile",
            "description": "Perfil del equipo generado por el SDK. Proporciónelo según los requisitos de las políticas para identidad de hardware, rechazo de VM o migración de hardware."
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "feature": {
            "description": "Identificador de la función consumida.",
            "maxLength": 64,
            "type": "string"
          },
          "identity_token": {
            "description": "JWT de identidad de Launch Ed25519 tipado y de un solo uso; ninguna declaración de derechos se considera prueba fiable de derechos de compra.",
            "maxLength": 12288,
            "type": "string",
            "writeOnly": true
          },
          "launch_connection_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "license_key": {
            "description": "Clave completa del cliente: lv_lic_ es una clave de licencia normal; lv_tmp_ sirve para el canje inicial de transferencia. Tras el éxito, el SDK usa una credencial lv_dev_ vinculada al equipo. No es una API Key administrativa del proveedor.",
            "pattern": "^(?:lv_(?:lic|tmp|dev)_[A-Za-z0-9_-]{43})?$",
            "type": "string",
            "writeOnly": true
          },
          "product_id": {
            "description": "UUID del producto; debe coincidir con el de la licencia.",
            "format": "uuid",
            "type": "string"
          },
          "quantity": {
            "description": "Unidades solicitadas para esta operación, entero 1–1000000000.",
            "maximum": 1000000000,
            "minimum": 1,
            "type": "integer"
          },
          "request_logout_ticket": {
            "description": "Negociación de capacidades del SDK. Solicite un ticket de cierre de sesión exclusivo de desvinculación cuando no se conserve ninguno para la vinculación actual. Omítalo cuando ya se conserve un ticket válido; los heartbeats en régimen estable evitan una consulta adicional de tickets.",
            "type": "boolean"
          },
          "reservation_id": {
            "description": "ID de reserva; envíalo para confirmar o cancelar.",
            "format": "uuid",
            "type": "string"
          },
          "reservation_seconds": {
            "default": 900,
            "description": "Duración opcional: 30–3600 segundos, 900 por defecto. Termina antes si se reinicia el período.",
            "maximum": 3600,
            "minimum": 30,
            "type": "integer"
          },
          "session_id": {
            "description": "Obligatorio para licencias flotantes: genere un UUID por instancia en ejecución y reutilícelo en las solicitudes de esa instancia. Opcional para licencias vinculadas a dispositivos.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "license_key",
          "device_id"
        ],
        "type": "object"
      },
      "RuntimePolicy": {
        "additionalProperties": false,
        "properties": {
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0
              },
              {
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "Intervalo de heartbeat en línea, en segundos. 0 deshabilita los heartbeats periódicos. La duración sin conexión se configura por separado.",
            "type": "integer"
          },
          "offline_mode": {
            "description": "limited: uso sin conexión de duración limitada; none: sin uso sin conexión; permanent: sin límite temporal adicional sin conexión, pero se sigue aplicando el vencimiento de la licencia.",
            "enum": [
              "limited",
              "none",
              "permanent"
            ],
            "type": "string"
          },
          "offline_seconds": {
            "description": "Segundos sin conexión permitidos: 1–31536000 para limited, 0 para none/permanent. No es el intervalo de heartbeat. Con los heartbeats habilitados, las nuevas políticas de uso limitado sin conexión deben cumplir offline_seconds \u003e= 3 × heartbeat_seconds; los arrendamientos de puestos flotantes también deben cubrir al menos tres intervalos de heartbeat.",
            "maximum": 31536000,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "heartbeat_seconds",
          "offline_mode",
          "offline_seconds"
        ],
        "type": "object"
      },
      "RuntimeResult": {
        "additionalProperties": false,
        "properties": {
          "activation_id": {
            "description": "UUID de vinculación del dispositivo o sesión de ejecución. Guárdelo para futuras solicitudes de licencia; no es una clave de licencia.",
            "format": "uuid",
            "type": "string"
          },
          "deactivated": {
            "description": "true cuando la desactivación termina correctamente. Libera una vinculación o sesión; no elimina la licencia ni reinicia su plazo.",
            "type": "boolean"
          },
          "device_key": {
            "description": "Credencial de dispositivo restringida y vinculada al dispositivo y a la versión de vinculación. Las credenciales de modo cuenta también requieren una sesión de autorización y un derecho vigentes; no pueden reactivar una vinculación liberada.",
            "pattern": "^lv_dev_[A-Za-z0-9_-]{43}$",
            "type": "string"
          },
          "heartbeat_seconds": {
            "anyOf": [
              {
                "const": 0,
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión."
              },
              {
                "description": "Intervalo de heartbeat en segundos: 0 lo deshabilita; en otro caso, 600–86400. La omisión usa los valores predeterminados del servidor; es independiente de la duración sin conexión.",
                "maximum": 86400,
                "minimum": 600,
                "type": "integer"
              }
            ],
            "description": "Intervalo de heartbeat sugerido en segundos. El campo de nivel superior puede omitirse para 0; runtime_policy.heartbeat_seconds en la firma es el valor autoritativo de la política.",
            "type": "integer"
          },
          "lease": {
            "$ref": "#/components/schemas/Lease",
            "description": "Caché de licencia firmada por el servidor. Acéptela solo después de verificarla con una clave pública de confianza fijada y comprobar producto/dispositivo. No se devuelve en la desactivación ni en consume."
          },
          "logout_ticket": {
            "$ref": "#/components/schemas/LogoutTicket",
            "description": "Capacidad exclusiva de desvinculación de esta instancia exacta de vinculación; manténgala fuera de los registros de solicitudes de ejecución."
          }
        },
        "required": [
          "activation_id"
        ],
        "type": "object"
      },
      "SDKConfig": {
        "additionalProperties": false,
        "example": {
          "allow_http": false,
          "app_version": "",
          "base_url": "https://www.licentivo.com",
          "cache_path": "",
          "device_name": "My application",
          "license_key": "",
          "product_id": "11111111-1111-4111-8111-111111111111",
          "trusted_keys": {
            "66666666-6666-4666-8666-666666666666": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
          }
        },
        "properties": {
          "allow_http": {
            "description": "Indica si se permite HTTP, solo para desarrollo local.",
            "type": "boolean"
          },
          "app_version": {
            "description": "Versión actual major.minor.patch del software.",
            "type": "string"
          },
          "base_url": {
            "description": "Origen del servidor de licencias, normalmente HTTPS, sin /api/v1.",
            "type": "string"
          },
          "cache_path": {
            "description": "Ruta de caché local; vacía permite que el SDK elija un directorio privado del usuario.",
            "type": "string"
          },
          "device_name": {
            "description": "Etiqueta de dispositivo legible para personas, no una identidad de seguridad.",
            "type": "string"
          },
          "license_key": {
            "description": "Clave de licencia completa del cliente proporcionada al activar. El código de inicialización del producto y los ejemplos descargados no contienen este secreto. Las solicitudes sin conexión usan la credencial proporcionada por el SDK.",
            "type": "string"
          },
          "product_id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "trusted_keys": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Asignación de UUID de clave pública a clave pública Base64URL para verificar con claves fijadas.",
            "type": "object"
          }
        },
        "required": [
          "base_url",
          "product_id",
          "license_key",
          "app_version",
          "device_name",
          "trusted_keys",
          "cache_path",
          "allow_http"
        ],
        "type": "object"
      },
      "SDKExampleInfo": {
        "additionalProperties": false,
        "properties": {
          "available": {
            "type": "boolean"
          },
          "can_configure": {
            "type": "boolean"
          },
          "duration_days": {
            "const": 3,
            "type": "integer"
          },
          "starts_at_first_activation": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "SDKExampleSetting": {
        "additionalProperties": false,
        "properties": {
          "available": {
            "type": "boolean"
          },
          "duration_days": {
            "const": 3,
            "type": "integer"
          },
          "policy_id": {
            "description": "UUID de la política dedicada; vacío antes de la configuración inicial.",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto dedicado; vacío antes de la configuración inicial.",
            "type": "string"
          }
        },
        "required": [
          "available",
          "duration_days",
          "product_id",
          "policy_id"
        ],
        "type": "object"
      },
      "SDKExampleSetup": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "SDKExampleTrial": {
        "additionalProperties": false,
        "properties": {
          "duration_days": {
            "const": 3,
            "type": "integer"
          },
          "expires_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "first_activated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "license_key": {
            "type": "string"
          },
          "starts_at_first_activation": {
            "type": "boolean"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "SDKInitializer": {
        "additionalProperties": false,
        "example": {
          "language": "go",
          "product_id": "11111111-1111-4111-8111-111111111111",
          "source": "const productID = \"11111111-1111-4111-8111-111111111111\"\nvar trustedKeys = map[string]string{\"66666666-6666-4666-8666-666666666666\": \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}\n",
          "trusted_keys": {
            "66666666-6666-4666-8666-666666666666": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
          }
        },
        "properties": {
          "language": {
            "description": "Identificador del lenguaje SDK para el paquete de descarga.",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          },
          "source": {
            "description": "Constantes públicas del producto para pegar en el código; sin secretos de activación de clientes.",
            "type": "string"
          },
          "trusted_keys": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Asignación de UUID de clave pública a clave pública Base64URL para verificar con claves fijadas.",
            "type": "object"
          }
        },
        "required": [
          "product_id",
          "trusted_keys",
          "language",
          "source"
        ],
        "type": "object"
      },
      "ScheduledPlan": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "type": "string"
          },
          "effective_month": {
            "description": "Mes UTC YYYY-MM en que entra en vigor la programación.",
            "type": "string"
          },
          "plan": {
            "description": "Identificador estable del plan de facturación del catálogo publicado.",
            "type": "string"
          },
          "sandbox": {
            "description": "Entorno de prueba",
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "ScopedRefundPreview": {
        "additionalProperties": false,
        "properties": {
          "affected_purchases": {
            "items": {
              "$ref": "#/components/schemas/ScopedRefundPurchase"
            },
            "type": "array"
          },
          "auto_renewal_disabled": {
            "type": "boolean"
          },
          "auto_renewal_enabled": {
            "type": "boolean"
          },
          "cancellation_at": {
            "const": "approval",
            "type": "string"
          },
          "pending_purchase_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "pending_upgrade_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "quote_hash": {
            "type": "string"
          },
          "quoted_at": {
            "format": "date-time",
            "type": "string"
          },
          "remaining_purchases": {
            "items": {
              "$ref": "#/components/schemas/ScopedRefundPurchase"
            },
            "type": "array"
          },
          "request": {
            "$ref": "#/components/schemas/CustomerRefundInput"
          },
          "scope": {
            "enum": [
              "purchase",
              "service"
            ],
            "type": "string"
          },
          "totals": {
            "items": {
              "$ref": "#/components/schemas/ScopedRefundTotal"
            },
            "type": "array"
          }
        },
        "required": [],
        "type": "object"
      },
      "ScopedRefundPurchase": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "type": "integer"
          },
          "approved_cents": {
            "type": "integer"
          },
          "currency": {
            "type": "string"
          },
          "ends_at": {
            "format": "date-time",
            "type": "string"
          },
          "maximum_cents": {
            "type": "integer"
          },
          "plan_name": {
            "type": "string"
          },
          "purchase_id": {
            "format": "uuid",
            "type": "string"
          },
          "requires_review": {
            "type": "boolean"
          },
          "source": {
            "type": "string"
          },
          "starts_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "ScopedRefundTotal": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "type": "integer"
          },
          "approved_cents": {
            "type": "integer"
          },
          "currency": {
            "type": "string"
          },
          "held_cents": {
            "type": "integer"
          },
          "manual_cents": {
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "ServiceCompensation": {
        "additionalProperties": false,
        "properties": {
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "incident_id": {
            "description": "UUID del incidente de servicio relacionado.",
            "format": "uuid",
            "type": "string"
          },
          "intervals": {
            "description": "Intervalos de tiempo compensados devueltos como cadena JSON.",
            "type": "string"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "type": "string"
          },
          "purchase_id": {
            "description": "UUID de la compra de paquete relacionada.",
            "format": "uuid",
            "type": "string"
          },
          "seconds": {
            "description": "Segundos añadidos como compensación de servicio.",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "incident_id",
          "mode",
          "seconds",
          "purchase_id",
          "created_at"
        ],
        "type": "object"
      },
      "ServiceCompensationList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/ServiceCompensation"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ServiceIncident": {
        "additionalProperties": false,
        "properties": {
          "affected_tenants": {
            "description": "Array de ID de espacios de trabajo codificado en JSON; [] es global.",
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "emergency": {
            "type": "boolean"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "starts_at": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "ServiceIncidentInput": {
        "additionalProperties": false,
        "properties": {
          "affected_tenants": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "body": {
            "type": "string"
          },
          "emergency": {
            "type": "boolean"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "expected_version": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "maintenance",
              "incident"
            ],
            "type": "string"
          },
          "starts_at": {
            "format": "date-time",
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "title",
          "body",
          "starts_at"
        ],
        "type": "object"
      },
      "ServiceIncidentList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ServiceIncident"
            },
            "type": "array"
          },
          "now": {
            "format": "date-time",
            "type": "string"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "SignedCapabilities": {
        "additionalProperties": false,
        "properties": {
          "app_version": {
            "description": "Versión de aplicación de esta operación de autorización de Launch.",
            "pattern": "^(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})\\.(0|[1-9][0-9]{0,8})$",
            "type": "string"
          },
          "binding_version": {
            "description": "Generación firmada de vinculación del dispositivo, asociada a la sesión de autorización.",
            "minimum": 1,
            "type": "integer"
          },
          "environment": {
            "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
            "enum": [
              "live",
              "sandbox"
            ],
            "type": "string"
          },
          "launch_connection_id": {
            "description": "UUID del recurso de Licentivo.",
            "format": "uuid",
            "type": "string"
          },
          "license_model": {
            "description": "Modelo de licencia de esta operación de autorización de Launch.",
            "enum": [
              "node_locked",
              "floating"
            ],
            "type": "string"
          },
          "maintenance_until": {
            "description": "Fecha límite de mantenimiento de esta operación de autorización de Launch.",
            "type": "integer"
          },
          "session_expires_at": {
            "description": "Vencimiento de sesión de esta operación de autorización de Launch.",
            "maximum": 253402300799,
            "type": "integer"
          },
          "session_id": {
            "description": "ID de sesión de esta operación de autorización de Launch.",
            "format": "uuid",
            "type": "string"
          },
          "version_released_at": {
            "description": "Fecha de publicación de la versión de esta operación de autorización de Launch.",
            "type": "integer"
          }
        },
        "required": [
          "license_model"
        ],
        "type": "object"
      },
      "SigningKey": {
        "additionalProperties": false,
        "properties": {
          "active": {
            "description": "Indicador de clave de firma actual; en una vista previa de política, recuento de dispositivos/sesiones activos.",
            "type": "boolean"
          },
          "algorithm": {
            "const": "Ed25519",
            "description": "Algoritmo de firma, actualmente Ed25519.",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "key_id": {
            "description": "UUID de la clave de firma del producto usado para seleccionar una clave de verificación.",
            "format": "uuid",
            "type": "string"
          },
          "public_key": {
            "description": "Clave pública Ed25519 codificada en Base64URL; sin material privado.",
            "type": "string"
          },
          "retired_at": {
            "anyOf": [
              {
                "description": "Marca temporal de retirada de la clave; null para claves actuales. Las claves públicas retiradas siguen disponibles para verificar.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de retirada de la clave; null para claves actuales. Las claves públicas retiradas siguen disponibles para verificar.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de retirada de la clave; null para claves actuales. Las claves públicas retiradas siguen disponibles para verificar."
          }
        },
        "required": [
          "key_id",
          "public_key",
          "active"
        ],
        "type": "object"
      },
      "StateResult": {
        "additionalProperties": false,
        "example": {
          "id": "33333333-3333-4333-8333-333333333333",
          "status": "pending"
        },
        "properties": {
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "status"
        ],
        "type": "object"
      },
      "Subscription": {
        "additionalProperties": false,
        "properties": {
          "current": {
            "$ref": "#/components/schemas/Period",
            "description": "Instantánea de facturación predeterminada del mes UTC actual."
          },
          "next": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PendingPlan",
                "description": "Plan predeterminado programado para el mes siguiente o null."
              },
              {
                "description": "Plan predeterminado programado para el mes siguiente o null.",
                "type": "null"
              }
            ],
            "description": "Plan predeterminado programado para el mes siguiente o null."
          },
          "sandbox": {
            "description": "Esta vista previa de suscripción devuelve true. Determine el entorno de pago real a partir de los ajustes de facturación/pago, no de este indicador de vista previa.",
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "Summary": {
        "additionalProperties": false,
        "properties": {
          "active_licenses": {
            "description": "Número de licencias activas no vencidas, incluidas las pendientes de primera activación.",
            "type": "integer"
          },
          "licenses": {
            "description": "Número de licencias no archivadas.",
            "type": "integer"
          },
          "policies": {
            "description": "Número de políticas no archivadas.",
            "type": "integer"
          },
          "products": {
            "description": "Recuento de productos en el resumen; grupos de uso de dispositivos por producto en las respuestas de uso.",
            "type": "integer"
          }
        },
        "required": [
          "products",
          "policies",
          "licenses",
          "active_licenses"
        ],
        "type": "object"
      },
      "SupportCase": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "type": "integer"
          },
          "approved_cents": {
            "type": "integer"
          },
          "cancellation_preview": {
            "description": "Vista previa de cancelación codificada en JSON.",
            "type": "string"
          },
          "cancellation_scope": {
            "type": "string"
          },
          "change_id": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "decision": {
            "type": "string"
          },
          "first_response_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "held_cents": {
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "incident_id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "manual_cents": {
            "type": "integer"
          },
          "manual_refund_pending": {
            "type": "boolean"
          },
          "mode": {
            "type": "string"
          },
          "order_id": {
            "type": "string"
          },
          "purchase_id": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "refund_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "refund_totals": {
            "description": "Totales por moneda codificados en JSON; nunca sume monedas distintas.",
            "type": "string"
          },
          "request_id": {
            "type": "string"
          },
          "response_due_at": {
            "format": "date-time",
            "type": "string"
          },
          "review_due_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "reviewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "scope_ids": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "SupportCaseDetail": {
        "additionalProperties": false,
        "properties": {
          "case": {
            "$ref": "#/components/schemas/SupportCase"
          },
          "messages": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "body": {
                  "type": "string"
                },
                "case_id": {
                  "format": "uuid",
                  "type": "string"
                },
                "created_at": {
                  "format": "date-time",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "type": "string"
                },
                "staff": {
                  "type": "boolean"
                },
                "user_id": {
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "original_refund_receipts": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "amount_cents": {
                  "minimum": 0,
                  "type": "integer"
                },
                "currency": {
                  "type": "string"
                },
                "intent_id": {
                  "format": "uuid",
                  "type": "string"
                },
                "refund_id": {
                  "type": "string"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "original_refunds": {
            "items": {
              "$ref": "#/components/schemas/ProviderRefund"
            },
            "type": "array"
          },
          "refund_payments": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "amount_cents": {
                  "minimum": 0,
                  "type": "integer"
                },
                "currency": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "type": "string"
                },
                "provider": {
                  "type": "string"
                },
                "provider_order_id": {
                  "type": "string"
                },
                "refunded_cents": {
                  "minimum": 0,
                  "type": "integer"
                },
                "status": {
                  "type": "string"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "refund_provider": {
            "type": "string"
          },
          "refund_unverified": {
            "type": "boolean"
          },
          "refunds": {
            "items": {
              "$ref": "#/components/schemas/PayPalRefund"
            },
            "type": "array"
          }
        },
        "required": [],
        "type": "object"
      },
      "SupportCaseInput": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "maxLength": 10000,
            "type": "string"
          },
          "kind": {
            "enum": [
              "support",
              "privacy",
              "appeal"
            ],
            "type": "string"
          },
          "request_id": {
            "maxLength": 80,
            "type": "string"
          },
          "subject": {
            "maxLength": 200,
            "type": "string"
          }
        },
        "required": [
          "subject",
          "body",
          "request_id"
        ],
        "type": "object"
      },
      "SupportCaseList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/SupportCase"
            },
            "type": "array"
          },
          "now": {
            "format": "date-time",
            "type": "string"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "SupportContact": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "description": "Correo público de asistencia y Reply-To para el correo de facturación. Vacío oculta el contacto. No cambia la dirección SMTP From existente ni crea un buzón.",
            "maxLength": 254,
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "SupportReadInput": {
        "additionalProperties": false,
        "properties": {
          "last_message_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "last_message_id"
        ],
        "type": "object"
      },
      "SupportReply": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "maxLength": 10000,
            "type": "string"
          },
          "expected_updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "enum": [
              "",
              "reviewing",
              "awaiting_info",
              "resolved"
            ],
            "type": "string"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "SupportUnread": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "case_id": {
                  "format": "uuid",
                  "type": "string"
                },
                "unread_messages": {
                  "type": "integer"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "unread_cases": {
            "type": "integer"
          },
          "unread_messages": {
            "type": "integer"
          },
          "unread_notices": {
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "SystemSettings": {
        "additionalProperties": false,
        "properties": {
          "database": {
            "$ref": "#/components/schemas/DatabaseStatus"
          },
          "environment": {
            "type": "string"
          },
          "mail": {
            "$ref": "#/components/schemas/MailSettings"
          },
          "public_url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "mail",
          "database"
        ],
        "type": "object"
      },
      "TLSCertificateInfo": {
        "additionalProperties": false,
        "properties": {
          "algorithm": {
            "type": "string"
          },
          "chain_length": {
            "maximum": 10,
            "minimum": 1,
            "type": "integer"
          },
          "domains": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "fingerprint_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "issuer": {
            "type": "string"
          },
          "not_after": {
            "format": "date-time",
            "type": "string"
          },
          "not_before": {
            "format": "date-time",
            "type": "string"
          },
          "self_signed": {
            "type": "boolean"
          },
          "serial_number": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "domains",
          "subject",
          "issuer",
          "not_before",
          "not_after",
          "fingerprint_sha256",
          "serial_number",
          "algorithm",
          "chain_length",
          "self_signed"
        ],
        "type": "object"
      },
      "TLSCertificateInput": {
        "additionalProperties": false,
        "properties": {
          "certificate_pem": {
            "description": "Certificado final PEM seguido de sus certificados intermedios, en orden. Debe coincidir con public_url. Solo el desarrollo local permite un certificado autofirmado.",
            "maxLength": 32768,
            "type": "string",
            "writeOnly": true
          },
          "expected_version": {
            "description": "Use version de GET /system/tls. Obligatorio para actualizar; una sustitución concurrente devuelve 409.",
            "type": "string"
          },
          "private_key_pem": {
            "description": "Clave PEM coincidente sin cifrar (PKCS#8, RSA o EC). Nunca se devuelve en ninguna respuesta.",
            "maxLength": 16384,
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "certificate_pem",
          "private_key_pem"
        ],
        "type": "object"
      },
      "TLSCertificateResult": {
        "additionalProperties": false,
        "properties": {
          "certificate": {
            "$ref": "#/components/schemas/TLSCertificateInfo"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "certificate",
          "version",
          "updated_at"
        ],
        "type": "object"
      },
      "TLSCertificateUpdateInput": {
        "additionalProperties": false,
        "properties": {
          "certificate_pem": {
            "description": "Certificado final PEM seguido de sus certificados intermedios, en orden. Debe coincidir con public_url. Solo el desarrollo local permite un certificado autofirmado.",
            "maxLength": 32768,
            "type": "string",
            "writeOnly": true
          },
          "expected_version": {
            "description": "Use version de GET /system/tls. Obligatorio para actualizar; una sustitución concurrente devuelve 409.",
            "type": "string"
          },
          "private_key_pem": {
            "description": "Clave PEM coincidente sin cifrar (PKCS#8, RSA o EC). Nunca se devuelve en ninguna respuesta.",
            "maxLength": 16384,
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "certificate_pem",
          "private_key_pem",
          "expected_version"
        ],
        "type": "object"
      },
      "TLSStatus": {
        "additionalProperties": false,
        "properties": {
          "address": {
            "type": "string"
          },
          "certificate": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TLSCertificateInfo"
              },
              {
                "type": "null"
              }
            ]
          },
          "enabled": {
            "type": "boolean"
          },
          "http_redirect_address": {
            "type": "string"
          },
          "public_url": {
            "type": "string"
          },
          "updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "public_url",
          "address",
          "http_redirect_address",
          "certificate",
          "version",
          "updated_at"
        ],
        "type": "object"
      },
      "TestMail": {
        "additionalProperties": false,
        "properties": {
          "to": {
            "format": "email",
            "type": "string"
          }
        },
        "required": [
          "to"
        ],
        "type": "object"
      },
      "Token": {
        "additionalProperties": false,
        "properties": {
          "token": {
            "maxLength": 100,
            "minLength": 32,
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "token"
        ],
        "type": "object"
      },
      "TokenPassword": {
        "additionalProperties": false,
        "properties": {
          "password": {
            "description": "12–128 bytes UTF-8, no caracteres",
            "type": "string",
            "writeOnly": true
          },
          "password_confirmation": {
            "description": "Obligatorio y debe coincidir exactamente con password",
            "type": "string",
            "writeOnly": true
          },
          "token": {
            "maxLength": 100,
            "minLength": 32,
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "token",
          "password",
          "password_confirmation"
        ],
        "type": "object"
      },
      "TransferCode": {
        "additionalProperties": false,
        "properties": {
          "activation_code": {
            "pattern": "^lv_tmp_[A-Za-z0-9_-]{43}$",
            "type": "string"
          },
          "activation_id": {
            "format": "uuid",
            "type": "string"
          },
          "expires_at": {
            "format": "date-time",
            "type": "string"
          },
          "license_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "activation_id",
          "activation_code",
          "expires_at",
          "license_id"
        ],
        "type": "object"
      },
      "TranslationCheck": {
        "additionalProperties": false,
        "properties": {
          "connected": {
            "type": "boolean"
          },
          "languages": {
            "items": {
              "$ref": "#/components/schemas/TranslationLanguage"
            },
            "type": "array"
          },
          "provider_usage": {
            "additionalProperties": false,
            "properties": {
              "character_count": {
                "type": "integer"
              },
              "character_limit": {
                "type": "integer"
              }
            },
            "required": [
              "character_count",
              "character_limit"
            ],
            "type": "object"
          }
        },
        "required": [
          "connected",
          "languages",
          "provider_usage"
        ],
        "type": "object"
      },
      "TranslationLanguage": {
        "additionalProperties": false,
        "properties": {
          "lang": {
            "description": "Código de destino BCP 47 devuelto por DeepL v3, como en-US o zh-Hant.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "usable_as_target": {
            "type": "boolean"
          }
        },
        "required": [
          "lang",
          "name",
          "usable_as_target"
        ],
        "type": "object"
      },
      "TranslationOptions": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "languages": {
            "items": {
              "$ref": "#/components/schemas/TranslationLanguage"
            },
            "type": "array"
          },
          "provider": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "languages",
          "provider"
        ],
        "type": "object"
      },
      "TranslationSettings": {
        "additionalProperties": false,
        "properties": {
          "checked_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "enabled": {
            "type": "boolean"
          },
          "key_configured": {
            "type": "boolean"
          },
          "languages": {
            "items": {
              "$ref": "#/components/schemas/TranslationLanguage"
            },
            "type": "array"
          },
          "local_usage": {
            "$ref": "#/components/schemas/TranslationUsage"
          },
          "monthly_limit": {
            "description": "Presupuesto mensual local de caracteres, independiente de la cuota de cuenta y las fechas de facturación de DeepL.",
            "type": "integer"
          },
          "requests_per_minute": {
            "type": "integer"
          },
          "tier": {
            "enum": [
              "free",
              "pro"
            ],
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "tier",
          "key_configured",
          "monthly_limit",
          "requests_per_minute",
          "languages",
          "checked_at",
          "version",
          "local_usage"
        ],
        "type": "object"
      },
      "TranslationSettingsInput": {
        "additionalProperties": false,
        "properties": {
          "api_key": {
            "description": "Se almacena cifrada. Vacío conserva la clave guardada salvo que clear_key sea true. Cambiar la clave/el nivel requiere otra comprobación correcta de conexión.",
            "maxLength": 1000,
            "type": "string",
            "writeOnly": true
          },
          "clear_key": {
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean"
          },
          "expected_version": {
            "type": "string"
          },
          "monthly_limit": {
            "maximum": 1000000000,
            "minimum": 1,
            "type": "integer"
          },
          "requests_per_minute": {
            "maximum": 60,
            "minimum": 1,
            "type": "integer"
          },
          "tier": {
            "enum": [
              "free",
              "pro"
            ],
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "tier",
          "monthly_limit",
          "requests_per_minute",
          "expected_version"
        ],
        "type": "object"
      },
      "TranslationUsage": {
        "additionalProperties": false,
        "properties": {
          "characters": {
            "description": "Caracteres facturados correctamente más reservas conservadoras de solicitudes con resultados desconocidos. Los aciertos de caché no añaden uso.",
            "type": "integer"
          },
          "month": {
            "description": "Mes natural UTC YYYY-MM.",
            "type": "string"
          }
        },
        "required": [
          "month",
          "characters"
        ],
        "type": "object"
      },
      "Trial": {
        "additionalProperties": false,
        "properties": {
          "base_url": {
            "type": "string"
          },
          "duration_days": {
            "const": 7,
            "type": "integer"
          },
          "expires_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "isolated": {
            "type": "boolean"
          },
          "key": {
            "type": "string",
            "writeOnly": true
          },
          "license_id": {
            "format": "uuid",
            "type": "string"
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          },
          "trusted_keys": {
            "items": {
              "$ref": "#/components/schemas/SigningKey"
            },
            "type": "array"
          }
        },
        "required": [
          "product_id",
          "license_id",
          "key",
          "trusted_keys"
        ],
        "type": "object"
      },
      "UpgradeList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/PlanUpgrade"
            },
            "type": "array"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "UpgradePart": {
        "additionalProperties": false,
        "description": "Cálculo congelado del cambio a plan superior para un periodo prepagado actual o futuro. change.amount_cents es la diferencia de este periodo; solo la cotización principal cobra la suma combinada.",
        "properties": {
          "change": {
            "$ref": "#/components/schemas/PlanUpgrade",
            "description": "Cambio de precio y derechos de esta parte del cambio a plan superior."
          },
          "ends_at": {
            "description": "Marca temporal de fin del paquete o ciclo, UTC; puede ser null antes de activar.",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "source": {
            "description": "Origen del derecho, como purchase o gift.",
            "enum": [
              "purchase",
              "gift",
              "auto_renewal"
            ],
            "type": "string"
          },
          "starts_at": {
            "description": "Marca temporal de inicio del paquete o ciclo, UTC.",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "source",
          "starts_at",
          "ends_at",
          "change"
        ],
        "type": "object"
      },
      "UpgradeQuoteInput": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "plan": {
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "type": "string"
          },
          "price_version": {
            "type": "string"
          },
          "request_id": {
            "maxLength": 80,
            "type": "string"
          }
        },
        "required": [
          "plan",
          "currency",
          "price_version",
          "request_id"
        ],
        "type": "object"
      },
      "Usage": {
        "additionalProperties": false,
        "properties": {
          "active_devices": {
            "description": "Para el mes UTC actual: ocupación actual de productos/dispositivos registrados, independiente del historial mensual de uso de dispositivos. Los registros ordinarios siguen contándose sin conexión hasta liberarse. Las sesiones flotantes solo cuentan mientras sus arrendamientos son válidos y se deduplican por hardware, recurriendo a la identidad del dispositivo como alternativa. La liberación o el vencimiento de la última sesión flotante devuelve capacidad; los registros válidos continúan al cruzar límites de meses de cuota. Se excluyen los registros aislados de pruebas SDK. Para otro mes UTC: historial de uso de dispositivos distintos registrado en ese mes.",
            "type": "integer"
          },
          "api_calls": {
            "description": "Llamadas activate, validate, heartbeat y deactivate correctas en el mes UTC y entorno de pago seleccionados. Se excluyen los fallos, las repeticiones idempotentes válidas, las comprobaciones locales y el consumo de funciones de software. Para comparar con la cuota del paquete comprado, use purchased.api_calls, que sigue el mes de cuota del paquete.",
            "type": "integer"
          },
          "api_period": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RuntimeAPIPeriod",
                "description": "Instantánea de la cuota API predeterminada de este mes UTC; puede ser null cuando está deshabilitada."
              },
              {
                "description": "Instantánea de la cuota API predeterminada de este mes UTC; puede ser null cuando está deshabilitada.",
                "type": "null"
              }
            ],
            "description": "Cuota API predeterminada del mes UTC; null si no está disponible. Con un paquete comprado, use purchased.api_calls y purchased.included_api_calls para el mes de cuota actual."
          },
          "billable_devices": {
            "description": "Sin compras activas en el mes UTC actual, ocupación actual de dispositivos bajo la cuota predeterminada. Para meses cerrados o cobertura prepagada, máximo de facturación guardado del periodo predeterminado. Las estimaciones usan al menos el máximo registrado; liberar un dispositivo no reembolsa cargos incurridos.",
            "type": "integer"
          },
          "estimated_total_cents": {
            "description": "Cargo mensual estimado de dispositivos del plan predeterminado, en centésimas de la unidad monetaria.",
            "type": "integer"
          },
          "estimated_total_micros": {
            "description": "Cargo mensual estimado de dispositivos del plan predeterminado, en millonésimas; no es la suma de todos los cargos de paquetes.",
            "type": "integer"
          },
          "month": {
            "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
            "type": "string"
          },
          "operations": {
            "description": "Recuentos de llamadas medidas correctas agrupadas por activate, validate, heartbeat y deactivate.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "count": {
                  "description": "Recuento del grupo actual o número de registros procesados por un lote.",
                  "type": "integer"
                },
                "operation": {
                  "description": "Nombre de operación; los lotes admiten create/renew/revoke/apply_policy y las solicitudes sin conexión activate/deactivate.",
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "overage_devices": {
            "description": "Dispositivos que superan la cuota incluida.",
            "type": "integer"
          },
          "period": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Period",
                "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo."
              },
              {
                "description": "Instantánea predeterminada de facturación mensual UTC; las reglas de medición usan month/day/lifetime y las filas de uso emplean la clave concreta del periodo.",
                "type": "null"
              }
            ],
            "description": "Cuota de facturación UTC predeterminada/histórica congelada. Es null cuando no existe ese periodo y la oferta predeterminada está deshabilitada; una compra activa sigue siendo utilizable."
          },
          "products": {
            "description": "Recuento de productos en el resumen; grupos de uso de dispositivos por producto en las respuestas de uso.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "active_devices": {
                  "description": "Ocupación actual por producto para el mes UTC actual; uso histórico de dispositivos distintos para un mes UTC anterior.",
                  "type": "integer"
                },
                "product_id": {
                  "description": "UUID del producto en el espacio de trabajo actual.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "type": "array"
          },
          "purchased": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PlanPurchase",
                "description": "Paquete activo actual de mes móvil o null."
              },
              {
                "description": "Paquete activo actual de mes móvil o null.",
                "type": "null"
              }
            ],
            "description": "Paquete activo en el entorno de pago actual, devuelto solo para el mes UTC actual. La cuota principal de dispositivos debe usar purchased.included_devices, no period.included_devices."
          },
          "purchased_active_devices": {
            "description": "Cuando purchased está presente: ocupación actual de productos/dispositivos registrados, independiente del historial mensual de uso de dispositivos. Los registros ordinarios siguen contándose sin conexión hasta liberarse. Las sesiones flotantes solo cuentan mientras sus arrendamientos son válidos y se deduplican por hardware, recurriendo a la identidad del dispositivo como alternativa. La liberación o el vencimiento de la última sesión flotante devuelve capacidad; los registros válidos continúan al cruzar límites de meses de cuota. Se excluyen los registros aislados de pruebas SDK.",
            "type": "integer"
          },
          "sandbox": {
            "description": "Entorno de prueba",
            "type": "boolean"
          },
          "timezone": {
            "description": "Zona horaria de agregación de uso, UTC.",
            "type": "string"
          },
          "warning": {
            "description": "normal, near_quota o quota_reached para la cuota predeterminada de dispositivos.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "UsageDevice": {
        "additionalProperties": false,
        "properties": {
          "device_id": {
            "description": "Huella de dispositivo con alcance de producto, normalmente de 64 caracteres hexadecimales minúsculos, derivada por el SDK.",
            "type": "string"
          },
          "first_seen_at": {
            "description": "Marca temporal de la primera actividad del dispositivo en este mes UTC.",
            "format": "date-time",
            "type": "string"
          },
          "last_seen_at": {
            "description": "Marca temporal de la última actividad de dispositivo observada por el servidor, UTC.",
            "format": "date-time",
            "type": "string"
          },
          "month": {
            "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
            "type": "string"
          },
          "product_id": {
            "description": "UUID del producto en el espacio de trabajo actual.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "UsageDeviceList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/UsageDevice"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "Verified": {
        "additionalProperties": false,
        "properties": {
          "verified": {
            "type": "boolean"
          }
        },
        "required": [
          "verified"
        ],
        "type": "object"
      },
      "VersionedActivationReleaseInput": {
        "additionalProperties": false,
        "properties": {
          "expected_generation": {
            "description": "Generación de vinculación mostrada en la lista actual de dispositivos. Obligatoria para vinculaciones de cuentas de Launch; las versiones obsoletas nunca liberan una vinculación posterior.",
            "minimum": 1,
            "type": "integer"
          },
          "operation_id": {
            "description": "UUID estable de operación para recuperación mediante reintentos. Obligatorio para vinculaciones de cuentas de Launch.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "WaffoCheck": {
        "additionalProperties": false,
        "properties": {
          "connected": {
            "description": "Activado",
            "type": "boolean"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          }
        },
        "required": [
          "connected",
          "mode"
        ],
        "type": "object"
      },
      "WaffoOrder": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
            "type": "integer"
          },
          "applied_at": {
            "anyOf": [
              {
                "description": "Fecha límite UTC de la ventana original de creación del proceso de pago.",
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hora UTC en que el pago verificado activó el servicio o abonó una recarga del monedero. purchase_id y upgrade_id null identifican una recarga."
          },
          "checkout_expires_at": {
            "description": "Fecha límite UTC de la ventana original de creación del proceso de pago.",
            "format": "date-time",
            "type": "string"
          },
          "created_at": {
            "description": "Fecha límite UTC de la ventana original de creación del proceso de pago.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "id": {
            "description": "Identificador local del pago de servicio.",
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "paid_at": {
            "anyOf": [
              {
                "description": "Fecha límite UTC de la ventana original de creación del proceso de pago.",
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hora UTC en que el backend verificó una transacción Waffo completada."
          },
          "provider_order_id": {
            "anyOf": [
              {
                "description": "Identificador del comerciante que empieza por MER_.",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Identificador ORD_ original recuperado de una respuesta API verificada."
          },
          "purchase_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Compra o renovación de servicio pendiente existente; mutuamente excluyente con upgrade_id."
          },
          "refunded_cents": {
            "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
            "type": "integer"
          },
          "request_id": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "status": {
            "description": "Ciclo de vida del pago, incluido paid_unapplied cuando los fondos cobrados requieren revisión y reembolso del operador.",
            "enum": [
              "creating",
              "created",
              "completed",
              "paid_unapplied",
              "partially_refunded",
              "refunded"
            ],
            "type": "string"
          },
          "upgrade_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cotización pendiente existente de cambio a plan superior; mutuamente excluyente con purchase_id."
          }
        },
        "required": [
          "id",
          "request_id",
          "mode",
          "provider_order_id",
          "purchase_id",
          "upgrade_id",
          "currency",
          "amount_cents",
          "refunded_cents",
          "status",
          "checkout_expires_at",
          "paid_at",
          "applied_at",
          "created_at"
        ],
        "type": "object"
      },
      "WaffoOrderInput": {
        "additionalProperties": false,
        "description": "Paga una compra/cambio a plan superior congelado o crea una recarga del monedero con amount y currency sin ID de servicio. Un request_id estable devuelve el pago original; cambiar su intención, importe o moneda se rechaza. Solo los pagos completados verificados de forma independiente abonan un monedero o activan servicio. Los retornos de recargas van al monedero. Los reintentos reutilizan la clave de idempotencia original del proveedor solo dentro de su ventana original de creación del proceso de pago.",
        "oneOf": [
          {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "amount"
                  ]
                },
                {
                  "required": [
                    "currency"
                  ]
                }
              ]
            },
            "properties": {
              "purchase_id": {
                "format": "uuid",
                "type": "string"
              },
              "upgrade_id": {
                "type": "null"
              }
            },
            "required": [
              "purchase_id"
            ]
          },
          {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "amount"
                  ]
                },
                {
                  "required": [
                    "currency"
                  ]
                }
              ]
            },
            "properties": {
              "purchase_id": {
                "type": "null"
              },
              "upgrade_id": {
                "format": "uuid",
                "type": "string"
              }
            },
            "required": [
              "upgrade_id"
            ]
          },
          {
            "properties": {
              "purchase_id": {
                "type": "null"
              },
              "upgrade_id": {
                "type": "null"
              }
            },
            "required": [
              "amount",
              "currency"
            ]
          }
        ],
        "properties": {
          "amount": {
            "description": "Obligatorio solo para una recarga del monedero. Importe decimal mostrado dentro de los límites configurados. Los pedidos de servicio rechazan importes del cliente.",
            "pattern": "^\\d+(?:\\.\\d{1,2})?$",
            "type": "string"
          },
          "currency": {
            "description": "Obligatorio solo para una recarga del monedero y debe estar habilitado para este proveedor.",
            "type": "string"
          },
          "overage_accepted": {
            "description": "Autorización explícita separada del exceso facturable mostrado.",
            "type": "boolean"
          },
          "policy_version": {
            "description": "Versión inmutable de la política publicada actualmente. Obligatoria para acciones protegidas por consentimiento después de que el operador publique una política, en ambos entornos de pago.",
            "type": "string"
          },
          "purchase_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Compra o renovación de servicio pendiente existente; mutuamente excluyente con upgrade_id."
          },
          "request_id": {
            "description": "Clave de solicitud estable generada por el llamante. Las repeticiones devuelven el proceso de pago original.",
            "maxLength": 80,
            "type": "string"
          },
          "terms_accepted": {
            "description": "Aceptación explícita, desmarcada por defecto.",
            "type": "boolean"
          },
          "upgrade_id": {
            "anyOf": [
              {
                "description": "Identificador local del pago de servicio.",
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cotización pendiente existente de cambio a plan superior; mutuamente excluyente con purchase_id."
          }
        },
        "required": [
          "request_id"
        ],
        "type": "object"
      },
      "WaffoOrderList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Elementos",
            "items": {
              "$ref": "#/components/schemas/WaffoOrder"
            },
            "type": "array"
          },
          "total": {
            "description": "Precio completo congelado del servicio en la unidad monetaria mínima; sin recarga de monedero ni pago mixto.",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "WaffoOrderResult": {
        "additionalProperties": false,
        "properties": {
          "approval_url": {
            "description": "URL autenticado de pago de corta duración o vacío después del pago, vencimiento o deshabilitación del canal. Nunca lo registre ni lo almacene en caché.",
            "type": "string"
          },
          "order": {
            "$ref": "#/components/schemas/WaffoOrder",
            "description": "Orden"
          },
          "return_url": {
            "description": "URL del panel del monedero para una recarga; URL de conciliación de precios para un pago de servicio. Un URL de retorno por sí solo nunca demuestra un pago.",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "order",
          "approval_url",
          "return_url"
        ],
        "type": "object"
      },
      "WaffoSettings": {
        "additionalProperties": false,
        "properties": {
          "currencies": {
            "description": "Monedas",
            "items": {
              "description": "Identificador del comerciante que empieza por MER_.",
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "description": "Activado",
            "type": "boolean"
          },
          "maximum_cents": {
            "description": "Recarga máxima del monedero en unidades monetarias menores; 100000 por defecto y no debe ser inferior a minimum_cents.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "merchant_id": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "minimum_cents": {
            "description": "Recarga mínima del monedero en unidades monetarias menores; 100 por defecto.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "private_key_configured": {
            "description": "Activado",
            "type": "boolean"
          },
          "product_id": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "store_id": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "version": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "webhook_public_key": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "webhook_url": {
            "description": "URL del webhook",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "mode",
          "merchant_id",
          "store_id",
          "product_id",
          "currencies",
          "private_key_configured",
          "webhook_public_key",
          "version",
          "webhook_url"
        ],
        "type": "object"
      },
      "WaffoSettingsInput": {
        "additionalProperties": false,
        "properties": {
          "clear_private_key": {
            "description": "Activado",
            "type": "boolean"
          },
          "currencies": {
            "description": "Monedas",
            "items": {
              "description": "Identificador del comerciante que empieza por MER_.",
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "description": "Activado",
            "type": "boolean"
          },
          "expected_version": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "maximum_cents": {
            "description": "Recarga máxima del monedero en unidades monetarias menores; 100000 por defecto y no debe ser inferior a minimum_cents.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "merchant_id": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "minimum_cents": {
            "description": "Recarga mínima del monedero en unidades monetarias menores; 100 por defecto.",
            "maximum": 100000000,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "description": "Entorno de pago. Los registros sandbox y live están aislados.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "private_key": {
            "description": "Clave privada de firma RSA. Cifrada en reposo; vacío conserva la clave guardada.",
            "maxLength": 8192,
            "type": "string",
            "writeOnly": true
          },
          "product_id": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "store_id": {
            "description": "Identificador del comerciante que empieza por MER_.",
            "type": "string"
          },
          "webhook_public_key": {
            "description": "Sustitución opcional de la clave pública oficial del webhook. Vacío usa la clave del SDK para el entorno seleccionado.",
            "maxLength": 8192,
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "mode",
          "merchant_id",
          "store_id",
          "product_id",
          "currencies",
          "expected_version"
        ],
        "type": "object"
      },
      "WaffoWebhookEvent": {
        "description": "Evento Waffo bruto autenticado con X-Waffo-Signature, la clave pública del entorno seleccionado, store y mode. Los pagos/reembolsos se verifican independientemente mediante la API.",
        "type": "object"
      },
      "Wallet": {
        "additionalProperties": false,
        "properties": {
          "balance_cents": {
            "description": "Saldo del monedero o saldo posterior al movimiento, en centésimas.",
            "type": "integer"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "WalletEntry": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "description": "Importe en centésimas; los asientos contables pueden ser abonos positivos o cargos negativos.",
            "type": "integer"
          },
          "balance_cents": {
            "description": "Saldo del monedero o saldo posterior al movimiento, en centésimas.",
            "type": "integer"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "Código de moneda de tres letras mayúsculas, como USD.",
            "pattern": "^[A-Z]{3}$",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "kind": {
            "description": "plan_upgrade registra un cambio pagado a un plan superior. paypal_refund_reserve retiene fondos disponibles del monedero; paypal_refund_release elimina esa retención; paypal_refund registra el reembolso en dinero confirmado. Los movimientos de reserva/liberación no son pagos en dinero y se compensan al completar la liquidación.",
            "type": "string"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "reference": {
            "description": "Referencia de negocio relacionada usada para el seguimiento.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "WalletEntryList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/WalletEntry"
            },
            "type": "array"
          },
          "limit": {
            "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
            "type": "integer"
          },
          "offset": {
            "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
            "type": "integer"
          },
          "total": {
            "description": "Total de registros coincidentes, no la longitud de la página actual.",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "WalletRefundRequest": {
        "additionalProperties": false,
        "properties": {
          "amount_cents": {
            "minimum": 1,
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "customer_email": {
            "description": "Solo lista de administradores.",
            "type": "string"
          },
          "decision": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "order_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "refund_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "refund_status": {
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          },
          "review_status": {
            "enum": [
              "pending",
              "approved",
              "declined",
              "cancelled"
            ],
            "type": "string"
          },
          "reviewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "enum": [
              "pending_review",
              "refund_pending",
              "refunded",
              "refund_failed",
              "declined",
              "cancelled"
            ],
            "type": "string"
          },
          "tenant_name": {
            "description": "Solo lista de administradores.",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "order_id",
          "mode",
          "currency",
          "amount_cents",
          "reason",
          "status",
          "review_status"
        ],
        "type": "object"
      },
      "WalletRefundRequestInput": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "Importe positivo, limitado tanto por el valor del pedido no reembolsado como por el crédito actual no gastado del monedero.",
            "pattern": "^[0-9]+(?:\\.[0-9]{1,2})?$",
            "type": "string"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "reason": {
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "amount",
          "reason",
          "request_id",
          "mode"
        ],
        "type": "object"
      },
      "WalletRefundRequestList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/WalletRefundRequest"
            },
            "type": "array"
          },
          "limit": {
            "type": "integer"
          },
          "mode": {
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "offset": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "mode"
        ],
        "type": "object"
      },
      "WalletRefundReview": {
        "additionalProperties": false,
        "properties": {
          "approve": {
            "type": "boolean"
          },
          "decision": {
            "maxLength": 1000,
            "minLength": 1,
            "type": "string"
          },
          "expected_updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "approve",
          "decision"
        ],
        "type": "object"
      },
      "WalletResult": {
        "additionalProperties": false,
        "properties": {
          "currencies": {
            "description": "Códigos de moneda permitidos en este entorno.",
            "items": {
              "pattern": "^[A-Z]{3}$",
              "type": "string"
            },
            "type": "array"
          },
          "items": {
            "description": "Registros devueltos; consulte items[] para los campos de cada elemento. Algunas colecciones vacías pueden ser null; consulte el tipo.",
            "items": {
              "$ref": "#/components/schemas/Wallet"
            },
            "type": "array"
          },
          "maximum_cents": {
            "description": "Recarga máxima del canal habilitado de recarga de monedero, en unidades monetarias menores.",
            "type": "integer"
          },
          "minimum_cents": {
            "description": "Recarga mínima del canal habilitado de recarga de monedero, en unidades monetarias menores.",
            "type": "integer"
          },
          "mode": {
            "description": "Plazo de licencia: perpetual, timed o trial; los objetos de facturación usan el modo de pago sandbox o live.",
            "enum": [
              "sandbox",
              "live"
            ],
            "type": "string"
          },
          "payment_channels": {
            "description": "Configuración de canales de pago disponibles. Muestre solo los canales habilitados que coincidan con el entorno activo de facturación y la moneda de compra.",
            "items": {
              "$ref": "#/components/schemas/PaymentChannel"
            },
            "type": "array"
          },
          "paypal_enabled": {
            "description": "Indica si PayPal está habilitado en este entorno de pago.",
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "WebhookAttempt": {
        "additionalProperties": false,
        "properties": {
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "delivery_id": {
            "description": "UUID de la tarea de entrega para este intento.",
            "format": "uuid",
            "type": "string"
          },
          "duration_ms": {
            "description": "Duración de entrega en milisegundos.",
            "type": "integer"
          },
          "error": {
            "description": "Objeto de error o categoría de fallo de entrega; consulte los campos secundarios o el tipo actual.",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "number": {
            "description": "Número de secuencia acumulado del intento.",
            "type": "integer"
          },
          "status_code": {
            "description": "Estado HTTP de este intento; puede ser 0 en un fallo de transporte.",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "delivery_id",
          "number",
          "status_code",
          "error",
          "duration_ms",
          "created_at"
        ],
        "type": "object"
      },
      "WebhookDelivery": {
        "additionalProperties": false,
        "properties": {
          "attempts": {
            "description": "Recuento acumulado de intentos de tarea.",
            "type": "integer"
          },
          "available_at": {
            "description": "Primera hora UTC en que puede ejecutarse la tarea.",
            "format": "date-time",
            "type": "string"
          },
          "created_at": {
            "description": "Hora de creación en UTC; las solicitudes sin conexión usan segundos Unix.",
            "format": "date-time",
            "type": "string"
          },
          "delivered_at": {
            "anyOf": [
              {
                "description": "Marca temporal de entrega correcta o null.",
                "format": "date-time",
                "type": "string"
              },
              {
                "description": "Marca temporal de entrega correcta o null.",
                "type": "null"
              }
            ],
            "description": "Marca temporal de entrega correcta o null."
          },
          "endpoint_id": {
            "description": "UUID del endpoint de webhook.",
            "format": "uuid",
            "type": "string"
          },
          "event_id": {
            "description": "UUID del evento original; úselo para la deduplicación del receptor.",
            "format": "uuid",
            "type": "string"
          },
          "id": {
            "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
            "format": "uuid",
            "type": "string"
          },
          "last_error": {
            "description": "Categoría del fallo más reciente; puede estar vacía.",
            "type": "string"
          },
          "last_status": {
            "description": "Estado de la respuesta HTTP más reciente; puede ser 0 si no llegó una respuesta.",
            "type": "integer"
          },
          "status": {
            "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "endpoint_id",
          "event_id",
          "status",
          "attempts",
          "available_at",
          "last_status",
          "last_error",
          "delivered_at",
          "created_at"
        ],
        "type": "object"
      },
      "WebhookEvent": {
        "description": "Evento PayPal firmado exacto, verificado con la API de PayPal",
        "type": "object"
      },
      "WebhookReceived": {
        "additionalProperties": false,
        "properties": {
          "ignored": {
            "type": "boolean"
          },
          "received": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      }
    },
    "securitySchemes": {
      "closureExport": {
        "description": "Credencial de descarga restringida de 15 minutos, nunca una sesión del panel. Producción usa __Host-licentivo_closure_export; siempre limitada por la fecha límite original del cierre.",
        "in": "cookie",
        "name": "licentivo_closure_export",
        "type": "apiKey"
      },
      "customerSession": {
        "description": "Producción usa __Host-licenova_customer; la identidad del comprador es independiente de la sesión del proveedor.",
        "in": "cookie",
        "name": "licenova_customer",
        "type": "apiKey"
      },
      "managementKey": {
        "bearerFormat": "lv_api_...",
        "scheme": "bearer",
        "type": "http"
      },
      "session": {
        "description": "Producción usa __Host-licenova_session",
        "in": "cookie",
        "name": "licenova_session",
        "type": "apiKey"
      }
    }
  },
  "info": {
    "description": "API de administración y licencias de Licentivo. Admite autorizaciones de ejecución firmadas, licencias vinculadas a dispositivos y flotantes, cuotas de dispositivos activados actualmente, uso mensual de API, funciones de software medidas por consumo, sesiones de cuentas de Launch, paquetes prepagados, regalos, renovación automática con monedero y cambios a planes superiores de toda la cobertura. PayPal, Paddle y Waffo admiten pagos verificados y reembolsos por el método original. Incluye políticas de clientes, cancelación con alcance aprobado, asistencia, compensaciones, exportación de datos y cierre lógico de cuentas. Los entornos de pago y las monedas están aislados; las credenciales privadas se cifran y nunca se devuelven.",
    "title": "API de Licentivo",
    "version": "0.12.0",
    "x-document-language": "es"
  },
  "openapi": "3.1.0",
  "paths": {
    "/api/v1/account/closure-export.zip": {
      "get": {
        "description": "Se vuelven a comprobar la credencial y la fecha límite original del cierre en cada solicitud y después de generar los datos. Restaurar una copia de seguridad no puede reiniciar la ventana.",
        "operationId": "get__api_v1_account_closure_export_zip",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/zip": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "closureExport": []
          }
        ],
        "summary": "Descargar durante la ventana de 30 días tras el cierre"
      }
    },
    "/api/v1/account/closure-export/session": {
      "post": {
        "description": "Requiere el correo original verificado y la contraseña, además de un cierre confirmado cuyo plazo exacto de 30 días aún no haya terminado. La cookie de 15 minutos está limitada por la fecha límite original, sujeta a límites de frecuencia y no puede autorizar el acceso normal a la API/al panel.",
        "operationId": "post__api_v1_account_closure_export_session",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClosureExportLogin"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ClosureExportCredential"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [],
        "summary": "Verificar una cuenta cerrada para una exportación restringida"
      }
    },
    "/api/v1/account/data-export": {
      "get": {
        "description": "Las descargas de propietarios incluyen CSV de negocio del espacio de trabajo. El archivo personal de un miembro contiene su perfil, publicaciones y solicitudes. Se excluyen secretos/hashes de credenciales y claves privadas de firma.",
        "operationId": "get__api_v1_account_data_export",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/zip": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Descargar los datos personales y autorizados propios",
        "x-required-role": "session"
      }
    },
    "/api/v1/account/deletions": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_account_deletions",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AccountClosureList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar solicitudes propias de cierre lógico",
        "x-required-role": "session"
      },
      "post": {
        "description": "El cierre por el propietario debe seleccionar workspace; un miembro solo puede cerrar su cuenta. La confirmación revoca sesiones/claves API, pero conserva los datos. Se permite exportar durante 30 días después de confirmar.",
        "operationId": "post__api_v1_account_deletions",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountClosureInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AccountClosure"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Solicitar el cierre lógico de una cuenta o espacio de trabajo",
        "x-required-role": "session"
      }
    },
    "/api/v1/account/deletions/{id}/cancel": {
      "post": {
        "description": "",
        "operationId": "post__api_v1_account_deletions__id__cancel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Retirar un cierre sin confirmar",
        "x-required-role": "session"
      }
    },
    "/api/v1/account/legal-acceptances": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_account_legal_acceptances",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LegalAcceptanceList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar los propios recibos de aceptación legal",
        "x-required-role": "session"
      }
    },
    "/api/v1/account/profile": {
      "patch": {
        "description": "Requiere la contraseña actual. El nuevo correo de acceso recibe un enlace de verificación de un solo uso válido durante 30 minutos. El correo de acceso verificado actual y el acceso no cambian hasta la confirmación.",
        "operationId": "patch__api_v1_account_profile",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountCorrection"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Corregir el nombre propio o solicitar un cambio del correo de acceso",
        "x-required-role": "session"
      }
    },
    "/api/v1/activate": {
      "post": {
        "description": "Autenticación mediante product_id + license_key + device_id. Sin cookie/CSRF/clave del proveedor. activation_id es obligatorio salvo para activate. Cada solicitud correcta consume una llamada API; las repeticiones idempotentes y los fallos no consumen llamadas. Los excesos cargan el monedero atómicamente o devuelven API_QUOTA_EXCEEDED/API_BALANCE_INSUFFICIENT. La cuota de dispositivos del espacio de trabajo sigue las activaciones actuales. La liberación devuelve capacidad; el vencimiento de un arrendamiento flotante también devuelve capacidad, mientras que un registro ordinario sin conexión sigue contándose. El exceso de dispositivos solo se cobra cuando el máximo de facturación del mes de cuota supera la capacidad ya pagada; la liberación no reembolsa cargos ya incurridos. El uso de API es independiente.",
        "operationId": "post_api_v1_activate",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RuntimeResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Activación en ejecución"
      }
    },
    "/api/v1/activations": {
      "get": {
        "operationId": "get_api_v1_activations",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "license_id",
            "schema": {
              "description": "UUID de licencia, distinto del secreto lv_lic_.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "product_id",
            "schema": {
              "description": "UUID del producto en el espacio de trabajo actual.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
              "enum": [
                "active",
                "released"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "description": "Texto de búsqueda; los campos de destino y la longitud máxima dependen de la operación.",
              "maxLength": 120,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "created_at": "2026-10-18T00:00:00Z",
                        "device_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                        "device_name": "Office PC",
                        "generation": 1,
                        "id": "44444444-4444-4444-8444-444444444444",
                        "last_seen_at": "2026-10-18T00:00:00Z",
                        "license_id": "33333333-3333-4333-8333-333333333333",
                        "product_id": "11111111-1111-4111-8111-111111111111",
                        "released_at": null,
                        "status": "active",
                        "virtual_machine": false
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ActivationList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar activaciones",
        "x-management-reference": {
          "group": "devices"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/activations/{id}/release": {
      "post": {
        "operationId": "post_api_v1_activations_by_id_release",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "expected_generation": 1,
                "operation_id": "11111111-1111-4111-8111-111111111111"
              },
              "schema": {
                "$ref": "#/components/schemas/VersionedActivationReleaseInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "status": "released"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/StateResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Liberar activación",
        "x-management-reference": {
          "group": "devices"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/api-keys": {
      "get": {
        "operationId": "get_api_v1_api-keys",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "allow_http": false,
                        "created_at": "2026-10-18T00:00:00Z",
                        "expires_at": "2026-10-18T00:00:00Z",
                        "id": "33333333-3333-4333-8333-333333333333",
                        "name": "Report app",
                        "prefix": "lv_api_AAAAAAA",
                        "revoked": false,
                        "scope": "read"
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/KeyList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar claves API",
        "x-management-reference": {
          "group": "keys"
        },
        "x-required-role": "owner",
        "x-required-scope": "owner_session"
      },
      "post": {
        "operationId": "post_api_v1_api-keys",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "description": "Obligatorio para escrituras autenticadas mediante cookie; obtenga data.csrf_token de GET /api/v1/auth/csrf y conserve las cookies.",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "allow_http": false,
                "expires_days": 90,
                "name": "Order system",
                "scope": "write"
              },
              "schema": {
                "$ref": "#/components/schemas/KeyCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "expires_at": "2027-01-16T00:00:00Z",
                    "id": "33333333-3333-4333-8333-333333333333",
                    "key": "lv_api_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                    "prefix": "lv_api_AAAAAAA"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/KeySecret",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Crear clave API",
        "x-management-reference": {
          "group": "keys"
        },
        "x-required-role": "owner",
        "x-required-scope": "owner_session"
      }
    },
    "/api/v1/api-keys/{id}": {
      "delete": {
        "operationId": "delete_api_v1_api-keys_by_id",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "description": "Obligatorio para escrituras autenticadas mediante cookie; obtenga data.csrf_token de GET /api/v1/auth/csrf y conserve las cookies.",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Revocar clave API",
        "x-management-reference": {
          "group": "keys"
        },
        "x-required-role": "owner",
        "x-required-scope": "owner_session"
      },
      "patch": {
        "description": "Requiere una sesión Owner y un token CSRF. Actualiza solo esta clave activa; la rotación conserva el ajuste. No modifica conexiones Launch ni autorizaciones de ejecución existentes. Este ajuste no habilita HTTP en la API de Licentivo.",
        "operationId": "patch_api_v1_api-keys_by_id",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "description": "Obligatorio para escrituras autenticadas mediante cookie; obtenga data.csrf_token de GET /api/v1/auth/csrf y conserve las cookies.",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "allow_http": true
              },
              "schema": {
                "$ref": "#/components/schemas/KeyUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "allow_http": false,
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/KeyUpdated",
                      "description": "Response data for the completed operation."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Actualizar el acceso HTTP a sitios",
        "x-management-reference": {
          "group": "keys"
        },
        "x-required-role": "owner",
        "x-required-scope": "owner_session"
      }
    },
    "/api/v1/api-keys/{id}/rotate": {
      "post": {
        "operationId": "post_api_v1_api-keys_by_id_rotate",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "description": "Obligatorio para escrituras autenticadas mediante cookie; obtenga data.csrf_token de GET /api/v1/auth/csrf y conserve las cookies.",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "key": "lv_api_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
                    "prefix": "lv_api_BBBBBBB"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/KeyRotated",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Rotar clave API",
        "x-management-reference": {
          "group": "keys"
        },
        "x-required-role": "owner",
        "x-required-scope": "owner_session"
      }
    },
    "/api/v1/audit-logs": {
      "get": {
        "operationId": "get_api_v1_audit-logs",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "action": "license.create",
                        "actor_id": "33333333-3333-4333-8333-333333333333",
                        "actor_kind": "api_key",
                        "created_at": "2026-10-18T00:00:00Z",
                        "id": "33333333-3333-4333-8333-333333333333",
                        "request_id": "55555555-5555-4555-8555-555555555555",
                        "resource_id": ""
                      }
                    ],
                    "limit": 25,
                    "offset": 0
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AuditList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar registros de auditoría",
        "x-management-reference": {
          "group": "usage"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/auth/accept-invitation": {
      "post": {
        "operationId": "post_api_v1_auth_accept-invitation",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenPassword"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PasswordSet"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Aceptar la invitación"
      }
    },
    "/api/v1/auth/change-password": {
      "post": {
        "operationId": "post_api_v1_auth_change-password",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangePassword"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PasswordSet"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Revocar todas las credenciales de la cuenta y establecer la contraseña"
      }
    },
    "/api/v1/auth/confirm-email-change": {
      "post": {
        "description": "Verifica el desafío cifrado de un solo uso. Solo una confirmación correcta cambia el correo de acceso, lo verifica y revoca las sesiones, claves API y enlaces de autenticación existentes. Los desafíos vencidos, sustituidos o invalidados por una contraseña no pueden modificar la cuenta.",
        "operationId": "post__api_v1_auth_confirm_email_change",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailChangeConfirmation"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [],
        "summary": "Confirmar un nuevo correo de acceso"
      }
    },
    "/api/v1/auth/csrf": {
      "get": {
        "operationId": "get_api_v1_auth_csrf",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CSRF"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Emitir un token CSRF vinculado a la sesión"
      }
    },
    "/api/v1/auth/forgot-password": {
      "post": {
        "operationId": "post_api_v1_auth_forgot-password",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Email"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Notice"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Contraseña olvidada"
      }
    },
    "/api/v1/auth/login": {
      "post": {
        "operationId": "post_api_v1_auth_login",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Login"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CSRF"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Inicio de sesión"
      }
    },
    "/api/v1/auth/logout": {
      "post": {
        "operationId": "post_api_v1_auth_logout",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LoggedOut"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Revocar la sesión actual"
      }
    },
    "/api/v1/auth/me": {
      "get": {
        "operationId": "get_api_v1_auth_me",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Me"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Cuenta actual autenticada mediante cookie"
      }
    },
    "/api/v1/auth/register": {
      "post": {
        "description": "Los términos publicados requieren policy_version y aceptación explícita en ambos entornos de pago. Los excesos de servicio facturables requieren además overage_accepted. Antes de la primera publicación de políticas, no se registra el consentimiento a borradores y cada operación sigue sus comprobaciones normales de registro, precios y pago.",
        "operationId": "post_api_v1_auth_register",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Register"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Notice"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Registro"
      }
    },
    "/api/v1/auth/resend-verification": {
      "post": {
        "operationId": "post_api_v1_auth_resend-verification",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Email"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Notice"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Reenviar la verificación"
      }
    },
    "/api/v1/auth/reset-password": {
      "post": {
        "operationId": "post_api_v1_auth_reset-password",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenPassword"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PasswordSet"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Restablecer la contraseña"
      }
    },
    "/api/v1/auth/verify-email": {
      "post": {
        "operationId": "post_api_v1_auth_verify-email",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Token"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Verified"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Verificación del correo"
      }
    },
    "/api/v1/billing/auto-renewal": {
      "get": {
        "description": "Solo sesiones. PATCH requiere el rol Owner del espacio de trabajo. Deshabilitada por defecto. Habilitarla requiere saldo suficiente en el modo y la moneda actuales para una renovación, además de revisar el último plan pagado, el plazo ofrecido y la versión del precio. Al vencer solo se cargan fondos del monedero, nunca PayPal ni una tarjeta. Un worker que se ejecuta cada minuto y las modificaciones en ejecución procesan las renovaciones vencidas bajo un bloqueo del tenant. Los intentos repetidos cobran una sola vez. Si faltan fondos, se espera una recarga; los cambios de precio, plan o disponibilidad suspenden los cargos hasta obtener un consentimiento nuevo. Deshabilitar cancela cargos automáticos futuros, no la cobertura pagada.",
        "operationId": "get_api_v1_billing_auto_renewal",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "next_renewal_at": null,
                    "setting": {
                      "amount_cents": 0,
                      "currency": "USD",
                      "enabled": true,
                      "mode": "sandbox",
                      "plan": "starter",
                      "plan_name": "Starter",
                      "policy_version": "",
                      "price_version": "example-v1",
                      "status": "disabled",
                      "term_months": 1,
                      "updated_at": "2026-10-18T00:00:00Z",
                      "version": ""
                    }
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AutoRenewalResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "DEFAULT_PLAN_DISABLED",
                    "message": "The default allowance plan has not been enabled by the administrator"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar la configuración de renovación automática",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      },
      "patch": {
        "description": "Solo sesiones. PATCH requiere el rol Owner del espacio de trabajo. Deshabilitada por defecto. Habilitarla requiere saldo suficiente en el modo y la moneda actuales para una renovación, además de revisar el último plan pagado, el plazo ofrecido y la versión del precio. Al vencer solo se cargan fondos del monedero, nunca PayPal ni una tarjeta. Un worker que se ejecuta cada minuto y las modificaciones en ejecución procesan las renovaciones vencidas bajo un bloqueo del tenant. Los intentos repetidos cobran una sola vez. Si faltan fondos, se espera una recarga; los cambios de precio, plan o disponibilidad suspenden los cargos hasta obtener un consentimiento nuevo. Deshabilitar cancela cargos automáticos futuros, no la cobertura pagada. Los términos publicados requieren policy_version y aceptación explícita en ambos entornos de pago. Los excesos de servicio facturables requieren además overage_accepted. Antes de la primera publicación de políticas, no se registra el consentimiento a borradores y cada operación sigue sus comprobaciones normales de registro, precios y pago.",
        "operationId": "patch_api_v1_billing_auto_renewal",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutoRenewalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AutoRenewal"
                    },
                    "request_id": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Habilitar o deshabilitar la renovación con monedero consentida explícitamente"
      }
    },
    "/api/v1/billing/invoices": {
      "get": {
        "operationId": "get_api_v1_billing_invoices",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "month",
            "schema": {
              "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
              "pattern": "^[0-9]{4}-[0-9]{2}$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "active_devices": 0,
                        "base_covered": false,
                        "base_micros": 0,
                        "created_at": "2026-10-18T00:00:00Z",
                        "currency": "USD",
                        "finalized_at": null,
                        "id": "33333333-3333-4333-8333-333333333333",
                        "included_devices": 0,
                        "month": "2026-09",
                        "overage_devices": 0,
                        "paid_at": null,
                        "payment_mode": "sandbox",
                        "plan": "starter",
                        "plan_name": "Starter",
                        "price_version": "example-v1",
                        "refunded_at": null,
                        "status": "draft",
                        "total_cents": 0,
                        "total_micros": 0,
                        "unit_micros": 0,
                        "voided_at": null
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/InvoiceList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar facturas",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/billing/invoices/{id}": {
      "get": {
        "operationId": "get_api_v1_billing_invoices_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "active_devices": 0,
                    "base_covered": false,
                    "base_micros": 0,
                    "created_at": "2026-10-18T00:00:00Z",
                    "currency": "USD",
                    "finalized_at": null,
                    "id": "33333333-3333-4333-8333-333333333333",
                    "included_devices": 0,
                    "month": "2026-09",
                    "overage_devices": 0,
                    "paid_at": null,
                    "payment_mode": "sandbox",
                    "plan": "starter",
                    "plan_name": "Starter",
                    "price_version": "example-v1",
                    "refunded_at": null,
                    "status": "draft",
                    "total_cents": 0,
                    "total_micros": 0,
                    "unit_micros": 0,
                    "voided_at": null
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Invoice",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar factura",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/billing/invoices/{id}/export.csv": {
      "get": {
        "operationId": "get_api_v1_billing_invoices_by_id_export_csv",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {
                "example": "invoice_id,month,currency,status,plan,price_version,active_devices,included_devices,overage_devices,base_micros,unit_micros,total_micros,total_cents\n",
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Exportar factura",
        "x-csv-columns": [
          "invoice_id",
          "month",
          "currency",
          "status",
          "plan",
          "price_version",
          "active_devices",
          "included_devices",
          "overage_devices",
          "base_micros",
          "unit_micros",
          "total_micros",
          "total_cents"
        ],
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/billing/invoices/{id}/finalize": {
      "post": {
        "operationId": "post_api_v1_billing_invoices_by_id_finalize",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "status": "finalized"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/StateResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Finalizar factura",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/billing/invoices/{id}/pay": {
      "post": {
        "description": "Antes de un pago nuevo se requiere la aceptación explícita de la política actual. La repetición de un pago ya realizado conserva su recibo original.",
        "operationId": "post_api_v1_billing_invoices_by_id_pay",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegalConsent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Invoice"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Pagar con el saldo una factura histórica confirmada",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/invoices/{id}/void": {
      "post": {
        "operationId": "post_api_v1_billing_invoices_by_id_void",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "status": "void"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/StateResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Anular factura",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/billing/jobs": {
      "get": {
        "operationId": "get_api_v1_billing_jobs",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "attempts": 0,
                        "available_at": "2026-10-18T00:00:00Z",
                        "created_at": "2026-10-18T00:00:00Z",
                        "id": "33333333-3333-4333-8333-333333333333",
                        "last_error": "",
                        "month": "2026-09",
                        "status": "pending"
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BillingJobList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar tareas de facturación",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      },
      "post": {
        "operationId": "post_api_v1_billing_jobs",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "month": "2026-09"
              },
              "schema": {
                "$ref": "#/components/schemas/MonthInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "attempts": 0,
                    "available_at": "2026-10-18T00:00:00Z",
                    "created_at": "2026-10-18T00:00:00Z",
                    "id": "33333333-3333-4333-8333-333333333333",
                    "last_error": "",
                    "month": "2026-09",
                    "status": "pending"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BillingJob",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Poner en cola una tarea de facturación",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/billing/jobs/{id}/retry": {
      "post": {
        "operationId": "post_api_v1_billing_jobs_by_id_retry",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "status": "pending"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/StateResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Reintentar una tarea de facturación",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/billing/notification-preferences": {
      "get": {
        "description": "Solo sesiones Owner; se rechazan las claves administrativas. Por defecto, los cuatro tipos están habilitados y el idioma es zh hasta guardar explícitamente. Las preferencias pertenecen a este usuario y espacio de trabajo. Reutiliza el transporte del correo de autenticación, el remitente, la cola persistente cifrada y los reintentos. Tanto el permiso de la plataforma como el consentimiento del destinatario deben admitir el tipo de mensaje. La entrega vuelve a comprobar el consentimiento actual y el estado del evento. Las opciones de correo no conceden ni revocan el consentimiento para cargar un monedero. Los mensajes sandbox están etiquetados. No se crean notificaciones para compras pendientes sin pagar ni regalos.",
        "operationId": "get__api_v1_billing_notification_preferences",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BillingNotificationPreferencesResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar el consentimiento de correo del propietario actual",
        "x-required-role": "owner"
      },
      "patch": {
        "description": "Actualización parcial para el propietario de la sesión; no puede dirigirse a otro usuario. La configuración regional controla los mensajes futuros. El correo de verificación y seguridad existente sigue siendo independiente. Reutiliza el transporte del correo de autenticación, el remitente, la cola persistente cifrada y los reintentos. Tanto el permiso de la plataforma como el consentimiento del destinatario deben admitir el tipo de mensaje. La entrega vuelve a comprobar el consentimiento actual y el estado del evento. Las opciones de correo no conceden ni revocan el consentimiento para cargar un monedero. Los mensajes sandbox están etiquetados. No se crean notificaciones para compras pendientes sin pagar ni regalos.",
        "operationId": "patch__api_v1_billing_notification_preferences",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BillingNotificationPreferenceInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BillingNotificationPreference"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Guardar el consentimiento de correo del propietario actual",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/overage-consent": {
      "post": {
        "description": "",
        "operationId": "post__api_v1_billing_overage_consent",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerOverageConsent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Autorizar explícitamente los excesos actuales con cargo al monedero",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/overage-settings": {
      "get": {
        "description": "Solo el tenant actual. Los miembros de solo lectura pueden consultarlas. Una cuota API ilimitada nunca queda limitada por una preferencia del cliente sobre excesos. Un plan null indica que la cuota predeterminada no está disponible.",
        "operationId": "get__api_v1_billing_overage_settings",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "customer_api_settings_enabled": false,
                    "customer_device_settings_enabled": false,
                    "plan": null,
                    "preference": {
                      "block_api_overage": false,
                      "block_device_overage": false,
                      "mode": "sandbox",
                      "updated_at": "2026-10-18T00:00:00Z",
                      "version": ""
                    }
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OverageSettings",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "DEFAULT_PLAN_DISABLED",
                    "message": "The default allowance plan has not been enabled by the administrator"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar preferencias sobre excesos de uso",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      },
      "patch": {
        "description": "Solo sesiones Owner. Cada opción proporcionada requiere el permiso administrativo correspondiente; un campo no autorizado rechaza toda la solicitud con 403. Límite estricto en ejecución = límite del administrador OR preferencia de bloqueo del cliente cuando ese permiso está habilitado. No elimina usos ni cargos anteriores. Las preferencias sandbox y live son independientes.",
        "operationId": "patch__api_v1_billing_overage_settings",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OverageSettingsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OveragePreference"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Guardar preferencias independientes sobre excesos de dispositivos y API"
      }
    },
    "/api/v1/billing/paddle/orders": {
      "get": {
        "operationId": "get__api_v1_billing_paddle_orders",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleOrderList"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar pagos de servicios y recargas del monedero de Paddle",
        "x-licentivo-access": "session"
      },
      "post": {
        "operationId": "post__api_v1_billing_paddle_orders",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaddleOrderInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Crear o recuperar un único pago de servicio de Paddle",
        "x-licentivo-access": "owner"
      }
    },
    "/api/v1/billing/paddle/orders/{id}": {
      "get": {
        "operationId": "get__api_v1_billing_paddle_orders__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "Identificador local del pago de servicio.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar la transacción de pago propia y el token público de cliente",
        "x-licentivo-access": "session"
      }
    },
    "/api/v1/billing/paddle/orders/{id}/reconcile": {
      "post": {
        "operationId": "post__api_v1_billing_paddle_orders__id__reconcile",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "Identificador local del pago de servicio.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaddleReconcileInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Verificar el pago y entregar el servicio comprado una sola vez",
        "x-licentivo-access": "owner"
      }
    },
    "/api/v1/billing/paypal/orders": {
      "get": {
        "operationId": "get_api_v1_billing_paypal_orders",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "amount_cents": 0,
                        "approval_url": "",
                        "capture_id": null,
                        "created_at": "2026-10-18T00:00:00Z",
                        "credited_at": null,
                        "currency": "USD",
                        "id": "33333333-3333-4333-8333-333333333333",
                        "mode": "sandbox",
                        "paypal_order_id": null,
                        "purchase_id": null,
                        "refunded_cents": 0,
                        "request_id": "55555555-5555-4555-8555-555555555555",
                        "status": "creating",
                        "upgrade_id": null
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalOrderList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar pedidos de recarga",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      },
      "post": {
        "description": "Los términos publicados requieren policy_version y aceptación explícita en ambos entornos de pago. Los excesos de servicio facturables requieren además overage_accepted. Antes de la primera publicación de políticas, no se registra el consentimiento a borradores y cada operación sigue sus comprobaciones normales de registro, precios y pago.",
        "operationId": "post_api_v1_billing_paypal_orders",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RechargeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalOrder"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Crear/recuperar una recarga idempotente",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/paypal/orders/{id}/capture": {
      "post": {
        "operationId": "post_api_v1_billing_paypal_orders_by_id_capture",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalOrder"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Confirmar una sola vez fondos vinculados al comerciante",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/paypal/orders/{id}/reconcile": {
      "post": {
        "operationId": "post_api_v1_billing_paypal_orders_by_id_reconcile",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalOrder"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Confirmar una sola vez fondos vinculados al comerciante",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/paypal/orders/{id}/refund-requests": {
      "post": {
        "description": "Solo sesiones con cookie; no se aceptan claves API administrativas. Las consultas de clientes se limitan a su espacio de trabajo. Las escrituras de clientes requieren un Owner verificado del espacio de trabajo, sin requerir permisos de administrador de la plataforma. Las solicitudes no mueven ni reservan fondos. La aprobación administrativa vuelve a comprobar el monedero actual y el valor capturado no reembolsado; después usa el procedimiento idempotente existente de reembolso por el método original y reserva. La aprobación no cancela planes.",
        "operationId": "post__api_v1_billing_paypal_orders__id__refund_requests",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WalletRefundRequestInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletRefundRequest"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Solicitar el reembolso de mi crédito de recarga no gastado",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/plans": {
      "get": {
        "operationId": "get_api_v1_billing_plans",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Catálogo público de precios gestionado por el administrador"
      }
    },
    "/api/v1/billing/purchases": {
      "get": {
        "operationId": "get_api_v1_billing_purchases",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "active": null,
                    "active_devices": 0,
                    "coverage_ends_at": null,
                    "items": [
                      {
                        "api_calls": 0,
                        "api_hard_limit": false,
                        "api_overage_cents": 0,
                        "api_unit_micros": 0,
                        "base_cents": 0,
                        "cancelled_at": null,
                        "created_at": "2026-10-18T00:00:00Z",
                        "currency": "USD",
                        "current_cycle_index": 0,
                        "current_upgrade_id": "",
                        "cycle_ends_at": "2026-10-18T00:00:00Z",
                        "cycle_starts_at": "2026-10-18T00:00:00Z",
                        "effective_included_devices": 0,
                        "effective_plan": "",
                        "effective_plan_name": "",
                        "ends_at": null,
                        "entitlement_cents": 0,
                        "gift_batch_id": "",
                        "gift_follows_current": false,
                        "hard_limit": false,
                        "id": "33333333-3333-4333-8333-333333333333",
                        "included_api_calls": null,
                        "included_devices": 0,
                        "mode": "sandbox",
                        "overage_cents": 0,
                        "plan": "starter",
                        "plan_name": "Starter",
                        "price_version": "example-v1",
                        "refunded_cents": 0,
                        "renewal": false,
                        "renewal_of": "",
                        "request_id": "55555555-5555-4555-8555-555555555555",
                        "service_credit_basis_cents": 0,
                        "service_credit_basis_seconds": 0,
                        "source": "purchase",
                        "starts_at": null,
                        "status": "pending",
                        "term_months": 1,
                        "total_api_calls": 0,
                        "total_api_overage_cents": 0,
                        "total_device_overage_cents": 0,
                        "unit_micros": 0
                      }
                    ],
                    "mode": "sandbox",
                    "renewal_package": null,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PurchaseList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar compras de paquetes",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      },
      "post": {
        "description": "Crea una compra con el plan, la moneda, la revisión de precio y el plazo seleccionados. Intenta liquidarla de inmediato con el monedero; si el saldo es insuficiente, devuelve pending sin iniciar la cobertura. Establezca renewal=true para ampliar un paquete activo. El pago correcto programa el servicio después de la cobertura existente; GET /billing/purchases informa de coverage_ends_at. El uso de la cuota actual y el vencimiento de las licencias de software no cambian. Los reintentos reutilizan request_id y no pueden duplicar cargos. Los términos publicados requieren policy_version y aceptación explícita en ambos entornos de pago. Los excesos de servicio facturables requieren además overage_accepted. Antes de la primera publicación de políticas, no se registra el consentimiento a borradores y cada operación sigue sus comprobaciones normales de registro, precios y pago.",
        "operationId": "post_api_v1_billing_purchases",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BuyPlan"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanPurchase"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Comprar un paquete o pagar una renovación anticipada",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/refund-requests": {
      "get": {
        "description": "Solo sesiones con cookie; no se aceptan claves API administrativas. Las consultas de clientes se limitan a su espacio de trabajo. Las escrituras de clientes requieren un Owner verificado del espacio de trabajo, sin requerir permisos de administrador de la plataforma. Las solicitudes no mueven ni reservan fondos. La aprobación administrativa vuelve a comprobar el monedero actual y el valor capturado no reembolsado; después usa el procedimiento idempotente existente de reembolso por el método original y reserva. La aprobación no cancela planes.",
        "operationId": "get__api_v1_billing_refund_requests",
        "parameters": [
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "sandbox",
                "live"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletRefundRequestList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar solicitudes de reembolso de mi espacio de trabajo"
      }
    },
    "/api/v1/billing/refund-requests/{id}/cancel": {
      "post": {
        "description": "Solo sesiones con cookie; no se aceptan claves API administrativas. Las consultas de clientes se limitan a su espacio de trabajo. Las escrituras de clientes requieren un Owner verificado del espacio de trabajo, sin requerir permisos de administrador de la plataforma. Las solicitudes no mueven ni reservan fondos. La aprobación administrativa vuelve a comprobar el monedero actual y el valor capturado no reembolsado; después usa el procedimiento idempotente existente de reembolso por el método original y reserva. La aprobación no cancela planes.",
        "operationId": "post__api_v1_billing_refund_requests__id__cancel",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletRefundRequest"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Retirar mi solicitud de reembolso pendiente",
        "x-required-role": "owner"
      }
    },
    "/api/v1/billing/renewal-plans": {
      "get": {
        "description": "Solo titularidad de compras completadas y cambios a planes superiores aplicados. Devuelve ofertas publicadas habilitadas y ofertas ocultas exclusivas de renovación para sus clientes existentes. Las cotizaciones pendientes no establecen titularidad. Renueve mediante POST /billing/purchases antes o después del vencimiento.",
        "operationId": "get__api_v1_billing_renewal_plans",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "api_hard_limit": false,
                        "api_unit_micros": 0,
                        "base_micros": 0,
                        "currency": "USD",
                        "description": "Desktop reporting software",
                        "enabled": true,
                        "hard_limit": false,
                        "included_api_calls": null,
                        "included_devices": 0,
                        "name": "Report app",
                        "plan": "starter",
                        "price_version": "example-v1",
                        "public": false,
                        "renewal_only": false,
                        "sort_order": 0,
                        "terms": [],
                        "unit_micros": 0,
                        "updated_at": "2026-10-18T00:00:00Z"
                      }
                    ],
                    "mode": "sandbox"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RenewalPlans",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "DEFAULT_PLAN_DISABLED",
                    "message": "The default allowance plan has not been enabled by the administrator"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar ofertas de renovación",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/billing/subscription": {
      "get": {
        "operationId": "get_api_v1_billing_subscription",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "current": {
                      "base_covered": false,
                      "base_micros": 0,
                      "created_at": "2026-10-18T00:00:00Z",
                      "currency": "USD",
                      "hard_limit": false,
                      "included_devices": 0,
                      "month": "2026-09",
                      "payment_mode": "sandbox",
                      "plan": "starter",
                      "plan_name": "Starter",
                      "price_version": "example-v1",
                      "unit_micros": 0
                    },
                    "next": null,
                    "sandbox": false
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Subscription",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "503": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "DEFAULT_PLAN_DISABLED",
                    "message": "The default allowance plan has not been enabled by the administrator"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "La cuota predeterminada está deshabilitada (DEFAULT_PLAN_DISABLED)"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar suscripción mensual",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      },
      "patch": {
        "operationId": "patch_api_v1_billing_subscription",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "currency": "USD",
                "plan": "starter",
                "price_version": "example-v1"
              },
              "schema": {
                "$ref": "#/components/schemas/PlanChange"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "currency": "USD",
                    "effective_month": "2026-11",
                    "plan": "starter",
                    "sandbox": false
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ScheduledPlan",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Programar plan mensual",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/billing/upgrades": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_billing_upgrades",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "amount_cents": 0,
                        "api_hard_limit": false,
                        "api_unit_micros": 0,
                        "applied_at": null,
                        "base_cents": 0,
                        "created_at": "2026-10-18T00:00:00Z",
                        "currency": "USD",
                        "cycle_seconds": 0,
                        "ends_at": "2026-10-18T00:00:00Z",
                        "expires_at": "2026-10-18T00:00:00Z",
                        "hard_limit": false,
                        "id": "33333333-3333-4333-8333-333333333333",
                        "included_api_calls": null,
                        "included_devices": 0,
                        "mode": "sandbox",
                        "parent_id": "33333333-3333-4333-8333-333333333333",
                        "parts": [],
                        "plan": "starter",
                        "plan_name": "Starter",
                        "previous_base_cents": 0,
                        "previous_plan_name": "",
                        "previous_upgrade_id": "",
                        "price_version": "example-v1",
                        "purchase_id": "33333333-3333-4333-8333-333333333333",
                        "remaining_seconds": 0,
                        "request_id": "55555555-5555-4555-8555-555555555555",
                        "status": "pending",
                        "unit_micros": 0
                      }
                    ],
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UpgradeList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "DEFAULT_PLAN_DISABLED",
                    "message": "The default allowance plan has not been enabled by the administrator"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar cambios a planes superiores de paquetes",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/billing/upgrades/quote": {
      "post": {
        "description": "Requiere una sesión Owner. El destino debe usar la misma moneda y no tener un precio mensual ni cuotas de dispositivos/API inferiores. Conserva el vencimiento y el uso originales. El cambio siempre incluye la cobertura actual y toda la cobertura futura prepagada/regalada. Cada periodo acredita su valor original de beneficio, prorrateado por los segundos restantes; un periodo no iniciado usa toda su duración. El valor de un regalo no es dinero reembolsable. El pago es un único cargo atómico al monedero; se mantienen las fechas y la cuota consumida. Las renovaciones, los regalos o las cancelaciones entre la cotización y el pago invalidan la cotización con UPGRADE_STATE_CONFLICT; una recarga PayPal vinculada que llega tarde permanece como crédito del monedero. La cobertura modificada requiere una cotización nueva.",
        "operationId": "post__api_v1_billing_upgrades_quote",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpgradeQuoteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanUpgrade"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Previsualizar un cambio de plan superior prorrateado sin cargar el monedero"
      }
    },
    "/api/v1/billing/upgrades/{id}/pay": {
      "post": {
        "description": "Devuelve pending sin cambiar el plan si el saldo es insuficiente. Devuelve applied después de cobrar una sola vez. Un plan activo cambiado o una cotización vencida devuelve 409. El cambio siempre incluye la cobertura actual y toda la cobertura futura prepagada/regalada. Cada periodo acredita su valor original de beneficio, prorrateado por los segundos restantes; un periodo no iniciado usa toda su duración. El valor de un regalo no es dinero reembolsable. El pago es un único cargo atómico al monedero; se mantienen las fechas y la cuota consumida. Las renovaciones, los regalos o las cancelaciones entre la cotización y el pago invalidan la cotización con UPGRADE_STATE_CONFLICT; una recarga PayPal vinculada que llega tarde permanece como crédito del monedero. La cobertura modificada requiere una cotización nueva. Antes de un pago nuevo se requiere la aceptación explícita de la política actual. La repetición de un pago ya realizado conserva su recibo original.",
        "operationId": "post__api_v1_billing_upgrades__id__pay",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LegalConsent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanUpgrade"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Confirmar y pagar una sola vez una cotización válida de cambio a plan superior"
      }
    },
    "/api/v1/billing/waffo/orders": {
      "get": {
        "operationId": "get__api_v1_billing_waffo_orders",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoOrderList"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar pagos de servicios y recargas del monedero de Waffo",
        "x-licentivo-access": "session"
      },
      "post": {
        "operationId": "post__api_v1_billing_waffo_orders",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WaffoOrderInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Crear o recuperar un único pago de servicio de Waffo",
        "x-licentivo-access": "owner"
      }
    },
    "/api/v1/billing/waffo/orders/{id}": {
      "get": {
        "operationId": "get__api_v1_billing_waffo_orders__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "Identificador local del pago de servicio.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar el pago Waffo del propio espacio de trabajo",
        "x-licentivo-access": "session"
      }
    },
    "/api/v1/billing/waffo/orders/{id}/reconcile": {
      "post": {
        "operationId": "post__api_v1_billing_waffo_orders__id__reconcile",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "Identificador local del pago de servicio.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Verificar el pago y conciliar el servicio y los reembolsos",
        "x-licentivo-access": "owner"
      }
    },
    "/api/v1/billing/wallet": {
      "get": {
        "operationId": "get_api_v1_billing_wallet",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "currencies": [],
                    "items": [
                      {
                        "balance_cents": 0,
                        "currency": "USD",
                        "mode": "sandbox"
                      }
                    ],
                    "maximum_cents": 0,
                    "minimum_cents": 0,
                    "mode": "sandbox",
                    "payment_channels": [],
                    "paypal_enabled": false
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar saldos del monedero",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/billing/wallet/entries": {
      "get": {
        "operationId": "get_api_v1_billing_wallet_entries",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "amount_cents": 0,
                        "balance_cents": 0,
                        "created_at": "2026-10-18T00:00:00Z",
                        "currency": "USD",
                        "id": "33333333-3333-4333-8333-333333333333",
                        "kind": "",
                        "mode": "sandbox",
                        "reference": ""
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletEntryList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar movimientos del monedero",
        "x-management-reference": {
          "group": "billing"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/consume": {
      "post": {
        "description": "Operación de ejecución autenticada mediante licencia; sin cookie del proveedor ni API Key. El consumo de funciones requiere una Idempotency-Key estable; consume no genera cargos API de la plataforma.",
        "operationId": "post_api_v1_consume",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ConsumptionResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "/consume"
      }
    },
    "/api/v1/consume/cancel": {
      "post": {
        "description": "Reserve antes de la acción de negocio, confirme solo después del éxito y cancele si falla. Conserve el mismo identificador de tarea y cuerpo de solicitud entre reintentos. Un timeout de commit deja un resultado incierto: reintente commit, nunca cancele ni repita el trabajo terminado. Las reservas finalizadas devuelven su estado actual; no hay cargos API de la plataforma. La finalización emite license.consume; las retenciones provisionales no emiten eventos de consumo.",
        "operationId": "post_api_v1_consume_cancel",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReservationResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Unidades de función: cancelar"
      }
    },
    "/api/v1/consume/commit": {
      "post": {
        "description": "Reserve antes de la acción de negocio, confirme solo después del éxito y cancele si falla. Conserve el mismo identificador de tarea y cuerpo de solicitud entre reintentos. Un timeout de commit deja un resultado incierto: reintente commit, nunca cancele ni repita el trabajo terminado. Las reservas finalizadas devuelven su estado actual; no hay cargos API de la plataforma. La finalización emite license.consume; las retenciones provisionales no emiten eventos de consumo.",
        "operationId": "post_api_v1_consume_commit",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReservationResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Unidades de función: confirmar"
      }
    },
    "/api/v1/consume/reserve": {
      "post": {
        "description": "Reserve antes de la acción de negocio, confirme solo después del éxito y cancele si falla. Conserve el mismo identificador de tarea y cuerpo de solicitud entre reintentos. Un timeout de commit deja un resultado incierto: reintente commit, nunca cancele ni repita el trabajo terminado. Las reservas finalizadas devuelven su estado actual; no hay cargos API de la plataforma. La finalización emite license.consume; las retenciones provisionales no emiten eventos de consumo.",
        "operationId": "post_api_v1_consume_reserve",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReservationResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Unidades de función: reservar"
      }
    },
    "/api/v1/customer/activations/{id}/release": {
      "post": {
        "operationId": "post_api_v1_customer_activations_by_id_release",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerReleaseInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CustomerReleaseResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "customerSession": []
          }
        ],
        "summary": "/customer/activations/{id}/release"
      }
    },
    "/api/v1/customer/cases": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_customer_cases",
        "parameters": [
          {
            "description": "Excluye un tipo de solicitud antes del recuento y la paginación. Use refund para excluir los casos de reembolso de la lista de asistencia; el acceso sigue limitado a la sesión actual.",
            "in": "query",
            "name": "exclude_kind",
            "schema": {
              "maxLength": 24,
              "type": "string"
            }
          },
          {
            "description": "Limita los casos de reembolso a recargas del monedero o cancelación del servicio.",
            "in": "query",
            "name": "refund_scope",
            "required": false,
            "schema": {
              "enum": [
                "wallet",
                "service"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar solicitudes de clientes",
        "x-required-role": "session"
      },
      "post": {
        "description": "Un request_id estable tiene alcance de espacio de trabajo; un contenido cambiado no puede reutilizarlo.",
        "operationId": "post__api_v1_customer_cases",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupportCaseInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCase"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Crear una solicitud de asistencia, privacidad o apelación",
        "x-required-role": "session"
      }
    },
    "/api/v1/customer/cases/unread": {
      "get": {
        "description": "Se excluyen los chats de reembolsos. Los clientes solo ven tickets autorizados del espacio de trabajo; los miembros ven los suyos. Cada administrador tiene un marcador de lectura independiente.",
        "operationId": "get__api_v1_customer_cases_unread",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportUnread"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar los recuentos personales de tickets y avisos sin leer",
        "x-required-role": "session"
      }
    },
    "/api/v1/customer/cases/{id}": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_customer_cases__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar solicitud y respuestas",
        "x-required-role": "session"
      }
    },
    "/api/v1/customer/cases/{id}/messages": {
      "post": {
        "description": "Los casos de reembolso rechazan respuestas con REFUND_REVIEW_WORKFLOW; los administradores aprueban o rechazan directamente. Los tickets de asistencia normales mantienen las respuestas. Los cierres revisados conservan el estado de su procedimiento de privacidad.",
        "operationId": "post__api_v1_customer_cases__id__messages",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupportReply"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Responder a un ticket de asistencia",
        "x-required-role": "session"
      }
    },
    "/api/v1/customer/cases/{id}/read": {
      "post": {
        "description": "Solo se marcan como leídos los mensajes hasta el último mostrado. Los posteriores siguen sin leer y las confirmaciones retrasadas no pueden hacer retroceder el marcador.",
        "operationId": "post__api_v1_customer_cases__id__read",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupportReadInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Confirmar los mensajes de ticket mostrados",
        "x-required-role": "session"
      }
    },
    "/api/v1/customer/compensations": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_customer_compensations",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "created_at": "2026-10-18T00:00:00Z",
                        "id": "33333333-3333-4333-8333-333333333333",
                        "incident_id": "33333333-3333-4333-8333-333333333333",
                        "intervals": "",
                        "mode": "timed",
                        "purchase_id": "33333333-3333-4333-8333-333333333333",
                        "seconds": 0
                      }
                    ]
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ServiceCompensationList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar compensaciones de servicio",
        "x-management-reference": {
          "group": "service"
        },
        "x-required-role": "session",
        "x-required-scope": "read"
      }
    },
    "/api/v1/customer/licenses": {
      "get": {
        "operationId": "get_api_v1_customer_licenses",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CustomerLicenses"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "customerSession": []
          }
        ],
        "summary": "Licencias vinculadas al comprador"
      }
    },
    "/api/v1/customer/login": {
      "post": {
        "operationId": "post_api_v1_customer_login",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Email"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Notice"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "/customer/login"
      }
    },
    "/api/v1/customer/logout": {
      "post": {
        "operationId": "post_api_v1_customer_logout",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LoggedOut"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "customerSession": []
          }
        ],
        "summary": "/customer/logout"
      }
    },
    "/api/v1/customer/notices": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_customer_notices",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "body": "",
                        "created_at": "2026-10-18T00:00:00Z",
                        "effective_at": null,
                        "emailed_at": null,
                        "id": "33333333-3333-4333-8333-333333333333",
                        "kind": "",
                        "read_at": null,
                        "reference": "",
                        "title": ""
                      }
                    ]
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceNoticeList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar avisos de servicio",
        "x-management-reference": {
          "group": "service"
        },
        "x-required-role": "session",
        "x-required-scope": "read"
      }
    },
    "/api/v1/customer/notices/{id}/read": {
      "post": {
        "description": "",
        "operationId": "post__api_v1_customer_notices__id__read",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Marcar un aviso propio como leído",
        "x-required-role": "session"
      }
    },
    "/api/v1/customer/offline/respond": {
      "post": {
        "operationId": "post_api_v1_customer_offline_respond",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OfflineRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OfflineResponse"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "customerSession": []
          }
        ],
        "summary": "/customer/offline/respond"
      }
    },
    "/api/v1/customer/refunds": {
      "post": {
        "description": "Un alcance explícito requiere confirmación y los valores devueltos quote_hash y quoted_at. El servicio sigue activo hasta que lo apruebe el administrador. Un estado cambiado o cotizaciones vencidas requieren una nueva vista previa; se rechazan las solicitudes pendientes en conflicto. Las solicitudes sin alcance permiten una cancelación inmediata, si cumple los requisitos, después de una confirmación explícita. Un order_id también puede seleccionar un pago Waffo/Paddle paid_unapplied con reason=failed_delivery; no inmoviliza un crédito del monedero que nunca se concedió.",
        "operationId": "post__api_v1_customer_refunds",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRefundInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCase"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Enviar una solicitud de reembolso para revisión directa",
        "x-required-role": "owner"
      }
    },
    "/api/v1/customer/refunds/quote": {
      "post": {
        "description": "Un alcance explícito de compra/servicio devuelve un hash de instantánea delimitada, las compras afectadas, estimaciones de reembolso por moneda y las fechas restantes. El envío no termina el servicio. Los regalos no tienen valor en efectivo; los cambios a planes superiores pagados siguen siendo reembolsables previa revisión.",
        "operationId": "post__api_v1_customer_refunds_quote",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRefundQuoteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CustomerRefundQuote"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Previsualizar el alcance de cancelación, los reembolsos y el servicio restante",
        "x-required-role": "owner"
      }
    },
    "/api/v1/customer/refunds/{id}/cancel": {
      "post": {
        "operationId": "post__api_v1_customer_refunds__id__cancel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CancelCustomerRefund"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Retirar el resto de mi solicitud de reembolso no revisada",
        "x-required-role": "owner"
      }
    },
    "/api/v1/customer/verify": {
      "post": {
        "operationId": "post_api_v1_customer_verify",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Token"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CustomerSession"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "/customer/verify"
      }
    },
    "/api/v1/deactivate": {
      "post": {
        "description": "Autenticación mediante product_id + license_key + device_id. Sin cookie/CSRF/clave del proveedor. activation_id es obligatorio salvo para activate. Cada solicitud correcta consume una llamada API; las repeticiones idempotentes y los fallos no consumen llamadas. Los excesos cargan el monedero atómicamente o devuelven API_QUOTA_EXCEEDED/API_BALANCE_INSUFFICIENT. La cuota de dispositivos del espacio de trabajo sigue las activaciones actuales. La liberación devuelve capacidad; el vencimiento de un arrendamiento flotante también devuelve capacidad, mientras que un registro ordinario sin conexión sigue contándose. El exceso de dispositivos solo se cobra cuando el máximo de facturación del mes de cuota supera la capacidad ya pagada; la liberación no reembolsa cargos ya incurridos. El uso de API es independiente.",
        "operationId": "post_api_v1_deactivate",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RuntimeResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Desactivación en ejecución"
      }
    },
    "/api/v1/demo/trial": {
      "post": {
        "operationId": "post_api_v1_demo_trial",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Trial"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Crear una prueba SDK aislada de siete días por propietario",
        "x-required-role": "owner"
      }
    },
    "/api/v1/examples/sdk": {
      "get": {
        "operationId": "get_api_v1_examples_sdk",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SDKExampleInfo"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Disponibilidad pública de ejemplos SDK"
      }
    },
    "/api/v1/examples/sdk/download/{name}": {
      "get": {
        "operationId": "get_api_v1_examples_sdk_download_{name}",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "description": "Lenguaje seguido de .zip, por ejemplo csharp.zip",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/zip": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Descargar el código fuente con la configuración pública del producto ya incluida en el código"
      }
    },
    "/api/v1/examples/sdk/trial": {
      "post": {
        "description": "Requiere CSRF del navegador y una cookie de visitante HttpOnly. Cada visitante obtiene una licencia independiente; los tres días empiezan en la primera activación. Repetir la solicitud nunca amplía el vencimiento. Habilita export, no pro.",
        "operationId": "post_api_v1_examples_sdk_trial",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SDKExampleTrial"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Solicitar/recuperar la prueba independiente de tres días de este visitante"
      }
    },
    "/api/v1/forum/images": {
      "post": {
        "operationId": "post__api_v1_forum_images",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "image": {
                    "description": "PNG, JPEG o GIF; como máximo 5 MB, 4096 × 4096 y 16 millones de píxeles. Los GIF se guardan como PNG estáticos. Es privada hasta adjuntarla a una publicación publicada.",
                    "format": "binary",
                    "type": "string"
                  }
                },
                "required": [
                  "image"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ForumImage"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Subir una imagen privada de borrador",
        "tags": [
          "Community"
        ]
      }
    },
    "/api/v1/forum/replies/{id}": {
      "delete": {
        "operationId": "delete__api_v1_forum_replies__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "format": "uuid",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "type": "object"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Eliminar una respuesta (autor o administrador de la plataforma)",
        "tags": [
          "Community"
        ]
      },
      "patch": {
        "operationId": "patch__api_v1_forum_replies__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForumReplyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "format": "uuid",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "type": "object"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Editar una respuesta propia",
        "tags": [
          "Community"
        ]
      }
    },
    "/api/v1/forum/topics": {
      "get": {
        "operationId": "get__api_v1_forum_topics",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "category",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "language",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ForumTopicList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [],
        "summary": "Listar debates públicos, primero los fijados",
        "tags": [
          "Community"
        ]
      },
      "post": {
        "operationId": "post__api_v1_forum_topics",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForumTopicInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "format": "uuid",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "type": "object"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Crear un debate (cualquier miembro verificado del tenant)",
        "tags": [
          "Community"
        ]
      }
    },
    "/api/v1/forum/topics/{id}": {
      "delete": {
        "operationId": "delete__api_v1_forum_topics__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "format": "uuid",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "type": "object"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Eliminar un debate (autor o administrador de la plataforma)",
        "tags": [
          "Community"
        ]
      },
      "get": {
        "operationId": "get__api_v1_forum_topics__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ForumTopicDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [],
        "summary": "Consultar un debate público y sus respuestas",
        "tags": [
          "Community"
        ]
      },
      "patch": {
        "operationId": "patch__api_v1_forum_topics__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForumTopicInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "format": "uuid",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "type": "object"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Editar un debate propio",
        "tags": [
          "Community"
        ]
      }
    },
    "/api/v1/forum/topics/{id}/moderation": {
      "post": {
        "operationId": "post__api_v1_forum_topics__id__moderation",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForumModerationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "format": "uuid",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "type": "object"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Fijar, desfijar, ocultar o bloquear debates (administrador de la plataforma)",
        "tags": [
          "Community"
        ]
      }
    },
    "/api/v1/forum/topics/{id}/replies": {
      "post": {
        "operationId": "post__api_v1_forum_topics__id__replies",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForumReplyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "format": "uuid",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "type": "object"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Código de error e ID de solicitud; no se exponen datos de la cuenta"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Responder a un debate",
        "tags": [
          "Community"
        ]
      }
    },
    "/api/v1/forum/topics/{id}/translate": {
      "post": {
        "description": "Los visitantes anónimos pueden usar este endpoint con un token CSRF. Solo se acepta texto del foro publicado y almacenado, nunca texto arbitrario enviado en la solicitud. La traducción se almacena en caché por contenido e idioma de destino. Los temas/respuestas ocultos devuelven 404; una traducción concurrente puede devolver TRANSLATION_PENDING. Se conservan los originales.",
        "operationId": "post__api_v1_forum_topics__id__translate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForumTranslationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ForumTranslationResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [],
        "summary": "Traducir un tema o una respuesta publicados"
      }
    },
    "/api/v1/forum/translation": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_forum_translation",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TranslationOptions"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [],
        "summary": "Obtener los idiomas de destino de traducción disponibles públicamente"
      }
    },
    "/api/v1/heartbeat": {
      "post": {
        "description": "Autenticación mediante product_id + license_key + device_id. Sin cookie/CSRF/clave del proveedor. activation_id es obligatorio salvo para activate. Cada solicitud correcta consume una llamada API; las repeticiones idempotentes y los fallos no consumen llamadas. Los excesos cargan el monedero atómicamente o devuelven API_QUOTA_EXCEEDED/API_BALANCE_INSUFFICIENT. Los acuses de reintentos de validación y heartbeat vencen después de 3600 segundos. Mientras siga siendo válida la autorización original, las solicitudes coincidentes dentro de esta ventana reproducen el resultado sin otro cargo. Tras la ventana, use una clave nueva; una clave usada anteriormente puede procesarse como solicitud nueva. Los acuses de activación, desactivación y uso de funciones se conservan de forma persistente. La cuota de dispositivos del espacio de trabajo sigue las activaciones actuales. La liberación devuelve capacidad; el vencimiento de un arrendamiento flotante también devuelve capacidad, mientras que un registro ordinario sin conexión sigue contándose. El exceso de dispositivos solo se cobra cuando el máximo de facturación del mes de cuota supera la capacidad ya pagada; la liberación no reembolsa cargos ya incurridos. El uso de API es independiente.",
        "operationId": "post_api_v1_heartbeat",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RuntimeResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Heartbeat en ejecución"
      }
    },
    "/api/v1/launch/connections": {
      "get": {
        "description": "Lista las conexiones de confianza de Launch. Licentivo realiza las decisiones, los reintentos y las comprobaciones de alcance.",
        "operationId": "launch_get__api_v1_launch_connections",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {},
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "description": "Resultado de esta operación.",
                      "properties": {
                        "items": {
                          "description": "Registros coincidentes en el alcance solicitado.",
                          "items": {
                            "$ref": "#/components/schemas/LaunchConnection"
                          },
                          "type": "array"
                        }
                      },
                      "required": [],
                      "type": "object"
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Listar conexiones de confianza de Launch",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-scope": "read"
      },
      "post": {
        "description": "Registra un emisor de Launch y un entorno comercial. Licentivo realiza las decisiones, los reintentos y las comprobaciones de alcance.",
        "operationId": "launch_post__api_v1_launch_connections",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "audience": "licentivo:launch",
                "enabled": true,
                "environment": "live",
                "issuer": "https://shop.example.test",
                "public_keys": {
                  "launch-1": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                }
              },
              "schema": {
                "$ref": "#/components/schemas/LaunchConnectionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "audience": "licentivo:launch",
                    "enabled": true,
                    "environment": "live",
                    "id": "11111111-1111-4111-8111-111111111111",
                    "issuer": "https://shop.example.test"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LaunchConnection",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Registrar un emisor de Launch y un entorno comercial",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/connections/{id}": {
      "put": {
        "description": "El emisor, la audiencia y el entorno son inmutables. Proporcione el conjunto completo de claves públicas de confianza.",
        "operationId": "launch_put__api_v1_launch_connections_id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "audience": "licentivo:launch",
                "enabled": true,
                "environment": "live",
                "issuer": "https://shop.example.test",
                "public_keys": {
                  "launch-1": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                }
              },
              "schema": {
                "$ref": "#/components/schemas/LaunchConnectionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "audience": "licentivo:launch",
                    "enabled": true,
                    "environment": "live",
                    "id": "11111111-1111-4111-8111-111111111111",
                    "issuer": "https://shop.example.test"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LaunchConnection",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Rotar claves de Launch o actualizar límites de ejecución",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/connections/{id}/devices/{activation}/release": {
      "post": {
        "description": "Licentivo reserva la cuota de liberación autónoma de 30 días, registra la operación y gestiona los reintentos y la revisión manual. El worker compara la versión de vinculación y revoca sesiones y credenciales bajo los mismos bloqueos de transacción. Las sesiones antiguas de Launch no pueden intercambiar otra afirmación de identidad en el dispositivo revocado.",
        "operationId": "launch_post__api_v1_launch_connections_id_devices_activation_release",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "activation",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "account_ref": "account_ref_example",
                "entitlement_ref": "entitlement_ref_example",
                "environment": "live",
                "expected_generation": 1,
                "operation_id": "11111111-1111-4111-8111-111111111111"
              },
              "schema": {
                "$ref": "#/components/schemas/LaunchDeviceReleaseInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "activation_id": "11111111-1111-4111-8111-111111111111",
                    "expected_generation": 1,
                    "license_id": "11111111-1111-4111-8111-111111111111",
                    "operation_id": "11111111-1111-4111-8111-111111111111",
                    "source": "logout",
                    "status": "pending"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DeviceReleaseOperation",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Solicitar una liberación remota con versión de un dispositivo de la cuenta",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/connections/{id}/entitlements/{entitlement}/devices": {
      "get": {
        "description": "Consulta los dispositivos de la cuenta, la cuota de liberación autoritativa y las operaciones. Licentivo realiza las decisiones, los reintentos y las comprobaciones de alcance.",
        "operationId": "launch_get__api_v1_launch_connections_id_entitlements_entitlement_devices",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "entitlement",
            "required": true,
            "schema": {
              "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
              "pattern": "^[A-Za-z0-9_-]{1,128}$",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "account_ref",
            "required": true,
            "schema": {
              "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
              "pattern": "^[A-Za-z0-9_-]{1,128}$",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "environment",
            "required": true,
            "schema": {
              "description": "Entorno comercial fijado tanto en la conexión como en la autorización firmada.",
              "enum": [
                "live",
                "sandbox"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {},
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "description": "Resultado de esta operación.",
                      "properties": {
                        "can_release": {
                          "description": "Indica si esta conexión de confianza puede autorizar nuevos usos en ejecución.",
                          "type": "boolean"
                        },
                        "items": {
                          "description": "Registros coincidentes en el alcance solicitado.",
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "device_name": {
                                "description": "Etiqueta del dispositivo legible para personas.",
                                "type": "string"
                              },
                              "generation": {
                                "description": "Instancia actual de la vinculación del dispositivo.",
                                "type": "integer"
                              },
                              "id": {
                                "description": "UUID del recurso de Licentivo.",
                                "format": "uuid",
                                "type": "string"
                              },
                              "last_seen_at": {
                                "description": "Hora de creación del registro en UTC.",
                                "format": "date-time",
                                "type": "string"
                              },
                              "status": {
                                "description": "Estado actual del ciclo de vida o del procesamiento controlado por el servidor.",
                                "type": "string"
                              }
                            },
                            "required": [],
                            "type": "object"
                          },
                          "type": "array"
                        },
                        "operations": {
                          "description": "Historial de operaciones de liberación de dispositivos controlado por el servidor.",
                          "items": {
                            "$ref": "#/components/schemas/DeviceReleaseOperation"
                          },
                          "type": "array"
                        },
                        "remaining": {
                          "description": "Liberaciones de autoservicio restantes en los últimos 30 días, calculadas por Licentivo.",
                          "type": "integer"
                        }
                      },
                      "required": [],
                      "type": "object"
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Consultar dispositivos de la cuenta, cuota de liberación autoritativa y operaciones",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/launch/connections/{id}/events": {
      "post": {
        "description": "Guarde de forma persistente antes de confirmar la recepción. Los ID duplicados con cuerpos distintos generan un conflicto. Los workers aplican la validez absoluta y las versiones agregadas monótonas dentro de una transacción, ignoran versiones antiguas y reintentan fallos hasta 12 veces antes de pasar a revisión manual. Para un derecho existente, los reembolsos, la suspensión y el vencimiento revocan el acceso independientemente de las asignaciones de planes, versiones de políticas, modos de validez y ocupación de dispositivos, manteniendo las comprobaciones de titularidad y versión. Los cambios a planes inferiores aplican conjuntamente las nuevas funciones, las reglas de medición y el límite efectivo de dispositivos; conservan las vinculaciones más antiguas y revocan las sesiones y credenciales de dispositivos excedentes sin consumir la cuota de liberación autónoma. Las renovaciones, los cambios de plan y los guardados de políticas conservan los límites manuales independientes de funciones y dispositivos. Las instantáneas explícitas entitlement.downgraded conservan el estado comercial activo, pero bloquean de forma persistente los derechos antiguos si falla la aplicación. Las instantáneas activas existentes con reducciones demostrables reciben la misma protección. Solo una instantánea aplicada con una versión igual o superior a la restricción pendiente elimina esa barrera. Los reintentos idempotentes de ejecución mantienen la deduplicación de operaciones y actualizan las autorizaciones y las fechas límite de compra que hayan cambiado. Consulte periódicamente el evento antes de declarar lista la autorización.",
        "operationId": "launch_post__api_v1_launch_connections_id_events",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "account_ref": "account_ref_example",
                "entitlement_ref": "entitlement_ref_example",
                "environment": "live",
                "event_id": "11111111-1111-4111-8111-111111111111",
                "launch_product_id": "11111111-1111-4111-8111-111111111111",
                "plan_ref": "plan_ref_example",
                "type": "entitlement.created",
                "valid_from": "2026-10-24T00:00:00Z",
                "version": 1
              },
              "schema": {
                "$ref": "#/components/schemas/LaunchCommerceEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "attempts": 1,
                    "available_at": "2026-10-24T00:00:00Z",
                    "connection_id": "11111111-1111-4111-8111-111111111111",
                    "event_id": "11111111-1111-4111-8111-111111111111",
                    "status": "pending"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LaunchEvent",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Recibir una instantánea comercial completa de Launch",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/connections/{id}/events/{event}": {
      "get": {
        "description": "Consulta el resultado de un evento comercial de Launch. Licentivo realiza las decisiones, los reintentos y las comprobaciones de alcance.",
        "operationId": "launch_get__api_v1_launch_connections_id_events_event_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "event",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "attempts": 1,
                    "available_at": "2026-10-24T00:00:00Z",
                    "connection_id": "11111111-1111-4111-8111-111111111111",
                    "event_id": "11111111-1111-4111-8111-111111111111",
                    "status": "pending"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LaunchEvent",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Consultar el resultado de un evento comercial de Launch",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/launch/connections/{id}/events/{event}/retry": {
      "post": {
        "description": "Reintenta un evento de Launch no aplicado. Licentivo realiza las decisiones, los reintentos y las comprobaciones de alcance.",
        "operationId": "launch_post__api_v1_launch_connections_id_events_event_retry",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "event",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "additionalProperties": false,
                "properties": {},
                "required": [],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {},
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "description": "Resultado de esta operación.",
                      "properties": {
                        "queued": {
                          "description": "Indica si esta conexión de confianza puede autorizar nuevos usos en ejecución.",
                          "type": "boolean"
                        }
                      },
                      "required": [],
                      "type": "object"
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Reintentar un evento de Launch no aplicado",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/connections/{id}/plans/{plan}": {
      "put": {
        "description": "Asigna una versión de plan de Launch a una política de licencias. Licentivo realiza las decisiones, los reintentos y las comprobaciones de alcance.",
        "operationId": "launch_put__api_v1_launch_connections_id_plans_plan_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "plan",
            "required": true,
            "schema": {
              "description": "Referencia inmutable del derecho de compra, que distingue mayúsculas y minúsculas.",
              "pattern": "^[A-Za-z0-9_-]{1,128}$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "launch_product_id": "11111111-1111-4111-8111-111111111111",
                "policy_id": "11111111-1111-4111-8111-111111111111",
                "policy_version": 1,
                "product_id": "11111111-1111-4111-8111-111111111111"
              },
              "schema": {
                "$ref": "#/components/schemas/LaunchPlanMappingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {},
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "description": "Resultado de esta operación.",
                      "properties": {
                        "saved": {
                          "description": "Indica si esta conexión de confianza puede autorizar nuevos usos en ejecución.",
                          "type": "boolean"
                        }
                      },
                      "required": [],
                      "type": "object"
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Asignar una versión de plan de Launch a una política de licencias",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/connections/{id}/session-revocations": {
      "post": {
        "description": "Revocación atómica síncrona: HTTP 200 significa que se han confirmado la revocación de sesiones, credenciales y vinculaciones de dispositivos coincidentes y el acuse persistente. La conexión determina el entorno; un entorno opcional no vacío debe coincidir. La omisión y un valor explícito coincidente son equivalentes para la idempotencia. Reutilice event_id y el mismo cuerpo normalizado en los reintentos, incluidos los concurrentes; los cuerpos distintos generan un conflicto. Las repeticiones correctas devuelven los recuentos originales y no revocan inicios de sesión posteriores. Las cuentas/sid desconocidos terminan correctamente con cero filas afectadas y conservan un marcador de rechazo de inicio de sesión. El alcance account registra un límite temporal de autenticación en el momento de aceptación del servidor. Se conservan la validez de los derechos comprados y los plazos de las licencias. Las conexiones deshabilitadas aceptan revocaciones.",
        "operationId": "launch_post__api_v1_launch_connections_id_session_revocations",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "account_ref": "account_456",
                "event_id": "11111111-1111-4111-8111-111111111111",
                "reason": "forced_logout",
                "scope": "session",
                "sid": "login_123"
              },
              "schema": {
                "$ref": "#/components/schemas/LaunchSessionRevocationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "account_ref": "account_456",
                    "completed_at": "2026-10-24T05:00:00.145678Z",
                    "connection_id": "11111111-1111-4111-8111-111111111111",
                    "created_at": "2026-10-24T05:00:00.123456Z",
                    "environment": "live",
                    "event_id": "11111111-1111-4111-8111-111111111111",
                    "reason": "forced_logout",
                    "released_devices": 2,
                    "revoked_credentials": 2,
                    "revoked_sessions": 2,
                    "scope": "session",
                    "sid": "login_123",
                    "status": "succeeded"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LaunchSessionRevocation",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "404": {
            "description": "La conexión no existe en este tenant"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "415": {
            "description": "Use Content-Type: application/json"
          },
          "500": {
            "description": "Fallo de base de datos o resultado desconocido; consulte o reintente el evento original sin cambiar su ID ni cuerpo"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Revocar un inicio de sesión de Launch o todas las sesiones de autorización de una cuenta",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/connections/{id}/session-revocations/{event}": {
      "get": {
        "description": "Devuelve el acuse persistente original de este tenant y conexión. HTTP 404 indica que no hay ningún resultado confirmado visible actualmente; reintente el POST original con el mismo event_id y cuerpo. No se requiere un worker asíncrono.",
        "operationId": "launch_get__api_v1_launch_connections_id_session_revocations_event_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "event",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "account_ref": "account_456",
                    "completed_at": "2026-10-24T05:00:00.145678Z",
                    "connection_id": "11111111-1111-4111-8111-111111111111",
                    "created_at": "2026-10-24T05:00:00.123456Z",
                    "environment": "live",
                    "event_id": "11111111-1111-4111-8111-111111111111",
                    "reason": "forced_logout",
                    "released_devices": 2,
                    "revoked_credentials": 2,
                    "revoked_sessions": 2,
                    "scope": "session",
                    "sid": "login_123",
                    "status": "succeeded"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LaunchSessionRevocation",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "404": {
            "description": "No existe ningún resultado confirmado en este tenant y conexión"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "500": {
            "description": "Fallo de base de datos o resultado desconocido; consulte o reintente el evento original sin cambiar su ID ni cuerpo"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Consultar el resultado confirmado de una revocación de sesión de Launch",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/launch/device-operations/{operation}": {
      "get": {
        "description": "Consulta el progreso de liberación remota. Licentivo realiza las decisiones, los reintentos y las comprobaciones de alcance.",
        "operationId": "launch_get__api_v1_launch_device_operations_operation_",
        "parameters": [
          {
            "in": "path",
            "name": "operation",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "activation_id": "11111111-1111-4111-8111-111111111111",
                    "expected_generation": 1,
                    "license_id": "11111111-1111-4111-8111-111111111111",
                    "operation_id": "11111111-1111-4111-8111-111111111111",
                    "source": "logout",
                    "status": "pending"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DeviceReleaseOperation",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Consultar el progreso de liberación remota",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/launch/device-operations/{operation}/retry": {
      "post": {
        "description": "Una operación manual_review requiere approve=true del propietario. La aprobación nunca elude la versión original de la vinculación.",
        "operationId": "launch_post__api_v1_launch_device_operations_operation_retry",
        "parameters": [
          {
            "in": "path",
            "name": "operation",
            "required": true,
            "schema": {
              "description": "UUID del recurso de Licentivo.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "approve": {
                    "description": "Indica si esta conexión de confianza puede autorizar nuevos usos en ejecución.",
                    "type": "boolean"
                  }
                },
                "required": [],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {},
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "additionalProperties": false,
                      "description": "Resultado de esta operación.",
                      "properties": {
                        "queued": {
                          "description": "Indica si esta conexión de confianza puede autorizar nuevos usos en ejecución.",
                          "type": "boolean"
                        }
                      },
                      "required": [],
                      "type": "object"
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [
          {
            "managementKey": []
          },
          {
            "session": []
          }
        ],
        "summary": "Reintentar o aprobar explícitamente una liberación revisada",
        "tags": [
          "Launch account licensing"
        ],
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/launch/exchange": {
      "post": {
        "description": "Idempotency-Key es obligatoria. Se requieren la cabecera JWT alg=Ed25519, typ=licentivo-launch-identity+jwt y un kid fijado, junto con los valores exactos de iss/aud/environment, sub, sid, jti, iat, nbf, exp, auth_time, session_exp, launch_product_id, product_id y entitlement_ref. La afirmación dura como máximo 120 segundos. Las repeticiones solo recuperan la misma sesión activa de dispositivo con la misma solicitud y clave de idempotencia. Las compras se consultan exclusivamente en Licentivo.",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "description": "Idempotency-Key para esta operación de autorización de Launch.",
              "maxLength": 80,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "device_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                "environment": "live",
                "identity_token": "identity_token_example",
                "launch_connection_id": "11111111-1111-4111-8111-111111111111",
                "product_id": "11111111-1111-4111-8111-111111111111"
              },
              "schema": {
                "$ref": "#/components/schemas/LaunchExchangeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "activation_id": "11111111-1111-4111-8111-111111111111"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RuntimeResult",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [],
        "summary": "Intercambiar la identidad de cuenta de Launch por una autorización de dispositivo",
        "tags": [
          "Launch account licensing"
        ]
      }
    },
    "/api/v1/legal/policy": {
      "get": {
        "description": "Devuelve documentos de servicio, reembolsos y privacidad congelados en los 13 idiomas admitidos. Se omiten los datos opcionales de perfil no confirmados. Una versión publicada requiere aceptación explícita; los procedimientos existentes continúan hasta la primera publicación.",
        "operationId": "get__api_v1_legal_policy",
        "parameters": [
          {
            "in": "query",
            "name": "version",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "locale",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommercePolicy"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [],
        "summary": "Consultar una política legal inmutable"
      }
    },
    "/api/v1/licenses": {
      "get": {
        "operationId": "get_api_v1_licenses",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "product_id",
            "schema": {
              "description": "UUID del producto en el espacio de trabajo actual.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "description": "Texto de búsqueda; los campos de destino y la longitud máxima dependen de la operación.",
              "maxLength": 254,
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
              "enum": [
                "active",
                "expired",
                "suspended",
                "revoked"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "created_at": "2026-10-18T00:00:00Z",
                        "customer": "Order #1001",
                        "duration_days": 30,
                        "expires_at": null,
                        "features": [
                          "export"
                        ],
                        "first_activated_at": null,
                        "id": "33333333-3333-4333-8333-333333333333",
                        "key_prefix": "lv_lic_AAAAAAA",
                        "max_devices": 1,
                        "mode": "timed",
                        "policy_id": "22222222-2222-4222-8222-222222222222",
                        "policy_version": 1,
                        "product_id": "11111111-1111-4111-8111-111111111111",
                        "status": "active",
                        "updated_at": "2026-10-18T00:00:00Z"
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LicenseList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar licencias",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-scope": "read"
      },
      "post": {
        "description": "Requiere una sesión Owner o una clave de escritura de un Owner activo. No hay reintentos automáticos de Idempotency-Key.",
        "operationId": "post_api_v1_licenses",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "customer": "Order #1001",
                "customer_email": "buyer@example.com",
                "duration_days": 30,
                "policy_id": "22222222-2222-4222-8222-222222222222",
                "product_id": "11111111-1111-4111-8111-111111111111"
              },
              "schema": {
                "$ref": "#/components/schemas/LicenseCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "duration_days": 30,
                    "expires_at": null,
                    "first_activated_at": null,
                    "id": "33333333-3333-4333-8333-333333333333",
                    "key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                    "key_prefix": "lv_lic_AAAAAAA"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LicenseSecret",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Emitir licencia",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-request-variants": [
          {
            "name": "timed",
            "request": {
              "customer": "Order #1001",
              "customer_email": "buyer@example.com",
              "duration_days": 30,
              "policy_id": "22222222-2222-4222-8222-222222222222",
              "product_id": "11111111-1111-4111-8111-111111111111"
            },
            "response": {
              "data": {
                "duration_days": 30,
                "expires_at": null,
                "first_activated_at": null,
                "id": "33333333-3333-4333-8333-333333333333",
                "key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                "key_prefix": "lv_lic_AAAAAAA"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          },
          {
            "name": "perpetual",
            "request": {
              "customer": "Order #1001",
              "customer_email": "buyer@example.com",
              "duration_days": null,
              "policy_id": "22222222-2222-4222-8222-222222222223",
              "product_id": "11111111-1111-4111-8111-111111111111"
            },
            "response": {
              "data": {
                "duration_days": null,
                "expires_at": null,
                "first_activated_at": null,
                "id": "33333333-3333-4333-8333-333333333333",
                "key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                "key_prefix": "lv_lic_AAAAAAA"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          }
        ],
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/licenses/batch": {
      "post": {
        "description": "Aplicar una política nunca cambia el modo ni la duración de una licencia. La creación requiere una duración explícita para cada licencia timed/trial, tomada de su entrada o del campo común del lote. Las licencias gestionadas por Launch rechazan renovaciones independientes, individuales o por lotes, con HTTP 409 LAUNCH_VALIDITY_MANAGED; renueve la compra en Launch y sincronice la validez absoluta. Un lote de renovación mixto se revierte por completo.",
        "operationId": "post_api_v1_licenses_batch",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "duration_days": 30,
                "entries": [
                  {
                    "customer": "Order #1001",
                    "customer_email": "buyer@example.com"
                  }
                ],
                "operation": "create",
                "policy_id": "22222222-2222-4222-8222-222222222222",
                "product_id": "11111111-1111-4111-8111-111111111111",
                "request_id": "55555555-5555-4555-8555-555555555555"
              },
              "schema": {
                "$ref": "#/components/schemas/BatchInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "count": 1,
                    "items": [
                      {
                        "customer": "Order #1001",
                        "customer_email": "buyer@example.com",
                        "duration_days": 30,
                        "expires_at": null,
                        "first_activated_at": null,
                        "id": "33333333-3333-4333-8333-333333333333",
                        "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                      }
                    ],
                    "operation": "create",
                    "request_id": "55555555-5555-4555-8555-555555555555"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BatchResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Operaciones de licencias por lotes",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-request-variants": [
          {
            "name": "create",
            "request": {
              "duration_days": 30,
              "entries": [
                {
                  "customer": "Order #1001",
                  "customer_email": "buyer@example.com"
                }
              ],
              "operation": "create",
              "policy_id": "22222222-2222-4222-8222-222222222222",
              "product_id": "11111111-1111-4111-8111-111111111111",
              "request_id": "55555555-5555-4555-8555-555555555555"
            },
            "response": {
              "data": {
                "count": 1,
                "items": [
                  {
                    "customer": "Order #1001",
                    "customer_email": "buyer@example.com",
                    "duration_days": 30,
                    "expires_at": null,
                    "first_activated_at": null,
                    "id": "33333333-3333-4333-8333-333333333333",
                    "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                  }
                ],
                "operation": "create",
                "request_id": "55555555-5555-4555-8555-555555555555"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          },
          {
            "name": "renew",
            "request": {
              "days": 30,
              "ids": [
                "33333333-3333-4333-8333-333333333333"
              ],
              "operation": "renew",
              "request_id": "55555555-5555-4555-8555-555555555555"
            },
            "response": {
              "data": {
                "count": 1,
                "items": [
                  {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "operation": "renew"
                  }
                ],
                "operation": "renew",
                "request_id": "55555555-5555-4555-8555-555555555555"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          },
          {
            "name": "revoke",
            "request": {
              "ids": [
                "33333333-3333-4333-8333-333333333333"
              ],
              "operation": "revoke",
              "request_id": "55555555-5555-4555-8555-555555555555"
            },
            "response": {
              "data": {
                "count": 1,
                "items": [
                  {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "operation": "revoke"
                  }
                ],
                "operation": "revoke",
                "request_id": "55555555-5555-4555-8555-555555555555"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          },
          {
            "name": "apply_policy",
            "request": {
              "ids": [
                "33333333-3333-4333-8333-333333333333"
              ],
              "operation": "apply_policy",
              "policy_id": "22222222-2222-4222-8222-222222222222",
              "preview_token": "REPLACE_WITH_THE_UNEXPIRED_PREVIEW_TOKEN",
              "request_id": "55555555-5555-4555-8555-555555555555"
            },
            "response": {
              "data": {
                "count": 1,
                "items": [
                  {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "operation": "apply_policy"
                  }
                ],
                "operation": "apply_policy",
                "request_id": "55555555-5555-4555-8555-555555555555"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          }
        ],
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/licenses/export.csv": {
      "get": {
        "operationId": "get_api_v1_licenses_export_csv",
        "parameters": [
          {
            "in": "query",
            "name": "product_id",
            "schema": {
              "description": "UUID del producto en el espacio de trabajo actual.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "description": "Texto de búsqueda; los campos de destino y la longitud máxima dependen de la operación.",
              "maxLength": 254,
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "description": "Estado actual del recurso; consulte la enumeración y las notas de la operación.",
              "enum": [
                "active",
                "expired",
                "suspended",
                "revoked"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {
                "example": "id,product_id,key_prefix,customer,mode,status,max_devices,expires_at\n",
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "413": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "EXPORT_TOO_LARGE",
                    "message": "Filter the export to at most 5000 records"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Filtrar hasta un máximo de 5000 registros"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Exportar licencias",
        "x-csv-columns": [
          "id",
          "product_id",
          "key_prefix",
          "customer",
          "mode",
          "status",
          "max_devices",
          "expires_at"
        ],
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/licenses/policy-preview": {
      "post": {
        "description": "Aplicar una política nunca cambia el modo ni la duración de una licencia. La creación requiere una duración explícita para cada licencia timed/trial, tomada de su entrada o del campo común del lote.",
        "operationId": "post_api_v1_licenses_policy-preview",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "ids": [
                  "33333333-3333-4333-8333-333333333333"
                ],
                "policy_id": "22222222-2222-4222-8222-222222222222"
              },
              "schema": {
                "$ref": "#/components/schemas/PreviewInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "changes": [],
                    "expires_in": 600,
                    "note": "",
                    "policy_version": 1,
                    "preview_token": ""
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PolicyPreview",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Previsualizar la aplicación de una política",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/licenses/{id}": {
      "delete": {
        "operationId": "delete_api_v1_licenses_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Archivar licencia",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      },
      "get": {
        "operationId": "get_api_v1_licenses_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "created_at": "2026-10-18T00:00:00Z",
                    "customer": "Order #1001",
                    "duration_days": 30,
                    "expires_at": null,
                    "features": [
                      "export"
                    ],
                    "first_activated_at": null,
                    "id": "33333333-3333-4333-8333-333333333333",
                    "key_prefix": "lv_lic_AAAAAAA",
                    "max_devices": 1,
                    "mode": "timed",
                    "policy_id": "22222222-2222-4222-8222-222222222222",
                    "policy_version": 1,
                    "product_id": "11111111-1111-4111-8111-111111111111",
                    "status": "active",
                    "updated_at": "2026-10-18T00:00:00Z"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/License",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar licencia",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-scope": "read"
      },
      "patch": {
        "operationId": "patch_api_v1_licenses_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "status": "suspended"
              },
              "schema": {
                "$ref": "#/components/schemas/LicenseUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Actualizar licencia",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/licenses/{id}/capabilities": {
      "get": {
        "operationId": "get_api_v1_licenses_by_id_capabilities",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "customer_email": "buyer@example.com",
                    "license": {
                      "license_id": "33333333-3333-4333-8333-333333333333",
                      "license_model": "node_locked",
                      "maintenance_days": 0,
                      "maintenance_until": null,
                      "max_version": "",
                      "min_version": "",
                      "product_id": "11111111-1111-4111-8111-111111111111",
                      "updated_at": "2026-10-18T00:00:00Z"
                    },
                    "meter_rules": [],
                    "usage": null
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LicenseCapabilityResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar capacidades de la licencia",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/licenses/{id}/customer": {
      "patch": {
        "operationId": "patch_api_v1_licenses_by_id_customer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "email": "buyer@example.com",
                "name": "Sample customer"
              },
              "schema": {
                "$ref": "#/components/schemas/CustomerAssignment"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Asignar cliente",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/licenses/{id}/maintenance/renew": {
      "post": {
        "operationId": "post_api_v1_licenses_by_id_maintenance_renew",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "days": 30
              },
              "schema": {
                "$ref": "#/components/schemas/Renew"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "license_id": "33333333-3333-4333-8333-333333333333",
                    "license_model": "node_locked",
                    "maintenance_days": 0,
                    "maintenance_until": null,
                    "max_version": "",
                    "min_version": "",
                    "product_id": "11111111-1111-4111-8111-111111111111",
                    "updated_at": "2026-10-18T00:00:00Z"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LicenseCapabilities",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Renovar mantenimiento",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/licenses/{id}/renew": {
      "post": {
        "description": "Antes de la primera activación, la renovación aumenta duration_days. Después de la activación, la ampliación comienza en el momento posterior entre la hora actual y expires_at; las licencias vencidas no pierden tiempo de ampliación comprado. Las licencias gestionadas por Launch rechazan renovaciones independientes, individuales o por lotes, con HTTP 409 LAUNCH_VALIDITY_MANAGED; renueve la compra en Launch y sincronice la validez absoluta. Un lote de renovación mixto se revierte por completo.",
        "operationId": "post_api_v1_licenses_by_id_renew",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "days": 30
              },
              "schema": {
                "$ref": "#/components/schemas/Renew"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "duration_days": 60,
                    "expires_at": null,
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Renewed",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Renovar licencia",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-request-variants": [
          {
            "name": "before_activation",
            "request": {
              "days": 30
            },
            "response": {
              "data": {
                "duration_days": 60,
                "expires_at": null,
                "id": "33333333-3333-4333-8333-333333333333"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          },
          {
            "name": "after_activation",
            "request": {
              "days": 30
            },
            "response": {
              "data": {
                "duration_days": 30,
                "expires_at": "2026-12-17T00:00:00Z",
                "id": "33333333-3333-4333-8333-333333333333"
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          }
        ],
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/licenses/{id}/reveal-key": {
      "post": {
        "description": "Requires an active Owner browser session and CSRF token. Management API keys and read-only members are forbidden. Keys are encrypted at rest and each view is audited without recording the secret. Ordinary lists, details and CSV exports contain only the prefix. Older encrypted batch/onboarding receipts are recovered during migration. Older hash-only issuances return LICENSE_KEY_UNAVAILABLE (409); Launch account licenses return LICENSE_KEY_NOT_APPLICABLE (409). Viewing does not rotate the key or change validity, devices or usage.",
        "operationId": "post_api_v1_licenses_by_id_reveal-key",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LicenseKeyReveal"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "View the original license key",
        "x-required-role": "owner"
      }
    },
    "/api/v1/licenses/{id}/revoke": {
      "post": {
        "operationId": "post_api_v1_licenses_by_id_revoke",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Revocar licencia",
        "x-management-reference": {
          "group": "licenses"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/members": {
      "get": {
        "operationId": "get_api_v1_members",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MemberList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "get /members",
        "x-required-role": "owner"
      },
      "post": {
        "operationId": "post_api_v1_members",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Invite"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Invited"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "post /members",
        "x-required-role": "owner"
      }
    },
    "/api/v1/members/{id}": {
      "patch": {
        "operationId": "patch_api_v1_members_by_id",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemberUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "patch /members/{id}",
        "x-required-role": "owner"
      }
    },
    "/api/v1/offline/respond": {
      "post": {
        "operationId": "post_api_v1_offline_respond",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "activation_id": "44444444-4444-4444-8444-444444444444",
                "app_version": "1.0.0",
                "created_at": 1792281600,
                "device_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                "device_name": "Office PC",
                "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                "operation": "deactivate",
                "product_id": "11111111-1111-4111-8111-111111111111",
                "request_id": "55555555-5555-4555-8555-555555555555",
                "version": 1
              },
              "schema": {
                "$ref": "#/components/schemas/OfflineRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "operation": "deactivate",
                    "request_id": "55555555-5555-4555-8555-555555555555",
                    "result": {
                      "activation_id": "44444444-4444-4444-8444-444444444444",
                      "deactivated": true
                    },
                    "version": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OfflineResponse",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Emitir una respuesta sin conexión",
        "x-management-reference": {
          "group": "integration"
        },
        "x-request-variants": [
          {
            "name": "activate",
            "request": {
              "app_version": "1.0.0",
              "created_at": 1792281600,
              "device_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
              "device_name": "Office PC",
              "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
              "operation": "activate",
              "product_id": "11111111-1111-4111-8111-111111111111",
              "request_id": "55555555-5555-4555-8555-555555555555",
              "version": 1
            },
            "response": {
              "data": {
                "operation": "activate",
                "request_id": "55555555-5555-4555-8555-555555555555",
                "result": {
                  "activation_id": "44444444-4444-4444-8444-444444444444",
                  "device_key": "lv_dev_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                  "heartbeat_seconds": 600,
                  "lease": {
                    "key_id": "66666666-6666-4666-8666-666666666666",
                    "payload": "BASE64URL_ENCODED_SIGNED_CLAIMS",
                    "signature": "BASE64URL_ED25519_SIGNATURE",
                    "version": 1
                  }
                },
                "version": 1
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          },
          {
            "name": "deactivate",
            "request": {
              "activation_id": "44444444-4444-4444-8444-444444444444",
              "app_version": "1.0.0",
              "created_at": 1792281600,
              "device_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
              "device_name": "Office PC",
              "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
              "operation": "deactivate",
              "product_id": "11111111-1111-4111-8111-111111111111",
              "request_id": "55555555-5555-4555-8555-555555555555",
              "version": 1
            },
            "response": {
              "data": {
                "operation": "deactivate",
                "request_id": "55555555-5555-4555-8555-555555555555",
                "result": {
                  "activation_id": "44444444-4444-4444-8444-444444444444",
                  "deactivated": true
                },
                "version": 1
              },
              "request_id": "55555555-5555-4555-8555-555555555555"
            }
          }
        ],
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/onboarding": {
      "post": {
        "operationId": "post_api_v1_onboarding",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "duration_days": 7,
                "mode": "trial",
                "name": "Report app",
                "request_id": "55555555-5555-4555-8555-555555555555"
              },
              "schema": {
                "$ref": "#/components/schemas/OnboardingInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "config": {
                      "allow_http": false,
                      "app_version": "1.0.0",
                      "base_url": "https://license.example.com",
                      "cache_path": "",
                      "device_name": "My application",
                      "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                      "product_id": "11111111-1111-4111-8111-111111111111",
                      "trusted_keys": {
                        "66666666-6666-4666-8666-666666666666": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                      }
                    },
                    "license_id": "33333333-3333-4333-8333-333333333333",
                    "license_key": "lv_lic_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                    "next": "Choose a language and download the configured SDK bundle.",
                    "policy_id": "22222222-2222-4222-8222-222222222222",
                    "product_id": "11111111-1111-4111-8111-111111111111"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OnboardingResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Crear recursos de integración",
        "x-management-reference": {
          "group": "integration"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/payments/paddle/webhook": {
      "post": {
        "operationId": "post__api_v1_payments_paddle_webhook",
        "parameters": [
          {
            "in": "header",
            "name": "Paddle-Signature",
            "required": true,
            "schema": {
              "description": "Nombre visible del servicio de pago.",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaddleWebhookEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookReceived"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [],
        "summary": "Verificar la firma de Paddle y conciliar pagos completados o ajustes",
        "x-licentivo-access": "public"
      }
    },
    "/api/v1/payments/paypal/webhook": {
      "post": {
        "operationId": "post_api_v1_payments_paypal_webhook",
        "parameters": [
          {
            "in": "header",
            "name": "Paypal-Auth-Algo",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Paypal-Cert-Url",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Paypal-Transmission-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Paypal-Transmission-Sig",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Paypal-Transmission-Time",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookReceived"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Notificación verificada de captura/reembolso/reversión"
      }
    },
    "/api/v1/payments/waffo/webhook": {
      "post": {
        "operationId": "post__api_v1_payments_waffo_webhook",
        "parameters": [
          {
            "in": "header",
            "name": "X-Waffo-Signature",
            "required": true,
            "schema": {
              "description": "Identificador del comerciante que empieza por MER_.",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WaffoWebhookEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookReceived"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [],
        "summary": "Verificar la firma de Waffo y conciliar el pago o reembolso",
        "x-licentivo-access": "public"
      }
    },
    "/api/v1/policies": {
      "get": {
        "operationId": "get_api_v1_policies",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "product_id",
            "schema": {
              "description": "UUID del producto en el espacio de trabajo actual.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "created_at": "2026-10-18T00:00:00Z",
                        "features": [
                          "export"
                        ],
                        "heartbeat_seconds": 600,
                        "id": "22222222-2222-4222-8222-222222222222",
                        "max_devices": 1,
                        "mode": "timed",
                        "name": "One device",
                        "offline_mode": "limited",
                        "offline_seconds": 86400,
                        "product_id": "11111111-1111-4111-8111-111111111111",
                        "updated_at": "2026-10-18T00:00:00Z",
                        "version": 1
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PolicyList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar políticas",
        "x-management-reference": {
          "group": "policies"
        },
        "x-required-scope": "read"
      },
      "post": {
        "description": "Requiere una sesión Owner o una clave de escritura de un Owner activo. No hay reintentos automáticos de Idempotency-Key.",
        "operationId": "post_api_v1_policies",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "features": [
                  "export"
                ],
                "heartbeat_seconds": 600,
                "max_devices": 1,
                "mode": "timed",
                "name": "One device",
                "offline_mode": "limited",
                "offline_seconds": 86400,
                "product_id": "11111111-1111-4111-8111-111111111111"
              },
              "schema": {
                "$ref": "#/components/schemas/PolicyCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Crear política",
        "x-management-reference": {
          "group": "policies"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/policies/{id}": {
      "delete": {
        "operationId": "delete_api_v1_policies_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Archivar política",
        "x-management-reference": {
          "group": "policies"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      },
      "get": {
        "operationId": "get_api_v1_policies_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "created_at": "2026-10-18T00:00:00Z",
                    "features": [
                      "export"
                    ],
                    "heartbeat_seconds": 600,
                    "id": "22222222-2222-4222-8222-222222222222",
                    "max_devices": 1,
                    "mode": "timed",
                    "name": "One device",
                    "offline_mode": "limited",
                    "offline_seconds": 86400,
                    "product_id": "11111111-1111-4111-8111-111111111111",
                    "updated_at": "2026-10-18T00:00:00Z",
                    "version": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Policy",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar política",
        "x-management-reference": {
          "group": "policies"
        },
        "x-required-scope": "read"
      },
      "patch": {
        "description": "Actualiza atómicamente la política y todas las instantáneas de licencias vinculadas no revocadas. Conserva los plazos de las licencias existentes, el uso confirmado y las ampliaciones independientes de mantenimiento. Devuelve synced_licenses. ACTIVE_DEVICES_CONFLICT revierte todo el guardado.",
        "operationId": "patch_api_v1_policies_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "max_devices": 2
              },
              "schema": {
                "$ref": "#/components/schemas/PolicyUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "synced_licenses": 0
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PolicySyncResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Actualizar la política básica",
        "x-management-reference": {
          "group": "policies"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/policies/{id}/capabilities": {
      "get": {
        "operationId": "get_api_v1_policies_by_id_capabilities",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "allow_vm": true,
                    "device_match": "system",
                    "license_model": "node_locked",
                    "maintenance_days": 0,
                    "max_version": "",
                    "meter_rules": [],
                    "min_version": "",
                    "policy_id": "22222222-2222-4222-8222-222222222222",
                    "policy_version": 1,
                    "product_id": "11111111-1111-4111-8111-111111111111",
                    "require_hardware": false,
                    "self_release_limit": 3,
                    "session_seconds": 7200,
                    "updated_at": "2026-10-18T00:00:00Z"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PolicyCapabilities",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar capacidades de la política",
        "x-management-reference": {
          "group": "policies"
        },
        "x-required-scope": "read"
      },
      "patch": {
        "description": "Use el policy_version actual. Actualiza atómicamente la política y todas las instantáneas de licencias vinculadas no revocadas, conservando los plazos emitidos, el uso confirmado y las ampliaciones independientes de mantenimiento. Devuelve synced_licenses. POLICY_CHANGED o ACTIVE_DEVICES_CONFLICT revierte todo el guardado.",
        "operationId": "patch_api_v1_policies_by_id_capabilities",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "license_model": "node_locked",
                "meter_rules": [
                  {
                    "allow_overage": false,
                    "feature": "export",
                    "limit": 500,
                    "max_overage": 0,
                    "period": "month"
                  }
                ],
                "policy_version": 1
              },
              "schema": {
                "$ref": "#/components/schemas/PolicyCapabilitiesInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "synced_licenses": 0
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PolicySyncResult",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Actualizar capacidades de la política",
        "x-management-reference": {
          "group": "policies"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/products": {
      "get": {
        "operationId": "get_api_v1_products",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "description": "Texto de búsqueda; los campos de destino y la longitud máxima dependen de la operación.",
              "maxLength": 120,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "created_at": "2026-10-18T00:00:00Z",
                        "description": "Desktop reporting software",
                        "id": "11111111-1111-4111-8111-111111111111",
                        "name": "Report app",
                        "status": "active",
                        "updated_at": "2026-10-18T00:00:00Z"
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ProductList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar productos",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-scope": "read"
      },
      "post": {
        "description": "Requiere una sesión Owner o una clave de escritura de un Owner activo. No hay reintentos automáticos de Idempotency-Key.",
        "operationId": "post_api_v1_products",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "description": "Desktop reporting software",
                "name": "Report app"
              },
              "schema": {
                "$ref": "#/components/schemas/ProductCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Crear producto",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/products/{id}": {
      "delete": {
        "operationId": "delete_api_v1_products_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Archivar producto",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      },
      "get": {
        "operationId": "get_api_v1_products_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "created_at": "2026-10-18T00:00:00Z",
                    "description": "Desktop reporting software",
                    "id": "11111111-1111-4111-8111-111111111111",
                    "name": "Report app",
                    "status": "active",
                    "updated_at": "2026-10-18T00:00:00Z"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Product",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Consultar producto",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-scope": "read"
      },
      "patch": {
        "operationId": "patch_api_v1_products_by_id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "name": "Report app Pro",
                "status": "active"
              },
              "schema": {
                "$ref": "#/components/schemas/ProductUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Actualizar producto",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/products/{id}/public-keys": {
      "get": {
        "operationId": "get_api_v1_products_by_id_public-keys",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/KeyBundle"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Conjunto de claves fijadas del producto"
      }
    },
    "/api/v1/products/{id}/releases": {
      "get": {
        "operationId": "get_api_v1_products_by_id_releases",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "channel": "stable",
                        "created_at": "2026-10-18T00:00:00Z",
                        "download_url": "",
                        "id": "33333333-3333-4333-8333-333333333333",
                        "notes": "Initial release",
                        "product_id": "11111111-1111-4111-8111-111111111111",
                        "published_at": "2026-10-18T00:00:00Z",
                        "sha256": "",
                        "version": "1.0.0"
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ReleaseList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar versiones publicadas",
        "x-management-reference": {
          "group": "releases"
        },
        "x-required-scope": "read"
      },
      "post": {
        "operationId": "post_api_v1_products_by_id_releases",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "channel": "stable",
                "notes": "Initial release",
                "version": "1.0.0"
              },
              "schema": {
                "$ref": "#/components/schemas/ReleaseInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "channel": "stable",
                    "created_at": "2026-10-18T00:00:00Z",
                    "download_url": "",
                    "id": "33333333-3333-4333-8333-333333333333",
                    "notes": "Initial release",
                    "product_id": "11111111-1111-4111-8111-111111111111",
                    "published_at": "2026-10-18T00:00:00Z",
                    "sha256": "",
                    "version": "1.0.0"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Release",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Publicar versión",
        "x-management-reference": {
          "group": "releases"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/products/{id}/sdk-bundle": {
      "post": {
        "operationId": "post_api_v1_products_by_id_sdk-bundle",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "language": "go"
              },
              "schema": {
                "$ref": "#/components/schemas/BundleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/zip": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Descargar el código fuente de ejemplo del producto",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/products/{id}/sdk-initializer": {
      "get": {
        "operationId": "get_api_v1_products_by_id_sdk-initializer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "language",
            "schema": {
              "default": "go",
              "description": "Identificador del lenguaje SDK para el paquete de descarga.",
              "enum": [
                "go",
                "java",
                "c",
                "cpp",
                "csharp",
                "python",
                "javascript",
                "rust",
                "ruby"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "language": "go",
                    "product_id": "11111111-1111-4111-8111-111111111111",
                    "source": "const productID = \"11111111-1111-4111-8111-111111111111\"\nvar trustedKeys = map[string]string{\"66666666-6666-4666-8666-666666666666\": \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}\n",
                    "trusted_keys": {
                      "66666666-6666-4666-8666-666666666666": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    }
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SDKInitializer",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Copiar el código de inicialización del producto",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/products/{id}/signing-keys": {
      "get": {
        "operationId": "get_api_v1_products_by_id_signing-keys",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "keys": [],
                    "product_id": "11111111-1111-4111-8111-111111111111"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ManagementKeyBundle",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar claves de firma",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/products/{id}/signing-keys/rotate": {
      "post": {
        "operationId": "post_api_v1_products_by_id_signing-keys_rotate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "active": true,
                    "algorithm": "Ed25519",
                    "created_at": "2026-10-18T00:00:00Z",
                    "key_id": "66666666-6666-4666-8666-666666666666",
                    "public_key": "",
                    "retired_at": null
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SigningKey",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Rotar clave de firma",
        "x-management-reference": {
          "group": "products"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/releases/eligible": {
      "post": {
        "description": "Operación de ejecución autenticada mediante licencia; sin cookie del proveedor ni API Key. El consumo de funciones requiere una Idempotency-Key estable; consume no genera cargos API de la plataforma.",
        "operationId": "post_api_v1_releases_eligible",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/EligibleReleases"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "/releases/eligible"
      }
    },
    "/api/v1/service/status": {
      "get": {
        "description": "Solo los avisos globales son públicos; no se exponen los ID de los espacios de trabajo destinatarios.",
        "operationId": "get__api_v1_service_status",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ServiceIncidentList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [],
        "summary": "Consultar mantenimiento e incidentes públicos"
      }
    },
    "/api/v1/sessions/logout": {
      "post": {
        "description": "Sin cookies de navegador ni token CSRF. Una operación duplicada reproduce el resultado sin liberar vinculaciones posteriores. El estado stale indica la finalización correcta de una revocación obsoleta. Los SDK deniegan el uso local y eliminan las credenciales de ejecución antes de enviar esta solicitud.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "activation_id": "11111111-1111-4111-8111-111111111111",
                "expected_generation": 1,
                "operation_id": "11111111-1111-4111-8111-111111111111",
                "product_id": "11111111-1111-4111-8111-111111111111",
                "release_token": "lv_out_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
              },
              "schema": {
                "$ref": "#/components/schemas/LogoutTicket"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "activation_id": "11111111-1111-4111-8111-111111111111",
                    "expected_generation": 1,
                    "license_id": "11111111-1111-4111-8111-111111111111",
                    "operation_id": "11111111-1111-4111-8111-111111111111",
                    "source": "logout",
                    "status": "pending"
                  },
                  "request_id": "request_id_example"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DeviceReleaseOperation",
                      "description": "Resultado de esta operación."
                    },
                    "request_id": {
                      "description": "Identificador de correlación de la solicitud HTTP.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Resultado aceptado"
          },
          "400": {
            "description": "Entrada no válida"
          },
          "401": {
            "description": "Autenticación o afirmación de identidad rechazada"
          },
          "403": {
            "description": "Derecho, credencial, entorno o inicio de sesión revocado"
          },
          "409": {
            "description": "Conflicto de idempotencia o de versión de política, revisión o vinculación"
          },
          "503": {
            "description": "Fallo temporal; reintente la operación original"
          }
        },
        "security": [],
        "summary": "Revocar una vinculación de dispositivo con versión mediante un ticket exclusivo de desvinculación",
        "tags": [
          "Launch account licensing"
        ]
      }
    },
    "/api/v1/summary": {
      "get": {
        "operationId": "get_api_v1_summary",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "active_licenses": 0,
                    "licenses": 0,
                    "policies": 0,
                    "products": 0
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Summary",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Recuentos del espacio de trabajo",
        "x-management-reference": {
          "group": "usage"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/support/contact": {
      "get": {
        "description": "Solo devuelve el correo de contacto configurado; vacío significa oculto. No se envía correo.",
        "operationId": "get__api_v1_support_contact",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportContact"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [],
        "summary": "Consultar el correo público de asistencia"
      }
    },
    "/api/v1/system/billing-notifications": {
      "get": {
        "description": "Reutiliza el transporte del correo de autenticación, el remitente, la cola persistente cifrada y los reintentos. Tanto el permiso de la plataforma como el consentimiento del destinatario deben admitir el tipo de mensaje. La entrega vuelve a comprobar el consentimiento actual y el estado del evento. Las opciones de correo no conceden ni revocan el consentimiento para cargar un monedero. Los mensajes sandbox están etiquetados. No se crean notificaciones para compras pendientes sin pagar ni regalos.",
        "operationId": "get__api_v1_system_billing_notifications",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BillingNotificationSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar las reglas de correo de facturación de la plataforma",
        "x-platform-admin": true,
        "x-required-role": "owner"
      },
      "patch": {
        "description": "Actualización parcial; los valores explícitamente false se conservan. Reutiliza el transporte del correo de autenticación, el remitente, la cola persistente cifrada y los reintentos. Tanto el permiso de la plataforma como el consentimiento del destinatario deben admitir el tipo de mensaje. La entrega vuelve a comprobar el consentimiento actual y el estado del evento. Las opciones de correo no conceden ni revocan el consentimiento para cargar un monedero. Los mensajes sandbox están etiquetados. No se crean notificaciones para compras pendientes sin pagar ni regalos.",
        "operationId": "patch__api_v1_system_billing_notifications",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BillingNotificationSettingsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BillingNotificationSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Configurar reglas de correo de facturación y el contacto público de asistencia",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/billing-notifications/preview": {
      "get": {
        "description": "Usa la configuración guardada de la plataforma y datos sandbox de ejemplo. No se crea ninguna compra ni tarea de correo.",
        "operationId": "get__api_v1_system_billing_notifications_preview",
        "parameters": [
          {
            "in": "query",
            "name": "kind",
            "required": true,
            "schema": {
              "enum": [
                "purchase_success",
                "expiry_reminder",
                "auto_renewal_success",
                "auto_renewal_problem"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "locale",
            "schema": {
              "default": "zh",
              "enum": [
                "zh",
                "zh-hant",
                "en",
                "es",
                "hi",
                "ar",
                "fr",
                "bn",
                "pt",
                "id",
                "ur"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BillingEmailPreview"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Previsualizar un correo de facturación sin enviarlo",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/billing-notifications/test": {
      "post": {
        "description": "La prueba explícita usa datos sandbox de ejemplo, añade [TEST] y sigue la configuración de correo existente. Puede probar una plantilla aunque ese tipo de notificación al cliente esté deshabilitado. No se realiza ningún pago ni renovación.",
        "operationId": "post__api_v1_system_billing_notifications_test",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BillingEmailTestInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MailQueued"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Poner en cola una prueba solicitada de correo de facturación",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/check-mail": {
      "post": {
        "description": "Comprueba solo el servicio guardado. Las comprobaciones de proveedores API usan solicitudes de solo lectura y nunca envían correo. Una clave que solo permite enviar puede producir check_status=limited y ok=false; esto no confirma que las credenciales sean válidas ni que la entrega haya terminado correctamente. Se necesita una solicitud explícita de correo de prueba para comprobar el envío.",
        "operationId": "post_api_v1_system_check-mail",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MailConnection"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "MAIL_PROVIDER_AUTH_FAILED, MAIL_PROVIDER_RATE_LIMITED o MAIL_PROVIDER_UNAVAILABLE. El envío de correo de prueba es asíncrono; los errores de entrega aparecen en el resultado de la tarea y no en la respuesta HTTP 202 original."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "post /system/check-mail",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_system_customer_cases",
        "parameters": [
          {
            "description": "Excluye un tipo de solicitud antes del recuento y la paginación. Use refund para excluir los casos de reembolso de la lista de asistencia; el acceso sigue limitado a la sesión actual.",
            "in": "query",
            "name": "exclude_kind",
            "schema": {
              "maxLength": 24,
              "type": "string"
            }
          },
          {
            "description": "Limita los casos de reembolso a recargas del monedero o cancelación del servicio.",
            "in": "query",
            "name": "refund_scope",
            "required": false,
            "schema": {
              "enum": [
                "wallet",
                "service"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar solicitudes de clientes",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/unread": {
      "get": {
        "description": "Se excluyen los chats de reembolsos. Los clientes solo ven tickets autorizados del espacio de trabajo; los miembros ven los suyos. Cada administrador tiene un marcador de lectura independiente.",
        "operationId": "get__api_v1_system_customer_cases_unread",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportUnread"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar los recuentos personales de tickets y avisos sin leer",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_system_customer_cases__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar solicitud y respuestas",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}/deletion-review": {
      "post": {
        "description": "Requiere reconocer las responsabilidades financieras. Revoca de inmediato el acceso normal; cierra la exportación del cliente al cumplirse exactamente 30 días y conserva todos los registros de negocio para la exportación autorizada de administradores.",
        "operationId": "post__api_v1_system_customer_cases__id__deletion_review",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountClosureReview"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Confirmar o rechazar el cierre lógico de una cuenta",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}/manual-refund": {
      "post": {
        "description": "Requiere el acuerdo del cliente y pruebas del pago completado. Esto registra la liquidación; nunca envía una transferencia bancaria. Repetir la confirmación no puede duplicar el cargo. Los pagos originales de Waffo/Paddle, incluidos los servicios, rechazan esta vía de mera declaración con ORIGINAL_REFUND_REQUIRED.",
        "operationId": "post__api_v1_system_customer_cases__id__manual_refund",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ManualRefundInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Registrar un reembolso alternativo realmente completado",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}/messages": {
      "post": {
        "description": "Los casos de reembolso rechazan respuestas con REFUND_REVIEW_WORKFLOW; los administradores aprueban o rechazan directamente. Los tickets de asistencia normales mantienen las respuestas. Los cierres revisados conservan el estado de su procedimiento de privacidad.",
        "operationId": "post__api_v1_system_customer_cases__id__messages",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupportReply"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Responder a un ticket de asistencia",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}/read": {
      "post": {
        "description": "Solo se marcan como leídos los mensajes hasta el último mostrado. Los posteriores siguen sin leer y las confirmaciones retrasadas no pueden hacer retroceder el marcador.",
        "operationId": "post__api_v1_system_customer_cases__id__read",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupportReadInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Confirmar los mensajes de ticket mostrados",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}/recover-original-refund": {
      "post": {
        "description": "Requiere confirmación administrativa explícita de que no se realizó ninguna transferencia alternativa. Conserva las pruebas originales y usa asientos contables compensatorios. Solo se solicita el importe restante a los pagos originales.",
        "operationId": "post__api_v1_system_customer_cases__id__recover_original_refund",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecoverOriginalRefund"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Corregir una declaración manual no pagada y solicitar el reembolso original",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}/refund-quote": {
      "post": {
        "description": "Nueva vista previa del alcance, importe y calendario. Un cambio del alcance del servicio requiere una nueva solicitud del cliente; el administrador puede rechazar directamente la anterior.",
        "operationId": "post__api_v1_system_customer_cases__id__refund_quote",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmptyRefundPreviewInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ScopedRefundPreview"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Previsualizar una solicitud pendiente con alcance definido antes de aprobarla",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/customer/cases/{id}/refund-review": {
      "post": {
        "description": "Serializa las operaciones en el espacio de trabajo de destino. La aprobación reserva fondos disponibles del monedero, asigna reembolsos por el método original usando ID de solicitud estables del proveedor y conserva cualquier saldo que requiera una alternativa acordada. Las aprobaciones Waffo/Paddle crean intenciones persistentes de reembolso con el proveedor original y envían solicitudes a la API de reembolsos del comerciante. Ninguna declaración manual puede completar estos reembolsos. Un estado de aprobación processing/pending no equivale a fondos liquidados.",
        "operationId": "post__api_v1_system_customer_cases__id__refund_review",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefundReview"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SupportCaseDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Aprobar o rechazar el reembolso del cliente",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/legal/policy": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_system_legal_policy",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommercePolicy"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar el perfil del operador y las versiones de políticas pendientes",
        "x-platform-admin": true,
        "x-required-role": "owner"
      },
      "patch": {
        "description": "La publicación requiere un nombre legal confirmado del operador y un correo de contacto válido. Los demás datos del perfil son opcionales y los no confirmados se omiten de los documentos públicos. Las versiones publicadas que sustituyen a otras conservan la versión anterior durante un preaviso mínimo de 30 días mediante la consola y correos enviados correctamente.",
        "operationId": "patch__api_v1_system_legal_policy",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CommercePolicyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommercePolicy"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Publicar o programar políticas de servicio",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/mail-jobs": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma. Los últimos 50 mensajes con tipo, entorno, destinatario, intentos, estado y motivo de cancelación. Se eliminan los payloads de mensajes entregados/cancelados. La aceptación SMTP no equivale a entrega en el buzón ni a lectura.",
        "operationId": "get_api_v1_system_mail-jobs",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MailJobList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "get /system/mail-jobs",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/mail-jobs/{id}/retry": {
      "post": {
        "description": "Restablece el número de intentos y pone en cola el mismo mensaje fallido. Las tareas entregadas, canceladas, en ejecución y pendientes devuelven MAIL_JOB_NOT_RETRYABLE. Las tareas de facturación vuelven a comprobar el consentimiento actual y el estado del evento antes del nuevo intento de entrega. Los errores SMTP nunca revierten un pago confirmado.",
        "operationId": "post__api_v1_system_mail_jobs__id__retry",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MailQueued"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Reintentar un correo fallido cuyo payload cifrado se ha conservado",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/operations": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma. Registro de aplicación de solo adición con actor, destinatario, motivo y cambios explícitos.",
        "operationId": "get__api_v1_system_operations",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "user_id",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "action",
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlatformOperationList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar operaciones administrativas de clientes"
      }
    },
    "/api/v1/system/overview": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma. Las métricas de paquetes usan el entorno de pago configurado actualmente. Los usuarios nuevos cubren los últimos 30 días; los vencimientos, los próximos 7 días.",
        "operationId": "get__api_v1_system_overview",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlatformOverview"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar los totales de clientes y paquetes de la plataforma"
      }
    },
    "/api/v1/system/paddle": {
      "get": {
        "operationId": "get__api_v1_system_paddle",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleSettings"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar la configuración de Paddle sin claves privadas",
        "x-licentivo-access": "platform"
      },
      "patch": {
        "operationId": "patch__api_v1_system_paddle",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaddleSettingsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleSettings"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Guardar las credenciales cifradas de Paddle Billing",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/paddle/check": {
      "post": {
        "operationId": "post__api_v1_system_paddle_check",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleCheck"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Verificar las credenciales de Paddle y el producto activo",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/paddle/orders": {
      "get": {
        "operationId": "get__api_v1_system_paddle_orders",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleOrderList"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar pagos de servicios y recargas del monedero de Paddle",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/paddle/orders/{id}/reconcile": {
      "post": {
        "operationId": "post__api_v1_system_paddle_orders__id__reconcile",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "Identificador local del pago de servicio.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaddleReconcileInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaddleOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Conciliar o recuperar una transacción original sin crear un cargo",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/payment-channels": {
      "get": {
        "operationId": "get__api_v1_system_payment_channels",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaymentChannels"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar canales de pago configurables de forma independiente",
        "x-licentivo-access": "platform"
      },
      "patch": {
        "operationId": "patch__api_v1_system_payment_channels",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentChannelInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PaymentChannels"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Habilitar o deshabilitar canales atómicamente con control optimista de concurrencia",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/paypal": {
      "get": {
        "operationId": "get_api_v1_system_paypal",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "PayPal",
        "x-platform-admin": true,
        "x-required-role": "owner"
      },
      "patch": {
        "operationId": "patch_api_v1_system_paypal",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayPalInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "PayPal",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/paypal/check": {
      "post": {
        "operationId": "post_api_v1_system_paypal_check",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalCheck"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Comprobar PayPal",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/paypal/orders/{id}/refund": {
      "post": {
        "description": "Solo sesiones de administradores de la plataforma. Reserva el crédito disponible y no gastado del monedero antes de contactar con PayPal. Pending indica que el resultado no está confirmado; concilie la misma solicitud. No cancela un paquete automáticamente.",
        "operationId": "post__api_v1_system_paypal_orders__id__refund",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefundInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalRefund"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Reembolsar los fondos no usados del monedero al método de pago PayPal original"
      }
    },
    "/api/v1/system/paypal/refund-requests": {
      "get": {
        "description": "Solo sesiones con cookie; no se aceptan claves API administrativas. Las consultas de clientes se limitan a su espacio de trabajo. Las escrituras de clientes requieren un Owner verificado del espacio de trabajo, sin requerir permisos de administrador de la plataforma. Las solicitudes no mueven ni reservan fondos. La aprobación administrativa vuelve a comprobar el monedero actual y el valor capturado no reembolsado; después usa el procedimiento idempotente existente de reembolso por el método original y reserva. La aprobación no cancela planes.",
        "operationId": "get__api_v1_system_paypal_refund_requests",
        "parameters": [
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "sandbox",
                "live"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletRefundRequestList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar solicitudes de reembolso de clientes para revisión",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/paypal/refund-requests/{id}/review": {
      "post": {
        "description": "Solo sesiones con cookie; no se aceptan claves API administrativas. Las consultas de clientes se limitan a su espacio de trabajo. Las escrituras de clientes requieren un Owner verificado del espacio de trabajo, sin requerir permisos de administrador de la plataforma. Las solicitudes no mueven ni reservan fondos. La aprobación administrativa vuelve a comprobar el monedero actual y el valor capturado no reembolsado; después usa el procedimiento idempotente existente de reembolso por el método original y reserva. La aprobación no cancela planes.",
        "operationId": "post__api_v1_system_paypal_refund_requests__id__review",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WalletRefundReview"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletRefundRequest"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, autenticación, titularidad, conflicto de revisión o saldo"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Aprobar o rechazar una solicitud de reembolso de un cliente",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/paypal/refunds": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma.",
        "operationId": "get__api_v1_system_paypal_refunds",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "sandbox",
                "live"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RefundList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar solicitudes de reembolso del entorno de pago seleccionado"
      }
    },
    "/api/v1/system/paypal/refunds/{id}/reconcile": {
      "post": {
        "description": "Solo sesiones de administradores de la plataforma. Reintenta el mismo PayPal-Request-Id si no se recibió el ID de reembolso o consulta el reembolso existente del proveedor.",
        "operationId": "post__api_v1_system_paypal_refunds__id__reconcile",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PayPalRefund"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Conciliar el mismo reembolso sin crear una identidad de cargo nueva"
      }
    },
    "/api/v1/system/plan-gifts": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma. El destinatario indicado representa el espacio de trabajo deduplicado. La búsqueda coincide con el correo del destinatario, el espacio de trabajo o el nombre del paquete.",
        "operationId": "get__api_v1_system_plan_gifts",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "sandbox",
                "live"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "user_id",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanGiftList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar el historial de regalos"
      },
      "post": {
        "description": "Solo sesiones de administradores de la plataforma. Lote atómico. Proporcione fingerprint de la vista previa y un request_id estable; una repetición coincidente devuelve el mismo lote. Cambiar el nivel o el calendario requiere una vista previa nueva. Los regalos mantienen un pago real cero y no pueden convertirse en reembolsos en efectivo. Su valor de beneficio capturado se acredita normalmente al cambiar a un plan superior. Solo los regalos nuevos del nivel actual que aún no han empezado siguen un cambio posterior sin pago adicional, conservando sus fechas. Los regalos históricos nunca se reajustan; las cuotas mensuales y las reglas de excesos se aplican normalmente. Los lotes mixtos usan metadatos current/---; revise los registros individuales de regalos respaldados por compras para conocer cada nivel y moneda reales.",
        "operationId": "post__api_v1_system_plan_gifts",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlanGiftInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanGiftResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Confirmar un regalo revisado del nivel actual"
      }
    },
    "/api/v1/system/plan-gifts/preview": {
      "post": {
        "description": "Solo sesiones de administradores de la plataforma. De 1 a 100 ID de usuario distintos de clientes activos. Los usuarios del mismo espacio de trabajo reciben un único contrato. Cada elemento hereda el paquete efectivo actual del cliente o el último paquete vencido en el entorno seleccionado. Los lotes con niveles mixtos devuelven el plan y el valor de beneficio reales de cada elemento. Omita plan/currency/price_version; los valores explícitos opcionales deben coincidir con el paquete existente de todos los clientes. Los clientes sin paquete no pueden recibir otro nivel mediante este endpoint. after_current añade después de toda la cobertura pagada/regalada; immediate rechaza derechos superpuestos. Sin escrituras ni cargos.",
        "operationId": "post__api_v1_system_plan_gifts_preview",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlanGiftPreviewInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanGiftPreview"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Previsualizar un paquete regalado del nivel actual"
      }
    },
    "/api/v1/system/plan-gifts/{id}/cancel": {
      "post": {
        "description": "Solo sesiones de administradores de la plataforma. Repetir la cancelación es seguro. Detiene este contrato sin eliminar el historial, reembolsar excesos ni desplazar otros contratos programados.",
        "operationId": "post__api_v1_system_plan_gifts__id__cancel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlatformReason"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanGiftCancellation"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Cancelar un regalo activo o programado"
      }
    },
    "/api/v1/system/plans": {
      "get": {
        "operationId": "get_api_v1_system_plans",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AdminPlanList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Planes",
        "x-platform-admin": true,
        "x-required-role": "owner"
      },
      "post": {
        "operationId": "post_api_v1_system_plans",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlanInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Price"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Planes",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/plans/customer-controls": {
      "patch": {
        "description": "Solo sesiones de administradores de la plataforma. Ambos interruptores son false por defecto. Proporcione device_enabled, api_enabled o ambos. Los interruptores omitidos mantienen su estado actual. Cada interruptor deshabilitado oculta sus controles de cliente e ignora solo su propia preferencia guardada hasta que se vuelva a habilitar. Las cuotas API marcadas como ilimitadas siguen siendo ilimitadas.",
        "operationId": "patch__api_v1_system_plans_customer_controls",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerControlsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CustomerControlsResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Permitir por separado los ajustes del cliente sobre excesos de dispositivos o API"
      }
    },
    "/api/v1/system/plans/default": {
      "patch": {
        "operationId": "patch_api_v1_system_plans_default",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DefaultPlan"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DefaultPlan"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Plan predeterminado",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/privacy/retention": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_system_privacy_retention",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar ejecuciones de archivo y retención",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/privacy/retention/run": {
      "post": {
        "description": "Solo archivo lógico; se conservan las filas de clientes y negocio. Rota los archivos de copia de seguridad .lvb gestionados y autenticados después de 90 días y los registros de seguridad propios de la aplicación después de seis meses naturales. Las ejecuciones se serializan mediante un bloqueo de base de datos.",
        "operationId": "post__api_v1_system_privacy_retention_run",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Confirmation"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CommerceResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Procesar el archivo y la retención ya vencidos",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/provider-refunds/{id}/reconcile": {
      "post": {
        "description": "Consulta la solicitud existente por su referencia de proveedor/negocio. Solo una intención persistente nunca enviada puede emitir su primera solicitud; los envíos duplicados o de resultado desconocido nunca se repiten. La finalización requiere recibos del proveedor original verificados de forma independiente.",
        "operationId": "post__api_v1_system_provider_refunds__id__reconcile",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ProviderRefund"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Conciliar el reembolso existente del canal original",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/refund-requests": {
      "get": {
        "description": "Sesión de administrador de la plataforma de solo lectura. Combina solicitudes de reembolso del monedero y casos de cancelación de monedero/servicio de proveedores. Los recuentos pendientes por entorno son independientes de la paginación y de los filtros de alcance. Consultar nunca aprueba, inmoviliza ni reembolsa fondos; use el endpoint de revisión existente de cada origen.",
        "operationId": "get_system_refund_requests",
        "parameters": [
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "sandbox",
                "live"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "review",
            "schema": {
              "enum": [
                "pending",
                "all"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "scope",
            "schema": {
              "enum": [
                "wallet",
                "service"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RefundInboxList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              }
            },
            "description": "Solicitudes y recuentos de revisión pendiente por entorno"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, sesión o permisos"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, sesión o permisos"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, sesión o permisos"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, sesión o permisos"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, sesión o permisos"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Cola unificada de revisión de reembolsos de clientes",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/refunds": {
      "get": {
        "operationId": "get__api_v1_system_refunds",
        "parameters": [
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "sandbox",
                "live"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RefundHistory"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar reembolsos de PayPal, Waffo y Paddle",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/revenue": {
      "get": {
        "operationId": "get_api_v1_system_revenue",
        "parameters": [
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "sandbox",
                "live"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "month",
            "schema": {
              "description": "all o UTC YYYY-MM",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Revenue"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Ingresos",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/sdk-example": {
      "post": {
        "description": "Solo una sesión Owner de un administrador de la plataforma, con CSRF. Se rechazan las claves API. Reutiliza el producto y la política dedicados; no renueva las pruebas existentes.",
        "operationId": "post_api_v1_system_sdk-example",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SDKExampleSetup"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SDKExampleSetting"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Preparar/habilitar el producto dedicado del administrador para ejemplos SDK públicos",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/service/incidents": {
      "get": {
        "description": "",
        "operationId": "get__api_v1_system_service_incidents",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ServiceIncidentList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar todos los avisos de servicio",
        "x-platform-admin": true,
        "x-required-role": "owner"
      },
      "post": {
        "description": "El mantenimiento no urgente requiere al menos 24 horas de preaviso. Un incidente continuo verificado que supere 24 horas acredita el tiempo pagado realmente afectado; los intervalos superpuestos no se compensan dos veces. Más de siete días puede dar derecho a un reembolso por el servicio no usado.",
        "operationId": "post__api_v1_system_service_incidents",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceIncidentInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ServiceIncident"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Publicar mantenimiento o resolver un incidente",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/settings": {
      "get": {
        "operationId": "get_api_v1_system_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SystemSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "get /system/settings",
        "x-platform-admin": true,
        "x-required-role": "owner"
      },
      "patch": {
        "operationId": "patch_api_v1_system_settings",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MailInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MailSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "patch /system/settings",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/test-mail": {
      "post": {
        "description": "Pone explícitamente en cola un mensaje de prueba real para el destinatario indicado usando el servicio de entrega guardado. HTTP 202 confirma la aceptación en la cola, no la llegada al buzón. Siga el estado de la tarea y revise el panel del proveedor/el buzón para detectar problemas de entrega.",
        "operationId": "post_api_v1_system_test-mail",
        "parameters": [
          {
            "description": "Obligatorio para escrituras con cookies/autenticación pública; solo se exime a las escrituras de recursos con Bearer admitidas",
            "in": "header",
            "name": "X-CSRF-Token",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestMail"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MailQueued"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "post /system/test-mail",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/tls": {
      "get": {
        "description": "Solo sesiones de navegador de administradores de la plataforma. Se rechazan las claves API administrativas y los propietarios de tenants. Refleja el certificado usado por este proceso. No se expone el PEM del certificado ni la clave privada.",
        "operationId": "get__api_v1_system_tls",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TLSStatus"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto; solo se devuelven los metadatos públicos del certificado."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar el certificado HTTPS activo"
      },
      "patch": {
        "description": "Solo sesiones de navegador de administradores de la plataforma. Se rechazan las claves API administrativas y los propietarios de tenants. Valida y cifra el certificado/la clave en MySQL, registra un evento de auditoría y sustituye después el certificado activo. Los nuevos intercambios TLS lo usan de inmediato; las conexiones existentes continúan normalmente. Un reinicio da prioridad al certificado de la base de datos frente a los archivos de arranque.",
        "operationId": "patch__api_v1_system_tls",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TLSCertificateUpdateInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TLSCertificateResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto; solo se devuelven los metadatos públicos del certificado."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Sustituir el certificado HTTPS inmediatamente"
      }
    },
    "/api/v1/system/tls/check": {
      "post": {
        "description": "Solo sesiones de navegador de administradores de la plataforma. Se rechazan las claves API administrativas y los propietarios de tenants. Comprueba formato, fortaleza de la clave, coincidencia de la clave, nombre del host, validez y cadena de confianza. HTTPS directo debe estar habilitado. El certificado activo no cambia.",
        "operationId": "post__api_v1_system_tls_check",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TLSCertificateInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TLSCertificateInfo"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto; solo se devuelven los metadatos públicos del certificado."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code. TLS_KEY_MISMATCH, TLS_DOMAIN_MISMATCH, TLS_EXPIRED, TLS_CHAIN_UNTRUSTED y TLS_SETTINGS_CONFLICT mantienen el certificado anterior."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Validar un certificado y una clave privada sin guardarlos"
      }
    },
    "/api/v1/system/translation": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma.",
        "operationId": "get__api_v1_system_translation",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TranslationSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar la configuración de DeepL sin exponer la clave API"
      },
      "patch": {
        "description": "Solo sesiones de administradores de la plataforma. Use expected_version del GET más reciente. La clave nunca se devuelve.",
        "operationId": "patch__api_v1_system_translation",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TranslationSettingsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TranslationSettings"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Guardar la configuración cifrada de DeepL"
      }
    },
    "/api/v1/system/translation/check": {
      "post": {
        "description": "Solo llama a los endpoints de idiomas y uso de DeepL; no se envía contenido del foro.",
        "operationId": "post__api_v1_system_translation_check",
        "parameters": [
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TranslationCheck"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte error.code y error.message; request_id identifica la solicitud."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Verificar la clave API guardada y obtener los idiomas admitidos y el uso"
      }
    },
    "/api/v1/system/users": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma. Incluye cuentas sin verificar y miembros de equipos; nunca devuelve hashes ni tokens de autenticación.",
        "operationId": "get__api_v1_system_users",
        "parameters": [
          {
            "description": "Coincidencia parcial de correo, nombre o espacio de trabajo sin distinguir mayúsculas y minúsculas; se escapan los caracteres comodín.",
            "in": "query",
            "name": "q",
            "schema": {
              "maxLength": 254,
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "enum": [
                "active",
                "disabled"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "role",
            "schema": {
              "enum": [
                "owner",
                "read_only"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "verified",
            "schema": {
              "enum": [
                "true",
                "false"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlatformUserList"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar todos los usuarios registrados"
      }
    },
    "/api/v1/system/users/export.csv": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma. Máximo 10000 registros coincidentes, UTF-8 con BOM y escape de fórmulas de hojas de cálculo. Sin credenciales.",
        "operationId": "get__api_v1_system_users_export_csv",
        "parameters": [
          {
            "description": "Coincidencia parcial de correo, nombre o espacio de trabajo sin distinguir mayúsculas y minúsculas; se escapan los caracteres comodín.",
            "in": "query",
            "name": "q",
            "schema": {
              "maxLength": 254,
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "enum": [
                "active",
                "disabled"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "role",
            "schema": {
              "enum": [
                "owner",
                "read_only"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "verified",
            "schema": {
              "enum": [
                "true",
                "false"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Archivo CSV adjunto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Exportar usuarios registrados filtrados como CSV"
      }
    },
    "/api/v1/system/users/{id}": {
      "get": {
        "description": "Solo sesiones de administradores de la plataforma. Los saldos del espacio de trabajo, los últimos 20 contratos y los totales acumulados pagados/reembolsados por PayPal se separan por moneda y entorno.",
        "operationId": "get__api_v1_system_users__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlatformUserDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar detalles del cliente y del espacio de trabajo"
      },
      "patch": {
        "description": "Solo sesiones de administradores de la plataforma. Requiere un motivo de operación y una versión para el control optimista de concurrencia. Deshabilitar revoca las sesiones, claves y enlaces de acceso existentes. Restaurar no recupera las claves. Las cuentas de administradores de la plataforma están protegidas.",
        "operationId": "patch__api_v1_system_users__id_",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlatformUserUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlatformUserDetail"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Actualizar el estado del cliente o una nota administrativa privada"
      }
    },
    "/api/v1/system/users/{id}/data-export": {
      "post": {
        "description": "Disponible después del cierre de la cuenta y del plazo del cliente. Requiere la contraseña del administrador, un alcance y un motivo operativo auditado. No se borran registros de negocio.",
        "operationId": "post__api_v1_system_users__id__data_export",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerDataExportInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/zip": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Exportar registros de clientes conservados",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/system/users/{id}/revoke-credentials": {
      "post": {
        "description": "Solo sesiones de administradores de la plataforma. No deshabilita la cuenta; el cliente puede volver a iniciar sesión. Aquí no se pueden revocar credenciales de administradores.",
        "operationId": "post__api_v1_system_users__id__revoke_credentials",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlatformReason"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlatformRevocation"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Revocar las sesiones y claves API existentes del cliente"
      }
    },
    "/api/v1/system/waffo": {
      "get": {
        "operationId": "get__api_v1_system_waffo",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoSettings"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Consultar la configuración de Waffo sin la clave de firma",
        "x-licentivo-access": "platform"
      },
      "patch": {
        "operationId": "patch__api_v1_system_waffo",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WaffoSettingsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoSettings"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Guardar las credenciales cifradas de Waffo",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/waffo/check": {
      "post": {
        "operationId": "post__api_v1_system_waffo_check",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoCheck"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Verificar las credenciales de Waffo y el producto activo de pago único",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/waffo/orders": {
      "get": {
        "operationId": "get__api_v1_system_waffo_orders",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoOrderList"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Listar pagos de servicios y recargas del monedero de Waffo",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/waffo/orders/{id}/reconcile": {
      "post": {
        "operationId": "post__api_v1_system_waffo_orders__id__reconcile",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "Identificador local del pago de servicio.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WaffoOrderResult"
                    },
                    "request_id": {
                      "description": "Identificador local del pago de servicio.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Recuperar y conciliar el pago original de Waffo",
        "x-licentivo-access": "platform"
      }
    },
    "/api/v1/system/workspaces/{id}/status": {
      "patch": {
        "description": "Solo sesiones de administradores de la plataforma. La suspensión bloquea el inicio de sesión, la API administrativa y las licencias en línea, y revoca credenciales. El plazo del contrato sigue transcurriendo. Los espacios de trabajo de la plataforma están protegidos; las cachés firmadas sin conexión siguen sujetas a su vencimiento existente.",
        "operationId": "patch__api_v1_system_workspaces__id__status",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlatformWorkspaceUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlatformWorkspaceStatus"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Examine error.code y error.message."
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Suspender o restaurar un espacio de trabajo completo de un cliente"
      }
    },
    "/api/v1/system/{provider}/orders/{id}/refund": {
      "post": {
        "description": "Sesión de administrador de la plataforma. Un servicio pagado requiere cancelación en su lugar. Un pago no aplicado se reembolsa sin movimientos de monedero. Un request_id estable conserva la intención de forma persistente antes de llamar a la pasarela; los resultados desconocidos se consultan y nunca se reenvían a ciegas.",
        "operationId": "post__api_v1_system__provider__orders__id__refund",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "provider",
            "required": true,
            "schema": {
              "enum": [
                "waffo",
                "paddle"
              ],
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-CSRF-Token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OriginalRefundInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OriginalRefundResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Error de validación, titularidad, entorno, estado de reembolso o proveedor"
          }
        },
        "security": [
          {
            "session": []
          }
        ],
        "summary": "Iniciar un reembolso por el canal original de crédito no gastado o un pago no aplicado",
        "x-platform-admin": true,
        "x-required-role": "owner"
      }
    },
    "/api/v1/usage": {
      "get": {
        "description": "El mes actual muestra los registros de dispositivos activos; los meses anteriores muestran el historial de uso de dispositivos registrado. Las cuotas API de los paquetes comprados siguen sus propios meses de cuota. El historial de dispositivos se conserva después de la liberación. La ocupación actual y los máximos de facturación son mediciones distintas.",
        "operationId": "get_api_v1_usage",
        "parameters": [
          {
            "description": "Mes natural UTC; por defecto, el actual",
            "in": "query",
            "name": "month",
            "schema": {
              "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
              "pattern": "^[0-9]{4}-[0-9]{2}$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "active_devices": 0,
                    "api_calls": 0,
                    "api_period": null,
                    "billable_devices": 0,
                    "estimated_total_cents": 0,
                    "estimated_total_micros": 0,
                    "month": "2026-09",
                    "operations": [],
                    "overage_devices": 0,
                    "period": null,
                    "products": [],
                    "purchased": null,
                    "purchased_active_devices": 0,
                    "sandbox": false,
                    "timezone": "UTC",
                    "warning": "normal"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Usage",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "503": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "DEFAULT_PLAN_DISABLED",
                    "message": "The default allowance plan has not been enabled by the administrator"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "La cuota predeterminada está deshabilitada (DEFAULT_PLAN_DISABLED)"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Current device occupancy, historical device use and metered API usage",
        "x-management-reference": {
          "group": "usage"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/usage/devices": {
      "get": {
        "description": "Registros de uso de dispositivos del mes UTC seleccionado, conservados después de liberar el dispositivo. Es un historial de actividad, no una lista actual de dispositivos en línea. Use GET /api/v1/usage para consultar la ocupación actual.",
        "operationId": "get_api_v1_usage_devices",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "description": "Mes natural UTC; por defecto, el actual",
            "in": "query",
            "name": "month",
            "schema": {
              "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
              "pattern": "^[0-9]{4}-[0-9]{2}$",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "product_id",
            "schema": {
              "description": "UUID del producto en el espacio de trabajo actual.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": [
                      {
                        "device_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                        "first_seen_at": "2026-09-01T00:00:00Z",
                        "last_seen_at": "2026-09-30T00:00:00Z",
                        "month": "2026-09",
                        "product_id": "11111111-1111-4111-8111-111111111111"
                      }
                    ],
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UsageDeviceList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar dispositivos usados",
        "x-management-reference": {
          "group": "usage"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/usage/export.csv": {
      "get": {
        "description": "Registros de uso de dispositivos del mes UTC seleccionado, conservados después de liberar el dispositivo. Es un historial de actividad, no una lista actual de dispositivos en línea. Use GET /api/v1/usage para consultar la ocupación actual.",
        "operationId": "get_api_v1_usage_export_csv",
        "parameters": [
          {
            "description": "Mes natural UTC; por defecto, el actual",
            "in": "query",
            "name": "month",
            "schema": {
              "description": "Mes UTC YYYY-MM; los valores de consulta omitidos usan el mes actual. Las tareas de facturación requieren un mes cerrado.",
              "pattern": "^[0-9]{4}-[0-9]{2}$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {
                "example": "month,product_id,device_id,first_seen_utc,last_seen_utc\n",
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Exportar uso",
        "x-csv-columns": [
          "month",
          "product_id",
          "device_id",
          "first_seen_utc",
          "last_seen_utc"
        ],
        "x-management-reference": {
          "group": "usage"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/validate": {
      "post": {
        "description": "Autenticación mediante product_id + license_key + device_id. Sin cookie/CSRF/clave del proveedor. activation_id es obligatorio salvo para activate. Cada solicitud correcta consume una llamada API; las repeticiones idempotentes y los fallos no consumen llamadas. Los excesos cargan el monedero atómicamente o devuelven API_QUOTA_EXCEEDED/API_BALANCE_INSUFFICIENT. Los acuses de reintentos de validación y heartbeat vencen después de 3600 segundos. Mientras siga siendo válida la autorización original, las solicitudes coincidentes dentro de esta ventana reproducen el resultado sin otro cargo. Tras la ventana, use una clave nueva; una clave usada anteriormente puede procesarse como solicitud nueva. Los acuses de activación, desactivación y uso de funciones se conservan de forma persistente. La cuota de dispositivos del espacio de trabajo sigue las activaciones actuales. La liberación devuelve capacidad; el vencimiento de un arrendamiento flotante también devuelve capacidad, mientras que un registro ordinario sin conexión sigue contándose. El exceso de dispositivos solo se cobra cuando el máximo de facturación del mes de cuota supera la capacidad ya pagada; la liberación no reembolsa cargos ya incurridos. El uso de API es independiente.",
        "operationId": "post_api_v1_validate",
        "parameters": [
          {
            "description": "Genere una clave nueva para cada operación; los reintentos mantienen la misma clave y cuerpo. Máximo 80 caracteres, sin espacios en blanco. Opcional para validación y heartbeat.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 80,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuntimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RuntimeResult"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Validación en ejecución"
      }
    },
    "/api/v1/webhook-deliveries/{id}/attempts": {
      "get": {
        "operationId": "get_api_v1_webhook-deliveries_by_id_attempts",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": null
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AttemptList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar intentos de entrega",
        "x-management-reference": {
          "group": "webhooks"
        },
        "x-required-scope": "read"
      }
    },
    "/api/v1/webhook-deliveries/{id}/retry": {
      "post": {
        "operationId": "post_api_v1_webhook-deliveries_by_id_retry",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "$ref": "#/components/schemas/Empty"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ID",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Reintentar la entrega de un webhook",
        "x-management-reference": {
          "group": "webhooks"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/webhooks": {
      "get": {
        "operationId": "get_api_v1_webhooks",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "event_types": [],
                    "items": [
                      {
                        "created_at": "2026-10-18T00:00:00Z",
                        "enabled": true,
                        "events": [],
                        "id": "33333333-3333-4333-8333-333333333333",
                        "name": "Report app",
                        "updated_at": "2026-10-18T00:00:00Z",
                        "url": "https://merchant.example.com/license-events"
                      }
                    ]
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LicensingWebhookList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar webhooks",
        "x-management-reference": {
          "group": "webhooks"
        },
        "x-required-scope": "read"
      },
      "post": {
        "operationId": "post_api_v1_webhooks",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "enabled": true,
                "events": [
                  "license.created",
                  "license.renewed"
                ],
                "name": "Order system",
                "url": "https://merchant.example.com/license-events"
              },
              "schema": {
                "$ref": "#/components/schemas/LicensingWebhookInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": "33333333-3333-4333-8333-333333333333",
                    "secret": "whsec_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LicensingWebhookSecret",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Guardar webhook",
        "x-management-reference": {
          "group": "webhooks"
        },
        "x-required-role": "owner",
        "x-required-scope": "write"
      }
    },
    "/api/v1/webhooks/{id}/deliveries": {
      "get": {
        "operationId": "get_api_v1_webhooks_by_id_deliveries",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "description": "ID único de este recurso; use en la ruta el ID del recurso correspondiente.",
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 25,
              "description": "Tamaño de página, 25 por defecto, intervalo 1–100.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "default": 0,
              "description": "Registros que se omiten, 0 por defecto, intervalo 0–100000; sume limit para la página siguiente.",
              "maximum": 100000,
              "minimum": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "items": null,
                    "limit": 25,
                    "offset": 0,
                    "total": 1
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DeliveryList",
                      "description": "Resultado de negocio cuando la operación termina correctamente; los fallos usan error."
                    },
                    "request_id": {
                      "description": "UUID de seguimiento HTTP de nivel superior. En la entrada de operaciones por lotes/incorporación es un UUID de idempotencia generado por el llamante; tienen finalidades distintas.",
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INVALID_INPUT",
                    "message": "Invalid request fields"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Please sign in again"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "FORBIDDEN",
                    "message": "This operation requires an owner account"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource not found"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "CONFLICT",
                    "message": "This value already exists"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "JSON_REQUIRED",
                    "message": "Use Content-Type: application/json"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "RATE_LIMITED",
                    "message": "Too many attempts; try again later"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "An unexpected error occurred"
                  },
                  "request_id": "55555555-5555-4555-8555-555555555555"
                },
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [
          {
            "session": []
          },
          {
            "managementKey": []
          }
        ],
        "summary": "Listar entregas de webhooks",
        "x-management-reference": {
          "group": "webhooks"
        },
        "x-required-scope": "read"
      }
    },
    "/healthz": {
      "get": {
        "operationId": "get_healthz",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Health"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          }
        },
        "security": [],
        "summary": "Actividad del proceso"
      }
    },
    "/readyz": {
      "get": {
        "operationId": "get_readyz",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": false,
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Health"
                    },
                    "request_id": {
                      "format": "uuid",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data",
                    "request_id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Correcto"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "405": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "415": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Consulte docs/error-codes.md para la aplicabilidad a cada endpoint"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Base de datos no disponible"
          }
        },
        "security": [],
        "summary": "Disponibilidad de la base de datos"
      }
    }
  },
  "servers": [
    {
      "url": "https://www.licentivo.com"
    }
  ]
}
