{
  "openapi": "3.0.3",
  "info": {
    "title": "API Publica Portal",
    "version": "1.0.0",
    "description": "Api publica REST para portal"
  },
  "servers": [
    {
      "url": "https://api.flexxible.net",
      "description": "Portal API (production)"
    }
  ],
  "tags": [],
  "paths": {
    "/v1/organizations/{organization_id}/flows": {
      "post": {
        "tags": [
          "Flujos"
        ],
        "summary": "Crear un flujo",
        "operationId": "createFlow",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          }
        ],
        "responses": {
          "201": {
            "description": "Flujo creado correctamente. La respuesta contiene el id del flujo creado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatedEntityResponse"
                },
                "example": {
                  "id": "507f1f77bcf86cd799439011"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos obligatorios - Valores de campo inválidos - Configuración de condición inválida - Identificador de microservicio inválido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable. Causas comunes: - Microservicio referenciado no encontrado - Entidades objetivo referenciadas (workspaces, grupos de Workspace, grupos de reporte) no encontradas o no pertenecientes - Tipo de condición inválido - El flujo no puede habilitarse"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateFlowV1Request"
              },
              "examples": {
                "create-workspace-flow": {
                  "summary": "Crear un flujo dirigido a workspaces específicos",
                  "value": {
                    "name": {
                      "en-EN": "Daily Backup Flow",
                      "es-ES": "Proceso de copia diaria"
                    },
                    "description": {
                      "en-EN": "Automated daily backup process",
                      "es-ES": "Proceso automatizado de copia de seguridad diaria"
                    },
                    "type": "workspace",
                    "detection_only": false,
                    "cooldown_minutes": 60,
                    "enabled": false,
                    "init_text": {
                      "en-EN": "Starting backup process...",
                      "es-ES": "Iniciando proceso de copia..."
                    },
                    "ok_text": {
                      "en-EN": "Backup completed successfully",
                      "es-ES": "Copia completada correctamente"
                    },
                    "ko_text": {
                      "en-EN": "Backup failed. Please check logs.",
                      "es-ES": "Copia fallida. Revise los registros."
                    },
                    "target": {
                      "type": "workspaces",
                      "ids": [
                        "507f1f77bcf86cd799439012",
                        "507f1f77bcf86cd799439013"
                      ]
                    },
                    "microservice_id": "507f1f77bcf86cd799439014",
                    "conditions": [
                      {
                        "condition_type_id": "507f1f77bcf86cd799439015",
                        "operator": "gt",
                        "compare_to": "80",
                        "check_every": 300
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "description": "Crea un nuevo flujo de automatización para la organización especificada. El flujo define la lógica de ejecución, las condiciones y los workspaces objetivo. Devuelve los datos del flujo creado tras una creación exitosa."
      },
      "get": {
        "tags": [
          "Flujos"
        ],
        "summary": "Listar flujos",
        "operationId": "listFlows",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo de orden opcional (:asc o :desc), p. ej., \"name\", \"name:asc\", \"cooldown_minutes:desc\". Usa orden ascendente por defecto si no se proporciona sufijo. Campos de ordenación válidos: id, name, description, type, detection_only, cooldown_minutes, enabled, init_text, ok_text, ko_text"
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista separada por comas de campos que se incluirán en cada elemento de flujo. Campos seleccionables: id, name, description, type, detection_only, cooldown_minutes, enabled. El campo id siempre se incluye.",
            "example": "name,description,enabled"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120,
              "pattern": "^.*$"
            },
            "description": "Filtra flujos por uno o más criterios. Proporciona un objeto JSON con condiciones de filtro. Puedes filtrar por: id, name, description, type, detection_only, cooldown_minutes, enabled, init_text, ok_text, ko_text. Usa operadores de comparación (eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between) y combina múltiples condiciones con operadores lógicos (and, or). Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtrar por flujos habilitados",
                "description": "Devuelve solo flujos habilitados.",
                "value": "{\"field\": \"enabled\", \"op\": \"eq\", \"value\": true}"
              },
              "complex-and": {
                "summary": "Filtrar por tipo y modo de detección",
                "description": "Devuelve flujos SESSION que no son solo de detección.",
                "value": "{\"and\": [{\"field\": \"type\", \"op\": \"eq\", \"value\": \"SESSION\"}, {\"field\": \"detection_only\", \"op\": \"eq\", \"value\": false}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con múltiples campos de texto y requiere flujos habilitados.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"name\", \"op\": \"contains\", \"value\": \"backup\"}, {\"field\": \"description\", \"op\": \"contains\", \"value\": \"backup\"}]}, {\"field\": \"enabled\", \"op\": \"eq\", \"value\": true}]}"
              }
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Número de elementos por página"
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "en-EN",
                "es-ES",
                "pt-BR",
                "ca-ES",
                "eu-ES"
              ],
              "default": "es-ES"
            },
            "description": "Código de idioma para campos de texto que admiten múltiples idiomas. Al crear o actualizar recursos, esto especifica el idioma de los valores de texto proporcionados. Al recuperar recursos, esto determina qué variante de idioma de los campos de texto multilingües se devuelve. Valores aceptados: 'en-EN' (inglés), 'es-ES' (español), 'pt-BR' (portugués), 'ca-ES' (catalán), 'eu-ES' (euskera). Usa 'es-ES' por defecto si no se proporciona."
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de flujos recuperada correctamente. La respuesta incluye metadatos de paginación y el arreglo de datos de flujos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlowListItemV1ListResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Parámetros de paginación no válidos - Parámetro de ordenación no válido - Parámetros de filtro no válidos"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de flujos pertenecientes a la organización especificada. Admite filtrado, ordenación y búsqueda en las propiedades de los flujos. Los resultados se devuelven en páginas con metadatos de paginación."
      }
    },
    "/v1/organizations/{organization_id}/operations": {
      "post": {
        "tags": [
          "Operaciones"
        ],
        "summary": "Crear operaciones",
        "operationId": "createOperations",
        "description": "Crea una o varias operaciones en base al alcance y objetivos enviados. Devuelve los identificadores de operaciones creadas junto con su organizacion de pertenencia.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud. Formato: Bearer <token>.",
            "example": "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "Identificador unico de la organizacion.",
            "example": "507f1f77bcf86cd799439011"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOperationV1Request"
              },
              "examples": {
                "workspace_scope": {
                  "summary": "Crear operacion sobre workspaces",
                  "value": {
                    "type": "execute_microservice",
                    "target": {
                      "type": "workspaces",
                      "ids": [
                        "507f1f77bcf86cd799439011",
                        "507f1f77bcf86cd799439012"
                      ]
                    },
                    "expiration_in_seconds": 600,
                    "payload": {
                      "microservice_id": "507f1f77bcf86cd799439015",
                      "parameters": {
                        "mode": "safe"
                      }
                    }
                  }
                },
                "session_scope": {
                  "summary": "Crear operacion sobre sesiones",
                  "value": {
                    "type": "execute_microservice",
                    "target": {
                      "type": "sessions",
                      "ids": [
                        "550E8400-E29B-41D4-A716-446655440000",
                        "7F5C3F8D-8A9B-4C8D-B8D1-123456789ABC"
                      ]
                    },
                    "payload": {
                      "microservice_id": "507f1f77bcf86cd799439015",
                      "parameters": {
                        "mode": "safe"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Operaciones creadas correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOperationV1Response"
                },
                "example": {
                  "ids": [
                    {
                      "organization_id": "507f1f77bcf86cd799439011",
                      "operation_id": "507f1f77bcf86cd799439031"
                    },
                    {
                      "organization_id": "507f1f77bcf86cd799439012",
                      "operation_id": "507f1f77bcf86cd799439032"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: tipo no soportado, target.type invalido, target.ids vacio, o expiration_in_seconds fuera de rango."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado."
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organizacion no encontrada."
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable. Causas comunes: objetivos no resolubles en la organizacion, o permisos insuficientes sobre reporting groups."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        }
      },
      "get": {
        "tags": [
          "Operaciones"
        ],
        "summary": "Listar operaciones de una organización",
        "operationId": "get_operations_v1",
        "description": "Devuelve una lista paginada de operaciones de la organización autorizada.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organización.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 100
            },
            "description": "Número de elementos por página."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Campos de respuesta separados por comas para cada elemento.",
            "example": "id,organization_id,name,description,status,created_at"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Expresión JSON de filtros sobre campos filtrables del recurso.",
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre",
                "value": "{\"field\":\"name\",\"op\":\"contains\",\"value\":\"remote\"}"
              },
              "complex-and": {
                "summary": "Filtrar por estado y descripción",
                "value": "{\"and\":[{\"field\":\"status\",\"op\":\"eq\",\"value\":\"finished\"},{\"field\":\"description\",\"op\":\"contains\",\"value\":\"remote\"}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "value": "{\"and\":[{\"or\":[{\"field\":\"microservice_id\",\"op\":\"eq\",\"value\":\"64f0c2a1b2d3e4f506070833\"},{\"field\":\"flow_id\",\"op\":\"eq\",\"value\":\"64f0c2a1b2d3e4f506070844\"}]},{\"field\":\"status\",\"op\":\"eq\",\"value\":\"pending\"}]}"
              }
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^([a-z_]+):(asc|desc)$"
            },
            "description": "Expresión de ordenación con el formato <field>:asc|desc. En modo agregado, solo acepta campos de `group_by` o aliases agregados (`count`, `<fn>_<field>`).",
            "example": "created_at:desc"
          },
          {
            "name": "aggregate",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 1024
            },
            "description": "Expresión JSON para agregación. Estructura: {\"group_by\":[\"field\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}. No se puede combinar con `fields`.",
            "examples": {
              "group-by-status-count": {
                "summary": "Agrupar por estado y contar",
                "value": "{\"group_by\":[\"status\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}"
              },
              "group-by-organization-count": {
                "summary": "Agrupar por organización y contar",
                "value": "{\"group_by\":[\"organization_id\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operaciones recuperadas correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetOperationsResponseV1"
                },
                "examples": {
                  "paginated_result": {
                    "summary": "Lista paginada con resultados",
                    "value": {
                      "has_next": true,
                      "data": [
                        {
                          "id": "64f0c2a1b2d3e4f506070811",
                          "organization_id": "507f1f77bcf86cd799439022",
                          "name": "remote_assistance",
                          "description": "Remote assistance operation",
                          "status": "finished",
                          "created_at": "2026-03-10T09:11:45Z",
                          "started_at": "2026-03-10T09:12:00Z",
                          "ended_at": "2026-03-10T09:15:17Z",
                          "microservice_id": "64f0c2a1b2d3e4f506070833",
                          "flow_id": "64f0c2a1b2d3e4f506070844",
                          "remote_support": {
                            "start_date": "2026-03-10T09:12:00Z",
                            "end_date": "2026-03-10T09:15:17Z",
                            "type": "unattended"
                          }
                        }
                      ]
                    }
                  },
                  "aggregated_by_status": {
                    "summary": "Resultado agregado por estado",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "status": "finished",
                          "count": 12
                        },
                        {
                          "status": "pending",
                          "count": 5
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parámetros de solicitud no válidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_filters": {
                    "summary": "Formato de filtros inválido",
                    "value": {
                      "error": {
                        "message": "Formato de filtros no válido",
                        "code": "bad_request",
                        "details": "El parámetro filters debe ser una cadena JSON válida."
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o sin acceso a la organización.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Fallo de autorización",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Recurso no encontrado dentro de la organización autorizada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not_found": {
                    "summary": "Recurso inexistente",
                    "value": {
                      "error": {
                        "message": "Recurso no encontrado",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Error inesperado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/reporting-groups/{reporting_group_id}/magic-links": {
      "post": {
        "tags": [
          "Grupos de reporte"
        ],
        "summary": "Crear un enlace mágico de descarga de agente",
        "operationId": "createReportingGroupMagicLink",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "reporting_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del Grupo de reporte",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReportingGroupMagicLinkRequestV1"
              },
              "examples": {
                "default-installer": {
                  "summary": "Crear enlace mágico usando valores estrictos del instalador",
                  "value": {
                    "expires_at": "2026-03-15T12:00:00.000Z",
                    "installer": {
                      "version": "latest",
                      "platform": "windows",
                      "arch": "x64",
                      "type": "fxxone"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Enlace mágico creado correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateReportingGroupMagicLinkResponseV1"
                },
                "examples": {
                  "created-magic-link": {
                    "summary": "Respuesta de enlace mágico creado",
                    "value": {
                      "id": "507f1f77bcf86cd799439099",
                      "token": "2ab46558-3c40-4b72-8fce-08b7b596f624",
                      "link": "https://portal.example.com/magic-link?key=2ab46558-3c40-4b72-8fce-08b7b596f624"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta: parámetros de ruta, cuerpo de solicitud o formato de fecha-hora no válidos."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: autenticación requerida"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de reporte no encontrado"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable: la validación de negocio falló (por ejemplo, una expiración fuera del rango permitido)."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Crea un enlace mágico para descargar el instalador del agente en un grupo de reporte. Esta funcionalidad solo está disponible para el producto FXXOne. Ponte en contacto con el equipo de Flexxible para más información."
      }
    },
    "/v1/organizations/{organization_id}/reporting-groups": {
      "post": {
        "tags": [
          "Grupos de reporte"
        ],
        "summary": "Crear un grupo de reporte",
        "operationId": "createReportingGroup",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          }
        ],
        "responses": {
          "201": {
            "description": "Grupo de reporte creado correctamente. La respuesta contiene el ID del grupo de reporte creado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatedEntityResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos obligatorios (name, product_config_id) - Valores de campo inválidos - Formato de ID inválido para campos product_config_id, patch_policy_target_id o intermediate_device - Valor de fishing_pattern_field inválido (debe ser uno de: full_name, description, ou, current_subnet) - Valor de fishing_pattern inválido (excede maxLength: 250) - Dispositivos intermedios no definidos secuencialmente (intermediate_device2 requiere intermediate_device1, intermediate_device3 requiere intermediate_device2)"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable. Causas comunes: - La configuración de producto no se encontró o no pertenece a la organización - Los IDs de Workspace de dispositivos intermedios no existen o no pertenecen a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReportingGroupRequestV1"
              },
              "examples": {
                "create-reporting-group-with-minimal-fields": {
                  "summary": "Crear un grupo de reporte solo con los campos obligatorios",
                  "value": {
                    "name": "Grupo de reporte de Producción",
                    "product_config_id": "507f1f77bcf86cd799439030"
                  }
                },
                "create-reporting-group-with-all-fields": {
                  "summary": "Crear un grupo de reporte con todos los campos disponibles, incluidos dispositivos intermedios",
                  "value": {
                    "name": "Grupo de reporte de Desarrollo",
                    "product_config_id": "507f1f77bcf86cd799439030",
                    "patch_policy_target_id": "507f1f77bcf86cd799439040",
                    "fishing_pattern": "Estaciones de trabajo Windows",
                    "fishing_pattern_field": "full_name",
                    "intermediate_device1": "507f1f77bcf86cd799439050",
                    "intermediate_device2": "507f1f77bcf86cd799439051",
                    "intermediate_device3": "507f1f77bcf86cd799439052"
                  }
                },
                "create-reporting-group-with-single-intermediate-device": {
                  "summary": "Crear un grupo de reporte solo con el primer dispositivo intermedio",
                  "value": {
                    "name": "Grupo de reporte de dispositivo único",
                    "product_config_id": "507f1f77bcf86cd799439030",
                    "intermediate_device1": "507f1f77bcf86cd799439050"
                  }
                }
              }
            }
          }
        },
        "description": "Crea un nuevo grupo de reporte para la organización especificada. Los grupos de reporte se usan para organizar y gestionar configuraciones de dispositivos, ajustes de producto y políticas de parches. Puedes configurar opcionalmente dispositivos intermedios (hasta 3) proporcionando identificadores de workspace. Los dispositivos intermedios se usan para acciones Wake on LAN en redes seguras, permitiendo el encendido remoto de dispositivos a través de puertas de enlace intermedias. Los dispositivos intermedios deben definirse secuencialmente: no puedes definir intermediate_device2 sin intermediate_device1, ni intermediate_device3 sin intermediate_device2. Todos los IDs de Workspace de dispositivos intermedios deben existir y pertenecer a la organización. Devuelve el ID del grupo de reporte creado tras una creación satisfactoria."
      },
      "get": {
        "tags": [
          "Grupos de reporte"
        ],
        "summary": "Listar grupos de reporte",
        "operationId": "listReportingGroups",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo de orden opcional (:asc o :desc). Campos de ordenación válidos: name, organization_id, product_config_id, fishing_pattern, fishing_pattern_field, patch_policy_target_id, policy_reporting_group, overridden_agent_settings.*, effective_agent_settings.*, execute_flexx_analyzer_agent, intermediate_device_1_id, intermediate_device_2_id, intermediate_device_3_id. Es ascendente de forma predeterminada si no se proporciona sufijo."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista separada por comas de campos para incluir en cada elemento de grupo de reporte. Campos seleccionables: id, name, organization_id, product_config_id, fishing_pattern, fishing_pattern_field, patch_policy_target_id, policy_reporting_group, overridden_agent_settings, effective_agent_settings, execute_flexx_analyzer_agent, flexx_agent_portal_download, intermediate_device_1_id, intermediate_device_2_id, intermediate_device_3_id. El campo id siempre se incluye.",
            "example": "name,effective_agent_settings,execute_flexx_analyzer_agent"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120,
              "description": "Filtra grupos de reporte usando un objeto JSON. Especifica el campo a filtrar, el operador de comparación y el valor. Ejemplo: {\"field\": \"name\", \"op\": \"eq\", \"value\": \"Grupo de reporte 1\"}",
              "example": "{\"field\": \"name\", \"op\": \"eq\", \"value\": \"Grupo de reporte 1\"}"
            },
            "description": "Filtra grupos de reporte por uno o más criterios. Proporciona una cadena JSON con AST de filtros. Filtra por cualquier campo devuelto en la respuesta. Para campos anidados usa notación de punto: overridden_agent_settings.remote_support, effective_agent_settings.remote_support, effective_agent_settings.uninstall_protection, etc. Operadores: eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between. Combina con and/or. Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre del grupo de reporte",
                "description": "Devuelve grupos de reporte cuyo nombre contiene el texto proporcionado.",
                "value": "{\"field\": \"name\", \"op\": \"contains\", \"value\": \"producción\"}"
              },
              "complex-and": {
                "summary": "Filtrar por configuración anidada y bandera de ejecución",
                "description": "Devuelve grupos donde la protección de desinstalación está desactivada y la ejecución del analizador está habilitada.",
                "value": "{\"and\": [{\"field\": \"effective_agent_settings.uninstall_protection\", \"op\": \"eq\", \"value\": \"off\"}, {\"field\": \"execute_flexx_analyzer_agent\", \"op\": \"eq\", \"value\": true}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con múltiples patrones de nombre y requiere soporte remoto interactivo.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"name\", \"op\": \"contains\", \"value\": \"prod\"}, {\"field\": \"name\", \"op\": \"contains\", \"value\": \"stage\"}]}, {\"field\": \"effective_agent_settings.remote_support\", \"op\": \"eq\", \"value\": \"INTERACTIVE\"}]}"
              }
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Número de elementos por página"
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de grupos de reporte recuperada correctamente. La respuesta incluye metadatos de paginación y el arreglo de datos de grupos de reporte.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportingGroupListItemV1ListResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Parámetros de paginación no válidos - Parámetro de ordenación no válido - Parámetros de filtro no válidos"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de grupos de reporte que pertenecen a la organización especificada. Admite filtrado y ordenación sobre propiedades de los grupos de reporte. Los filtros se proporcionan como una cadena JSON siguiendo la estructura AST de FilterNode. Los resultados se devuelven en páginas con metadatos de paginación."
      }
    },
    "/v1/organizations/{organization_id}/tenants": {
      "post": {
        "tags": [
          "Tenants"
        ],
        "summary": "Crear un tenant",
        "operationId": "createTenant",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización propietaria que creará el tenant",
            "example": "507f1f77bcf86cd799439011"
          }
        ],
        "responses": {
          "201": {
            "description": "Tenant y organización asociados creados correctamente. Devuelve el ID del tenant generado por el servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatedEntityResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Cuerpo de solicitud o parámetros de ruta no válidos - Faltan campos obligatorios (name, product_config_id, organization_email, organization_language, organization_country, organization_industry) - Formato de id no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "No se encontró la organización propietaria"
          },
          "422": {
            "description": "Entidad no procesable - Error de validación de lógica de negocio. Causas comunes: - Product config no encontrado - La organización no es elegible para crear tenants - La organización no existe en build - La organización no tiene productos elegibles - Relación de partner no válida - La organización y la organización padre son clientes finales - Entidad referenciada no encontrada",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTenantRequestV1"
              },
              "examples": {
                "create-tenant-with-all-required-fields": {
                  "summary": "Crear un tenant con la información mínima requerida",
                  "value": {
                    "name": "Tenant de producción",
                    "product_config_id": "507f1f77bcf86cd799439030",
                    "organization_email": "tenant@example.com",
                    "organization_language": "en",
                    "organization_country": "US",
                    "organization_industry": "Tecnología"
                  }
                },
                "create-tenant-with-optional-fields": {
                  "summary": "Crear un tenant con política",
                  "value": {
                    "name": "Tenant empresarial",
                    "product_config_id": "507f1f77bcf86cd799439030",
                    "policy_id": "507f1f77bcf86cd799439050",
                    "organization_email": "enterprise@example.com",
                    "organization_language": "es",
                    "organization_country": "ES",
                    "organization_industry": "Finanzas"
                  }
                }
              }
            }
          }
        },
        "description": "Crea un nuevo tenant y una organización asociada para la organización propietaria especificada. El nombre del tenant también se usa como nombre de la organización recién creada. Requiere product_config_id. Admite opcionalmente la asignación de política."
      },
      "get": {
        "tags": [
          "Tenants"
        ],
        "summary": "Listar tenants",
        "operationId": "listTenants",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Número de elementos por página"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo opcional de orden (:asc o :desc), p. ej., \"name\", \"name:asc\", \"create_date:desc\". Usa orden ascendente de forma predeterminada si no se proporciona sufijo. Campos válidos: id, create_date, name, region, product_id, policy_id"
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista separada por comas de campos a incluir en cada elemento de tenant. Campos seleccionables: id, organization_id, create_date, name, region, product_id, policy_id. El campo id siempre se incluye.",
            "example": "name,region,product_id"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120,
              "description": "Filtra tenants usando un objeto JSON. Especifica el campo a filtrar, el operador de comparación y el valor. Ejemplo: {\"field\": \"name\", \"op\": \"eq\", \"value\": \"Tenant 1\"}",
              "example": "{\"field\": \"name\", \"op\": \"eq\", \"value\": \"Tenant 1\"}"
            },
            "description": "Filtra tenants por uno o más criterios. Proporciona un objeto JSON con condiciones de filtro. Puedes filtrar por cualquier campo devuelto en la respuesta. Usa operadores de comparación (eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between) y combina varias condiciones con operadores lógicos (and, or). Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtro simple",
                "description": "Filtra tenants por nombre que contiene texto.",
                "value": "{\"field\": \"name\", \"op\": \"contains\", \"value\": \"production\"}"
              },
              "complex-and": {
                "summary": "Filtro complejo con AND",
                "description": "Filtra tenants por region y producto al mismo tiempo.",
                "value": "{\"and\": [{\"field\": \"region\", \"op\": \"eq\", \"value\": \"us-east\"}, {\"field\": \"product_id\", \"op\": \"eq\", \"value\": \"507f1f77bcf86cd799439030\"}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con múltiples regiones y aplica una restricción de nombre.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"region\", \"op\": \"eq\", \"value\": \"us-east\"}, {\"field\": \"region\", \"op\": \"eq\", \"value\": \"eu-west\"}]}, {\"field\": \"name\", \"op\": \"contains\", \"value\": \"tenant\"}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de tenants recuperada correctamente. La respuesta incluye la bandera de paginación y el arreglo de datos de tenants.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TenantListItemV1ListResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Parámetros de paginación no válidos - Parámetro de ordenación no válido - Parámetros de filtro no válidos"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de tenants que pertenecen a la organización especificada. Admite filtrado y ordenación sobre propiedades del tenant. Los filtros se proporcionan como una cadena JSON que sigue la estructura AST de FilterNode. Los resultados se devuelven en páginas con metadatos de paginación."
      }
    },
    "/v1/organizations/{organization_id}/workspace-groups/{workspace_group_id}/schedules": {
      "post": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Crear una programación cron",
        "operationId": "createWorkspaceGroupSchedule",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "201": {
            "description": "Programación creada correctamente. La respuesta contiene el ID de la programación creada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatedEntityResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos obligatorios (cron_expression, time_zone, type) - Formato de expresión cron inválido - Valor de zona horaria inválido - Tipo de programación inválido (debe ser START, STOP o RESTART) - Formato de ID de Workspace de intermediate_device inválido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: el usuario no tiene acceso a la organización o la organización no existe"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces no encontrado o el grupo de workspaces pertenece a una organización diferente (después de pasar la autorización)"
          },
          "409": {
            "$ref": "#/components/responses/Conflict",
            "description": "Conflicto: ya existe una programación con el mismo tipo, hora y día (después de la conversión de zona horaria)"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable. Causas comunes: - El ID de Workspace de intermediate_device no existe o no pertenece a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateWorkspaceGroupScheduleRequestV1"
              },
              "examples": {
                "create-start-schedule": {
                  "summary": "Crear una programación START para días laborables a las 8 AM",
                  "value": {
                    "cron_expression": "0 8 * * 1-5",
                    "time_zone": "Eastern Standard Time",
                    "type": "start"
                  }
                },
                "create-start-schedule-with-intermediate-device": {
                  "summary": "Crear una programación START con dispositivo intermedio para Wake-on-LAN",
                  "value": {
                    "cron_expression": "0 8 * * 1-5",
                    "time_zone": "Eastern Standard Time",
                    "type": "start",
                    "intermediate_device": "507f1f77bcf86cd799439050"
                  }
                },
                "create-stop-schedule": {
                  "summary": "Crear una programación STOP para días laborables a las 6 PM",
                  "value": {
                    "cron_expression": "0 18 * * 1-5",
                    "time_zone": "UTC",
                    "type": "stop"
                  }
                },
                "create-restart-schedule": {
                  "summary": "Crear una programación RESTART para fines de semana a la medianoche",
                  "value": {
                    "cron_expression": "0 0 * * 0,6",
                    "time_zone": "Pacific Standard Time",
                    "type": "restart"
                  }
                }
              }
            }
          }
        },
        "description": "Crea una nueva programación cron para un grupo de workspaces. Las programaciones definen operaciones automatizadas de energía (START, STOP, RESTART) que se ejecutan en programaciones especificadas según expresiones cron y zona horaria. Las programaciones START pueden incluir opcionalmente un ID de Workspace de dispositivo intermedio para operaciones Wake on LAN en redes seguras. Si se proporciona intermediate_device, indica que se debe usar un dispositivo intermedio. El sistema valida que no exista una programación en conflicto (mismo tipo, hora y día después de la conversión de zona horaria)."
      },
      "get": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Listar programaciones cron",
        "operationId": "listWorkspaceGroupSchedules",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de programaciones recuperada correctamente. Devuelve un arreglo de objetos de programación. Arreglo vacío si no existen programaciones.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceGroupScheduleV1ListResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta: formato de ID de grupo de workspaces no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: el usuario no tiene acceso a la organización o la organización no existe"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces no encontrado o el grupo de workspaces pertenece a una organización diferente (después de que la autorización se valida)"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera todas las programaciones cron configuradas para un grupo de workspaces. Devuelve un arreglo de objetos de programación que contienen expresión cron, zona horaria, tipo, información del dispositivo intermedio y metadatos de auditoría. Si el grupo de workspaces no tiene programaciones, se devuelve un arreglo vacío."
      }
    },
    "/v1/organizations/{organization_id}/workspace-groups": {
      "post": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Crear un grupo de workspaces",
        "operationId": "createWorkspaceGroup",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          }
        ],
        "responses": {
          "201": {
            "description": "Grupo de workspaces creado correctamente. La respuesta contiene el ID del grupo de workspaces creado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatedEntityResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos obligatorios - Valores de campo no válidos - Valor de tipo no válido (solo se permite STATIC) - Estructura de ubicación no válida"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "409": {
            "$ref": "#/components/responses/Conflict",
            "description": "Conflicto: ya existe un grupo de workspaces con el mismo nombre"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkspacegroupsCreateRequestV1"
              },
              "examples": {
                "create-static-workspace-group": {
                  "summary": "Crear un grupo de workspaces con los campos obligatorios mínimos",
                  "value": {
                    "name": "Grupo de Workspaces de producción"
                  }
                },
                "create-workspace-group-with-description": {
                  "summary": "Crear un grupo de workspaces con descripción",
                  "value": {
                    "name": "Grupo de Workspaces de desarrollo",
                    "description": "Grupo de workspaces para entornos de desarrollo",
                    "type": "static"
                  }
                },
                "create-workspace-group-with-location": {
                  "summary": "Crear un grupo de workspaces con información de ubicación",
                  "value": {
                    "name": "Grupo de Workspaces de la oficina de Madrid",
                    "description": "Grupo de workspaces para la oficina de Madrid",
                    "type": "static",
                    "location": {
                      "latitude": 40.4168,
                      "longitude": -3.7038,
                      "address": "Madrid, España",
                      "description": "Ubicación de la oficina principal"
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Crea un nuevo grupo de workspaces para la organización especificada. Actualmente solo se admiten grupos de workspaces de tipo STATIC. Devuelve el ID del grupo de workspaces creado tras una creación exitosa."
      },
      "get": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Listar grupos de workspaces",
        "operationId": "listWorkspaceGroups",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo opcional de orden (:asc o :desc). Campos de ordenación válidos: id, name, description, create_user, create_date, type, location. El orden ascendente se usa por defecto si no se proporciona sufijo."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista separada por comas de campos para incluir en cada elemento de grupos de workspaces. Campos seleccionables: id, name, description, organization_id, create_user, create_date, type, filter, location, entra_id_source. El campo id siempre se incluye.",
            "example": "name,type,create_date"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120,
              "description": "Filtrar grupos de workspaces usando un objeto JSON. Especifica el campo a filtrar, el operador de comparación y el valor. Ejemplo: {\"field\": \"name\", \"op\": \"eq\", \"value\": \"grupos de workspaces 1\"}",
              "example": "{\"field\": \"name\", \"op\": \"eq\", \"value\": \"Grupo de Workspace 1\"}"
            },
            "description": "Filtrar grupos de workspaces por uno o más criterios. Proporciona un objeto JSON con condiciones de filtrado. Puedes filtrar por: id, name, description, create_user, create_date, type, location, entra_id_source.resource_id, entra_id_source.resource_type, entra_id_source.resource_name. Para campos anidados como location o entra_id_source, usa notación por puntos (p. ej., location.latitude, entra_id_source.resource_type). Usa operadores de comparación (eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between) y combina múltiples condiciones con operadores lógicos (and, or). Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre de grupos de workspaces",
                "description": "Devuelve grupos de workspaces cuyo nombre contiene el texto proporcionado.",
                "value": "{\"field\": \"name\", \"op\": \"contains\", \"value\": \"finanzas\"}"
              },
              "complex-and": {
                "summary": "Filtrar por tipo y ubicación",
                "description": "Devuelve grupos de workspaces STATIC por encima de un umbral de latitud.",
                "value": "{\"and\": [{\"field\": \"type\", \"op\": \"eq\", \"value\": \"STATIC\"}, {\"field\": \"location.latitude\", \"op\": \"gt\", \"value\": 40}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con múltiples patrones de nombre y requiere un tipo de recurso de Entra específico.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"name\", \"op\": \"contains\", \"value\": \"Finanzas\"}, {\"field\": \"name\", \"op\": \"contains\", \"value\": \"RRHH\"}]}, {\"field\": \"entra_id_source.resource_type\", \"op\": \"eq\", \"value\": \"GROUP\"}]}"
              }
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Número de elementos por página"
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de grupos de workspaces recuperada correctamente. La respuesta incluye metadatos de paginación y un arreglo de datos de grupos de workspaces.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceGroupListItemV1ListResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Parámetros de paginación no válidos - Parámetro de ordenación no válido - Parámetros de filtrado no válidos"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de grupos de workspaces que pertenecen a la organización especificada. Admite filtrado y ordenación sobre propiedades de grupos de workspaces. Los filtros se proporcionan como una cadena JSON siguiendo la estructura AST de FilterNode. Los resultados se devuelven en páginas con metadatos de paginación."
      }
    },
    "/v1/organizations/{organization_id}/flows/{flow_id}": {
      "delete": {
        "tags": [
          "Flujos"
        ],
        "summary": "Eliminar un flujo",
        "operationId": "deleteFlow",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "flow_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del flujo que se va a eliminar",
            "example": "507f1f77bcf86cd799439012"
          }
        ],
        "responses": {
          "204": {
            "description": "Flujo eliminado correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - ID de flujo no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - autenticación requerida"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Flujo no encontrado"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Elimina de forma permanente un flujo de la organización. Esta acción no se puede deshacer. No devuelve contenido (204) tras una eliminación correcta."
      },
      "get": {
        "tags": [
          "Flujos"
        ],
        "summary": "Recuperar un flujo",
        "operationId": "getFlowById",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "flow_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del flujo",
            "example": "507f1f77bcf86cd799439012"
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "en-EN",
                "es-ES",
                "pt-BR",
                "ca-ES",
                "eu-ES"
              ],
              "default": "es-ES"
            },
            "description": "Código de idioma para campos de texto que admiten varios idiomas. Al crear o actualizar recursos, esto especifica el idioma de los valores de texto proporcionados. Al recuperar recursos, esto determina qué variante de idioma de los campos de texto multilingües se devuelve. Valores aceptados: 'en-EN' (inglés), 'es-ES' (español), 'pt-BR' (portugués), 'ca-ES' (catalán), 'eu-ES' (euskera). El valor predeterminado es 'es-ES' si no se proporciona."
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles del flujo recuperados correctamente. La respuesta incluye la configuración completa del flujo, condiciones, destinos y métricas de ejecución.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetFlowResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - ID de flujo no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Flujo no encontrado"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera información detallada sobre un flujo específico, incluida su configuración, lógica de ejecución, condiciones, destinos y métricas de ejecución. Devuelve los datos completos del flujo en el idioma solicitado."
      },
      "put": {
        "tags": [
          "Flujos"
        ],
        "summary": "Actualizar un flujo",
        "operationId": "updateFlow",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "flow_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del flujo a actualizar",
            "example": "507f1f77bcf86cd799439012"
          }
        ],
        "responses": {
          "204": {
            "description": "Flujo actualizado correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos obligatorios - Valores de campo no válidos - Configuración de condición no válida - Identificador de microservicio no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - autenticación requerida"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Flujo u organización no encontrados"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable. Causas comunes: - Microservicio referenciado no encontrado - Entidades objetivo referenciadas (Workspaces, Workspace groups, Grupos de reporte) no encontradas o no pertenecientes - Tipo de condición no válido - El flujo no se puede habilitar"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateFlowV1Request"
              },
              "examples": {
                "update-flow-configuration": {
                  "summary": "Actualizar flujo con nueva configuracion",
                  "value": {
                    "name": {
                      "en-EN": "Flujo diario de copia actualizado",
                      "es-ES": "Proceso de copia diaria actualizado"
                    },
                    "description": {
                      "en-EN": "Proceso automatizado de copia diaria actualizado",
                      "es-ES": "Proceso automatizado de copia actualizado"
                    },
                    "detection_only": false,
                    "cooldown_minutes": 120,
                    "enabled": true,
                    "init_text": {
                      "en-EN": "Iniciando proceso de copia actualizado...",
                      "es-ES": "Iniciando proceso de copia actualizado..."
                    },
                    "ok_text": {
                      "en-EN": "Copia completada correctamente"
                    },
                    "ko_text": {
                      "en-EN": "La copia fallo. Por favor, revisa los registros."
                    },
                    "target": {
                      "type": "workspaces",
                      "ids": [
                        "507f1f77bcf86cd799439012",
                        "507f1f77bcf86cd799439013"
                      ]
                    },
                    "microservice_id": "507f1f77bcf86cd799439014",
                    "conditions": [
                      {
                        "condition_type_id": "507f1f77bcf86cd799439015",
                        "operator": "gte",
                        "compare_to": "90",
                        "period": null,
                        "check_every": 600
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "description": "Actualiza la configuración de un flujo existente, incluyendo nombre, descripción, lógica de ejecución, condiciones y configuración de destino. No devuelve contenido (204) tras una actualización correcta."
      }
    },
    "/v1/organizations/{organization_id}/reporting-groups/{reporting_group_id}": {
      "delete": {
        "tags": [
          "Grupos de reporte"
        ],
        "summary": "Eliminar un grupo de reporte",
        "operationId": "deleteReportingGroup",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "reporting_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de reporte que se va a eliminar",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "204": {
            "description": "Grupo de reporte eliminado correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Parámetros de ruta no válidos - Formato de ID no válido para organization_id o reporting_group_id"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de reporte no encontrado o no pertenece a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Elimina un grupo de reporte existente de la organización. El grupo de reporte no debe tener Workspaces asignados y debe ser directamente editable. No devuelve contenido (204) tras una eliminación exitosa."
      },
      "get": {
        "tags": [
          "Grupos de reporte"
        ],
        "summary": "Recuperar un grupo de reporte",
        "operationId": "getReportingGroupById",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "reporting_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de reporte",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles del grupo de reporte recuperados correctamente. La respuesta incluye la configuración del grupo de reporte y los ajustes del agente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportingGroupByIdV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - formato de ID de grupo de reporte no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - autenticación requerida"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de reporte no encontrado o no pertenece a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera información detallada sobre un grupo de reporte específico, incluida su configuración y los ajustes del agente. Devuelve datos del grupo de reporte que coinciden con la estructura del endpoint de listado."
      },
      "put": {
        "tags": [
          "Grupos de reporte"
        ],
        "summary": "Actualizar un grupo de reporte",
        "operationId": "updateReportingGroup",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "reporting_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de reporte a actualizar",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "204": {
            "description": "Grupo de reporte actualizado correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos obligatorios (name) - Valores de campo no válidos - Valor de fishing_pattern_field no válido (debe ser uno de: full_name, description, ou, current_subnet) - Valor de fishing_pattern no válido (supera maxLength: 250) - Formato de ID no válido para los campos patch_policy_target_id o intermediate_device - Dispositivos intermedios no definidos secuencialmente (intermediate_device2 requiere intermediate_device1, intermediate_device3 requiere intermediate_device2)"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - autenticación requerida"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "No encontrado. Causas comunes: - Grupo de reporte no encontrado o que no pertenece a la organización - Destino de política de parches no encontrado"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable. Causas comunes: - Los IDs de Workspace de dispositivos intermedios no existen o no pertenecen a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReportingGroupRequestV1"
              },
              "examples": {
                "update-reporting-group-full-replacement": {
                  "summary": "Actualizar grupo de reporte con todos los campos actualizables, incluidos los dispositivos intermedios",
                  "value": {
                    "name": "Grupo de reporte de producción actualizado",
                    "description": "Grupo de reporte actualizado para entornos de producción",
                    "patch_policy_target_id": "507f1f77bcf86cd799439040",
                    "fishing_pattern": "Estaciones de trabajo Windows",
                    "fishing_pattern_field": "full_name",
                    "intermediate_device1": "507f1f77bcf86cd799439050",
                    "intermediate_device2": "507f1f77bcf86cd799439051",
                    "intermediate_device3": "507f1f77bcf86cd799439052"
                  }
                },
                "update-reporting-group-minimal-fields": {
                  "summary": "Actualizar grupo de reporte solo con los campos obligatorios (limpia todos los campos opcionales)",
                  "value": {
                    "name": "Nombre actualizado del grupo de reporte"
                  },
                  "description": "Este ejemplo muestra la actualización solo del nombre. Todos los campos opcionales (description, patch_policy_target_id, fishing_pattern, fishing_pattern_field y dispositivos intermedios) se limpiarán."
                },
                "update-reporting-group-with-single-intermediate-device": {
                  "summary": "Actualizar grupo de reporte solo con el primer dispositivo intermedio",
                  "value": {
                    "name": "Nombre actualizado del grupo de reporte",
                    "description": "Configuración de un solo dispositivo intermedio",
                    "intermediate_device1": "507f1f77bcf86cd799439050"
                  },
                  "description": "Este ejemplo establece solo intermediate_device1. intermediate_device2 e intermediate_device3 se limpiarán si estaban establecidos previamente."
                },
                "update-reporting-group-clear-intermediate-devices": {
                  "summary": "Actualizar grupo de reporte y limpiar todos los dispositivos intermedios",
                  "value": {
                    "name": "Nombre actualizado del grupo de reporte",
                    "description": "Sin dispositivos intermedios"
                  },
                  "description": "Al omitir todos los campos intermediate_device, todos se limpiarán (comportamiento idempotente)."
                }
              }
            }
          }
        },
        "description": "Actualiza la configuración de un grupo de reporte existente, incluyendo nombre, descripción, destino de política de parches, patrón de búsqueda y dispositivos intermedios. Este endpoint implementa semántica de reemplazo completo: todos los campos actualizables deben incluirse en la solicitud. Omitir campos opcionales los limpiará (comportamiento idempotente). Puede configurar opcionalmente dispositivos intermedios (hasta 3) proporcionando identificadores de Workspace. Los dispositivos intermedios se usan para acciones Wake-on-LAN en redes seguras, permitiendo el encendido remoto de dispositivos a través de puertas de enlace intermedias. Los dispositivos intermedios deben definirse secuencialmente: no puede definir intermediate_device2 sin intermediate_device1, ni intermediate_device3 sin intermediate_device2. Todos los IDs de Workspace de dispositivos intermedios deben existir y pertenecer a la organización. No devuelve contenido (204) tras una actualización exitosa."
      }
    },
    "/v1/organizations/{organization_id}/tenants/{tenant_id}": {
      "delete": {
        "tags": [
          "Tenants"
        ],
        "summary": "Eliminar un tenant",
        "operationId": "deleteTenant",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización propietaria del tenant",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "tenant_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del tenant que se va a eliminar",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "204": {
            "description": "Tenant eliminado correctamente. La organización relacionada ha sido desactivada. No se devuelve contenido en el cuerpo de la respuesta."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Parámetros de ruta no válidos - Formato de ID de tenant no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: se requiere autenticación o el usuario no tiene permisos para eliminar el tenant. También se devuelve al intentar eliminar un tenant de la propia organización del usuario."
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Tenant no encontrado"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable: error de validación de lógica de negocio. Causas comunes: - No se puede eliminar un tenant con sub-tenants (la organización tiene más de un tenant) - No se puede eliminar un tenant de la propia organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Elimina un tenant existente y desactiva la organización relacionada. No se puede eliminar un tenant de la propia organización del usuario. No se puede eliminar un tenant si la organización tiene más de un tenant."
      },
      "get": {
        "tags": [
          "Tenants"
        ],
        "summary": "Recuperar un tenant",
        "operationId": "getTenantById",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "tenant_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del tenant",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles del tenant recuperados correctamente. La respuesta incluye información completa del tenant, incluidas las asignaciones de producto y política.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TenantByIdV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - formato de ID de tenant inválido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Tenant no encontrado"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera información detallada sobre un tenant específico, incluida su configuración, asignación de producto, asignación de política y metadatos. Devuelve datos completos del tenant para la organización especificada."
      },
      "put": {
        "tags": [
          "Tenants"
        ],
        "summary": "Actualizar un tenant",
        "operationId": "updateTenant",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización propietaria del tenant",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "tenant_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del tenant a actualizar",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "204": {
            "description": "Nombre del tenant actualizado correctamente. El nombre de la organización relacionada también se ha actualizado. No se devuelve contenido en el cuerpo de la respuesta."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Cuerpo de solicitud o parámetros de ruta no válidos - Falta el campo obligatorio (name) - Tipos de campo no válidos"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: se requiere autenticación o el usuario no tiene permiso para actualizar el tenant"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Tenant no encontrado"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTenantRequestV1"
              },
              "examples": {
                "update-tenant-name": {
                  "summary": "Actualizar el nombre de un tenant existente",
                  "value": {
                    "name": "Tenant de Produccion Actualizado"
                  }
                }
              }
            }
          }
        },
        "description": "Actualiza el nombre de un tenant existente. La actualización del nombre del tenant también actualiza el nombre de la organización relacionada."
      }
    },
    "/v1/organizations/{organization_id}/workspace-groups/{workspace_group_id}/schedules/{schedule_id}": {
      "delete": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Eliminar una programación cron",
        "operationId": "deleteWorkspaceGroupSchedule",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          },
          {
            "name": "schedule_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la programación a eliminar",
            "example": "507f1f77bcf86cd799439060"
          }
        ],
        "responses": {
          "204": {
            "description": "Programación eliminada correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - formato de ID de programación no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - el usuario no tiene acceso a la organización, o la organización no existe"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "No se encontró el grupo de workspaces o la programación, o el grupo de workspaces pertenece a una organización diferente (después de que la autorización se valide)"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Elimina una programación cron de un grupo de workspaces. Una vez eliminada, la operación de energía automatizada definida por esta programación ya no se ejecutará. La programación debe pertenecer al grupo de workspaces y a la organización especificados."
      },
      "get": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Recuperar una programación cron",
        "operationId": "getWorkspaceGroupScheduleById",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          },
          {
            "name": "schedule_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la programación",
            "example": "507f1f77bcf86cd799439060"
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles de programación recuperados correctamente. La respuesta incluye expresión cron, zona horaria, tipo, información del dispositivo intermedio y metadatos de auditoría.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceGroupScheduleV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - formato de ID de programación no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - el usuario no tiene acceso a la organización, o la organización no existe"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "No se encontró el grupo de workspaces o la programación, o el grupo de workspaces pertenece a una organización diferente (después de que la autorización se valida)"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera información detallada sobre programación cron especifica para un grupo de workspaces. Devuelve la configuración de la programación, incluida la expresión cron, la zona horaria, el tipo de operación, la configuración del dispositivo intermedio y los metadatos de auditoría (creado por, actualizado por, actualizado en)."
      },
      "put": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Actualizar una programación cron",
        "operationId": "updateWorkspaceGroupSchedule",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          },
          {
            "name": "schedule_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la programación a actualizar",
            "example": "507f1f77bcf86cd799439060"
          }
        ],
        "responses": {
          "204": {
            "description": "Programación actualizada correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos obligatorios (cron_expression, time_zone, type) - Formato de expresión cron no válido - Valor de zona horaria no válido - Tipo de programación no válido (debe ser START, STOP o RESTART) - Formato de ID de Workspace intermediate_device no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces o programación no encontrada, o no pertenece a la organización"
          },
          "409": {
            "$ref": "#/components/responses/Conflict",
            "description": "Conflicto - Ya existe una programación con el mismo tipo, hora y día (después de la conversión de zona horaria), excluyendo la programación actual que se está actualizando"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable. Causas comunes: - El ID de Workspace intermediate_device no existe o no pertenece a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWorkspaceGroupScheduleRequestV1"
              },
              "examples": {
                "update-schedule-time": {
                  "summary": "Actualizar programación para ejecutar a una hora diferente",
                  "value": {
                    "cron_expression": "0 9 * * 1-5",
                    "time_zone": "Eastern Standard Time",
                    "type": "start"
                  }
                },
                "add-intermediate-device": {
                  "summary": "Agregar dispositivo intermedio a una programación START existente",
                  "value": {
                    "cron_expression": "0 8 * * 1-5",
                    "time_zone": "Eastern Standard Time",
                    "type": "start",
                    "intermediate_device": "507f1f77bcf86cd799439050"
                  }
                },
                "remove-intermediate-device": {
                  "summary": "Eliminar dispositivo intermedio de la programación START",
                  "value": {
                    "cron_expression": "0 8 * * 1-5",
                    "time_zone": "Eastern Standard Time",
                    "type": "start"
                  }
                },
                "change-schedule-type": {
                  "summary": "Cambiar el tipo de programación de START a STOP",
                  "value": {
                    "cron_expression": "0 18 * * 1-5",
                    "time_zone": "UTC",
                    "type": "stop"
                  }
                }
              }
            }
          }
        },
        "description": "Actualiza una programación cron existente para un grupo de workspaces. Se deben proporcionar todos los campos de la programación, ya que este endpoint implementa semántica de reemplazo completo. El sistema valida que no exista una programación en conflicto (mismo tipo, hora y día después de la conversión de zona horaria), excluyendo la programación actual que se está actualizando. Para eliminar un dispositivo intermedio de una programación START, omita el campo intermediate_device."
      }
    },
    "/v1/organizations/{organization_id}/workspace-groups/{workspace_group_id}": {
      "delete": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Eliminar un grupo de workspaces",
        "operationId": "deleteWorkspaceGroup",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces que se eliminará",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "204": {
            "description": "Grupo de workspaces eliminado correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - formato de ID de grupo de workspaces no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces no encontrado o no pertenece a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Elimina permanentemente un grupo de workspaces de la organización. Esta acción no se puede deshacer. No devuelve contenido (204) tras una eliminación exitosa."
      },
      "get": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Recuperar un grupo de workspaces",
        "operationId": "getWorkspaceGroupById",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles del grupo de workspaces recuperados correctamente. La respuesta incluye la configuración, el tipo y la ubicación del grupo de workspaces.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceGroupDetailResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - formato de ID de grupo de workspaces no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces no encontrado o no pertenece a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera información detallada sobre un grupo de workspaces específico, incluida su configuración, tipo y ubicación. Devuelve datos del grupo de workspaces que coinciden con la estructura del endpoint de listado."
      },
      "put": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Actualizar un grupo de workspaces",
        "operationId": "updateWorkspaceGroup",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces que se actualizará",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "204": {
            "description": "Grupo de workspaces actualizado correctamente. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Faltan campos requeridos (name, description, location) - Valores de campo no válidos - Estructura de location no válida - Faltan campos requeridos de location (latitude, longitude, address)"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces no encontrado o no pertenece a la organización"
          },
          "409": {
            "$ref": "#/components/responses/Conflict",
            "description": "Conflicto - ya existe un grupo de workspaces con el mismo nombre"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity",
            "description": "Entidad no procesable - violación de regla de negocio (p. ej., no se puede establecer filter en un grupo de workspaces de Entra ID)"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkspaceGroupUpdateRequestV1"
              },
              "examples": {
                "update-workspace-group-(full-replacement)": {
                  "summary": "Actualizar grupo de workspaces con todos los campos requeridos",
                  "value": {
                    "name": "Grupo de Workspace de Produccion Actualizado",
                    "description": "Grupo de workspaces actualizado para entornos de producción",
                    "location": {
                      "latitude": 40.4168,
                      "longitude": -3.7038,
                      "address": "Madrid, Espana",
                      "description": "Ubicación de oficina actualizada"
                    }
                  }
                },
                "update-workspace-group-without-location-description": {
                  "summary": "Actualizar grupo de workspaces con campos requeridos; la descripcion de location es opcional",
                  "value": {
                    "name": "Grupo de Workspace de Produccion Actualizado",
                    "description": "Grupo de workspaces actualizado para entornos de producción",
                    "location": {
                      "latitude": 40.4168,
                      "longitude": -3.7038,
                      "address": "Madrid, Espana"
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Actualiza la configuración de un grupo de workspaces existente, incluyendo name, description y location. Esta es una solicitud PUT que implementa reemplazo completo: todos los campos actualizables son obligatorios. No devuelve contenido (204) tras una actualización exitosa."
      }
    },
    "/v1/organizations/{organization_id}/flows/condition-types": {
      "get": {
        "tags": [
          "Flujos"
        ],
        "summary": "Listar tipos de condición",
        "operationId": "listConditionTypes",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Elementos por página (predeterminado: 100, máx.: 100)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo de orden opcional (:asc o :desc). Usa nombres de propiedades de la respuesta. Campos válidos: id, name, description, type, value_type, value_placeholder, period. Ejemplo: \"name:asc\" o \"type:desc\""
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista de campos separada por comas para incluir en cada elemento de tipo de condición. Campos seleccionables: id, name, description, type, frequency_values, value_type, value_placeholder, op_values, period. El campo id siempre se incluye.",
            "example": "name,type,op_values"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Filtra tipos de condición por uno o más criterios. Proporciona un objeto JSON con condiciones de filtro. Puedes filtrar por cualquier campo devuelto en la respuesta. Usa operadores de comparación (eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between) y combina múltiples condiciones con operadores lógicos (and, or). Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtrar por tipo de condición",
                "description": "Devuelve tipos de condición que coinciden con un identificador de tipo específico.",
                "value": "{\"field\": \"type\", \"op\": \"eq\", \"value\": \"osVersion\"}"
              },
              "complex-and": {
                "summary": "Filtrar por tipo de valor y soporte periódico",
                "description": "Devuelve tipos de condición basados en cadenas que no son periódicos.",
                "value": "{\"and\": [{\"field\": \"value_type\", \"op\": \"eq\", \"value\": \"string\"}, {\"field\": \"period\", \"op\": \"eq\", \"value\": false}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide por texto de nombre o descripción y restringe por tipo de condición.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"name\", \"op\": \"contains\", \"value\": \"os\"}, {\"field\": \"description\", \"op\": \"contains\", \"value\": \"version\"}]}, {\"field\": \"type\", \"op\": \"eq\", \"value\": \"osVersion\"}]}"
              }
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "en-EN",
                "es-ES",
                "pt-BR",
                "ca-ES",
                "eu-ES"
              ],
              "default": "es-ES"
            },
            "description": "Código de idioma para campos de texto que admiten múltiples idiomas. Al crear o actualizar recursos, esto especifica el idioma de los valores de texto proporcionados. Al recuperar recursos, esto determina qué variante de idioma de los campos de texto multilingües se devuelve. Valores aceptados: 'en-EN' (inglés), 'es-ES' (español), 'pt-BR' (portugués), 'ca-ES' (catalán), 'eu-ES' (euskera). Si no se proporciona, el valor predeterminado es 'es-ES'."
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de tipos de condición recuperada correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConditionTypeV1ListResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta - ID de organización inválido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de tipos de condición disponibles que pueden usarse en condiciones de flujo. Admite paginación, ordenación, filtrado y selección de campos."
      }
    },
    "/v1/organizations/{organization_id}/installed-apps/{installed_app_id}": {
      "get": {
        "tags": [
          "Aplicaciones instaladas"
        ],
        "summary": "Recuperar una aplicación instalada",
        "operationId": "get_installed_app_by_id",
        "description": "Devuelve los detalles de la aplicación instalada solicitada dentro del alcance de una organización.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organización.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "installed_app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la aplicación instalada.",
            "example": "64f0c2a1b2d3e4f5060709aa"
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles de la aplicación instalada recuperados correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetInstalledAppByIdResponseV1"
                },
                "examples": {
                  "installed_app_details": {
                    "summary": "Respuesta de detalle de la aplicación instalada",
                    "value": {
                      "id": "64f0c2a1b2d3e4f5060709aa",
                      "organization_id": "507f1f77bcf86cd799439011",
                      "name": "Google Chrome",
                      "publisher": "Google LLC",
                      "operating_system": "windows",
                      "notes": "Administrada mediante catálogo de software",
                      "discovered_at": "2026-02-15T09:30:00.000Z",
                      "reported_at": "2026-04-01T07:45:00.000Z",
                      "installations": 4
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parámetros de solicitud no válidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_installed_app_id": {
                    "summary": "Formato de identificador de aplicación instalada no válido",
                    "value": {
                      "error": {
                        "message": "Formato de installed_app_id no válido",
                        "code": "bad_request",
                        "details": "installed_app_id debe ser una cadena hexadecimal en minúsculas de 24 caracteres"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o organización no accesible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Fallo de acceso a la organización",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Aplicación instalada no encontrada dentro del alcance de la organización autorizada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "installed_app_not_found": {
                    "summary": "No se encontró la aplicación instalada solicitada",
                    "value": {
                      "error": {
                        "message": "Aplicación instalada no encontrada",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Fallo no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/installed-apps/{installed_app_id}/versions": {
      "get": {
        "tags": [
          "Aplicaciones instaladas"
        ],
        "summary": "Listar versiones observadas para una aplicacion instalada",
        "description": "Devuelve una lista paginada de versiones observadas para la aplicacion instalada dentro del alcance de la organizacion.",
        "operationId": "get_installed_app_versions",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organizacion.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "installed_app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la aplicacion instalada.",
            "example": "64f0c2a1b2d3e4f5060708c1"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Numero de pagina."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 100
            },
            "description": "Numero de elementos por pagina."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Nombres de campos de los elementos de respuesta, separados por comas, que se deben incluir."
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Expresion de filtro JSON sobre rutas de campos filtrables de la respuesta.",
            "examples": {
              "simple": {
                "summary": "Filtrar por version exacta",
                "value": "{\"field\":\"version\",\"op\":\"eq\",\"value\":\"117.0.5938.149\"}"
              },
              "complex-and": {
                "summary": "Filtrar por una version exacta dentro de una expresion and",
                "value": "{\"and\":[{\"field\":\"version\",\"op\":\"eq\",\"value\":\"117.0.5938.149\"},{\"field\":\"version\",\"op\":\"eq\",\"value\":\"117.0.5938.149\"}]}"
              },
              "complex-or-and": {
                "summary": "Combinar alternativas de version en logica anidada",
                "value": "{\"and\":[{\"or\":[{\"field\":\"version\",\"op\":\"eq\",\"value\":\"117.0.5938.149\"},{\"field\":\"version\",\"op\":\"eq\",\"value\":\"118.0.5993.70\"}]},{\"field\":\"version\",\"op\":\"eq\",\"value\":\"118.0.5993.70\"}]}"
              }
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^(version|discovered_at|reported_at):(asc|desc)$"
            },
            "description": "Expresion de ordenacion en el formato <field>:asc|desc."
          }
        ],
        "responses": {
          "200": {
            "description": "Versiones de aplicaciones instaladas recuperadas correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetInstalledAppVersionsResponseV1"
                },
                "examples": {
                  "paginated_result": {
                    "summary": "Lista paginada con filas de versiones",
                    "value": {
                      "has_next": true,
                      "data": [
                        {
                          "version": "118.0.5993.90",
                          "reported_at": "2026-04-05T10:12:00Z",
                          "discovered_at": "2026-02-01T08:30:00Z"
                        }
                      ]
                    }
                  },
                  "empty_result": {
                    "summary": "No se encontraron versiones",
                    "value": {
                      "has_next": false,
                      "data": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parametros de solicitud no validos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_filters": {
                    "summary": "Formato de filtros no valido",
                    "value": {
                      "error": {
                        "message": "Formato de filtros no valido",
                        "code": "bad_request",
                        "details": "filters debe ser un JSON valido"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o la organizacion no es accesible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Error de acceso a la organizacion",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "El recurso solicitado no se encontro dentro del alcance de la organizacion autorizada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "installed_app_not_found": {
                    "summary": "No se encontro la aplicacion instalada",
                    "value": {
                      "error": {
                        "message": "No encontrado",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Error no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/installed-apps/{installed_app_id}/workspaces": {
      "get": {
        "tags": [
          "Aplicaciones instaladas"
        ],
        "summary": "Listar workspaces para una app instalada",
        "description": "Devuelve una lista paginada de observaciones a nivel de Workspace para la app instalada seleccionada en el alcance de la organizacion.",
        "operationId": "get_installed_app_workspaces",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de organizacion.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "installed_app_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de app instalada.",
            "example": "64f0c2a1b2d3e4f5060709aa"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Numero de pagina."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 100
            },
            "description": "Numero de elementos por pagina."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Nombres de campos de elementos de respuesta separados por comas para incluir."
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Expresion de filtro JSON sobre rutas de campos de respuesta filtrables.",
            "examples": {
              "simple": {
                "summary": "Filtrar por workspace_id",
                "value": "{\"field\":\"workspace_id\",\"op\":\"eq\",\"value\":\"64f0c2a1b2d3e4f5060708f1\"}"
              },
              "complex-and": {
                "summary": "Filtrar por install_location y version",
                "value": "{\"and\":[{\"field\":\"install_location\",\"op\":\"contains\",\"value\":\"Program Files\"},{\"field\":\"version\",\"op\":\"contains\",\"value\":\"124\"}]}"
              },
              "complex-or-and": {
                "summary": "Combinar alternativas de installed_at con una condicion de organizacion",
                "value": "{\"and\":[{\"or\":[{\"field\":\"installed_at\",\"op\":\"eq\",\"value\":\"2025-12-01T08:00:00.000Z\"},{\"field\":\"installed_at\",\"op\":\"eq\",\"value\":\"2025-11-15T09:30:00.000Z\"}]},{\"field\":\"organization_id\",\"op\":\"eq\",\"value\":\"507f1f77bcf86cd799439011\"}]}"
              }
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^(workspace_id|organization_id|version|reported_at|install_location|installed_at):(asc|desc)$"
            },
            "description": "Expresion de ordenamiento con el formato <field>:asc|desc."
          }
        ],
        "responses": {
          "200": {
            "description": "Observaciones de Workspace de app instalada obtenidas correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetInstalledAppWorkspacesResponseV1"
                },
                "examples": {
                  "paginated_result": {
                    "summary": "Observaciones de Workspace paginadas",
                    "value": {
                      "has_next": true,
                      "data": [
                        {
                          "workspace_id": "64f0c2a1b2d3e4f5060708f1",
                          "organization_id": "507f1f77bcf86cd799439011",
                          "version": "124.0.2478.97",
                          "reported_at": "2026-01-15T10:20:30.000Z",
                          "install_location": "C:\\Program Files\\ExampleApp",
                          "installed_at": "2025-12-01T08:00:00.000Z"
                        }
                      ]
                    }
                  },
                  "empty_result": {
                    "summary": "No se encontraron observaciones de Workspace",
                    "value": {
                      "has_next": false,
                      "data": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parametros de solicitud invalidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_filters": {
                    "summary": "Formato de filters invalido",
                    "value": {
                      "error": {
                        "message": "Formato de filters invalido",
                        "code": "bad_request",
                        "details": "filters debe ser una expresion de filtro JSON valida"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o la organizacion no es accesible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Fallo de acceso a la organizacion",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No se encontro la app instalada dentro del alcance de organizacion autorizado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "installed_app_not_found": {
                    "summary": "No se encontro la app instalada solicitada",
                    "value": {
                      "error": {
                        "message": "No se encontro la app instalada",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Fallo no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/installed-apps": {
      "get": {
        "tags": [
          "Aplicaciones instaladas"
        ],
        "summary": "Listar aplicaciones instaladas",
        "description": "Devuelve una lista paginada de aplicaciones instaladas disponibles en el alcance de la organización.",
        "operationId": "get_installed_apps",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organización.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 100
            },
            "description": "Número de elementos por página."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Nombres de campos del elemento de respuesta separados por comas que se incluirán."
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Expresión de filtro JSON sobre los campos de filtro admitidos.",
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre de aplicación",
                "value": "{\"field\":\"name\",\"op\":\"contains\",\"value\":\"chrome\"}"
              },
              "complex-and": {
                "summary": "Filtrar por sistema operativo y presencia de instalación",
                "value": "{\"and\":[{\"field\":\"operating_system\",\"op\":\"eq\",\"value\":\"Windows\"},{\"field\":\"has_installations\",\"op\":\"eq\",\"value\":true}]}"
              },
              "complex-or-and": {
                "summary": "Combinar alternativas de publicador con presencia de instalación",
                "value": "{\"and\":[{\"or\":[{\"field\":\"publisher\",\"op\":\"contains\",\"value\":\"microsoft\"},{\"field\":\"publisher\",\"op\":\"contains\",\"value\":\"google\"}]},{\"field\":\"has_installations\",\"op\":\"eq\",\"value\":true}]}"
              }
            }
          },
          {
            "name": "aggregate",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 1024
            },
            "description": "Expresión de agregación JSON con `group_by` y `fns`. No se puede combinar con `fields`.",
            "examples": {
              "group_by_operating_system": {
                "summary": "Agrupar por sistema operativo y contar",
                "value": "{\"group_by\":[\"operating_system\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}"
              },
              "group_by_publisher_avg_installations": {
                "summary": "Agrupar por publicador y calcular promedio de instalaciones",
                "value": "{\"group_by\":[\"publisher\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"},{\"field\":\"installations\",\"fn\":\"avg\"}]}"
              }
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^([a-z_]+):(asc|desc)$"
            },
            "description": "Expresión de ordenación con el formato <field>:asc|desc. En modo agregado, solo acepta campos de `group_by` o aliases agregados (`count`, `<fn>_<field>`)."
          }
        ],
        "responses": {
          "200": {
            "description": "Aplicaciones instaladas recuperadas correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetInstalledAppsResponseV1"
                },
                "examples": {
                  "paginated_result": {
                    "summary": "Lista paginada con aplicaciones instaladas",
                    "value": {
                      "has_next": true,
                      "data": [
                        {
                          "id": "64f0c2a1b2d3e4f5060708c1",
                          "organization_id": "507f1f77bcf86cd799439011",
                          "name": "Microsoft Edge",
                          "discovered_at": "2026-03-10T09:00:00Z",
                          "reported_at": "2026-03-15T09:45:11Z",
                          "operating_system": "windows",
                          "publisher": "Microsoft Corporation",
                          "installations": 4
                        }
                      ]
                    }
                  },
                  "empty_result": {
                    "summary": "No se encontraron aplicaciones instaladas",
                    "value": {
                      "has_next": false,
                      "data": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parámetros de solicitud no válidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_filters": {
                    "summary": "Formato de filtros no válido",
                    "value": {
                      "error": {
                        "message": "Formato de filtros no válido",
                        "code": "bad_request",
                        "details": "filters debe ser un JSON válido"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o la organización no es accesible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Fallo de acceso a la organización",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "El recurso solicitado no se encontró dentro del alcance autorizado de la organización.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "resource_not_found": {
                    "summary": "No se encontró el recurso solicitado",
                    "value": {
                      "error": {
                        "message": "No encontrado",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Fallo no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/me": {
      "get": {
        "tags": [
          "Autenticación"
        ],
        "summary": "Validar token y obtener contexto actual",
        "description": "Valida el token y devuelve el contexto autenticado.",
        "operationId": "get_me",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          }
        ],
        "responses": {
          "200": {
            "description": "Contexto autenticado recuperado correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMeResponseV1"
                },
                "examples": {
                  "authenticated_context": {
                    "summary": "Contexto de organización y token",
                    "value": {
                      "organization_id": "507f1f77bcf86cd799439011",
                      "token_id": "507f1f77bcf86cd799439022",
                      "token_name": "api-key-admin",
                      "token_created_at": "2026-03-01T10:15:00Z",
                      "token_expires_at": "2027-03-01T10:15:00Z"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token inválido, expirado o ausente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_token": {
                    "summary": "Error de autenticación",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Fallo no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/microservices/{microservice_id}": {
      "get": {
        "tags": [
          "Microservicios"
        ],
        "summary": "Obtener microservicio por identificador",
        "operationId": "get_microservice_by_id_v1",
        "description": "Devuelve un microservicio visible para la organizacion objetivo (designer o marketplace), con estado de habilitacion y configuracion habilitada cuando exista.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organizacion sobre la que se consulta el microservicio.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "microservice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador del microservicio a recuperar.",
            "example": "65f0d9f2b3c4d5e6f7080911"
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "default": "es-ES",
              "maxLength": 10
            },
            "description": "Idioma para resolver campos multilenguaje a un unico valor por campo.",
            "example": "es-ES"
          }
        ],
        "responses": {
          "200": {
            "description": "Microservicio recuperado correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMicroserviceByIdResponseV1"
                },
                "examples": {
                  "microservicio_habilitado": {
                    "summary": "Microservicio encontrado con configuracion habilitada",
                    "value": {
                      "data": {
                        "id": "65f0d9f2b3c4d5e6f7080911",
                        "organization_id": "507f1f77bcf86cd799439011",
                        "name": "Antivirus Scan",
                        "description": "Escaneo programado de antivirus",
                        "category": "security",
                        "created_at": "2026-05-15T10:00:00Z",
                        "archived_at": null,
                        "type": "standard",
                        "icon_name": "shield",
                        "icon_background": "#0B5FFF",
                        "context": "organization",
                        "is_ai_enhanced": false,
                        "enabled": true,
                        "enabled_configuration": {
                          "enabled_at": "2026-05-15T10:30:00Z",
                          "efficiency": 95,
                          "workspace_group_execution": "l1",
                          "individual_execution": "l3",
                          "end_user_execution_workspace_group_ids": [
                            "65f0d9f2b3c4d5e6f7080931",
                            "65f0d9f2b3c4d5e6f7080932"
                          ]
                        }
                      }
                    }
                  },
                  "microservicio_no_habilitado": {
                    "summary": "Microservicio encontrado sin configuracion habilitada",
                    "value": {
                      "data": {
                        "id": "65f0d9f2b3c4d5e6f7080912",
                        "organization_id": "507f1f77bcf86cd799439011",
                        "name": "Patch Baseline",
                        "description": "Control de parches pendientes",
                        "category": "maintenance",
                        "created_at": "2026-05-16T12:00:00Z",
                        "archived_at": null,
                        "type": "standard",
                        "icon_name": "patch",
                        "icon_background": "#22A06B",
                        "context": "organization",
                        "is_ai_enhanced": true,
                        "enabled": false,
                        "enabled_configuration": null
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parametros de solicitud invalidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "id_invalido": {
                    "summary": "Identificador de microservicio invalido",
                    "value": {
                      "error": {
                        "message": "Parametro microservice_id invalido",
                        "code": "bad_request"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o sin acceso a la organizacion.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Acceso a organizacion no autorizado",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Microservicio no encontrado en el alcance autorizado de la organizacion.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "microservice_not_found": {
                    "summary": "Microservicio no encontrado",
                    "value": {
                      "error": {
                        "message": "No encontrado",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Error no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/microservices": {
      "get": {
        "tags": [
          "Microservicios"
        ],
        "summary": "Listar microservicios de una organización",
        "operationId": "get_microservices_v1",
        "description": "Devuelve un listado paginado de microservicios visibles para la organización objetivo (propia o delegada según permisos del llamador), enriquecido con el estado de habilitación y su configuración asociada cuando exista. La resolución de habilitación se realiza estrictamente con el organization_id enviado en el path.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organización objetivo sobre la que se consulta el catálogo; la habilitación se verifica contra este mismo identificador.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "default": "es-ES",
              "maxLength": 10
            },
            "description": "Idioma para resolver los campos multilenguaje de la respuesta a un único valor por campo.",
            "example": "es-ES"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 100
            },
            "description": "Cantidad de elementos por página."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Campos de respuesta a incluir, separados por comas."
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Expresión JSON de filtros sobre campos filtrables del recurso.",
            "examples": {
              "simple": {
                "summary": "Filtro simple por nombre",
                "value": "{\"field\":\"name\",\"op\":\"contains\",\"value\":\"backup\"}"
              },
              "complex-and": {
                "summary": "Filtro compuesto con AND",
                "value": "{\"and\":[{\"field\":\"type\",\"op\":\"eq\",\"value\":\"standard\"},{\"field\":\"context\",\"op\":\"eq\",\"value\":\"organization\"}]}"
              },
              "complex-or-and": {
                "summary": "Filtro compuesto con OR y AND",
                "value": "{\"and\":[{\"or\":[{\"field\":\"category\",\"op\":\"eq\",\"value\":\"security\"},{\"field\":\"category\",\"op\":\"eq\",\"value\":\"automation\"}]},{\"field\":\"name\",\"op\":\"contains\",\"value\":\"agent\"}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Microservicios recuperados correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMicroservicesResponseV1"
                },
                "examples": {
                  "resultado_con_datos": {
                    "summary": "Listado con resultados",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "id": "65f0d9f2b3c4d5e6f7080911",
                          "organization_id": "507f1f77bcf86cd799439011",
                          "name": "Antivirus Scan",
                          "description": "Escaneo programado de antivirus",
                          "category": "security",
                          "created_at": "2026-05-15T10:00:00Z",
                          "archived_at": null,
                          "type": "standard",
                          "icon_name": "shield",
                          "icon_background": "#0B5FFF",
                          "context": "organization",
                          "is_ai_enhanced": false,
                          "enabled": true,
                          "enabled_configuration": {
                            "enabled_at": "2026-05-15T10:30:00Z",
                            "efficiency": 95,
                            "workspace_group_execution": "l1",
                            "individual_execution": "l3",
                            "end_user_execution_workspace_group_ids": [
                              "65f0d9f2b3c4d5e6f7080931",
                              "65f0d9f2b3c4d5e6f7080932"
                            ]
                          }
                        },
                        {
                          "id": "65f0d9f2b3c4d5e6f7080912",
                          "organization_id": "507f1f77bcf86cd799439011",
                          "name": "Patch Baseline",
                          "description": "Control de parches pendientes",
                          "category": "maintenance",
                          "created_at": "2026-05-16T12:00:00Z",
                          "archived_at": null,
                          "type": "standard",
                          "icon_name": "patch",
                          "icon_background": "#22A06B",
                          "context": "organization",
                          "is_ai_enhanced": true,
                          "enabled": false,
                          "enabled_configuration": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parámetros de solicitud inválidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "filters_invalido": {
                    "summary": "Formato de filtros inválido",
                    "value": {
                      "error": {
                        "message": "Formato de filtros inválido",
                        "code": "bad_request",
                        "details": "El parámetro filters debe ser una cadena JSON válida."
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o sin acceso a la organización.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Acceso a organización no autorizado",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No se encontró el recurso solicitado dentro del alcance autorizado de la organización.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "resource_not_found": {
                    "summary": "Recurso no encontrado",
                    "value": {
                      "error": {
                        "message": "No encontrado",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Error no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/operations/{operation_id}": {
      "get": {
        "tags": [
          "Operaciones"
        ],
        "summary": "Obtener detalle de una operación",
        "operationId": "get_operation_by_id_v1",
        "description": "Devuelve el detalle público de una operación existente en la organización autorizada.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organización.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "operation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la operación.",
            "example": "64f0c2a1b2d3e4f506070811"
          }
        ],
        "responses": {
          "200": {
            "description": "Operación recuperada correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetOperationByIdResponseV1"
                },
                "examples": {
                  "operation_detail": {
                    "summary": "Detalle de operación",
                    "value": {
                      "id": "64f0c2a1b2d3e4f506070811",
                      "name": "remote_assistance",
                      "description": "Operación de asistencia remota",
                      "status": "finished",
                      "created_at": "2026-03-10T09:11:45Z",
                      "started_at": "2026-03-10T09:12:00Z",
                      "ended_at": "2026-03-10T09:15:17Z",
                      "microservice_id": "64f0c2a1b2d3e4f506070833",
                      "flow_id": "64f0c2a1b2d3e4f506070844",
                      "remote_support": {
                        "start_date": "2026-03-10T09:12:00Z",
                        "end_date": "2026-03-10T09:15:17Z",
                        "type": "unattended"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parámetros de ruta no válidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_identifier": {
                    "summary": "Identificador con formato inválido",
                    "value": {
                      "error": {
                        "message": "El identificador de operación no es válido",
                        "code": "bad_request",
                        "details": "operation_id debe tener 24 caracteres hexadecimales en minúscula."
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o sin acceso a la organización.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Fallo de autorización",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Operación no encontrada en la organización autorizada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not_found": {
                    "summary": "Operación inexistente",
                    "value": {
                      "error": {
                        "message": "Operación no encontrada",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Error inesperado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/operations/{operation_id}/results": {
      "get": {
        "tags": [
          "Operaciones"
        ],
        "summary": "Obtener resultados de una operación",
        "operationId": "get_operation_results_v1",
        "description": "Devuelve resultados paginados de ejecución para una operación dentro de la organización autorizada.",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organización.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "operation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la operación.",
            "example": "64f0c2a1b2d3e4f506070811"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Página a consultar."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 100
            },
            "description": "Número de elementos por página."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Lista separada por comas con campos de respuesta a incluir.",
            "example": "id,workspace_id,status,name,start_date,end_date"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^([a-z_]+):(asc|desc)$"
            },
            "description": "Expresión de ordenación con el formato <field>:asc|desc. En modo agregado, solo acepta campos de `group_by` o aliases agregados (`count`, `<fn>_<field>`).",
            "example": "start_date:desc"
          },
          {
            "name": "aggregate",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 1024
            },
            "description": "Expresión JSON para agregación. Estructura: {\"group_by\":[\"field\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}. No se puede combinar con `fields`.",
            "examples": {
              "group-by-status-count": {
                "summary": "Agrupar por estado y contar",
                "value": "{\"group_by\":[\"status\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}"
              },
              "group-by-status-avg-script-duration": {
                "summary": "Agrupar por estado y calcular promedio",
                "value": "{\"group_by\":[\"status\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"},{\"field\":\"script_duration\",\"fn\":\"avg\"}]}"
              }
            }
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Expresión JSON de filtros sobre campos permitidos.",
            "examples": {
              "simple": {
                "summary": "Filtro simple por nombre de máquina",
                "value": "{\"field\":\"name\",\"op\":\"contains\",\"value\":\"srv\"}"
              },
              "complex-and": {
                "summary": "Filtro compuesto con condiciones AND",
                "value": "{\"and\":[{\"field\":\"status\",\"op\":\"eq\",\"value\":\"completed\"},{\"field\":\"name\",\"op\":\"contains\",\"value\":\"win\"}]}"
              },
              "complex-or-and": {
                "summary": "Filtro compuesto con OR anidado y AND",
                "value": "{\"and\":[{\"or\":[{\"field\":\"status\",\"op\":\"eq\",\"value\":\"error\"},{\"field\":\"status\",\"op\":\"eq\",\"value\":\"timeout\"}]},{\"field\":\"name\",\"op\":\"contains\",\"value\":\"desk\"}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultados recuperados correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetOperationResultsResponseV1"
                },
                "examples": {
                  "results_page": {
                    "summary": "Página de resultados de la operación",
                    "value": {
                      "data": [
                        {
                          "id": "66b5f6d2f8d5a4d8a7f1c101",
                          "operation_id": "64f0c2a1b2d3e4f506070811",
                          "workspace_id": "66b5f6d2f8d5a4d8a7f1c301",
                          "organization_id": "507f1f77bcf86cd799439011",
                          "status": "completed",
                          "name": "ws-001",
                          "start_date": "2026-05-10T10:15:30Z",
                          "end_date": "2026-05-10T10:16:41Z",
                          "script_detail": "Script ejecutado correctamente",
                          "script_duration": 71,
                          "script_response": [
                            {
                              "timestamp": "2026-05-10T10:15:35.100Z",
                              "line": "Linea inicial\nDetalle multilinea"
                            },
                            {
                              "timestamp": "2026-05-10T10:15:37.100Z",
                              "line": "Segundo bloque OUT"
                            }
                          ]
                        }
                      ],
                      "has_next": true
                    }
                  },
                  "aggregated_by_status": {
                    "summary": "Resultado agregado por estado",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "status": "completed",
                          "count": 120,
                          "avg_script_duration": 17.4
                        },
                        {
                          "status": "error",
                          "count": 45,
                          "avg_script_duration": 3.1
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o sin acceso a la organización.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unauthorized": {
                    "summary": "Fallo de autorización",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Operación no encontrada en la organización autorizada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not_found": {
                    "summary": "Operación inexistente",
                    "value": {
                      "error": {
                        "message": "Operación no encontrada",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Error inesperado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/patch-policy-targets": {
      "get": {
        "tags": [
          "Objetivos de política de parches"
        ],
        "summary": "Listar objetivos de política de parches",
        "operationId": "listPatchPolicyTargets",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Elementos por página (predeterminado: 100, máx.: 100)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo de orden opcional (:asc o :desc). Use los nombres de las propiedades de la respuesta. Campos válidos: id, name, create_date, update_date, timezone, should_restart, wake_on_lan, force_patching_configuration, is_in_maintenance, patch_policy_target_type. Ejemplo: \"name:asc\" o \"create_date:desc\""
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista de campos separada por comas para incluir en cada elemento de objetivo de política de parches. Campos seleccionables: id, name, create_user, create_date, update_date, timezone, should_restart, wake_on_lan, force_patching_configuration, is_in_maintenance, weeks, schedule, patch_policy_target_type, patch_policy_id. El campo id siempre se incluye.",
            "example": "name,timezone,patch_policy_id"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Filtre objetivos de política de parches por uno o más criterios. Proporcione un objeto JSON con condiciones de filtro. Puede filtrar por cualquier campo devuelto en la respuesta. Use operadores de comparación (eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between) y combine múltiples condiciones con operadores lógicos (and, or). Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre del objetivo",
                "description": "Devuelve objetivos de política de parches cuyo nombre contiene el texto proporcionado.",
                "value": "{\"field\": \"name\", \"op\": \"contains\", \"value\": \"Base\"}"
              },
              "complex-and": {
                "summary": "Filtrar por tipo de objetivo y comportamiento de reinicio",
                "description": "Devuelve objetivos de Windows que requieren reinicio después del parcheo.",
                "value": "{\"and\": [{\"field\": \"patch_policy_target_type\", \"op\": \"eq\", \"value\": \"windows\"}, {\"field\": \"should_restart\", \"op\": \"eq\", \"value\": true}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con múltiples zonas horarias y excluye objetivos en mantenimiento.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"timezone\", \"op\": \"eq\", \"value\": \"UTC\"}, {\"field\": \"timezone\", \"op\": \"eq\", \"value\": \"America/New_York\"}]}, {\"field\": \"is_in_maintenance\", \"op\": \"eq\", \"value\": false}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de objetivos de política de parches recuperada correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PatchPolicyTargetV1ListResponseV1"
                },
                "examples": {
                  "single-target": {
                    "summary": "Objetivo de política de parches único",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "id": "66ab6cf4d4d2e709bafd404c",
                          "name": "Base",
                          "create_user": "6439606652fc0c0051f1787b",
                          "create_date": "2024-08-01T11:09:40.719Z",
                          "update_date": "2026-01-14T10:16:28.143Z",
                          "timezone": "UTC",
                          "should_restart": true,
                          "wake_on_lan": true,
                          "force_patching_configuration": false,
                          "is_in_maintenance": false,
                          "weeks": [
                            1,
                            2
                          ],
                          "schedule": {
                            "MONDAY": {},
                            "TUESDAY": {},
                            "WEDNESDAY": {},
                            "THURSDAY": {
                              "9": [
                                15,
                                30,
                                45
                              ],
                              "10": [
                                0,
                                15,
                                30,
                                45
                              ],
                              "11": [
                                0,
                                15,
                                30,
                                45
                              ],
                              "12": [
                                0,
                                15,
                                30,
                                45
                              ],
                              "13": [
                                0,
                                15,
                                30,
                                45
                              ],
                              "14": [
                                0,
                                15,
                                30,
                                45
                              ],
                              "15": [
                                0
                              ]
                            },
                            "FRIDAY": {},
                            "SATURDAY": {},
                            "SUNDAY": {}
                          },
                          "patch_policy_target_type": "windows",
                          "patch_policy_id": "507f1f77bcf86cd799439011"
                        }
                      ]
                    }
                  },
                  "multiple-targets": {
                    "summary": "Múltiples objetivos de política de parches",
                    "value": {
                      "has_next": true,
                      "data": [
                        {
                          "id": "66ab6cf4d4d2e709bafd404c",
                          "name": "Base",
                          "create_user": "6439606652fc0c0051f1787b",
                          "create_date": "2024-08-01T11:09:40.719Z",
                          "update_date": "2026-01-14T10:16:28.143Z",
                          "timezone": "UTC",
                          "should_restart": true,
                          "wake_on_lan": true,
                          "force_patching_configuration": false,
                          "is_in_maintenance": false,
                          "weeks": [
                            1,
                            2
                          ],
                          "schedule": {
                            "MONDAY": {},
                            "TUESDAY": {},
                            "WEDNESDAY": {},
                            "THURSDAY": {
                              "9": [
                                15,
                                30,
                                45
                              ],
                              "10": [
                                0,
                                15,
                                30,
                                45
                              ]
                            },
                            "FRIDAY": {},
                            "SATURDAY": {},
                            "SUNDAY": {}
                          },
                          "patch_policy_target_type": "windows",
                          "patch_policy_id": "507f1f77bcf86cd799439011"
                        },
                        {
                          "id": "66ab6cf4d4d2e709bafd404d",
                          "name": "Linux Base",
                          "create_user": "6439606652fc0c0051f1787b",
                          "create_date": "2024-08-02T10:00:00.000Z",
                          "update_date": "2024-08-02T10:00:00.000Z",
                          "timezone": "America/New_York",
                          "should_restart": false,
                          "wake_on_lan": false,
                          "force_patching_configuration": true,
                          "is_in_maintenance": false,
                          "weeks": [
                            1
                          ],
                          "schedule": {
                            "MONDAY": {
                              "8": [
                                0,
                                30
                              ]
                            },
                            "TUESDAY": {},
                            "WEDNESDAY": {},
                            "THURSDAY": {},
                            "FRIDAY": {},
                            "SATURDAY": {},
                            "SUNDAY": {}
                          },
                          "patch_policy_target_type": "linux",
                          "patch_policy_id": "507f1f77bcf86cd799439012"
                        }
                      ]
                    }
                  },
                  "empty-list": {
                    "summary": "Lista vacía cuando no existen objetivos",
                    "value": {
                      "has_next": false,
                      "data": []
                    }
                  },
                  "no-patch-policy": {
                    "summary": "Objetivo sin política de parches asignada",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "id": "66ab6cf4d4d2e709bafd404c",
                          "name": "Base",
                          "create_user": "6439606652fc0c0051f1787b",
                          "create_date": "2024-08-01T11:09:40.719Z",
                          "update_date": "2026-01-14T10:16:28.143Z",
                          "timezone": "UTC",
                          "should_restart": true,
                          "wake_on_lan": true,
                          "force_patching_configuration": false,
                          "is_in_maintenance": false,
                          "weeks": [
                            1,
                            2
                          ],
                          "schedule": {
                            "MONDAY": {},
                            "TUESDAY": {},
                            "WEDNESDAY": {},
                            "THURSDAY": {},
                            "FRIDAY": {},
                            "SATURDAY": {},
                            "SUNDAY": {}
                          },
                          "patch_policy_target_type": null,
                          "patch_policy_id": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Paginación, ordenación o filtros no válidos."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: el usuario no tiene acceso a la organización, o la organización no existe"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de objetivos de política de parches para una organización. Admite paginación, ordenación y filtrado mediante una cadena de filtros JSON. Los objetivos de política de parches definen cuándo y cómo se aplican los parches a los Workspaces."
      }
    },
    "/v1/organizations/{organization_id}/product-configs": {
      "get": {
        "tags": [
          "Configuraciones de producto"
        ],
        "summary": "Listar configuraciones de producto",
        "operationId": "listProductConfigs",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Elementos por página (predeterminado: 100, máximo: 100)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo de orden opcional (:asc o :desc). Usa los nombres de propiedades de la respuesta. Campos válidos: id, environment, create_date, active, product_id, region. Ejemplo: \"product_id:asc\" o \"create_date:desc\""
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista separada por comas de campos para incluir en cada elemento de configuración de producto. Campos seleccionables: id, environment, create_date, active, product_id, region. El campo id siempre se incluye.",
            "example": "environment,active,region"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Filtra configuraciones de producto por uno o más criterios. Proporciona un objeto JSON con condiciones de filtro. Puedes filtrar por cualquier campo devuelto en la respuesta. Usa operadores de comparación (eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between) y combina múltiples condiciones con operadores lógicos (and, or). Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtrar por entorno",
                "description": "Devuelve configuraciones de producto para un único entorno.",
                "value": "{\"field\": \"environment\", \"op\": \"eq\", \"value\": \"PRODUCTION\"}"
              },
              "complex-and": {
                "summary": "Filtrar por estado y región",
                "description": "Devuelve configuraciones de producto activas en una región específica.",
                "value": "{\"and\": [{\"field\": \"active\", \"op\": \"eq\", \"value\": true}, {\"field\": \"region\", \"op\": \"eq\", \"value\": \"us-east\"}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con múltiples entornos y restringe por producto.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"environment\", \"op\": \"eq\", \"value\": \"PRODUCTION\"}, {\"field\": \"environment\", \"op\": \"eq\", \"value\": \"STAGING\"}]}, {\"field\": \"product_id\", \"op\": \"eq\", \"value\": \"507f1f77bcf86cd799439001\"}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de configuraciones de producto recuperada correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductConfigV1ListResponseV1"
                },
                "examples": {
                  "single-config": {
                    "summary": "Configuración de producto única",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "id": "507f1f77bcf86cd799439011",
                          "environment": "PRODUCTION",
                          "create_date": "2024-01-15T10:30:00.000Z",
                          "active": true,
                          "product_id": "507f1f77bcf86cd799439001",
                          "region": "us-east"
                        }
                      ]
                    }
                  },
                  "multiple-configs": {
                    "summary": "Múltiples configuraciones de producto",
                    "value": {
                      "has_next": true,
                      "data": [
                        {
                          "id": "507f1f77bcf86cd799439011",
                          "environment": "PRODUCTION",
                          "create_date": "2024-01-15T10:30:00.000Z",
                          "active": true,
                          "product_id": "507f1f77bcf86cd799439001",
                          "region": "us-east"
                        },
                        {
                          "id": "507f1f77bcf86cd799439012",
                          "environment": "STAGING",
                          "create_date": "2024-01-20T14:45:00.000Z",
                          "active": false,
                          "product_id": "507f1f77bcf86cd799439001",
                          "region": null
                        }
                      ]
                    }
                  },
                  "empty-list": {
                    "summary": "Lista vacía cuando no existen configuraciones",
                    "value": {
                      "has_next": false,
                      "data": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Paginación, ordenamiento o filtros inválidos."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: el usuario no tiene acceso a la organización o la organización no existe"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de configuraciones de producto para la organización especificada. Devuelve un arreglo de objetos de configuración de producto que contiene detalles de configuración, incluidos entorno, estado, información del producto y región. Admite paginación, ordenamiento y filtrado mediante una cadena de filtro JSON."
      }
    },
    "/v1/organizations/{organization_id}/sessions/{session_id}": {
      "get": {
        "tags": [
          "Sesiones"
        ],
        "summary": "Recuperar una sesión",
        "operationId": "get_session_by_id",
        "description": "Devuelve detalles centrados en la sesión solicitada dentro del alcance de una organización.",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organizacion.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$",
              "minLength": 36,
              "maxLength": 36
            },
            "description": "Identificador de la sesion.",
            "example": "550E8400-E29B-41D4-A716-446655440000"
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles de la sesion recuperados correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSessionByIdResponseV1"
                },
                "examples": {
                  "session_details": {
                    "summary": "Respuesta de detalle de la sesion",
                    "value": {
                      "id": "550E8400-E29B-41D4-A716-446655440000",
                      "user_name": "contoso\\jdoe",
                      "session_type": "vdi_desktop",
                      "windows_session_id": 7,
                      "connection_state": "active",
                      "start_date": "2026-03-15T08:30:00Z",
                      "session_status": "active_notifications",
                      "platform_type": "windows",
                      "connected": true,
                      "current_session_id": 41,
                      "current_dc_name": "dc-eu-01",
                      "last_connection_time": "2026-03-15T09:45:11Z",
                      "log_on_duration": 35,
                      "session_key": "6BA7B810-9DAD-11D1-80B4-00C04FD430C8",
                      "flexx_analyzer_executed": true,
                      "cpu_usage": 34.2,
                      "ram_usage_gb": 3.8,
                      "rtt_usage": 18.1,
                      "current_uid_usage": 2.4,
                      "ram_usage": 3891,
                      "ram_percentage": 47,
                      "number_alerts_user": 0,
                      "number_alerts_vm": 1,
                      "workspace_id": "64f0c2a1b2d3e4f5060708aa"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parametros de solicitud no validos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_session_id": {
                    "summary": "Formato de identificador de sesion no valido",
                    "value": {
                      "error": {
                        "message": "Formato de session_id no valido",
                        "code": "bad_request",
                        "details": "session_id debe ser un UUID en mayusculas con formato 8-4-4-4-12"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o la organizacion no es accesible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Fallo de acceso a la organizacion",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Sesion no encontrada dentro del alcance autorizado de la organizacion.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "session_not_found": {
                    "summary": "La sesion solicitada no fue encontrada",
                    "value": {
                      "error": {
                        "message": "Sesion no encontrada",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Fallo no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/sessions": {
      "get": {
        "tags": [
          "Sesiones"
        ],
        "summary": "Listar sesiones",
        "operationId": "get_sessions",
        "description": "Devuelve una lista paginada de sesiones de la organización.",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{24}$",
              "minLength": 24,
              "maxLength": 24
            },
            "description": "Identificador de la organización.",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            },
            "description": "Número de página."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 100
            },
            "description": "Número de elementos por página."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Nombres de campos de elementos de respuesta separados por comas."
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Expresión de filtro JSON sobre rutas de campos de respuesta filtrables.",
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre de usuario",
                "value": "{\"field\":\"user_name\",\"op\":\"contains\",\"value\":\"jdoe\"}"
              },
              "complex-and": {
                "summary": "Filtrar por estado y estado de conexión",
                "value": "{\"and\":[{\"field\":\"session_status\",\"op\":\"eq\",\"value\":\"active\"},{\"field\":\"connection_state\",\"op\":\"eq\",\"value\":\"active\"}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "value": "{\"and\":[{\"or\":[{\"field\":\"connection_state\",\"op\":\"eq\",\"value\":\"active\"},{\"field\":\"connection_state\",\"op\":\"eq\",\"value\":\"disconnected\"}]},{\"field\":\"current_dc_name\",\"op\":\"contains\",\"value\":\"dc-eu\"}]}"
              }
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^([a-z_]+):(asc|desc)$"
            },
            "description": "Expresión de ordenación con el formato <field>:asc|desc. En modo agregado, solo acepta campos de `group_by` o aliases agregados (`count`, `<fn>_<field>`)."
          },
          {
            "name": "aggregate",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 1024
            },
            "description": "Expresión JSON para agregación. Estructura: {\"group_by\":[\"field\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}. No se puede combinar con `fields`.",
            "examples": {
              "group-by-connection-state-count": {
                "summary": "Agrupar por estado de conexión y contar",
                "value": "{\"group_by\":[\"connection_state\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}"
              },
              "group-by-platform-avg-cpu": {
                "summary": "Agrupar por plataforma y calcular promedio",
                "value": "{\"group_by\":[\"platform_type\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"},{\"field\":\"cpu_usage\",\"fn\":\"avg\"}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sesiones recuperadas correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSessionsResponseV1"
                },
                "examples": {
                  "paginated_result": {
                    "summary": "Lista paginada con sesiones",
                    "value": {
                      "has_next": true,
                      "data": [
                        {
                          "id": "550E8400-E29B-41D4-A716-446655440000",
                          "user_name": "contoso\\jdoe",
                          "session_type": "vdi_desktop",
                          "windows_session_id": 7,
                          "connection_state": "active",
                          "start_date": "2026-03-15T08:30:00Z",
                          "cpu_usage": 34.2,
                          "ram_usage_gb": 3.8,
                          "rtt_usage": 18.1,
                          "session_status": "active",
                          "platform_type": "windows",
                          "connected": true,
                          "current_session_id": 41,
                          "current_dc_name": "dc-eu-01",
                          "current_uid_usage": 2.4,
                          "flexx_analyzer_executed": false,
                          "last_connection_time": "2026-03-15T09:45:11Z",
                          "log_on_duration": 35,
                          "number_alerts_user": 0,
                          "number_alerts_vm": 1,
                          "ram_usage": 3891,
                          "ram_percentage": 47,
                          "session_key": "6BA7B810-9DAD-11D1-80B4-00C04FD430C8",
                          "workspace_id": "64f0c2a1b2d3e4f5060708aa",
                          "organization_id": "507f1f77bcf86cd799439011"
                        }
                      ]
                    }
                  },
                  "empty_result": {
                    "summary": "No se encontraron sesiones",
                    "value": {
                      "has_next": false,
                      "data": []
                    }
                  },
                  "aggregated_by_connection_state": {
                    "summary": "Resultado agregado por estado de conexión",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "connection_state": "active",
                          "count": 120,
                          "avg_cpu_usage": 17.4
                        },
                        {
                          "connection_state": "disconnected",
                          "count": 45,
                          "avg_cpu_usage": 3.1
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parámetros de solicitud inválidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid_filters": {
                    "summary": "Formato de filtros inválido",
                    "value": {
                      "error": {
                        "message": "Formato de filtros inválido",
                        "code": "bad_request",
                        "details": "filters debe ser una cadena JSON válida"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "No autorizado o la organización no es accesible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "organization_not_authorized": {
                    "summary": "Fallo de acceso a la organización",
                    "value": {
                      "error": {
                        "message": "No autorizado",
                        "code": "unauthorized"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No se encontró el recurso solicitado dentro del alcance autorizado de la organización.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "resource_not_found": {
                    "summary": "No se encontró el recurso solicitado",
                    "value": {
                      "error": {
                        "message": "No encontrado",
                        "code": "not_found"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno del servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unexpected_error": {
                    "summary": "Fallo no controlado",
                    "value": {
                      "error": {
                        "message": "Error interno del servidor",
                        "code": "internal_error"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/organizations/{organization_id}/workspaces/{workspace_id}": {
      "get": {
        "tags": [
          "Workspaces"
        ],
        "summary": "Recuperar un workspace",
        "operationId": "getWorkspaceById",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del Workspace",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "200": {
            "description": "Detalles del Workspace recuperados correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspacePublicV1"
                },
                "examples": {
                  "workspace-details": {
                    "summary": "Informacion detallada del Workspace",
                    "value": {
                      "id": "22f5381aa25e89b73785ca34",
                      "organization_id": "155f78b81155f8ab327ef274",
                      "name": "SDI04-001.org.terravex.net",
                      "related_environment": "1437d381972ce53252aabe72f053af7c",
                      "operating_system": "Microsoft Windows Server 2022 Standard 21H2",
                      "serial_number": "40a70e53327456131ae3321135531ae87f655cbeab27f01134c7ef366a7f2402",
                      "ip_address": "172.30.113.115",
                      "os_update_num_pending": 5,
                      "reporting_group_id": "65f83219942714fc24f01435",
                      "flxmid": "50a70e53327456131ae5921135531ae87f639cbe5b27f09034c7ef366a7f2402",
                      "os_update_num_days_since_last": 183,
                      "total_ram": 8191,
                      "altitude": 0,
                      "antivirus": "Windows Defender",
                      "antivirus_status": "installed_working",
                      "bios_manufacturer": "VMware, Inc.",
                      "bios_mode": "UEFI",
                      "bios_version": "P79 Ver. 6.00",
                      "bios_smbversion": "2.7",
                      "bios_serialnumber": "VMware-42 06 fd 7c 3a f4 af 1c-97 07 56 e2 07 67 d7 23",
                      "base_board_manufacturer": "Intel Corporation",
                      "base_board_product": "440BX Desktop Reference Platform",
                      "base_board_version": "A30",
                      "broker": "citrix_on-premises",
                      "public_ip_city": "Barcelona",
                      "flexxagent_version": "25.9.1.0",
                      "compliance_result": "not_evaluated",
                      "compliance_last_execution": "2025-06-12T06:13:17.17Z",
                      "domain_name": "org.terravex.net",
                      "public_ip_country": "ES",
                      "cores_count": "4",
                      "edr_active_detections": false,
                      "edr_host_id": "11bbcc1e6e2c440aa8b7522a78a292ad",
                      "edr_status": "installed_working",
                      "edr_version": "7.05.17706.0",
                      "current_subnet": "172.30.213.0/24",
                      "default_gateway": "172.30.213.1",
                      "device_kind": "virtual",
                      "edr": "CrowdStrike",
                      "ema_agent_version": "",
                      "ema_endpoint_id": "",
                      "embedded_controller_version": "255.255",
                      "os_fast_startup": false,
                      "flexxanalyzer_config": "configured",
                      "flexxanalyzer_version": "3.0.2",
                      "hypervisor": "vmware_vsphere",
                      "ip_version": "IPv4",
                      "public_ip_isp": "Cloudflare, Inc.",
                      "iot_hub_config_sync_status": "synced",
                      "is_amt_supported": false,
                      "is_laptop": false,
                      "is_physical": false,
                      "last_boot_duration": 20,
                      "last_restart_time": null,
                      "last_time": "2025-06-12T06:13:17.17Z",
                      "last_windows_update": "2025-09-18T00:00:00.00Z",
                      "last_autorepair": "2025-06-10T10:00:00.00Z",
                      "latitude": 0,
                      "locale": "English (United States)",
                      "longitude": 0,
                      "mac_address": "10-52-56-36-21-42",
                      "network_interface_type": "unknown",
                      "os_build_number": "6.3.20348.4171",
                      "os_manufacturer": "Microsoft Corporation",
                      "os_version": "10.0.20348.20348",
                      "ou": "OU=NonPersistent,OU=Workstations,OU=OPS914,DC=ops914,DC=terravex,DC=net",
                      "os_page_file": "C:\\pagefile.sys",
                      "os_page_file_space": 512,
                      "platform_role": "Desktop",
                      "platform_type": "windows",
                      "processor": "Intel(R) Xeon(R) Gold 6348 CPU @ 2.60GHz, 4 Core(s), 4 Logical Processors",
                      "public_ip": "19.27.129.141",
                      "os_reboot_pending": false,
                      "secure_boot_state": "On",
                      "system_model": "VMware7,1",
                      "system_type": "x64-based PC",
                      "os_time_zone": "Romance Standard Time",
                      "user_name": "Domain\\user001",
                      "vm_type": "workspace",
                      "windows_type": "server",
                      "create_date": "2023-12-18T11:26:11.11Z",
                      "last_deregistration_time": "2026-01-19T12:26:25.25Z",
                      "encrypted_harddisks": "partial",
                      "custom_field_01": "testVal1",
                      "custom_field_02": "testVal2",
                      "custom_field_03": "4",
                      "custom_field_04": "",
                      "custom_field_05": "",
                      "custom_field_06": "",
                      "custom_field_07": "",
                      "custom_field_08": "",
                      "custom_field_09": "",
                      "custom_field_10": "",
                      "flexxagent_type": "unified",
                      "antivirus_version_number": "4.18.2104.5",
                      "related_location": "C08D2228-E80A-4ADA-A75F-03E33E71D119",
                      "area": "Development",
                      "custom_field_11": "",
                      "custom_field_12": "",
                      "custom_field_13": "",
                      "custom_field_14": "",
                      "custom_field_15": "",
                      "custom_field_16": "",
                      "custom_field_17": "",
                      "custom_field_18": "",
                      "custom_field_19": "",
                      "custom_field_20": "",
                      "department": "Department",
                      "office": "Office",
                      "last_custom_fields_update": "2025-12-24T11:24:51.51Z",
                      "workspace_id": "6676aa0c1e9c850250a70e53327456131ae59211aa531ae87f639cbe5b27f09034c7e3366a7f2402",
                      "flexxanalyzer_proxy_uri": "",
                      "iot_hub_name": "idIot0e33d84fe5761e",
                      "flexxagent_status": "stopped",
                      "boot_hard_disk_used_percentage": 34,
                      "last_connection_time": "2025-06-12T06:13:17.17Z",
                      "network_signal": 0,
                      "num_alerts": 0,
                      "percent_cpu": 17,
                      "percent_ram": 0,
                      "power_state": "off",
                      "sessions_count": 0,
                      "used_system_disk_c": 34,
                      "wake_on_lan_mac": "10-50-56-56-51-12",
                      "wake_on_lan_subnet": "172.30.213.0/24",
                      "broker_status": "disconnected",
                      "status": "online"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta: el formato del ID de Workspace no es válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: autenticación requerida"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Workspace no encontrado"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera información detallada sobre un Workspace específico."
      }
    },
    "/v1/organizations/{organization_id}/workspace-groups/{workspace_group_id}/workspaces": {
      "get": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Listar workspaces",
        "operationId": "listWorkspaceGroupsWorkspaces",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Elementos por página (predeterminado: 100, máx.: 100)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Campo de ordenación con sufijo de orden opcional (:asc o :desc). Usa nombres de propiedades de la respuesta: id, organization_id, name, related_environment, operative_system, ip_address, type, last_user, total_ram."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista separada por comas de campos para incluir en cada elemento Workspace. Campos seleccionables: id, organization_id, name, related_environment, operative_system, ip_address, type, last_user, total_ram. El campo id siempre se incluye.",
            "example": "name,operative_system,total_ram"
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120,
              "description": "Cadena JSON con condiciones de filtro. Usa nombres de propiedades de la respuesta para los campos. Operadores: eq, ne, in, nin, gt, gte, lt, lte, contains, startsWith, endsWith, between. Combina con and/or."
            },
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre de Workspace",
                "description": "Devuelve Workspaces cuyo nombre contiene el texto proporcionado.",
                "value": "{\"field\": \"name\", \"op\": \"contains\", \"value\": \"desktop\"}"
              },
              "complex-and": {
                "summary": "Filtrar por sistema operativo y RAM",
                "description": "Devuelve Workspaces con Windows y al menos 8 GB de RAM.",
                "value": "{\"and\": [{\"field\": \"operative_system\", \"op\": \"contains\", \"value\": \"Windows\"}, {\"field\": \"total_ram\", \"op\": \"gte\", \"value\": 8192}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con dos prefijos de subred y aplica un umbral de memoria.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"ip_address\", \"op\": \"startsWith\", \"value\": \"172.\"}, {\"field\": \"ip_address\", \"op\": \"startsWith\", \"value\": \"10.\"}]}, {\"field\": \"total_ram\", \"op\": \"gt\", \"value\": 4096}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de Workspaces del grupo de workspaces recuperada correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceGroupWorkspaceListResponseV1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Paginación, ordenación o filtros no válidos."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces no encontrado o no pertenece a la organización"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de Workspaces que pertenecen al grupo de workspaces especificado. Admite paginación, ordenación y filtrado mediante una cadena de filtros JSON. La respuesta incluye un conjunto reducido de campos de Workspace."
      },
      "put": {
        "tags": [
          "Grupos de workspaces"
        ],
        "summary": "Establecer o actualizar workspaces",
        "operationId": "updateWorkspaceGroupsWorkspace",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer usado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "workspace_group_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único del grupo de workspaces",
            "example": "507f1f77bcf86cd799439020"
          }
        ],
        "responses": {
          "204": {
            "description": "Workspaces actualizados correctamente en el grupo de workspaces. No se devuelve contenido."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Causas comunes: - Estructura del cuerpo de la solicitud no válida - Formato de ID de Workspace no válido"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado: autenticación requerida"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Grupo de workspaces no encontrado o no perteneciente a la organización"
          },
          "422": {
            "description": "Entidad no procesable. Causas comunes: - Los IDs de Workspace no existen - Los Workspaces no pertenecen a la organización - IDs de Workspace no válidos",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkspacesUpdateRequestV1"
              },
              "examples": {
                "set-workspaces-in-group": {
                  "summary": "Establecer multiples Workspaces en un grupo de workspaces",
                  "value": {
                    "workspace_ids": [
                      "507f1f77bcf86cd799439030",
                      "507f1f77bcf86cd799439031"
                    ]
                  }
                },
                "remove-all-workspaces": {
                  "summary": "Eliminar todos los Workspaces del grupo de workspaces proporcionando un arreglo vacio",
                  "value": {
                    "workspace_ids": []
                  }
                },
                "set-single-workspace": {
                  "summary": "Establecer un solo Workspace en un grupo de workspaces",
                  "value": {
                    "workspace_ids": [
                      "507f1f77bcf86cd799439030"
                    ]
                  }
                }
              }
            }
          }
        },
        "description": "Establece o reemplaza todos los Workspaces en el grupo de workspaces especificado con la lista proporcionada. Esta es una operación de reemplazo, no una actualización incremental: todos los Workspaces existentes se reemplazan. No devuelve contenido (204) tras una actualización exitosa."
      }
    },
    "/v1/organizations/{organization_id}/workspaces": {
      "get": {
        "tags": [
          "Workspaces"
        ],
        "summary": "Listar workspaces",
        "operationId": "listWorkspaces",
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de acceso Bearer utilizado para autorizar la solicitud.",
            "example": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
          },
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "El identificador único de la organización",
            "example": "507f1f77bcf86cd799439011"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 1
            },
            "description": "Número de página (predeterminado: 1)"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 100,
              "minimum": 1
            },
            "description": "Elementos por página (predeterminado: 100, max.: 100)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^([a-z_]+):(asc|desc)$"
            },
            "description": "Expresión de ordenación con el formato <field>:asc|desc. En modo agregado, solo acepta campos de `group_by` o aliases agregados (`count`, `<fn>_<field>`)."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 2048
            },
            "description": "Lista separada por comas de campos de respuesta a incluir.",
            "example": "name,user_name,operating_system"
          },
          {
            "name": "aggregate",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 1024
            },
            "description": "Agrupa y calcula agregaciones sobre Workspaces. Debe enviarse como cadena JSON con `group_by` (array de campos de contrato) y `fns` (array de objetos `{ field, fn }`). `field` puede ser `\"*\"` solo cuando `fn` es `\"count\"`. Valores permitidos para `fn`: `count`, `sum`, `avg`, `min`, `max`. El parámetro `aggregate` no puede combinarse con `fields`. En modo agregado, `sort` solo puede ordenar por campos de `group_by` o por salidas agregadas (`count`, `fn_campo`).",
            "examples": {
              "simple": {
                "summary": "Agrupar por estado y contar",
                "value": "{\"group_by\":[\"status\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"}]}"
              },
              "with-average": {
                "summary": "Agrupar por plataforma y calcular promedio",
                "value": "{\"group_by\":[\"platform_type\"],\"fns\":[{\"field\":\"*\",\"fn\":\"count\"},{\"field\":\"percent_cpu\",\"fn\":\"avg\"}]}"
              }
            }
          },
          {
            "name": "filters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 5120
            },
            "description": "Filtre Workspaces por uno o más criterios. Proporcione un objeto JSON con condiciones de filtro. Puede filtrar por cualquier campo devuelto en la respuesta; use los mismos nombres de campo y las mismas formas de valor que en la respuesta. Use operadores de comparación (eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith, between) y combine múltiples condiciones con operadores lógicos (and, or). Longitud máxima: 5120 caracteres.",
            "examples": {
              "simple": {
                "summary": "Filtrar por nombre de Workspace",
                "description": "Devuelve Workspaces cuyo nombre contiene el texto proporcionado.",
                "value": "{\"field\": \"name\", \"op\": \"contains\", \"value\": \"sdi\"}"
              },
              "complex-and": {
                "summary": "Filtrar por plataforma y estado de energia",
                "description": "Devuelve solo Workspaces que coinciden con ambas condiciones.",
                "value": "{\"and\": [{\"field\": \"platform_type\", \"op\": \"eq\", \"value\": \"windows\"}, {\"field\": \"power_state\", \"op\": \"eq\", \"value\": \"on\"}]}"
              },
              "complex-or-and": {
                "summary": "Combinar condiciones OR y AND",
                "description": "Coincide con alternativas de broker y requiere un estado de EDR saludable.",
                "value": "{\"and\": [{\"or\": [{\"field\": \"broker\", \"op\": \"eq\", \"value\": \"citrix_on-premises\"}, {\"field\": \"broker\", \"op\": \"eq\", \"value\": \"azure_virtual_desktop\"}]}, {\"field\": \"edr_status\", \"op\": \"eq\", \"value\": \"installed_working\"}]}"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista paginada de Workspaces recuperada correctamente.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceListResponseV1"
                },
                "examples": {
                  "workspace-list": {
                    "summary": "Lista paginada con un Workspace",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "id": "22f5381aa25e89b73785ca34",
                          "organization_id": "155f78b81155f8ab327ef274",
                          "name": "SDI04-001.org.terravex.net",
                          "related_environment": "1437d381972ce53252aabe72f053af7c",
                          "operating_system": "Microsoft Windows Server 2022 Standard 21H2",
                          "serial_number": "40a70e53327456131ae3321135531ae87f655cbeab27f01134c7ef366a7f2402",
                          "ip_address": "172.30.113.115",
                          "os_update_num_pending": 5,
                          "reporting_group_id": "65f83219942714fc24f01435",
                          "flxmid": "50a70e53327456131ae5921135531ae87f639cbe5b27f09034c7ef366a7f2402",
                          "os_update_num_days_since_last": 183,
                          "total_ram": 8191,
                          "altitude": 0,
                          "antivirus": "Windows Defender",
                          "antivirus_status": "installed_working",
                          "bios_manufacturer": "VMware, Inc.",
                          "bios_mode": "UEFI",
                          "bios_version": "P79 Ver. 6.00",
                          "bios_smbversion": "2.7",
                          "bios_serialnumber": "VMware-42 06 fd 7c 3a f4 af 1c-97 07 56 e2 07 67 d7 23",
                          "base_board_manufacturer": "Intel Corporation",
                          "base_board_product": "440BX Desktop Reference Platform",
                          "base_board_version": "A30",
                          "broker": "citrix_on-premises",
                          "public_ip_city": "Barcelona",
                          "flexxagent_version": "25.9.1.0",
                          "compliance_result": "not_evaluated",
                          "compliance_last_execution": "2025-06-12T06:13:17.17Z",
                          "domain_name": "org.terravex.net",
                          "public_ip_country": "ES",
                          "cores_count": "4",
                          "edr_active_detections": false,
                          "edr_host_id": "11bbcc1e6e2c440aa8b7522a78a292ad",
                          "edr_status": "installed_working",
                          "edr_version": "7.05.17706.0",
                          "current_subnet": "172.30.213.0/24",
                          "default_gateway": "172.30.213.1",
                          "device_kind": "virtual",
                          "edr": "CrowdStrike",
                          "ema_agent_version": "",
                          "ema_endpoint_id": "",
                          "embedded_controller_version": "255.255",
                          "os_fast_startup": false,
                          "flexxanalyzer_config": "configured",
                          "flexxanalyzer_version": "3.0.2",
                          "hypervisor": "vmware_vsphere",
                          "ip_version": "IPv4",
                          "public_ip_isp": "Cloudflare, Inc.",
                          "iot_hub_config_sync_status": "synced",
                          "is_amt_supported": false,
                          "is_laptop": false,
                          "is_physical": false,
                          "last_boot_duration": 20,
                          "last_restart_time": null,
                          "last_time": "2025-06-12T06:13:17.17Z",
                          "last_windows_update": "2025-09-18T00:00:00.00Z",
                          "last_autorepair": "2025-06-10T10:00:00.00Z",
                          "latitude": 0,
                          "locale": "English (United States)",
                          "longitude": 0,
                          "mac_address": "10-52-56-36-21-42",
                          "network_interface_type": "unknown",
                          "os_build_number": "6.3.20348.4171",
                          "os_manufacturer": "Microsoft Corporation",
                          "os_version": "10.0.20348.20348",
                          "ou": "OU=NonPersistent,OU=Workstations,OU=OPS914,DC=ops914,DC=terravex,DC=net",
                          "os_page_file": "C:\\pagefile.sys",
                          "os_page_file_space": 512,
                          "platform_role": "Desktop",
                          "platform_type": "windows",
                          "processor": "Intel(R) Xeon(R) Gold 6348 CPU @ 2.60GHz, 4 Core(s), 4 Logical Processors",
                          "public_ip": "19.27.129.141",
                          "os_reboot_pending": false,
                          "secure_boot_state": "On",
                          "system_model": "VMware7,1",
                          "system_type": "x64-based PC",
                          "os_time_zone": "Romance Standard Time",
                          "user_name": "Domain\\user001",
                          "vm_type": "workspace",
                          "windows_type": "server",
                          "create_date": "2023-12-18T11:26:11.11Z",
                          "last_deregistration_time": "2026-01-19T12:26:25.25Z",
                          "encrypted_harddisks": "partial",
                          "custom_field_01": "testVal1",
                          "custom_field_02": "testVal2",
                          "custom_field_03": "4",
                          "custom_field_04": "",
                          "custom_field_05": "",
                          "custom_field_06": "",
                          "custom_field_07": "",
                          "custom_field_08": "",
                          "custom_field_09": "",
                          "custom_field_10": "",
                          "flexxagent_type": "unified",
                          "antivirus_version_number": "4.18.2104.5",
                          "related_location": "C08D2228-E80A-4ADA-A75F-03E33E71D119",
                          "area": "Development",
                          "custom_field_11": "",
                          "custom_field_12": "",
                          "custom_field_13": "",
                          "custom_field_14": "",
                          "custom_field_15": "",
                          "custom_field_16": "",
                          "custom_field_17": "",
                          "custom_field_18": "",
                          "custom_field_19": "",
                          "custom_field_20": "",
                          "department": "Department",
                          "office": "Office",
                          "last_custom_fields_update": "2025-12-24T11:24:51.51Z",
                          "workspace_id": "6676aa0c1e9c850250a70e53327456131ae59211aa531ae87f639cbe5b27f09034c7e3366a7f2402",
                          "flexxanalyzer_proxy_uri": "",
                          "iot_hub_name": "idIot0e33d84fe5761e",
                          "flexxagent_status": "stopped",
                          "boot_hard_disk_used_percentage": 34,
                          "last_connection_time": "2025-06-12T06:13:17.17Z",
                          "network_signal": 0,
                          "num_alerts": 0,
                          "percent_cpu": 17,
                          "percent_ram": 0,
                          "power_state": "off",
                          "sessions_count": 0,
                          "used_system_disk_c": 34,
                          "wake_on_lan_mac": "10-50-56-56-51-12",
                          "wake_on_lan_subnet": "172.30.213.0/24",
                          "broker_status": "disconnected",
                          "status": "offline"
                        }
                      ]
                    }
                  },
                  "workspace-aggregate": {
                    "summary": "Resultado agregado por estado",
                    "value": {
                      "has_next": false,
                      "data": [
                        {
                          "status": "online",
                          "count": 120,
                          "avg_percent_cpu": 17.4
                        },
                        {
                          "status": "offline",
                          "count": 45,
                          "avg_percent_cpu": 3.1
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest",
            "description": "Solicitud incorrecta. Paginación, ordenación o filtros no válidos."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized",
            "description": "No autorizado - se requiere autenticación"
          },
          "404": {
            "$ref": "#/components/responses/NotFound",
            "description": "Organización no encontrada"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        },
        "description": "Recupera una lista paginada de Workspaces. Admite paginación, ordenación y filtrado mediante una cadena de filtro JSON."
      }
    }
  },
  "components": {
    "schemas": {
      "CreatedEntityResponse": {
        "type": "object",
        "description": "Cuerpo de respuesta para una creación exitosa (201). Contiene el id de la entidad creada.",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "El id de la entidad creada.",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "example": "507f1f77bcf86cd799439011"
          }
        }
      },
      "MultilangField": {
        "type": "object",
        "description": "Campo multilenguaje. Las claves son códigos de idioma (en-EN, es-ES, pt-BR, eu-ES, ca-ES). Debe haber al menos una clave. Cada valor debe tener entre 1 y 512 caracteres.",
        "properties": {
          "en-EN": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "es-ES": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "pt-BR": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "eu-ES": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "ca-ES": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          }
        },
        "additionalProperties": false
      },
      "CreateFlowV1Request": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/components/schemas/MultilangField",
            "description": "Nombre del flujo. Se requiere al menos una clave de idioma; cada valor debe tener entre 1 y 512 caracteres."
          },
          "description": {
            "$ref": "#/components/schemas/MultilangField",
            "description": "Descripción del flujo. Se requiere al menos una clave de idioma; cada valor debe tener entre 1 y 512 caracteres."
          },
          "type": {
            "type": "string",
            "enum": [
              "session",
              "workspace"
            ]
          },
          "detection_only": {
            "type": "boolean"
          },
          "cooldown_minutes": {
            "type": "number",
            "minimum": 10,
            "maximum": 1440,
            "description": "Tiempo de espera en minutos. Debe estar entre 10 y 1440."
          },
          "enabled": {
            "type": "boolean",
            "default": false,
            "description": "Si es true, el flujo queda habilitado tras su creación (requiere condiciones, microservicio y objetivo válidos). Si se omite o es false, se crea un flujo deshabilitado."
          },
          "init_text": {
            "$ref": "#/components/schemas/MultilangField",
            "description": "Mensaje de texto inicial. Se omite si no es necesario. Cuando se proporciona, se requiere al menos una clave de idioma; cada valor debe tener entre 1 y 512 caracteres."
          },
          "ok_text": {
            "$ref": "#/components/schemas/MultilangField",
            "description": "Mensaje de texto de éxito. Se omite si no es necesario. Cuando se proporciona, se requiere al menos una clave de idioma; cada valor debe tener entre 1 y 512 caracteres."
          },
          "ko_text": {
            "$ref": "#/components/schemas/MultilangField",
            "description": "Mensaje de texto de error. Se omite si no es necesario. Cuando se proporciona, se requiere al menos una clave de idioma; cada valor debe tener entre 1 y 512 caracteres."
          },
          "target": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "all_workspaces",
                  "workspaces",
                  "workspace_groups",
                  "reporting_groups"
                ]
              },
              "ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 512
                }
              }
            },
            "required": [
              "type"
            ]
          },
          "microservice_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlowConditionInputV1"
            }
          }
        },
        "required": [
          "name",
          "description",
          "type",
          "detection_only",
          "cooldown_minutes",
          "target",
          "microservice_id",
          "conditions"
        ]
      },
      "FlowConditionInputV1": {
        "type": "object",
        "properties": {
          "condition_type_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "operator": {
            "type": "string",
            "enum": [
              "eq",
              "gt",
              "lt",
              "gte",
              "lte",
              "startsWith",
              "endsWith",
              "contains",
              "at"
            ]
          },
          "compare_to": {
            "type": "string",
            "maxLength": 512
          },
          "period": {
            "type": "number",
            "nullable": true
          },
          "check_every": {
            "type": "number"
          }
        },
        "required": [
          "condition_type_id",
          "operator",
          "compare_to",
          "check_every"
        ]
      },
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "message": {
                "type": "string"
              },
              "code": {
                "type": "string"
              },
              "details": {
                "type": "string"
              }
            },
            "required": [
              "message",
              "code"
            ]
          }
        },
        "required": [
          "error"
        ]
      },
      "CreateOperationV1Request": {
        "type": "object",
        "required": [
          "type",
          "target"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Tipo de comando de operacion.",
            "enum": [
              "execute_microservice"
            ]
          },
          "target": {
            "type": "object",
            "description": "Objeto de alcance y objetivos.",
            "required": [
              "type",
              "ids"
            ],
            "properties": {
              "type": {
                "type": "string",
                "description": "Alcance de objetivos.",
                "enum": [
                  "workspaces",
                  "sessions"
                ]
              },
              "ids": {
                "type": "array",
                "description": "Lista de identificadores objetivo. Para workspaces se esperan ids de 24 caracteres hexadecimales; para sessions se esperan UUIDs.",
                "minItems": 1,
                "maxItems": 20000,
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 512
                }
              }
            },
            "additionalProperties": false
          },
          "expiration_in_seconds": {
            "type": "integer",
            "minimum": 0,
            "description": "Expiracion personalizada en segundos. Si se omite se usa el valor por defecto del comando."
          },
          "payload": {
            "type": "object",
            "description": "Carga especifica del tipo de operacion. La validacion de estructura depende de type.",
            "additionalProperties": true
          }
        },
        "additionalProperties": false
      },
      "CreateOperationV1Response": {
        "type": "object",
        "required": [
          "ids"
        ],
        "properties": {
          "ids": {
            "type": "array",
            "description": "Identificadores de operaciones creadas con su organizacion de pertenencia.",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "organization_id",
                "operation_id"
              ],
              "properties": {
                "organization_id": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{24}$",
                  "minLength": 24,
                  "maxLength": 24,
                  "description": "Identificador de organizacion donde se creo la operacion."
                },
                "operation_id": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{24}$",
                  "minLength": 24,
                  "maxLength": 24,
                  "description": "Identificador MongoDB de la operacion creada."
                }
              },
              "additionalProperties": false
            }
          }
        }
      },
      "CreateReportingGroupMagicLinkRequestV1": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha y hora de expiración en UTC (ISO 8601, por ejemplo, con sufijo Z). Debe estar en el futuro y no más de 91 días por delante.",
            "example": "2026-03-15T12:00:00.000Z"
          },
          "installer": {
            "$ref": "#/components/schemas/ReportingGroupMagicLinkInstallerV1"
          }
        },
        "required": [
          "expires_at",
          "installer"
        ],
        "description": "Cuerpo de solicitud para crear un enlace mágico de Grupo de reporte."
      },
      "ReportingGroupMagicLinkInstallerV1": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "version": {
            "type": "string",
            "enum": [
              "latest"
            ],
            "description": "Versión del instalador.",
            "example": "latest"
          },
          "platform": {
            "type": "string",
            "enum": [
              "windows"
            ],
            "description": "Plataforma del instalador.",
            "example": "windows"
          },
          "arch": {
            "type": "string",
            "enum": [
              "x64"
            ],
            "description": "Arquitectura del instalador.",
            "example": "x64"
          },
          "type": {
            "type": "string",
            "enum": [
              "fxxone"
            ],
            "description": "Tipo de instalador.",
            "example": "fxxone"
          }
        },
        "required": [
          "version",
          "platform",
          "arch",
          "type"
        ],
        "description": "Selección de instalador para el enlace mágico."
      },
      "CreateReportingGroupMagicLinkResponseV1": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "description": "Identificador del enlace mágico",
            "example": "507f1f77bcf86cd799439099"
          },
          "token": {
            "type": "string",
            "description": "Token asociado con el enlace mágico.",
            "example": "2ab46558-3c40-4b72-8fce-08b7b596f624"
          },
          "link": {
            "type": "string",
            "description": "URL del enlace mágico.",
            "example": "https://portal.example.com/magic-link?key=2ab46558-3c40-4b72-8fce-08b7b596f624"
          }
        },
        "required": [
          "id",
          "token",
          "link"
        ]
      },
      "CreateReportingGroupRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 512,
            "description": "El nombre del grupo de reporte. Debe ser único dentro de la organización.",
            "example": "Grupo de reporte de Producción"
          },
          "product_config_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "El identificador único de la configuración de producto que se asociará con este grupo de reporte. La configuración de producto debe existir y pertenecer a la organización.",
            "example": "507f1f77bcf86cd799439030"
          },
          "patch_policy_target_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del destino de política de parches que se asociará con este grupo de reporte.",
            "example": "507f1f77bcf86cd799439040"
          },
          "fishing_pattern": {
            "type": "string",
            "maxLength": 250,
            "description": "Opcional. Un patrón de expresión regular usado para hacer coincidir dispositivos. Debe ser un patrón regex válido. Si se proporciona, también se debe especificar fishing_pattern_field.",
            "example": "Estaciones de trabajo Windows"
          },
          "fishing_pattern_field": {
            "type": "string",
            "enum": [
              "full_name",
              "description",
              "ou",
              "current_subnet"
            ],
            "description": "Opcional. Campo sobre el que se aplica fishing_pattern. Obligatorio si se proporciona fishing_pattern. Valores válidos: full_name (nombre completo del dispositivo), description (descripción del dispositivo), ou (unidad organizativa), current_subnet (subred actual).",
            "example": "full_name"
          },
          "intermediate_device1": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del primer Workspace de dispositivo intermedio. Los dispositivos intermedios se usan para acciones Wake on LAN en redes seguras, permitiendo el encendido remoto de dispositivos objetivo a través de puertas de enlace intermedias. Los dispositivos intermedios deben definirse secuencialmente sin huecos. Si se proporcionan intermediate_device2 o intermediate_device3, este campo es obligatorio.",
            "example": "507f1f77bcf86cd799439050"
          },
          "intermediate_device2": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del segundo Workspace de dispositivo intermedio. Se usa para acciones Wake on LAN en redes seguras. Requiere que se proporcione intermediate_device1. Si se proporciona intermediate_device3, este campo es obligatorio.",
            "example": "507f1f77bcf86cd799439051"
          },
          "intermediate_device3": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del tercer Workspace de dispositivo intermedio. Se usa para acciones Wake on LAN en redes seguras. Requiere que se proporcionen intermediate_device1 e intermediate_device2.",
            "example": "507f1f77bcf86cd799439052"
          }
        },
        "required": [
          "name",
          "product_config_id"
        ],
        "description": "Cuerpo de solicitud para crear un nuevo grupo de reporte. Los grupos de reporte organizan dispositivos y gestionan configuraciones, políticas de parches y enrutamiento de dispositivos intermedios."
      },
      "CreateTenantRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 512
          },
          "product_config_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "policy_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "organization_email": {
            "type": "string",
            "maxLength": 512
          },
          "organization_language": {
            "type": "string",
            "maxLength": 512
          },
          "organization_country": {
            "type": "string",
            "maxLength": 512
          },
          "organization_industry": {
            "type": "string",
            "maxLength": 512
          }
        },
        "required": [
          "name",
          "product_config_id",
          "organization_email",
          "organization_language",
          "organization_country",
          "organization_industry"
        ]
      },
      "CreateWorkspaceGroupScheduleRequestV1": {
        "type": "object",
        "properties": {
          "cron_expression": {
            "type": "string",
            "description": "Expresión cron que define cuándo debe ejecutarse la programación. Formato: minuto hora día-del-mes mes día-de-la-semana. Ejemplos: '0 8 * * 1-5' (8 AM en días laborables), '0 0 * * 0' (medianoche del domingo), '30 14 * * *' (2:30 PM diariamente). Día-de-la-semana: 0=domingo, 1=lunes, ..., 6=sábado. Admite rangos (1-5), listas (1,3,5) y comodines (*). Debe ser un formato de expresión cron válido con 5 campos separados por espacios.",
            "example": "0 8 * * 1-5"
          },
          "time_zone": {
            "type": "string",
            "description": "Zona horaria para la ejecución de la programación. Admite identificadores IANA (p. ej., 'America/New_York') y Windows (p. ej., 'Pacific Standard Time').",
            "example": "Eastern Standard Time"
          },
          "type": {
            "type": "string",
            "enum": [
              "start",
              "stop",
              "restart"
            ],
            "description": "Tipo de operación de energía a realizar. START: Enciende los Workspaces del grupo. STOP: Apaga los Workspaces del grupo. RESTART: Reinicia los Workspaces del grupo.",
            "example": "start"
          },
          "intermediate_device": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del Workspace de dispositivo intermedio. Si se proporciona, indica que se debe usar un dispositivo intermedio para operaciones Wake on LAN. Solo aplicable a programaciones START. Se usa para acciones Wake on LAN en redes seguras. El Workspace debe existir y pertenecer a la organización.",
            "example": "507f1f77bcf86cd799439050"
          }
        },
        "required": [
          "cron_expression",
          "time_zone",
          "type"
        ]
      },
      "WorkspacegroupsCreateRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 512
          },
          "description": {
            "type": "string",
            "maxLength": 512
          },
          "type": {
            "type": "string",
            "enum": [
              "static"
            ],
            "default": "static"
          },
          "location": {
            "$ref": "#/components/schemas/WorkspaceGroupBaseUpdateLocationInputV1"
          }
        },
        "required": [
          "name"
        ]
      },
      "WorkspaceGroupBaseUpdateLocationInputV1": {
        "type": "object",
        "properties": {
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          },
          "address": {
            "type": "string",
            "maxLength": 512
          },
          "description": {
            "type": "string",
            "maxLength": 512
          }
        },
        "required": [
          "latitude",
          "longitude",
          "address"
        ]
      },
      "ConditionTypeV1ListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si hay más resultados disponibles en la siguiente página"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ConditionTypeV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "ConditionTypeV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "frequency_values": {
            "type": "array",
            "items": {
              "type": "number"
            }
          },
          "value_type": {
            "type": "string"
          },
          "value_placeholder": {
            "type": "string",
            "nullable": true
          },
          "period": {
            "type": "boolean"
          },
          "op_values": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "eq",
                "gt",
                "lt",
                "gte",
                "lte",
                "startsWith",
                "endsWith",
                "contains",
                "at"
              ]
            },
            "description": "Valores de operador permitidos para el value_type de este tipo de condición. Campo calculado basado en value_type: string → [\"eq\", \"startsWith\", \"endsWith\", \"contains\"], int/double → [\"eq\", \"gt\", \"lt\", \"gte\", \"lte\"], id/bool → [\"eq\"], cron → [\"at\"]"
          }
        },
        "required": [
          "id"
        ]
      },
      "GetFlowResponseV1": {
        "type": "object",
        "description": "Detalle del flujo tal como lo devuelve GET flow by id. La organización está implícita por la ruta `/v1/organizations/{organization_id}/flows/{flow_id}`. Los workspaces/grupos de destino se normalizan en target.ids (cadenas hexadecimales de ObjectId de MongoDB).",
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "create_date": {
            "type": "string",
            "format": "date-time"
          },
          "update_date": {
            "type": "string",
            "format": "date-time"
          },
          "name": {
            "type": "string",
            "description": "Resuelto para Accept-Language cuando es multilingüe"
          },
          "description": {
            "type": "string",
            "description": "Resuelto para Accept-Language cuando es multilingüe"
          },
          "type": {
            "type": "string",
            "enum": [
              "session",
              "workspace"
            ]
          },
          "version": {
            "type": "number"
          },
          "detection_only": {
            "type": "boolean"
          },
          "cooldown_minutes": {
            "type": "number",
            "description": "Tiempo de espera en minutos"
          },
          "enabled": {
            "type": "boolean"
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlowConditionV1"
            },
            "description": "Omitido o vacío cuando el flujo no tiene condiciones"
          },
          "trigger": {
            "type": "string",
            "nullable": true
          },
          "target": {
            "$ref": "#/components/schemas/FlowTargetSelectorV1",
            "description": "Destino de ejecución: type selecciona el alcance; ids enumera valores de _id de Workspace, _id de grupo de Workspace o _id de Grupo de reporte (vacío cuando type es ALL_WORKSPACES)"
          },
          "microservice_id": {
            "type": "string",
            "nullable": true,
            "description": "ID del microservicio vinculado cuando está presente"
          },
          "init_text": {
            "type": "string",
            "nullable": true,
            "description": "Resuelto para Accept-Language cuando es multilingüe"
          },
          "ok_text": {
            "type": "string",
            "nullable": true,
            "description": "Resuelto para Accept-Language cuando es multilingüe"
          },
          "ko_text": {
            "type": "string",
            "nullable": true,
            "description": "Resuelto para Accept-Language cuando es multilingüe"
          },
          "execution_metrics": {
            "$ref": "#/components/schemas/FlowExecutionMetricsV1",
            "nullable": true,
            "description": "Presente cuando se calcularon métricas para este flujo"
          }
        },
        "required": [
          "id",
          "create_date",
          "update_date",
          "name",
          "description",
          "type",
          "version",
          "detection_only",
          "cooldown_minutes",
          "enabled",
          "target"
        ]
      },
      "FlowConditionV1": {
        "type": "object",
        "properties": {
          "condition_type_id": {
            "type": "string"
          },
          "metric": {
            "type": "string"
          },
          "operator": {
            "type": "string"
          },
          "compare_to": {
            "type": "string"
          },
          "period": {
            "type": "number",
            "nullable": true
          },
          "check_every": {
            "type": "number"
          }
        },
        "required": [
          "condition_type_id",
          "metric",
          "operator",
          "compare_to",
          "check_every"
        ]
      },
      "FlowTargetSelectorV1": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "all_workspaces",
              "workspaces",
              "workspace_groups",
              "reporting_groups"
            ],
            "description": "ALL_WORKSPACES: ids siempre es []. WORKSPACES: ids son _id de documentos de Workspace (24 hex). WORKSPACE_GROUPS / REPORTING_GROUPS: ids son valores de _id de grupo."
          },
          "ids": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            }
          }
        },
        "required": [
          "type",
          "ids"
        ]
      },
      "FlowExecutionMetricsV1": {
        "type": "object",
        "properties": {
          "targeted_workspaces": {
            "type": "number"
          },
          "evaluations_per_day": {
            "type": "number"
          },
          "possible_executions_per_day": {
            "type": "number"
          },
          "total_possible_executions_per_day": {
            "type": "number"
          }
        },
        "required": [
          "targeted_workspaces",
          "evaluations_per_day",
          "possible_executions_per_day",
          "total_possible_executions_per_day"
        ]
      },
      "FlowListItemV1ListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlowListItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "FlowListItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "session",
              "workspace"
            ]
          },
          "detection_only": {
            "type": "boolean"
          },
          "cooldown_minutes": {
            "type": "number",
            "description": "Tiempo de espera en minutos"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ]
      },
      "GetInstalledAppByIdResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la aplicación instalada."
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la organización asociada con la aplicación instalada."
          },
          "name": {
            "type": "string",
            "description": "Nombre de la aplicación instalada."
          },
          "publisher": {
            "type": "string",
            "nullable": true,
            "description": "Proveedor de la aplicación instalada."
          },
          "operating_system": {
            "type": "string",
            "enum": [
              "windows",
              "linux",
              "android",
              "mac_os",
              "chrome_os",
              "other"
            ],
            "description": "Sistema operativo donde se observa la aplicación."
          },
          "notes": {
            "type": "string",
            "description": "Notas asociadas con la aplicación instalada."
          },
          "discovered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Marca de tiempo del primer descubrimiento."
          },
          "reported_at": {
            "type": "string",
            "format": "date-time",
            "description": "Marca de tiempo del último reporte."
          },
          "installations": {
            "type": "integer",
            "minimum": 0,
            "description": "Número de instalaciones observadas para la aplicación."
          }
        },
        "required": [
          "id",
          "organization_id",
          "name",
          "operating_system",
          "notes",
          "reported_at",
          "installations"
        ]
      },
      "GetInstalledAppVersionsResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si hay otra pagina disponible."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetInstalledAppVersionsItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "GetInstalledAppVersionsItemV1": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "nullable": true,
            "description": "Version de la aplicacion instalada."
          },
          "reported_at": {
            "type": "string",
            "format": "date-time",
            "description": "Marca de tiempo del ultimo reporte para esta version."
          },
          "discovered_at": {
            "type": "string",
            "format": "date-time",
            "description": "Marca de tiempo de la primera observacion para esta version."
          }
        },
        "required": [
          "reported_at",
          "discovered_at"
        ]
      },
      "GetInstalledAppWorkspacesResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si hay otra pagina disponible."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetInstalledAppWorkspacesItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "GetInstalledAppWorkspacesItemV1": {
        "type": "object",
        "properties": {
          "workspace_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de Workspace."
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de organizacion."
          },
          "version": {
            "type": "string",
            "nullable": true,
            "description": "Version de la aplicacion instalada reportada para el Workspace."
          },
          "reported_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha y hora del ultimo reporte de instalacion para el Workspace."
          },
          "install_location": {
            "type": "string",
            "nullable": true,
            "description": "Ruta de instalacion reportada para la aplicacion en el Workspace."
          },
          "installed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha y hora de instalacion reportada para el Workspace."
          }
        },
        "required": [
          "workspace_id",
          "organization_id"
        ]
      },
      "GetInstalledAppsResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si hay otra página disponible."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetInstalledAppsItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "GetInstalledAppsItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la aplicación instalada."
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la organización asociado a este elemento de aplicación instalada."
          },
          "name": {
            "type": "string",
            "description": "Nombre de la aplicación instalada."
          },
          "discovered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Marca de tiempo del primer descubrimiento."
          },
          "reported_at": {
            "type": "string",
            "format": "date-time",
            "description": "Marca de tiempo del último reporte."
          },
          "operating_system": {
            "type": "string",
            "enum": [
              "windows",
              "linux",
              "android",
              "mac_os",
              "chrome_os",
              "other"
            ],
            "description": "Sistema operativo donde se observa la aplicación."
          },
          "publisher": {
            "type": "string",
            "nullable": true,
            "description": "Publicador de la aplicación."
          },
          "installations": {
            "type": "integer",
            "minimum": 0,
            "description": "Número de instalaciones observadas para la aplicación."
          }
        },
        "required": [
          "id",
          "organization_id",
          "name",
          "reported_at",
          "operating_system",
          "installations"
        ]
      },
      "GetMeResponseV1": {
        "type": "object",
        "properties": {
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la organización autenticada."
          },
          "token_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la API key autenticada."
          },
          "token_name": {
            "type": "string",
            "nullable": true,
            "description": "Nombre del token autenticado."
          },
          "token_created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha de creación del token."
          },
          "token_expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha de expiración del token."
          }
        },
        "required": [
          "organization_id",
          "token_id",
          "token_name",
          "token_created_at",
          "token_expires_at"
        ]
      },
      "GetMicroserviceByIdResponseV1": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MicroserviceItemV1"
          }
        },
        "required": [
          "data"
        ]
      },
      "MicroserviceItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador del microservicio."
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la organización asociada al microservicio."
          },
          "name": {
            "type": "string",
            "description": "Nombre del microservicio resuelto en el idioma solicitado."
          },
          "description": {
            "type": "string",
            "description": "Descripción del microservicio resuelta en el idioma solicitado."
          },
          "category": {
            "type": "string",
            "description": "Categoría del microservicio resuelta en el idioma solicitado."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha y hora de creación del microservicio."
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha y hora de archivado, cuando aplique."
          },
          "type": {
            "type": "string",
            "nullable": true,
            "description": "Tipo funcional del microservicio."
          },
          "icon_name": {
            "type": "string",
            "nullable": true,
            "description": "Nombre del icono asociado."
          },
          "icon_background": {
            "type": "string",
            "nullable": true,
            "description": "Color de fondo del icono."
          },
          "context": {
            "type": "string",
            "nullable": true,
            "description": "Contexto de visibilidad del microservicio."
          },
          "is_ai_enhanced": {
            "type": "boolean",
            "nullable": true,
            "description": "Indica si el microservicio tiene capacidades de IA habilitadas."
          },
          "enabled": {
            "type": "boolean",
            "description": "Indica si el microservicio está habilitado para la organización."
          },
          "enabled_configuration": {
            "type": "object",
            "nullable": true,
            "description": "Configuración habilitada del microservicio para la organización.",
            "properties": {
              "enabled_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Fecha y hora en la que se habilitó la configuración."
              },
              "efficiency": {
                "type": "number",
                "description": "Valor de eficiencia de la configuración habilitada."
              },
              "workspace_group_execution": {
                "type": "string",
                "enum": [
                  "l1",
                  "l2",
                  "l3"
                ],
                "description": "Modo de ejecución por grupos de workspace."
              },
              "individual_execution": {
                "type": "string",
                "enum": [
                  "l1",
                  "l2",
                  "l3"
                ],
                "description": "Modo de ejecución individual."
              },
              "end_user_execution_workspace_group_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{24}$",
                  "minLength": 24,
                  "maxLength": 24
                },
                "description": "Identificadores de grupos de workspace habilitados para ejecución de usuario final."
              }
            },
            "required": [
              "enabled_at",
              "efficiency",
              "workspace_group_execution",
              "individual_execution",
              "end_user_execution_workspace_group_ids"
            ]
          }
        },
        "required": [
          "id",
          "organization_id",
          "name",
          "description",
          "category",
          "created_at",
          "archived_at",
          "type",
          "icon_name",
          "icon_background",
          "context",
          "is_ai_enhanced",
          "enabled",
          "enabled_configuration"
        ]
      },
      "GetMicroservicesResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si existe una página siguiente."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MicroserviceItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "GetOperationByIdResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la ejecución de operación."
          },
          "name": {
            "type": "string",
            "description": "Nombre de la operación."
          },
          "description": {
            "type": "string",
            "description": "Descripción de la operación. Se devuelve cadena vacía cuando no existe en origen."
          },
          "status": {
            "type": "string",
            "enum": [
              "finished",
              "unknown",
              "error",
              "pending",
              "in-progress",
              "timeout",
              "cancelled",
              "scheduled"
            ],
            "description": "Estado actual de la operación."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Marca temporal de creación."
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Marca temporal de inicio."
          },
          "ended_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Marca temporal de finalización."
          },
          "microservice_id": {
            "type": "string",
            "nullable": true,
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador del microservicio relacionado, cuando exista."
          },
          "flow_id": {
            "type": "string",
            "nullable": true,
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador del flujo relacionado, cuando exista."
          },
          "remote_support": {
            "$ref": "#/components/schemas/GetOperationByIdRemoteSupportV1"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "status",
          "created_at"
        ]
      },
      "GetOperationByIdRemoteSupportV1": {
        "type": "object",
        "nullable": true,
        "properties": {
          "start_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha de inicio del soporte remoto."
          },
          "end_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha de fin del soporte remoto."
          },
          "type": {
            "type": "string",
            "nullable": true,
            "description": "Tipo de sesión de soporte remoto."
          }
        }
      },
      "GetOperationResultsResponseV1": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetOperationResultItemV1"
            }
          },
          "has_next": {
            "type": "boolean",
            "description": "Indica si existen más resultados en la siguiente página."
          }
        },
        "required": [
          "data",
          "has_next"
        ]
      },
      "GetOperationResultItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador del resultado."
          },
          "operation_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la operación asociada."
          },
          "workspace_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador del workspace asociado."
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la organización asociada."
          },
          "status": {
            "type": "string",
            "description": "Estado de ejecución del resultado.",
            "enum": [
              "scheduled",
              "pending",
              "in-progress",
              "completed",
              "error",
              "timeout",
              "cancelled",
              "unknown"
            ]
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Nombre de máquina asociado a la sesión cuando exista."
          },
          "start_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha y hora de inicio de la ejecución."
          },
          "end_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha y hora de fin de la ejecución."
          },
          "script_detail": {
            "type": "string",
            "nullable": true,
            "description": "Detalle de ejecución del script cuando exista."
          },
          "script_duration": {
            "type": "number",
            "nullable": true,
            "description": "Duración del script en segundos cuando exista."
          },
          "script_response": {
            "type": "array",
            "nullable": true,
            "description": "Salida estructurada del script con timestamp y línea.",
            "items": {
              "$ref": "#/components/schemas/GetOperationResultScriptResponseLineV1"
            }
          }
        },
        "required": [
          "id",
          "operation_id",
          "workspace_id",
          "status"
        ]
      },
      "GetOperationResultScriptResponseLineV1": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Timestamp ISO-8601 de la línea o null cuando no esté disponible."
          },
          "line": {
            "type": "string",
            "description": "Contenido de la línea o bloque de salida."
          }
        },
        "required": [
          "timestamp",
          "line"
        ]
      },
      "GetOperationsResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si existe una página siguiente."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetOperationItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "GetOperationItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la ejecución de operación."
          },
          "name": {
            "type": "string",
            "description": "Nombre de la operación."
          },
          "description": {
            "type": "string",
            "description": "Descripción de la operación. Se devuelve cadena vacía cuando no existe en origen."
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la organización propietaria de la operación."
          },
          "status": {
            "type": "string",
            "enum": [
              "finished",
              "unknown",
              "error",
              "pending",
              "in-progress",
              "timeout",
              "cancelled",
              "scheduled"
            ],
            "description": "Estado actual de la operación."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Marca temporal de creación."
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Marca temporal de inicio."
          },
          "ended_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Marca temporal de finalización."
          },
          "microservice_id": {
            "type": "string",
            "nullable": true,
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador del microservicio relacionado, cuando exista."
          },
          "flow_id": {
            "type": "string",
            "nullable": true,
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador del flujo relacionado, cuando exista."
          },
          "remote_support": {
            "$ref": "#/components/schemas/GetOperationRemoteSupportV1"
          }
        },
        "required": [
          "id",
          "organization_id",
          "name",
          "description",
          "status",
          "created_at"
        ]
      },
      "GetOperationRemoteSupportV1": {
        "type": "object",
        "nullable": true,
        "properties": {
          "start_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha de inicio del soporte remoto."
          },
          "end_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Fecha de fin del soporte remoto."
          },
          "type": {
            "type": "string",
            "nullable": true,
            "description": "Tipo de sesión de soporte remoto."
          }
        }
      },
      "PatchPolicyTargetV1ListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si hay más resultados disponibles en la siguiente página"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PatchPolicyTargetV1"
            },
            "description": "Arreglo de objetos de objetivo de política de parches"
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "PatchPolicyTargetV1": {
        "type": "object",
        "description": "Recurso de objetivo de política de parches",
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "El identificador único del objetivo de política de parches",
            "example": "66ab6cf4d4d2e709bafd404c"
          },
          "name": {
            "type": "string",
            "description": "Nombre del objetivo de política de parches",
            "example": "Base"
          },
          "create_user": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "ID de usuario que creó el objetivo de política de parches",
            "example": "6439606652fc0c0051f1787b"
          },
          "create_date": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha y hora de creación del objetivo de política de parches (datetime ISO 8601)",
            "example": "2024-08-01T11:09:40.719Z"
          },
          "update_date": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha y hora de última actualización del objetivo de política de parches (datetime ISO 8601)",
            "example": "2026-01-14T10:16:28.143Z"
          },
          "timezone": {
            "type": "string",
            "description": "Zona horaria para la programación de la política de parches. Identificador de zona horaria IANA o nombre de zona horaria de Windows.",
            "example": "UTC"
          },
          "should_restart": {
            "type": "boolean",
            "description": "Si se deben reiniciar los Workspaces después del parcheo",
            "example": true
          },
          "wake_on_lan": {
            "type": "boolean",
            "description": "Si se debe usar Wake on LAN para el parcheo",
            "example": true
          },
          "force_patching_configuration": {
            "type": "boolean",
            "description": "Si se debe forzar la configuración de parcheo",
            "example": false
          },
          "is_in_maintenance": {
            "type": "boolean",
            "description": "Si el objetivo de política de parches está actualmente en modo de mantenimiento",
            "example": false
          },
          "weeks": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4
            },
            "description": "Arreglo de números de semana (1-4) en los que debe ocurrir el parcheo",
            "example": [
              1,
              2
            ]
          },
          "schedule": {
            "type": "object",
            "description": "Programación que define cuándo ocurre el parcheo. Las claves son nombres de días (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY). Los valores son objetos vacíos u objetos con claves de hora (como cadenas) que contienen arreglos de números de minuto.",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 59
                }
              }
            },
            "example": {
              "MONDAY": {},
              "TUESDAY": {},
              "WEDNESDAY": {},
              "THURSDAY": {
                "9": [
                  15,
                  30,
                  45
                ],
                "10": [
                  0,
                  15,
                  30,
                  45
                ],
                "11": [
                  0,
                  15,
                  30,
                  45
                ]
              },
              "FRIDAY": {},
              "SATURDAY": {},
              "SUNDAY": {}
            }
          },
          "patch_policy_target_type": {
            "type": "string",
            "enum": [
              "windows",
              "linux",
              null
            ],
            "nullable": true,
            "description": "Tipo de objetivo de política de parches ('windows', 'linux' o null).",
            "example": "windows"
          },
          "patch_policy_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "nullable": true,
            "description": "El identificador único de la política de parches asociada. Null si no hay una política de parches asignada.",
            "example": "507f1f77bcf86cd799439011"
          }
        },
        "required": [
          "id"
        ]
      },
      "ProductConfigV1ListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si hay más páginas disponibles"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductConfigV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "ProductConfigV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Identificador único de la configuración de producto",
            "example": "507f1f77bcf86cd799439011"
          },
          "environment": {
            "type": "string",
            "description": "Tipo de entorno para la configuración de producto (p. ej., PRODUCTION, STAGING, DEVELOPMENT)",
            "example": "PRODUCTION"
          },
          "create_date": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha y hora de creación de la configuración de producto (fecha y hora ISO 8601)",
            "example": "2024-01-15T10:30:00.000Z"
          },
          "active": {
            "type": "boolean",
            "description": "Indica si la configuración de producto está activa.",
            "example": true
          },
          "product_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Identificador único del producto asociado con esta configuración",
            "example": "507f1f77bcf86cd799439001"
          },
          "region": {
            "type": "string",
            "nullable": true,
            "description": "Nombre de la región donde se despliega la configuración de producto. Nulo si no hay región asignada.",
            "example": "us-east"
          }
        },
        "required": [
          "id"
        ]
      },
      "ReportingGroupByIdV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del grupo de reporte"
          },
          "name": {
            "type": "string",
            "description": "Nombre del grupo de reporte"
          },
          "organization_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador de la organización"
          },
          "product_config_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador de la configuración del producto"
          },
          "fishing_pattern": {
            "type": "string",
            "nullable": true,
            "description": "Nombre del fishing pattern"
          },
          "fishing_pattern_field": {
            "type": "string",
            "enum": [
              "full_name",
              "description",
              "ou",
              "current_subnet"
            ],
            "nullable": true,
            "description": "Campo sobre el que se aplica fishing_pattern. Valores posibles: full_name, description, ou, current_subnet."
          },
          "patch_policy_target_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador del destino de política de parches"
          },
          "policy_reporting_group": {
            "type": "string",
            "nullable": true,
            "description": "Identificador del grupo de reporte de política"
          },
          "overridden_agent_settings": {
            "$ref": "#/components/schemas/ReportingGroupAgentSettingsV1",
            "nullable": true,
            "description": "Ajustes del agente sobrescritos a nivel de grupo de reporte"
          },
          "effective_agent_settings": {
            "$ref": "#/components/schemas/ReportingGroupEffectiveAgentSettingsV1",
            "nullable": true,
            "description": "Ajustes efectivos del agente (combinados desde la configuración del producto y sobrescrituras)"
          },
          "execute_flexx_analyzer_agent": {
            "type": "boolean",
            "description": "Si la ejecución del agente Flexx Analyzer está habilitada"
          },
          "intermediate_device_1_id": {
            "type": "string",
            "nullable": true,
            "description": "ID de Workspace del primer dispositivo intermedio (buscado por sysId)"
          },
          "intermediate_device_2_id": {
            "type": "string",
            "nullable": true,
            "description": "ID de Workspace del segundo dispositivo intermedio (buscado por sysId)"
          },
          "intermediate_device_3_id": {
            "type": "string",
            "nullable": true,
            "description": "ID de Workspace del tercer dispositivo intermedio (buscado por sysId)"
          }
        },
        "required": [
          "id",
          "name",
          "execute_flexx_analyzer_agent"
        ]
      },
      "ReportingGroupAgentSettingsV1": {
        "type": "object",
        "properties": {
          "remote_support": {
            "type": "string",
            "nullable": true,
            "description": "Configuración de soporte remoto"
          },
          "collect_device_location": {
            "type": "boolean",
            "nullable": true,
            "description": "Si la recopilación de ubicación del dispositivo está habilitada"
          },
          "auto_update_agents": {
            "type": "boolean",
            "nullable": true,
            "description": "Si la actualización automática de agentes está habilitada"
          },
          "collect_event_logs": {
            "type": "boolean",
            "nullable": true,
            "description": "Si la recopilación de registros de eventos está habilitada"
          },
          "event_log_ids": {
            "type": "string",
            "nullable": true,
            "description": "IDs de registros de eventos"
          },
          "event_logs_recurrence": {
            "type": "number",
            "nullable": true,
            "description": "Recurrencia de registros de eventos"
          },
          "collect_disks": {
            "type": "boolean",
            "nullable": true,
            "description": "Si la recopilación de discos está habilitada"
          },
          "collect_services": {
            "type": "boolean",
            "nullable": true,
            "description": "Si la recopilación de servicios está habilitada"
          },
          "collect_pnp_events": {
            "type": "boolean",
            "nullable": true,
            "description": "Si la recopilación de eventos PnP está habilitada"
          },
          "collect_public_ip": {
            "type": "boolean",
            "nullable": true,
            "description": "Si la recopilación de IP pública está habilitada"
          },
          "fra_system_actions_role": {
            "type": "string",
            "nullable": true,
            "description": "Rol de acciones del sistema FRA"
          },
          "unified_reporting": {
            "type": "string",
            "nullable": true,
            "description": "Configuración de reporte unificado"
          },
          "unified_operations": {
            "type": "string",
            "nullable": true,
            "description": "Configuración de operaciones unificadas"
          },
          "uninstall_protection": {
            "type": "string",
            "nullable": true,
            "enum": [
              "off",
              "on",
              "invalid"
            ],
            "description": "Devuelve \"invalid\" cuando el valor es desconocido o no está en el conjunto actual de valores conocidos."
          },
          "web_apps": {
            "type": "boolean",
            "nullable": true,
            "description": "Si las web apps están habilitadas"
          }
        }
      },
      "ReportingGroupEffectiveAgentSettingsV1": {
        "type": "object",
        "description": "Ajustes efectivos del agente (incluye campos de configuración del producto más sobrescrituras)",
        "properties": {
          "remote_support": {
            "type": "string",
            "nullable": true
          },
          "collect_device_location": {
            "type": "boolean",
            "nullable": true
          },
          "auto_update_agents": {
            "type": "boolean",
            "nullable": true
          },
          "collect_event_logs": {
            "type": "boolean",
            "nullable": true
          },
          "event_log_ids": {
            "type": "string",
            "nullable": true
          },
          "event_logs_recurrence": {
            "type": "number",
            "nullable": true
          },
          "collect_disks": {
            "type": "boolean",
            "nullable": true
          },
          "collect_services": {
            "type": "boolean",
            "nullable": true
          },
          "collect_pnp_events": {
            "type": "boolean",
            "nullable": true
          },
          "collect_public_ip": {
            "type": "boolean",
            "nullable": true
          },
          "fra_system_actions_role": {
            "type": "string",
            "nullable": true
          },
          "unified_reporting": {
            "type": "string",
            "nullable": true
          },
          "uninstall_protection": {
            "type": "string",
            "nullable": true,
            "enum": [
              "off",
              "on",
              "invalid"
            ],
            "description": "Devuelve \"invalid\" cuando el valor es desconocido o no está en el conjunto actual de valores conocidos."
          },
          "resources_report_recurrence": {
            "type": "number",
            "nullable": true
          },
          "profile_storage_report_recurrence": {
            "type": "number",
            "nullable": true
          },
          "sync_broker_recurrence": {
            "type": "number",
            "nullable": true
          },
          "detect_new_citrix_subscriptions": {
            "type": "boolean",
            "nullable": true
          },
          "proxy_type": {
            "type": "string",
            "nullable": true
          },
          "can_enable_flexx_agent_per_group": {
            "type": "boolean",
            "nullable": true
          },
          "web_apps": {
            "type": "boolean",
            "nullable": true
          },
          "fra_simplified_security": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ReportingGroupListItemV1ListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReportingGroupListItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "ReportingGroupListItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del grupo de reporte"
          },
          "name": {
            "type": "string",
            "description": "Nombre del grupo de reporte"
          },
          "organization_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador de organización"
          },
          "product_config_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador de configuración de producto"
          },
          "fishing_pattern": {
            "type": "string",
            "nullable": true,
            "description": "Nombre del patrón de fishing"
          },
          "fishing_pattern_field": {
            "type": "string",
            "enum": [
              "full_name",
              "description",
              "ou",
              "current_subnet"
            ],
            "nullable": true,
            "description": "Campo sobre el que se aplica fishing_pattern. Valores posibles: full_name, description, ou, current_subnet."
          },
          "patch_policy_target_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador de patch policy target"
          },
          "policy_reporting_group": {
            "type": "string",
            "nullable": true,
            "description": "Identificador de policy reporting group"
          },
          "overridden_agent_settings": {
            "$ref": "#/components/schemas/ReportingGroupAgentSettingsV1",
            "nullable": true,
            "description": "Configuración del agente sobrescrita a nivel de grupo de reporte"
          },
          "effective_agent_settings": {
            "$ref": "#/components/schemas/ReportingGroupEffectiveAgentSettingsV1",
            "nullable": true,
            "description": "Configuración efectiva del agente (fusionada desde la configuración del producto y las sobrescrituras)"
          },
          "execute_flexx_analyzer_agent": {
            "type": "boolean",
            "description": "Si la ejecución del agente FlexxAnalyzer está habilitada"
          },
          "flexx_agent_portal_download": {
            "type": "boolean",
            "description": "Si la descarga de FlexxAgent desde el portal está habilitada para la organización del grupo (en tenants delegados usa el valor del tenant principal)"
          },
          "intermediate_device_1_id": {
            "type": "string",
            "nullable": true,
            "description": "ID de Workspace del primer dispositivo intermedio"
          },
          "intermediate_device_2_id": {
            "type": "string",
            "nullable": true,
            "description": "ID de Workspace del segundo dispositivo intermedio"
          },
          "intermediate_device_3_id": {
            "type": "string",
            "nullable": true,
            "description": "ID de Workspace del tercer dispositivo intermedio"
          }
        },
        "required": [
          "id"
        ]
      },
      "GetSessionByIdResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$",
            "minLength": 36,
            "maxLength": 36,
            "description": "Identificador de la sesion."
          },
          "user_name": {
            "type": "string",
            "description": "Cuenta de usuario para la sesion."
          },
          "session_type": {
            "type": "string",
            "enum": [
              "vdi_desktop",
              "application",
              "sdi_desktop",
              "device"
            ],
            "description": "Tipo de sesion."
          },
          "windows_session_id": {
            "type": "integer",
            "description": "Identificador de sesion de Windows."
          },
          "connection_state": {
            "type": "string",
            "enum": [
              "unknown",
              "connected",
              "disconnected",
              "terminated",
              "preparing_session",
              "active",
              "reconnecting",
              "non_broker_session",
              "other",
              "pending"
            ],
            "description": "Estado de conexion de la sesion."
          },
          "start_date": {
            "type": "string",
            "description": "Marca de tiempo de inicio de la sesion."
          },
          "session_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "empty",
              "active_notifications",
              "active_notifications_ack_accepted",
              "active_notifications_ack_pending"
            ],
            "description": "Estado de la sesion."
          },
          "platform_type": {
            "type": "string",
            "enum": [
              "windows",
              "mac",
              "linux",
              "android",
              "chrome_os",
              "unknown"
            ],
            "description": "Tipo de plataforma."
          },
          "connected": {
            "type": "boolean",
            "description": "Indica si la sesion esta conectada actualmente."
          },
          "current_session_id": {
            "type": "integer",
            "description": "Identificador actual de la sesion de conexion."
          },
          "current_dc_name": {
            "type": "string",
            "description": "Nombre actual del centro de datos."
          },
          "last_connection_time": {
            "type": "string",
            "description": "Cadena de marca de tiempo de la ultima conexion."
          },
          "log_on_duration": {
            "type": "number",
            "description": "Duracion de inicio de sesion."
          },
          "session_key": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$",
            "minLength": 36,
            "maxLength": 36,
            "description": "Clave de sesion."
          },
          "flexx_analyzer_executed": {
            "type": "boolean",
            "description": "Indica si la ejecucion del analizador se ha completado."
          },
          "cpu_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de CPU."
          },
          "ram_usage_gb": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de RAM en gigabytes."
          },
          "rtt_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de RTT."
          },
          "current_uid_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de UID."
          },
          "ram_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de RAM."
          },
          "ram_percentage": {
            "type": "number",
            "nullable": true,
            "description": "Porcentaje actual de uso de RAM."
          },
          "number_alerts_user": {
            "type": "number",
            "nullable": true,
            "description": "Numero de alertas de usuario."
          },
          "number_alerts_vm": {
            "type": "number",
            "nullable": true,
            "description": "Numero de alertas de Workspace."
          },
          "workspace_id": {
            "type": "string",
            "nullable": true,
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador MongoDB (_id) del Workspace relacionado con la sesion, resuelto a partir de la relación de sesión."
          }
        },
        "required": [
          "id",
          "user_name",
          "session_type",
          "windows_session_id",
          "connection_state",
          "start_date",
          "current_session_id",
          "current_dc_name",
          "last_connection_time",
          "log_on_duration",
          "session_key",
          "connected",
          "flexx_analyzer_executed"
        ]
      },
      "GetSessionsResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Si hay otra página disponible."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetSessionItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "GetSessionItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$",
            "minLength": 36,
            "maxLength": 36,
            "description": "Identificador de la sesión."
          },
          "user_name": {
            "type": "string",
            "description": "Cuenta de usuario de la sesión."
          },
          "session_type": {
            "type": "string",
            "enum": [
              "vdi_desktop",
              "application",
              "sdi_desktop",
              "device"
            ],
            "description": "Tipo de sesión."
          },
          "windows_session_id": {
            "type": "integer",
            "description": "Identificador de sesión de Windows."
          },
          "connection_state": {
            "type": "string",
            "enum": [
              "unknown",
              "connected",
              "disconnected",
              "terminated",
              "preparing_session",
              "active",
              "reconnecting",
              "non_broker_session",
              "other",
              "pending"
            ],
            "description": "Estado de conexión de la sesión."
          },
          "start_date": {
            "type": "string",
            "description": "Marca de tiempo de inicio de la sesión."
          },
          "cpu_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de CPU."
          },
          "ram_usage_gb": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de RAM en gigabytes."
          },
          "rtt_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de RTT."
          },
          "session_status": {
            "type": "string",
            "description": "Estado de la sesión."
          },
          "platform_type": {
            "type": "string",
            "enum": [
              "windows",
              "mac",
              "linux",
              "android",
              "chrome_os",
              "unknown"
            ],
            "description": "Tipo de plataforma."
          },
          "connected": {
            "type": "boolean",
            "description": "Indicador de conexión actual."
          },
          "current_session_id": {
            "type": "integer",
            "description": "Identificador de sesión de conexión actual."
          },
          "current_dc_name": {
            "type": "string",
            "description": "Nombre actual del centro de datos."
          },
          "current_uid_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de UID."
          },
          "flexx_analyzer_executed": {
            "type": "boolean",
            "description": "Si la ejecución del analizador ha finalizado."
          },
          "last_connection_time": {
            "type": "string",
            "description": "Cadena de marca de tiempo de la última conexión."
          },
          "log_on_duration": {
            "type": "number",
            "description": "Duración de inicio de sesión."
          },
          "number_alerts_user": {
            "type": "number",
            "nullable": true,
            "description": "Número de alertas de usuario."
          },
          "number_alerts_vm": {
            "type": "number",
            "nullable": true,
            "description": "Número de alertas de Workspace."
          },
          "ram_usage": {
            "type": "number",
            "nullable": true,
            "description": "Uso actual de RAM."
          },
          "ram_percentage": {
            "type": "number",
            "nullable": true,
            "description": "Porcentaje actual de uso de RAM."
          },
          "session_key": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$",
            "minLength": 36,
            "maxLength": 36,
            "description": "Clave de sesión."
          },
          "workspace_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador MongoDB (_id) del Workspace asociado con la sesión, resuelto a partir de la relación de sesión."
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "minLength": 24,
            "maxLength": 24,
            "description": "Identificador de la organización asociado con la sesión."
          }
        },
        "required": [
          "id",
          "user_name",
          "session_type",
          "windows_session_id",
          "connection_state",
          "start_date",
          "cpu_usage",
          "ram_usage_gb",
          "rtt_usage",
          "session_status",
          "platform_type",
          "connected",
          "current_session_id",
          "current_dc_name",
          "current_uid_usage",
          "flexx_analyzer_executed",
          "last_connection_time",
          "log_on_duration",
          "number_alerts_user",
          "number_alerts_vm",
          "ram_usage",
          "ram_percentage",
          "session_key",
          "workspace_id",
          "organization_id"
        ]
      },
      "TenantByIdV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "organization_id": {
            "type": "string",
            "description": "ID de la organización del tenant"
          },
          "create_date": {
            "type": "string",
            "format": "date-time"
          },
          "name": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "product_id": {
            "type": "string",
            "nullable": true,
            "description": "ID del producto (nullable)"
          },
          "policy_id": {
            "type": "string",
            "nullable": true,
            "description": "ID de la política (nullable)"
          }
        },
        "required": [
          "id",
          "organization_id",
          "create_date",
          "name",
          "region"
        ]
      },
      "TenantListItemV1ListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean",
            "description": "Indica si hay mas páginas disponibles"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TenantListItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "TenantListItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del tenant"
          },
          "organization_id": {
            "type": "string",
            "description": "ID de la organización del tenant"
          },
          "create_date": {
            "type": "string",
            "format": "date-time",
            "description": "Fecha de creación (fecha y hora ISO 8601)"
          },
          "name": {
            "type": "string",
            "description": "Nombre del tenant"
          },
          "region": {
            "type": "string",
            "description": "Región/ID de región"
          },
          "product_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador del producto (nullable si el tenant no tiene producto asignado)"
          },
          "policy_id": {
            "type": "string",
            "nullable": true,
            "description": "Identificador de la política (nullable si el tenant no tiene política asignada)"
          }
        },
        "required": [
          "id"
        ]
      },
      "WorkspacePublicV1": {
        "type": "object",
        "description": "Recurso Workspace.",
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "organization_id": {
            "type": "string",
            "nullable": true,
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "related_environment": {
            "type": "string",
            "nullable": true
          },
          "operating_system": {
            "type": "string",
            "nullable": true
          },
          "serial_number": {
            "type": "string",
            "nullable": true
          },
          "ip_address": {
            "type": "string",
            "nullable": true
          },
          "os_update_num_pending": {
            "type": "number",
            "nullable": true
          },
          "reporting_group_id": {
            "type": "string",
            "nullable": true
          },
          "flxmid": {
            "type": "string",
            "nullable": true
          },
          "os_update_num_days_since_last": {
            "type": "number",
            "nullable": true
          },
          "total_ram": {
            "type": "number",
            "nullable": true
          },
          "altitude": {
            "type": "number",
            "nullable": true
          },
          "antivirus": {
            "type": "string",
            "nullable": true
          },
          "antivirus_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unknown",
              "not_installed",
              "installed_stopped",
              "installed_working"
            ],
            "description": "Estado del antivirus."
          },
          "bios_manufacturer": {
            "type": "string",
            "nullable": true
          },
          "bios_mode": {
            "type": "string",
            "nullable": true
          },
          "bios_version": {
            "type": "string",
            "nullable": true
          },
          "bios_smbversion": {
            "type": "string",
            "nullable": true
          },
          "bios_serialnumber": {
            "type": "string",
            "nullable": true
          },
          "base_board_manufacturer": {
            "type": "string",
            "nullable": true
          },
          "base_board_product": {
            "type": "string",
            "nullable": true
          },
          "base_board_version": {
            "type": "string",
            "nullable": true
          },
          "broker": {
            "type": "string",
            "nullable": true,
            "enum": [
              "no_broker_detected",
              "azure_virtual_desktop",
              "citrix_on-premises",
              "citrix_daas",
              "amazon_workspaces",
              "vmware_horizon",
              "parallels_ras",
              "windows_365",
              "rdsh",
              "uds",
              "unknown"
            ],
            "description": "Tipo de broker."
          },
          "public_ip_city": {
            "type": "string",
            "nullable": true
          },
          "flexxagent_version": {
            "type": "string",
            "nullable": true
          },
          "compliance_result": {
            "type": "string",
            "nullable": true,
            "enum": [
              "not_evaluated",
              "compliant",
              "not_compliant"
            ],
            "description": "Resultado de cumplimiento."
          },
          "compliance_last_execution": {
            "type": "string",
            "nullable": true
          },
          "domain_name": {
            "type": "string",
            "nullable": true
          },
          "public_ip_country": {
            "type": "string",
            "nullable": true
          },
          "cores_count": {
            "type": "string",
            "nullable": true
          },
          "edr_active_detections": {
            "type": "boolean",
            "nullable": true
          },
          "edr_host_id": {
            "type": "string",
            "nullable": true
          },
          "edr_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unknown",
              "not_installed",
              "installed_stopped",
              "installed_working"
            ],
            "description": "Estado del agente EDR."
          },
          "edr_version": {
            "type": "string",
            "nullable": true
          },
          "current_subnet": {
            "type": "string",
            "nullable": true
          },
          "default_gateway": {
            "type": "string",
            "nullable": true
          },
          "device_kind": {
            "type": "string",
            "nullable": true,
            "enum": [
              "virtual",
              "physical"
            ],
            "description": "Tipo de dispositivo (Virtual/Físico)."
          },
          "edr": {
            "type": "string",
            "nullable": true
          },
          "ema_agent_version": {
            "type": "string",
            "nullable": true
          },
          "ema_endpoint_id": {
            "type": "string",
            "nullable": true
          },
          "embedded_controller_version": {
            "type": "string",
            "nullable": true
          },
          "os_fast_startup": {
            "type": "boolean",
            "nullable": true
          },
          "flexxanalyzer_config": {
            "type": "string",
            "nullable": true,
            "enum": [
              "not_configured",
              "disabled_in_workspace",
              "configured",
              "installed",
              "not_compatible"
            ],
            "description": "Configuración de FlexxAnalyzer."
          },
          "flexxanalyzer_version": {
            "type": "string",
            "nullable": true
          },
          "hypervisor": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unknown",
              "physical",
              "microsoft_azure",
              "microsoft_hyper-v",
              "vmware_vsphere",
              "amazon_web_services",
              "nutanix",
              "citrix_hypervisor",
              "oracle_cloud",
              "google_cloud"
            ],
            "description": "Tipo de hipervisor."
          },
          "ip_version": {
            "type": "string",
            "nullable": true
          },
          "public_ip_isp": {
            "type": "string",
            "nullable": true
          },
          "iot_hub_config_sync_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unknown",
              "does_not_apply",
              "synced",
              "unsynced"
            ],
            "description": "Estado de sincronización de configuración de IoT Hub."
          },
          "is_amt_supported": {
            "type": "boolean",
            "nullable": true
          },
          "is_laptop": {
            "type": "boolean",
            "nullable": true
          },
          "is_physical": {
            "type": "boolean",
            "nullable": true
          },
          "last_boot_duration": {
            "type": "number",
            "nullable": true
          },
          "last_restart_time": {
            "type": "string",
            "nullable": true
          },
          "last_time": {
            "type": "string",
            "nullable": true
          },
          "last_windows_update": {
            "type": "string",
            "nullable": true
          },
          "last_autorepair": {
            "type": "string",
            "nullable": true
          },
          "latitude": {
            "type": "number",
            "nullable": true
          },
          "locale": {
            "type": "string",
            "nullable": true
          },
          "longitude": {
            "type": "number",
            "nullable": true
          },
          "mac_address": {
            "type": "string",
            "nullable": true
          },
          "network_interface_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unknown",
              "ethernet",
              "wifi",
              "mobile_network",
              "other"
            ],
            "description": "Tipo de interfaz de red."
          },
          "os_build_number": {
            "type": "string",
            "nullable": true
          },
          "os_manufacturer": {
            "type": "string",
            "nullable": true
          },
          "os_version": {
            "type": "string",
            "nullable": true
          },
          "ou": {
            "type": "string",
            "nullable": true
          },
          "os_page_file": {
            "type": "string",
            "nullable": true
          },
          "os_page_file_space": {
            "type": "number",
            "nullable": true
          },
          "platform_role": {
            "type": "string",
            "nullable": true
          },
          "platform_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "windows",
              "mac",
              "android",
              "linux",
              "chromebook",
              "ios",
              "unknown"
            ],
            "description": "Tipo de plataforma."
          },
          "processor": {
            "type": "string",
            "nullable": true
          },
          "public_ip": {
            "type": "string",
            "nullable": true
          },
          "os_reboot_pending": {
            "type": "boolean",
            "nullable": true
          },
          "secure_boot_state": {
            "type": "string",
            "nullable": true
          },
          "system_model": {
            "type": "string",
            "nullable": true
          },
          "system_type": {
            "type": "string",
            "nullable": true
          },
          "os_time_zone": {
            "type": "string",
            "nullable": true
          },
          "user_name": {
            "type": "string",
            "nullable": true
          },
          "vm_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "hidden",
              "workspace_or_avd_session_host",
              "desktop_template_definition",
              "vcc_role",
              "template_definition_surrogate",
              "workspace",
              "server",
              "vdi_appliance",
              "application_template_definition",
              "application_server",
              "endpoint"
            ],
            "description": "Tipo de VM."
          },
          "windows_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unknown",
              "workstation",
              "domain_controller",
              "server"
            ],
            "description": "Tipo de Windows."
          },
          "create_date": {
            "type": "string",
            "nullable": true
          },
          "last_deregistration_time": {
            "type": "string",
            "nullable": true
          },
          "encrypted_harddisks": {
            "type": "string",
            "nullable": true,
            "enum": [
              "no",
              "yes",
              "partial",
              "na"
            ],
            "description": "Estado de cifrado del disco duro."
          },
          "custom_field_01": {
            "type": "string",
            "nullable": true
          },
          "custom_field_02": {
            "type": "string",
            "nullable": true
          },
          "custom_field_03": {
            "type": "string",
            "nullable": true
          },
          "custom_field_04": {
            "type": "string",
            "nullable": true
          },
          "custom_field_05": {
            "type": "string",
            "nullable": true
          },
          "custom_field_06": {
            "type": "string",
            "nullable": true
          },
          "custom_field_07": {
            "type": "string",
            "nullable": true
          },
          "custom_field_08": {
            "type": "string",
            "nullable": true
          },
          "custom_field_09": {
            "type": "string",
            "nullable": true
          },
          "custom_field_10": {
            "type": "string",
            "nullable": true
          },
          "flexxagent_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unified",
              "mac",
              "linux",
              "universal"
            ],
            "description": "Tipo de FlexxAgent."
          },
          "antivirus_version_number": {
            "type": "string",
            "nullable": true
          },
          "related_location": {
            "type": "string",
            "nullable": true
          },
          "area": {
            "type": "string",
            "nullable": true
          },
          "custom_field_11": {
            "type": "string",
            "nullable": true
          },
          "custom_field_12": {
            "type": "string",
            "nullable": true
          },
          "custom_field_13": {
            "type": "string",
            "nullable": true
          },
          "custom_field_14": {
            "type": "string",
            "nullable": true
          },
          "custom_field_15": {
            "type": "string",
            "nullable": true
          },
          "custom_field_16": {
            "type": "string",
            "nullable": true
          },
          "custom_field_17": {
            "type": "string",
            "nullable": true
          },
          "custom_field_18": {
            "type": "string",
            "nullable": true
          },
          "custom_field_19": {
            "type": "string",
            "nullable": true
          },
          "custom_field_20": {
            "type": "string",
            "nullable": true
          },
          "department": {
            "type": "string",
            "nullable": true
          },
          "office": {
            "type": "string",
            "nullable": true
          },
          "last_custom_fields_update": {
            "type": "string",
            "nullable": true
          },
          "workspace_id": {
            "type": "string",
            "nullable": true,
            "minLength": 25,
            "pattern": "^[0-9a-f]{25,}$"
          },
          "flexxanalyzer_proxy_uri": {
            "type": "string",
            "nullable": true
          },
          "iot_hub_name": {
            "type": "string",
            "nullable": true
          },
          "flexxagent_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unknown",
              "working",
              "stopped",
              "not_reporting",
              "service_stopped",
              "service_disabled",
              "communication_error",
              "other_error",
              "not_installed",
              "update_requested",
              "updating",
              "update_error"
            ],
            "description": "Estado del FlexxAgent / cliente VDI."
          },
          "boot_hard_disk_used_percentage": {
            "type": "number",
            "nullable": true
          },
          "last_connection_time": {
            "type": "string",
            "nullable": true
          },
          "network_signal": {
            "type": "number",
            "nullable": true
          },
          "num_alerts": {
            "type": "number",
            "nullable": true
          },
          "percent_cpu": {
            "type": "number",
            "nullable": true,
            "description": "Uso de CPU del Workspace en porcentaje."
          },
          "percent_ram": {
            "type": "number",
            "nullable": true
          },
          "power_state": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unmanaged",
              "unknown",
              "dev_express",
              "off",
              "on",
              "suspended",
              "turning_on",
              "turning_off",
              "suspending",
              "resuming",
              "non_reporting"
            ],
            "description": "Estado de energía."
          },
          "sessions_count": {
            "type": "number",
            "nullable": true
          },
          "used_system_disk_c": {
            "type": "number",
            "nullable": true
          },
          "wake_on_lan_mac": {
            "type": "string",
            "nullable": true
          },
          "wake_on_lan_subnet": {
            "type": "string",
            "nullable": true
          },
          "broker_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "warning",
              "other",
              "preparing_session",
              "connected",
              "active",
              "disconnected",
              "reconnecting",
              "non_brokered_session",
              "error",
              "unmanaged",
              "unknown",
              "unavailable",
              "off",
              "on",
              "suspended",
              "turning_on",
              "turning_off",
              "suspending",
              "resuming",
              "not_reporting",
              "unregistered",
              "available",
              "inuse",
              "maintenance_or_drain_mode"
            ],
            "description": "Estado del broker."
          },
          "status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "online",
              "offline"
            ],
            "description": "Estado de conectividad del workspace."
          }
        },
        "required": [
          "id"
        ]
      },
      "WorkspaceGroupDetailResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "description": "ID del grupo de workspaces"
          },
          "name": {
            "type": "string",
            "description": "Nombre del grupo de workspaces"
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Descripción del grupo de workspaces"
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "description": "Identificador de organización"
          },
          "create_user": {
            "type": "string",
            "nullable": true,
            "pattern": "^[0-9a-f]{24}$",
            "description": "ID del usuario que creó el grupo de workspaces"
          },
          "create_date": {
            "type": "string",
            "format": "date-time",
            "description": "Marca de tiempo de creación"
          },
          "type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "static",
              "dynamic",
              "entra_id"
            ],
            "description": "Tipo de grupo de workspaces"
          },
          "filter": {
            "type": "string",
            "nullable": true,
            "description": "Cadena de filtro para grupo de workspaces dinámicos"
          },
          "location": {
            "$ref": "#/components/schemas/WorkspaceLocationV1",
            "nullable": true,
            "description": "Información de ubicación del grupo de workspaces"
          },
          "entra_id_source": {
            "$ref": "#/components/schemas/WorkspaceGroupEntraIdSourceV1",
            "nullable": true,
            "description": "Información de origen de Entra ID para el grupo de workspaces"
          }
        },
        "required": [
          "id",
          "name",
          "organization_id",
          "create_date"
        ]
      },
      "WorkspaceGroupEntraIdSourceV1": {
        "type": "object",
        "properties": {
          "resource_id": {
            "type": "string",
            "description": "ID de recurso de Entra ID"
          },
          "resource_type": {
            "type": "string",
            "enum": [
              "group",
              "administrative_unit"
            ],
            "description": "Tipo de recurso de Entra ID"
          },
          "resource_name": {
            "type": "string",
            "description": "Nombre del recurso de Entra ID"
          }
        },
        "required": [
          "resource_id",
          "resource_type",
          "resource_name"
        ]
      },
      "WorkspaceLocationV1": {
        "type": "object",
        "properties": {
          "latitude": {
            "type": "number",
            "description": "Coordenada de latitud"
          },
          "longitude": {
            "type": "number",
            "description": "Coordenada de longitud"
          },
          "address": {
            "type": "string",
            "description": "Cadena de dirección"
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Descripción de la ubicación"
          }
        },
        "required": [
          "latitude",
          "longitude",
          "address"
        ]
      },
      "WorkspaceGroupScheduleV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "description": "El identificador único de la programación",
            "example": "507f1f77bcf86cd799439060"
          },
          "cron_expression": {
            "type": "string",
            "description": "Expresión cron que define cuándo se ejecuta la programación. Formato: minuto hora día-del-mes mes día-de-la-semana.",
            "example": "0 8 * * 1-5"
          },
          "time_zone": {
            "type": "string",
            "description": "Zona horaria para la ejecución de la programación. Admite identificadores IANA (p. ej., 'America/New_York') y Windows (p. ej., 'Pacific Standard Time').",
            "example": "Eastern Standard Time"
          },
          "type": {
            "type": "string",
            "enum": [
              "start",
              "stop",
              "restart"
            ],
            "description": "Tipo de operación de energía: START (enciende), STOP (apaga), RESTART (reinicia Workspaces)"
          },
          "intermediate_device": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "nullable": true,
            "description": "El identificador único del workspace del dispositivo intermedio, si está configurado. Se usa para acciones de Wake on LAN en redes seguras.",
            "example": "507f1f77bcf86cd799439050"
          },
          "create_user": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "nullable": true,
            "description": "ID de usuario que creó la programación",
            "example": "507f1f77bcf86cd799439070"
          },
          "updated_by": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "nullable": true,
            "description": "ID de usuario que actualizó por última vez la programación",
            "example": "507f1f77bcf86cd799439070"
          },
          "update_date": {
            "type": "string",
            "format": "date-time",
            "description": "Marca temporal de la última actualización de la programación",
            "example": "2024-01-15T10:30:00Z"
          }
        },
        "required": [
          "id",
          "cron_expression",
          "time_zone",
          "type",
          "update_date"
        ]
      },
      "WorkspaceGroupScheduleV1ListResponseV1": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkspaceGroupScheduleV1"
            },
            "description": "Arreglo de programaciones cron para el grupo de workspaces"
          }
        },
        "required": [
          "data"
        ]
      },
      "WorkspaceGroupWorkspaceItemV1": {
        "type": "object",
        "description": "Elemento Workspace en la lista de Workspaces del grupo de workspaces (proyección reducida).",
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "organization_id": {
            "type": "string",
            "nullable": true,
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "related_environment": {
            "type": "string",
            "nullable": true
          },
          "operative_system": {
            "type": "string",
            "nullable": true
          },
          "ip_address": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "last_user": {
            "type": "string",
            "nullable": true
          },
          "total_ram": {
            "type": "number",
            "nullable": true
          }
        },
        "required": [
          "id"
        ]
      },
      "WorkspaceGroupWorkspaceListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkspaceGroupWorkspaceItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "WorkspaceGroupListItemV1ListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkspaceGroupListItemV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "WorkspaceGroupListItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "description": "ID del grupo de workspaces"
          },
          "name": {
            "type": "string",
            "description": "Nombre del grupo de workspaces"
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Descripción del grupo de workspaces"
          },
          "organization_id": {
            "type": "string",
            "pattern": "^[0-9a-f]{24}$",
            "description": "Identificador de la organización"
          },
          "create_user": {
            "type": "string",
            "nullable": true,
            "pattern": "^[0-9a-f]{24}$",
            "description": "ID del usuario que creó el grupo de workspaces"
          },
          "create_date": {
            "type": "string",
            "format": "date-time",
            "description": "Marca de tiempo de creación"
          },
          "type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "static",
              "dynamic",
              "entra_id"
            ],
            "description": "Tipo de grupos de workspaces"
          },
          "filter": {
            "type": "string",
            "nullable": true,
            "description": "Cadena de filtro para grupos de workspaces dinámicos"
          },
          "location": {
            "$ref": "#/components/schemas/WorkspaceLocationV1",
            "nullable": true,
            "description": "Información de ubicación del grupo de workspaces"
          },
          "entra_id_source": {
            "$ref": "#/components/schemas/WorkspaceGroupEntraIdSourceV1",
            "nullable": true,
            "description": "Información de origen de Entra ID para el grupo de workspaces"
          }
        },
        "required": [
          "id"
        ]
      },
      "WorkspaceListResponseV1": {
        "type": "object",
        "properties": {
          "has_next": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkspacePublicV1"
            }
          }
        },
        "required": [
          "has_next",
          "data"
        ]
      },
      "UpdateFlowV1Request": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/components/schemas/MultilangField",
            "description": "Nombre del flujo. Se requiere al menos una clave de idioma; cada valor entre 1 y 512 caracteres."
          },
          "description": {
            "$ref": "#/components/schemas/MultilangField",
            "description": "Descripción del flujo. Se requiere al menos una clave de idioma; cada valor entre 1 y 512 caracteres."
          },
          "detection_only": {
            "type": "boolean"
          },
          "cooldown_minutes": {
            "type": "number",
            "minimum": 10,
            "maximum": 1440,
            "description": "Tiempo de espera en minutos. Debe estar entre 10 y 1440."
          },
          "enabled": {
            "type": "boolean",
            "description": "Indica si el flujo está habilitado. PUT espera una definición completa; este campo es obligatorio."
          },
          "init_text": {
            "$ref": "#/components/schemas/MultilangField",
            "nullable": true,
            "description": "Mensaje de texto inicial. Obligatorio en PUT. Envia null para limpiar; en caso contrario, objeto con al menos una clave de idioma; cada valor entre 1 y 512 caracteres."
          },
          "ok_text": {
            "$ref": "#/components/schemas/MultilangField",
            "nullable": true,
            "description": "Mensaje de texto de éxito. Obligatorio en PUT. Envia null para limpiar; en caso contrario, objeto con al menos una clave de idioma; cada valor entre 1 y 512 caracteres."
          },
          "ko_text": {
            "$ref": "#/components/schemas/MultilangField",
            "nullable": true,
            "description": "Mensaje de texto de error. Obligatorio en PUT. Envia null para limpiar; en caso contrario, objeto con al menos una clave de idioma; cada valor entre 1 y 512 caracteres."
          },
          "target": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "all_workspaces",
                  "workspaces",
                  "workspace_groups",
                  "reporting_groups"
                ]
              },
              "ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 512
                }
              }
            },
            "required": [
              "type"
            ]
          },
          "microservice_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$"
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlowConditionInputV1"
            }
          }
        },
        "required": [
          "name",
          "description",
          "detection_only",
          "cooldown_minutes",
          "enabled",
          "init_text",
          "ok_text",
          "ko_text",
          "target",
          "microservice_id",
          "conditions"
        ]
      },
      "UpdateReportingGroupRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 512,
            "description": "El nombre del grupo de reporte. Debe ser único dentro de la organización.",
            "example": "Grupo de reporte de producción actualizado"
          },
          "description": {
            "type": "string",
            "maxLength": 1000,
            "description": "Opcional. Una descripción del propósito y uso del grupo de reporte.",
            "example": "Grupo de reporte actualizado para entornos de producción"
          },
          "patch_policy_target_id": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del destino de política de parches que se asociará con este grupo de reporte. Establézcalo en null u omítalo para eliminar la asociación.",
            "example": "507f1f77bcf86cd799439040"
          },
          "fishing_pattern": {
            "type": "string",
            "maxLength": 250,
            "description": "Opcional. Un patrón de expresión regular usado para hacer coincidir dispositivos. Debe ser un patrón regex válido. Si se proporciona, también se debe especificar fishing_pattern_field. Omítalo para eliminar el patrón.",
            "example": "Estaciones de trabajo Windows"
          },
          "fishing_pattern_field": {
            "type": "string",
            "enum": [
              "full_name",
              "description",
              "ou",
              "current_subnet"
            ],
            "description": "Opcional. Campo sobre el que se aplica fishing_pattern. Obligatorio si se proporciona fishing_pattern. Valores válidos: full_name (nombre completo del dispositivo), description (descripción del dispositivo), ou (unidad organizativa), current_subnet (subred actual).",
            "example": "full_name"
          },
          "intermediate_device1": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del Workspace del primer dispositivo intermedio. Los dispositivos intermedios se usan para acciones Wake-on-LAN en redes seguras, permitiendo el encendido remoto de los dispositivos objetivo a través de puertas de enlace intermedias. Los dispositivos intermedios deben definirse secuencialmente y sin huecos. Si se omite, se limpiarán todos los dispositivos intermedios. Si se proporcionan intermediate_device2 o intermediate_device3, este campo es obligatorio.",
            "example": "507f1f77bcf86cd799439050"
          },
          "intermediate_device2": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del Workspace del segundo dispositivo intermedio. Se usa para acciones Wake-on-LAN en redes seguras. Requiere que se proporcione intermediate_device1. Si se omite mientras intermediate_device1 está proporcionado, este y intermediate_device3 se limpiarán. Si se proporciona intermediate_device3, este campo es obligatorio.",
            "example": "507f1f77bcf86cd799439051"
          },
          "intermediate_device3": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del Workspace del tercer dispositivo intermedio. Se usa para acciones Wake on LAN en redes seguras. Requiere que se proporcionen intermediate_device1 e intermediate_device2. Si se omite mientras intermediate_device1 e intermediate_device2 están proporcionados, este campo se limpiará.",
            "example": "507f1f77bcf86cd799439052"
          }
        },
        "required": [
          "name"
        ],
        "description": "Cuerpo de la solicitud para actualizar un grupo de reporte existente. Este endpoint implementa semántica de reemplazo completo: todos los campos actualizables deben incluirse. Omitir campos opcionales los limpiará (comportamiento idempotente). Los dispositivos intermedios se usan para acciones Wake on LAN en redes seguras, permitiendo el encendido remoto de dispositivos a través de puertas de enlace intermedias. Los dispositivos intermedios deben definirse secuencialmente: no puede definir intermediate_device2 sin intermediate_device1, ni intermediate_device3 sin intermediate_device2. Todos los IDs de Workspace de dispositivos intermedios deben existir y pertenecer a la organización."
      },
      "UpdateTenantRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 512
          }
        },
        "required": [
          "name"
        ]
      },
      "UpdateWorkspaceGroupScheduleRequestV1": {
        "type": "object",
        "properties": {
          "cron_expression": {
            "type": "string",
            "description": "Expresión cron que define cuándo debe ejecutarse la programación. Formato: minuto hora día-del-mes mes día-de-la-semana. Ejemplos: '0 8 * * 1-5' (8 AM entre semana), '0 0 * * 0' (medianoche del domingo), '30 14 * * *' (2:30 PM diariamente). Día-de-la-semana: 0=domingo, 1=lunes, ..., 6=sábado. Admite rangos (1-5), listas (1,3,5) y comodines (*). Debe ser un formato de expresión cron válido con 5 campos separados por espacios.",
            "example": "0 8 * * 1-5"
          },
          "time_zone": {
            "type": "string",
            "description": "Zona horaria para la ejecución de la programación. Admite identificadores IANA (p. ej., 'America/New_York') y Windows (p. ej., 'Pacific Standard Time').",
            "example": "Eastern Standard Time"
          },
          "type": {
            "type": "string",
            "enum": [
              "start",
              "stop",
              "restart"
            ],
            "description": "Tipo de operación de energía a realizar. START: Enciende los Workspaces del grupo. STOP: Apaga los Workspaces del grupo. RESTART: Reinicia los Workspaces del grupo.",
            "example": "start"
          },
          "intermediate_device": {
            "type": "string",
            "maxLength": 24,
            "pattern": "^[0-9a-f]{24}$",
            "description": "Opcional. El identificador único del Workspace de dispositivo intermedio. Si se proporciona, indica que debe usarse un dispositivo intermedio para operaciones de Wake-on-LAN. Solo aplica a programaciones START. Se usa para acciones de Wake-on-LAN en redes seguras. El Workspace debe existir y pertenecer a la organización. Para eliminar un dispositivo intermedio, omita este campo.",
            "example": "507f1f77bcf86cd799439050"
          }
        },
        "required": [
          "cron_expression",
          "time_zone",
          "type"
        ]
      },
      "WorkspaceGroupUpdateRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 512
          },
          "description": {
            "type": "string",
            "maxLength": 512
          },
          "location": {
            "$ref": "#/components/schemas/WorkspaceGroupBaseUpdateLocationInputV1"
          }
        },
        "required": [
          "name",
          "description",
          "location"
        ]
      },
      "WorkspacesUpdateRequestV1": {
        "type": "object",
        "properties": {
          "workspace_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 24,
              "pattern": "^[0-9a-f]{24}$"
            },
            "description": "Arreglo de IDs de Workspace"
          }
        },
        "required": [
          "workspace_ids"
        ]
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Solicitud incorrecta",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "No autorizado",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "NotFound": {
        "description": "No encontrado",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "Demasiadas solicitudes",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "InternalServerError": {
        "description": "Error interno del servidor",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "UnprocessableEntity": {
        "description": "Entidad no procesable",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "Conflict": {
        "description": "Conflicto",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      }
    }
  }
}
