{
  "openapi": "3.0.1",
  "info": {
    "title": "WebRobot ETL API",
    "description": "API for managing projects, jobs, datasets, and ETL pipelines on WebRobot.\n\n## Authentication\n\nThe API uses API Keys for authentication. Include the `X-API-Key` header in all requests.\n\n## Base URL\n\n- Production: `https://api.webrobot.eu/api`\n- Development: `http://localhost:8020/api`\n\n## Rate Limiting\n\nRequests are limited to 1000 requests per minute per API key.\n",
    "version": "1.0.0",
    "contact": {
      "name": "WebRobot Support",
      "email": "support@webrobot.eu"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://webrobot.eu"
    }
  },
  "servers": [
    {
      "url": "https://api.webrobot.eu/api",
      "description": "Production"
    },
    {
      "url": "http://localhost:8020/api",
      "description": "Local development"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "paths": {
    "/webrobot/cloud/scheduler/cronjobs": {
      "get": {
        "tags": [
          "Cloud",
          "Scheduler"
        ],
        "summary": "List all Kubernetes CronJobs",
        "description": "Returns the list of all CronJobs configured in the Kubernetes cluster.\n\nCronJobs are used to schedule periodic execution of Spark jobs.\n",
        "operationId": "listCronJobs",
        "parameters": [
          {
            "name": "namespace",
            "in": "query",
            "description": "Kubernetes namespace to filter (optional)",
            "schema": {
              "type": "string",
              "example": "webrobot"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of CronJobs retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Cloud",
          "Scheduler"
        ],
        "summary": "Create a new Kubernetes CronJob",
        "description": "Creates a new Kubernetes CronJob to schedule periodic execution of a Spark job.\n\nThe CronJob will execute the job according to the specified schedule (cron format).\n",
        "operationId": "createCronJob",
        "requestBody": {
          "required": true,
          "description": "Configuration of the CronJob to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CronJobRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "CronJob created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/cloud/scheduler/cronjobs/{name}": {
      "get": {
        "tags": [
          "Cloud",
          "Scheduler"
        ],
        "summary": "Get a specific CronJob",
        "description": "Returns the details of a specific Kubernetes CronJob.\n",
        "operationId": "getCronJob",
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "description": "CronJob name",
            "schema": {
              "type": "string",
              "example": "daily-etl-job"
            }
          },
          {
            "name": "namespace",
            "in": "query",
            "description": "Kubernetes namespace (optional)",
            "schema": {
              "type": "string",
              "example": "webrobot"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "CronJob details",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "CronJob not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Cloud",
          "Scheduler"
        ],
        "summary": "Delete a Kubernetes CronJob",
        "description": "Deletes a Kubernetes CronJob and all its scheduled executions.\n\n**Warning:** This operation is irreversible.\n",
        "operationId": "deleteCronJob",
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "description": "Name of the CronJob to delete",
            "schema": {
              "type": "string",
              "example": "daily-etl-job"
            }
          },
          {
            "name": "namespace",
            "in": "query",
            "description": "Kubernetes namespace (optional)",
            "schema": {
              "type": "string",
              "example": "webrobot"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "CronJob deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "CronJob not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/cloud/spark/capabilities": {
      "get": {
        "tags": [
          "Cloud",
          "Spark"
        ],
        "summary": "Get Spark cluster capabilities",
        "description": "Returns information about available capabilities and configurations of the Spark cluster,\nincluding supported versions, available resources, and configurations.\n",
        "operationId": "getCapabilities",
        "responses": {
          "200": {
            "description": "Spark cluster capabilities",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/cloud/spark/info": {
      "get": {
        "tags": [
          "Cloud",
          "Spark"
        ],
        "summary": "Get Spark cluster information",
        "description": "Returns general information about the Spark cluster, including versions, configurations\ne status of the cluster.\n",
        "operationId": "getInfo",
        "responses": {
          "200": {
            "description": "Spark cluster information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/cloud/spark/health": {
      "get": {
        "tags": [
          "Cloud",
          "Spark",
          "Health"
        ],
        "summary": "Spark service health check",
        "description": "Checks the health status of the Spark service and cluster.\n",
        "operationId": "healthCheck",
        "responses": {
          "200": {
            "description": "Spark service operational",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "UP"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Spark service unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/cloud/training/info": {
      "get": {
        "tags": [
          "Cloud",
          "Training"
        ],
        "summary": "Get training service information",
        "description": "Returns information about the AI/ML training service, including versions and configurations.\n",
        "operationId": "getInfo_1",
        "responses": {
          "200": {
            "description": "Training service information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/cloud/training/health": {
      "get": {
        "tags": [
          "Cloud",
          "Training",
          "Health"
        ],
        "summary": "Training service health check",
        "description": "Checks the health status of the AI/ML training service.\n",
        "operationId": "healthCheck_1",
        "responses": {
          "200": {
            "description": "Training service operational",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "UP"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Training service unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/{country}/execute": {
      "post": {
        "tags": [
          "EAN Plugin",
          "Jobs"
        ],
        "summary": "Execute EAN Image Sourcing job for a country",
        "description": "Executes an EAN Image Sourcing job for the specified country.\n\nThis endpoint triggers a Spark job that searches for product images\nbased on EAN codes in the dataset for the given country.\n",
        "operationId": "executeJob",
        "parameters": [
          {
            "name": "country",
            "in": "path",
            "required": true,
            "description": "ISO country code (e.g. \"denmark\", \"italy\", \"france\")",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/bootstrap/status": {
      "get": {
        "tags": [
          "EAN Plugin",
          "Bootstrap"
        ],
        "summary": "Get bootstrap status",
        "description": "Returns the status of the EAN Image Sourcing bootstrap process.\n\nThe bootstrap process initializes the dataset and prepares it for\nimage sourcing operations.\n",
        "operationId": "getBootstrapStatus",
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/{country}/images": {
      "post": {
        "tags": [
          "EAN Plugin",
          "Images"
        ],
        "summary": "Search and retrieve images for EAN products",
        "description": "Searches for images of products identified by EAN codes in the dataset of the specified country.\n\nReturns images with:\n- Full image URL\n- Base64 data (if requested)\n- Similarity schours (0.0 - 1.0)\n- Additional metadata\n\n**Note:**\n- Images are searched in the most recent available dataset\n- Results are sorted by descending score\n- The `includeBase64` field in the request controls whether to include base64 data\n",
        "operationId": "getImagesSimplified",
        "parameters": [
          {
            "name": "country",
            "in": "path",
            "required": true,
            "description": "ISO country code (e.g. \"denmark\", \"italy\", \"france\")",
            "schema": {
              "type": "string",
              "example": "denmark"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Image search request for EAN products.\n\nSpecifies the EAN codes of products to search images for.\n",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "eans"
                ],
                "properties": {
                  "eans": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "List of EAN codes to search",
                    "example": [
                      "5901234123457",
                      "5901234123458"
                    ]
                  },
                  "includeBase64": {
                    "type": "boolean",
                    "description": "If true, includes base64 data of images",
                    "default": false,
                    "example": true
                  },
                  "limit": {
                    "type": "integer",
                    "description": "Maximum number of images per product",
                    "default": 5,
                    "example": 10
                  }
                }
              },
              "examples": {
                "basic": {
                  "summary": "Basic search without base64",
                  "value": {
                    "eans": [
                      "5901234123457"
                    ]
                  }
                },
                "withBase64": {
                  "summary": "Search with base64 data",
                  "value": {
                    "eans": [
                      "5901234123457",
                      "5901234123458"
                    ],
                    "includeBase64": true,
                    "limit": 10
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Images found successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "ean": {
                            "type": "string",
                            "description": "Product EAN code",
                            "example": "5901234123457"
                          },
                          "images": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "url": {
                                  "type": "string",
                                  "description": "Full image URL",
                                  "example": "https://example.com/image.jpg"
                                },
                                "base64": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Base64 data of the image (if requested)"
                                },
                                "schours": {
                                  "type": "number",
                                  "format": "float",
                                  "description": "Similarity schours (0.0 - 1.0)",
                                  "example": 0.85
                                },
                                "source": {
                                  "type": "string",
                                  "description": "Image source",
                                  "example": "google_images"
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - empty EAN list or invalid format",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Dataset not found for the specified country",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/info": {
      "get": {
        "tags": [
          "EAN Plugin",
          "Info"
        ],
        "summary": "Get EAN Image Sourcing plugin information",
        "description": "Returns information about the EAN Image Sourcing plugin, including\nversion, configuration, and available features.\n",
        "operationId": "getPluginInfo",
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/{country}/status": {
      "get": {
        "tags": [
          "EAN Plugin",
          "Jobs"
        ],
        "summary": "Get status of the last EAN job executed for a country",
        "description": "Returns information about the last EAN Image Sourcing job executed for the specified country.\n\nIncludes execution details such as:\n- Job status (PENDING, RUNNING, COMPLETED, FAILED)\n- Start and end timestamps\n- Execution time\n- Spark UI URL (if available)\n- Number of executor pods\n- Error messages (if failed)\n",
        "operationId": "getStatus",
        "parameters": [
          {
            "name": "country",
            "in": "path",
            "required": true,
            "description": "ISO country code (e.g. \"denmark\", \"italy\", \"france\")",
            "schema": {
              "type": "string",
              "example": "denmark"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job status retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "country": {
                      "type": "string",
                      "example": "denmark"
                    },
                    "hasJobs": {
                      "type": "boolean",
                      "description": "Indicates if there are jobs for this country"
                    },
                    "latestJobStatus": {
                      "type": "string",
                      "enum": [
                        "PENDING",
                        "RUNNING",
                        "COMPLETED",
                        "FAILED"
                      ],
                      "example": "COMPLETED"
                    },
                    "latestJobId": {
                      "type": "string",
                      "example": "210"
                    },
                    "projectId": {
                      "type": "string",
                      "example": "98"
                    },
                    "latestExecution": {
                      "type": "object",
                      "properties": {
                        "executionId": {
                          "type": "string",
                          "example": "spark-2d53940045a6-95379617"
                        },
                        "status": {
                          "type": "string",
                          "example": "COMPLETED"
                        },
                        "submittedAt": {
                          "type": "string",
                          "format": "date-time",
                          "example": "2025-12-10T19:36:47.798498"
                        },
                        "completedAt": {
                          "type": "string",
                          "format": "date-time",
                          "example": "2025-12-10T19:58:04.825877"
                        },
                        "executionTimeSeconds": {
                          "type": "integer",
                          "description": "Execution time in seconds",
                          "example": 1277
                        },
                        "errorMessage": {
                          "type": "string",
                          "nullable": true,
                          "description": "Error message if the job failed"
                        },
                        "sparkUiUrl": {
                          "type": "string",
                          "nullable": true,
                          "description": "Spark UI URL to monitor the execution"
                        },
                        "executorPodCount": {
                          "type": "integer",
                          "description": "Number of executor pods used",
                          "example": 2
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No job found for the specified country",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/{country}/query": {
      "post": {
        "tags": [
          "EAN Plugin",
          "Query"
        ],
        "summary": "Execute a query on the EAN dataset",
        "description": "Executes a custom query on the EAN dataset of the specified country.\n\nAllows querying the dataset with custom filters and conditions.\n",
        "operationId": "queryImages",
        "parameters": [
          {
            "name": "country",
            "in": "path",
            "required": true,
            "description": "ISO country code (e.g. \"denmark\", \"italy\", \"france\")",
            "schema": {
              "type": "string",
              "example": "denmark"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Query to execute on the dataset",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Query results",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Dataset not found for the specified country",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/{country}/schedule": {
      "post": {
        "tags": [
          "EAN Plugin",
          "Scheduler"
        ],
        "summary": "Schedule a recurring EAN job",
        "description": "Creates or updates the schedule for a recurring EAN Image Sourcing job for a country.\n\nThe job will be executed automatically according to the specified schedule (cron format).\n",
        "operationId": "scheduleJob",
        "parameters": [
          {
            "name": "country",
            "in": "path",
            "required": true,
            "description": "ISO country code (e.g. \"denmark\", \"italy\", \"france\")",
            "schema": {
              "type": "string",
              "example": "denmark"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Schedule configuration (cron format)",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Schedule created/updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid schedule",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ean-image-sourcing/{country}/upload": {
      "post": {
        "tags": [
          "EAN Plugin",
          "Upload"
        ],
        "summary": "Upload an EAN dataset",
        "description": "Uploads a new EAN dataset for the specified country.\n\nThe file must be in CSV format with EAN codes and related data.\n",
        "operationId": "uploadCsv",
        "parameters": [
          {
            "name": "country",
            "in": "path",
            "required": true,
            "description": "ISO country code (e.g. \"denmark\", \"italy\", \"france\")",
            "schema": {
              "type": "string",
              "example": "denmark"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "CSV file to upload",
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FormDataMultiPart"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dataset uploaded successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid file or wrong format",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/training/{jobId}": {
      "delete": {
        "tags": [
          "AI Providers",
          "Training"
        ],
        "summary": "Cancel an AI training job",
        "description": "Cancels an AI training job that is running or queued for the specified provider.\n\n**Warning:** This operation is irreversible and interrupts training if in progress.\n",
        "operationId": "cancelTraining",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name (e.g. \"huggingface\", \"openai\", \"cohere\")",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "ID of the training job to cancel",
            "schema": {
              "type": "string",
              "example": "job-12345"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job cancelled successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/training/{jobId}/download": {
      "get": {
        "tags": [
          "AI Providers",
          "Training"
        ],
        "summary": "Download a trained model",
        "description": "Downloads a trained AI model from the specified provider.\n\nThe model is downloaded to the specified path or the default path.\n",
        "operationId": "downloadModel",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Training job ID",
            "schema": {
              "type": "string",
              "example": "job-12345"
            }
          },
          {
            "name": "outputPath",
            "in": "query",
            "description": "Destination path for download (optional)",
            "schema": {
              "type": "string",
              "example": "/path/to/models"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Model downloaded successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Model or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/cost-estimate": {
      "post": {
        "tags": [
          "AI Providers",
          "Training"
        ],
        "summary": "Estimate the cost of a training job",
        "description": "Calculates a cost estimate for an AI training job based on the specified parameters.\n\nThe estimate includes compute, storage and other necessary service costs.\n",
        "operationId": "estimateCost",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Training job parameters for estimation",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingRequestBean"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated cost estimate",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "estimatedCost": {
                      "type": "number",
                      "format": "float",
                      "description": "Costo stimato in USD"
                    },
                    "currency": {
                      "type": "string",
                      "example": "USD"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Parametri non validi",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/models": {
      "get": {
        "tags": [
          "AI Providers",
          "Models"
        ],
        "summary": "Get models supported by a provider",
        "description": "Returns the list of all AI models supported by the specified provider,\nincluding information on versions, capabilities and requirements.\n",
        "operationId": "getSupportedModels",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of supported models",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Provider not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers": {
      "get": {
        "tags": [
          "AI Providers"
        ],
        "summary": "Get list of supported AI providers",
        "description": "Returns the list of all AI providers supported by the platform,\nincluding information on available capabilities and configurations.\n",
        "operationId": "getSupportedProviders",
        "responses": {
          "200": {
            "description": "List of supported providers",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/training/{jobId}/logs": {
      "get": {
        "tags": [
          "AI Providers",
          "Training"
        ],
        "summary": "Get logs of a training job",
        "description": "Returns the execution logs of an AI training job.\n\nThe logs include information on progress, errors, and training metrics.\n",
        "operationId": "getTrainingLogs",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Training job ID",
            "schema": {
              "type": "string",
              "example": "job-12345"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Training job logs",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "logs": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/training/{jobId}/status": {
      "get": {
        "tags": [
          "AI Providers",
          "Training"
        ],
        "summary": "Get status of a training job",
        "description": "Returns the current status of an AI training job, including information on\nprogress, duration and any errors.\n",
        "operationId": "getTrainingStatus",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Training job ID",
            "schema": {
              "type": "string",
              "example": "job-12345"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Training job status",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "PENDING",
                        "RUNNING",
                        "COMPLETED",
                        "FAILED"
                      ]
                    },
                    "progress": {
                      "type": "number",
                      "format": "float",
                      "description": "Percentuale di completamento (0-100)"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/huggingface/models/publish": {
      "post": {
        "tags": [
          "AI Providers",
          "Models"
        ],
        "summary": "Publish a model to Hugging Face",
        "description": "Publishes a trained model to the Hugging Face Model Hub platform.\n\nThe model must have been trained and must be available for publication.\n",
        "operationId": "publishModel",
        "requestBody": {
          "required": true,
          "description": "Information for model publication",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ModelPublishRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Model published successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/training": {
      "post": {
        "tags": [
          "AI Providers",
          "Training"
        ],
        "summary": "Start a new AI training job",
        "description": "Starts a new job of training for an AI model using the provider specified.\n\nThe job is executed in the background and can be monitored through the status and logs endpoints.\n",
        "operationId": "startTraining",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Training job configuration",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingRequestBean"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Training job started successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jobId": {
                      "type": "string",
                      "description": "Created training job ID"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid configuration",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/ai-providers/providers/{provider}/datasets": {
      "post": {
        "tags": [
          "AI Providers",
          "Datasets"
        ],
        "summary": "Upload a dataset for AI training",
        "description": "Uploads a dataset to use for training AI models on the provider specified.\n\nThe dataset must be in a format supported by the provider.\n",
        "operationId": "uploadDataset",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "AI provider name",
            "schema": {
              "type": "string",
              "example": "huggingface"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Information on the dataset to upload",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatasetUploadRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Dataset uploaded successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid dataset",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/agents": {
      "post": {
        "tags": [
          "Agents"
        ],
        "summary": "Create a new PySpark agent",
        "description": "Creates a new PySpark agent that can be used to execute ETL jobs.\n\nAn agent contains the PySpark code that is executed when a job is started.\nThe agent must be associated with a category.\n",
        "operationId": "createAgent",
        "requestBody": {
          "required": true,
          "description": "Agent data to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Agent created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `agents:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/agents/{agentId}": {
      "delete": {
        "tags": [
          "Agents"
        ],
        "summary": "Delete an agent",
        "description": "Deletes a PySpark agent from the system.\n\n**Warning:** This operation is irreversible. Jobs that use this agent\nwill no longer be able to be executed.\n",
        "operationId": "deleteAgent",
        "parameters": [
          {
            "name": "agentId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the agent to delete",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Agent deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `agents:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Agent not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/agents/{categoryId}/{agentId}": {
      "get": {
        "tags": [
          "Agents"
        ],
        "summary": "Get a specific agent",
        "description": "Returns the details of a specific PySpark agent, including the source code.\n",
        "operationId": "getAgent",
        "parameters": [
          {
            "name": "categoryId",
            "in": "path",
            "required": true,
            "description": "ID of the category the agent belongs to",
            "schema": {
              "type": "string",
              "example": "1"
            }
          },
          {
            "name": "agentId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the agent",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Agent details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `agents:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Agent not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Agents"
        ],
        "summary": "Update an agent",
        "description": "Updates the data of an existing PySpark agent, including the source code.\n\n**Note:** Updating the source code requires that no job is running\nwith this agent.\n",
        "operationId": "updateAgent",
        "parameters": [
          {
            "name": "categoryId",
            "in": "path",
            "required": true,
            "description": "ID of the category the agent belongs to",
            "schema": {
              "type": "string",
              "example": "1"
            }
          },
          {
            "name": "agentId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the agent to update",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated agent data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Agent updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `agents:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Agent not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Agent in use - cannot update",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/agents/{categoryId}/name/{agentName}": {
      "get": {
        "tags": [
          "Agents"
        ],
        "summary": "Get an agent by name",
        "description": "Returns the details of a PySpark agent searching by name within of a category.\n",
        "operationId": "getAgentFromName",
        "parameters": [
          {
            "name": "categoryId",
            "in": "path",
            "required": true,
            "description": "Category ID",
            "schema": {
              "type": "string",
              "example": "1"
            }
          },
          {
            "name": "agentName",
            "in": "path",
            "required": true,
            "description": "Agent name",
            "schema": {
              "type": "string",
              "example": "my-agent"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Agent details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `agents:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Agent not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/agents/{categoryId}": {
      "get": {
        "tags": [
          "Agents"
        ],
        "summary": "Get all agents of a category",
        "description": "Returns the list of all PySpark agents belonging to a specific category.\n",
        "operationId": "getAllAgents",
        "parameters": [
          {
            "name": "categoryId",
            "in": "path",
            "required": true,
            "description": "Category ID",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of agents in the category",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AgentDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `agents:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Category not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/categories": {
      "get": {
        "tags": [
          "Categories"
        ],
        "summary": "Get all categories",
        "description": "Returns the list of all categories available in the system.\n\nCategories are used to organize projects, agents, and jobs.\n",
        "operationId": "getAllCategories",
        "responses": {
          "200": {
            "description": "List of categories",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobCategoryDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Categories"
        ],
        "summary": "Create a new category",
        "description": "Creates a new category to organize projects, agents and jobs.\n",
        "operationId": "createCategory",
        "requestBody": {
          "required": true,
          "description": "Category data to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobCategoryDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Category created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobCategoryDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/categories/id/{categoryId}": {
      "get": {
        "tags": [
          "Categories"
        ],
        "summary": "Get a specific category",
        "description": "Returns the details of a specific category, including the list of associated projects.\n",
        "operationId": "getCategory",
        "parameters": [
          {
            "name": "categoryId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the category",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Category details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobCategoryDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Category not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Categories"
        ],
        "summary": "Update a category",
        "description": "Updates the data of an existing category.\n",
        "operationId": "updateCategory",
        "parameters": [
          {
            "name": "categoryId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the category to update",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated category data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobCategoryDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Category updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobCategoryDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Category not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Categories"
        ],
        "summary": "Delete a category",
        "description": "Deletes a category from the system.\n\n**Warning:** This operation is irreversible. Associated projects will not be deleted.\n",
        "operationId": "deleteCategory",
        "parameters": [
          {
            "name": "categoryId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the category to delete",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Category deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Category not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/categories/{categoryName}": {
      "get": {
        "tags": [
          "Categories"
        ],
        "summary": "Get a category by name",
        "description": "Returns the details of a category searching by name.\n",
        "operationId": "getCategoryFromName",
        "parameters": [
          {
            "name": "categoryName",
            "in": "path",
            "required": true,
            "description": "Category name",
            "schema": {
              "type": "string",
              "example": "my-category"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Category details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobCategoryDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Category not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/categories/test": {
      "get": {
        "tags": [
          "Categories",
          "Test"
        ],
        "summary": "Test endpoint for categories",
        "description": "Test endpoint to verify categories functionality.\n",
        "operationId": "test",
        "responses": {
          "200": {
            "description": "Test completed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/cloud-credentials": {
      "get": {
        "tags": [
          "Cloud Credentials"
        ],
        "summary": "Get all cloud credentials",
        "description": "Returns the list of all cloud credentials configured in the system,\nwith support for pagination and provider filtering.\n\nCloud credentials are used to access external services such as\nAWS, Azure, GCP, etc. during Spark job execution.\n",
        "operationId": "getAllCloudCredentials",
        "parameters": [
          {
            "name": "provider",
            "in": "query",
            "description": "Filter by cloud provider (e.g. \"aws\", \"azure\", \"gcp\")",
            "schema": {
              "type": "string",
              "example": "aws"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Page number (0-based)",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0,
              "example": 0
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Page size",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50,
              "example": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of cloud credentials",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CloudCredential"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Cloud Credentials"
        ],
        "summary": "Create a new cloud credential",
        "description": "Creates a new cloud credential to access external cloud services.\n\nCredentials are encrypted and stored securely in the database.\n",
        "operationId": "createCloudCredential",
        "requestBody": {
          "required": true,
          "description": "Cloud credential data to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudCredential"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Credential created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudCredential"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/cloud-credentials/id/{credentialId}": {
      "get": {
        "tags": [
          "Cloud Credentials"
        ],
        "summary": "Get a specific cloud credential",
        "description": "Returns the details of a specific cloud credential.\n\n**Note:** Sensitive credentials are returned in encrypted form.\n",
        "operationId": "getCloudCredentialById",
        "parameters": [
          {
            "name": "credentialId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the credential",
            "schema": {
              "type": "string",
              "example": "550e8400-e29b-41d4-a716-446655440000"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Credential details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudCredential"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Credential not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Cloud Credentials"
        ],
        "summary": "Update a cloud credential",
        "description": "Updates the data of an existing cloud credential.\n\nNew credentials are encrypted before being saved.\n",
        "operationId": "updateCloudCredential",
        "parameters": [
          {
            "name": "credentialId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the credential to update",
            "schema": {
              "type": "string",
              "example": "550e8400-e29b-41d4-a716-446655440000"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated credential data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudCredential"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Credential updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudCredential"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Credential not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Cloud Credentials"
        ],
        "summary": "Delete a cloud credential",
        "description": "Deletes a cloud credential from the system.\n\n**Warning:** This operation is irreversible. Jobs using this credential\nwill no longer be able to access cloud services.\n",
        "operationId": "deleteCloudCredential",
        "parameters": [
          {
            "name": "credentialId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the credential to delete",
            "schema": {
              "type": "string",
              "example": "550e8400-e29b-41d4-a716-446655440000"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Credential deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Credential not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/cloud-credentials/provider/{provider}": {
      "get": {
        "tags": [
          "Cloud Credentials"
        ],
        "summary": "Get cloud credentials by provider",
        "description": "Returns the list of all cloud credentials configured for a specific provider.\n",
        "operationId": "getCloudCredentialsByProvider",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "description": "Cloud provider name (e.g. \"aws\", \"azure\", \"gcp\")",
            "schema": {
              "type": "string",
              "example": "aws"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of credentials for the provider",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CloudCredential"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Provider not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/datasets": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "summary": "Get all datasets",
        "description": "Returns the list of all datasets available in the system, with support for filters.\n\nDatasets can be filtered by type, format, and indexing status.\n",
        "operationId": "getAllDatasets_1",
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "description": "Filter by dataset type",
            "schema": {
              "type": "string",
              "example": "parquet"
            }
          },
          {
            "name": "indexed",
            "in": "query",
            "description": "Filter by indexing status (true/false)",
            "schema": {
              "type": "string",
              "example": "true"
            }
          },
          {
            "name": "format",
            "in": "query",
            "description": "Filter by format (parquet, csv, json, etc.)",
            "schema": {
              "type": "string",
              "example": "parquet"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of datasets",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DatasetDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `datasets:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Datasets"
        ],
        "summary": "Create a new dataset",
        "description": "Creates a new dataset in the system with the specified configurations.\n\nThe dataset can be associated with a project and used as input or output for ETL jobs.\n",
        "operationId": "createDataset",
        "requestBody": {
          "required": true,
          "description": "Dataset data to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatasetDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Dataset created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatasetDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `datasets:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/datasets/{datasetId}": {
      "get": {
        "tags": [
          "Datasets"
        ],
        "summary": "Get a specific dataset",
        "description": "Returns the details of a specific dataset, including information on schema, format and path.\n",
        "operationId": "getDataset_1",
        "parameters": [
          {
            "name": "datasetId",
            "in": "path",
            "required": true,
            "description": "Dataset ID",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Dataset details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatasetDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `datasets:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Dataset not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Datasets"
        ],
        "summary": "Update a dataset",
        "description": "Updates the data of an existing dataset, including configurations and metadata.\n",
        "operationId": "updateDataset",
        "parameters": [
          {
            "name": "datasetId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the dataset to update",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated dataset data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatasetDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dataset updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatasetDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `datasets:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Dataset not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Datasets"
        ],
        "summary": "Delete a dataset",
        "description": "Deletes a dataset from the system.\n\n**Warning:** This operation is irreversible. Jobs that use this dataset\nas input or output may not work correctly.\n",
        "operationId": "deleteDataset_1",
        "parameters": [
          {
            "name": "datasetId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the dataset to delete",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Dataset deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `datasets:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Dataset not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/datasets/query": {
      "post": {
        "tags": [
          "Datasets",
          "Query"
        ],
        "summary": "Executes an SQL query on a dataset",
        "description": "Executes an SQL query (Presto/Trino) on a dataset to retrieve or analyze the data.\n\nThe query is executed on the MinIO catalog and can use all SQL features supported by Trino.\n",
        "operationId": "executeQuery",
        "requestBody": {
          "required": true,
          "description": "Query SQL da eseguire",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PrestoQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Query results",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/datasets/query/task/{taskId}/info": {
      "get": {
        "tags": [
          "Datasets",
          "Query",
          "Tasks"
        ],
        "summary": "Get information about the dataset associated with a task",
        "description": "Returns information about the output dataset associated with a specific task.\n",
        "operationId": "getDatasetInfoByTask",
        "parameters": [
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Task ID",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Dataset information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Task or dataset not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/datasets/query/columns": {
      "get": {
        "tags": [
          "Datasets",
          "Query"
        ],
        "summary": "Get columns of a table",
        "description": "Returns the list of columns and their types of a table in the Trino catalog.\n",
        "operationId": "getTableColumns",
        "parameters": [
          {
            "name": "catalog",
            "in": "query",
            "description": "Catalog name (default: minio)",
            "schema": {
              "type": "string",
              "default": "minio",
              "example": "minio"
            }
          },
          {
            "name": "schema",
            "in": "query",
            "description": "Schema name (default: default)",
            "schema": {
              "type": "string",
              "default": "default",
              "example": "default"
            }
          },
          {
            "name": "table",
            "in": "query",
            "required": true,
            "description": "Table name",
            "schema": {
              "type": "string",
              "example": "my_table"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of columns",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "type": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Table not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/datasets/query/tables": {
      "get": {
        "tags": [
          "Datasets",
          "Query"
        ],
        "summary": "List all available tables",
        "description": "Returns the list of all tables available in a specific catalog and schema.\n",
        "operationId": "listTables",
        "parameters": [
          {
            "name": "catalog",
            "in": "query",
            "description": "Catalog name (default: minio)",
            "schema": {
              "type": "string",
              "default": "minio",
              "example": "minio"
            }
          },
          {
            "name": "schema",
            "in": "query",
            "description": "Schema name (default: default)",
            "schema": {
              "type": "string",
              "default": "default",
              "example": "default"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of tables",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/datasets/query/task/{taskId}": {
      "post": {
        "tags": [
          "Datasets",
          "Query",
          "Tasks"
        ],
        "summary": "Executes an SQL query on the output dataset of a task",
        "description": "Executes a SQL query on the output dataset associated with a specific task.\n\nUseful for analyzing the results of a task after its execution.\n",
        "operationId": "queryDatasetByTask",
        "parameters": [
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Task ID",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "SQL query to execute",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PrestoQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Query results",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Task or dataset not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/etl-library-versions": {
      "get": {
        "tags": [
          "Admin",
          "ETL Library"
        ],
        "summary": "Get all ETL library versions",
        "description": "Returns the list of all ETL library versions available in the system,\nwith support for filtering by build type and active status.\n",
        "operationId": "getAllVersions",
        "parameters": [
          {
            "name": "buildType",
            "in": "query",
            "description": "Filter by build type (e.g. \"development\", \"production\")",
            "schema": {
              "type": "string",
              "example": "development"
            }
          },
          {
            "name": "activeOnly",
            "in": "query",
            "description": "Return only active versions",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of ETL versions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Admin",
          "ETL Library"
        ],
        "summary": "Create or update an ETL library version",
        "description": "Creates a new ETL library version or updates an existing one.\n\nETL versions are used to execute Spark jobs with specific library versions.\n",
        "operationId": "createOrUpdateVersion",
        "requestBody": {
          "required": true,
          "description": "ETL version data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Version created or updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
                }
              }
            }
          },
          "201": {
            "description": "Version created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/etl-library-versions/id/{id}": {
      "get": {
        "tags": [
          "Admin",
          "ETL Library"
        ],
        "summary": "Get a specific ETL version",
        "description": "Returns the details of a version of the library ETL identified by the ID.\n",
        "operationId": "getVersionById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Unique ID of the version",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ETL version details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Version not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Admin",
          "ETL Library"
        ],
        "summary": "Update an ETL version",
        "description": "Updates the data of an existing ETL library version.\n",
        "operationId": "updateVersion",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Unique ID of the version to update",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated version data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Version updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Version not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Admin",
          "ETL Library"
        ],
        "summary": "Delete an ETL version",
        "description": "Deletes an ETL library version from the system.\n\n**Warning:** This operation is irreversible. Jobs using this version\nmay not work correctly.\n",
        "operationId": "deleteVersion",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Unique ID of the version to delete",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Version deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Version not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/etl-library-versions/build-type/{buildType}/build-number/{buildNumber}": {
      "get": {
        "tags": [
          "Admin",
          "ETL Library"
        ],
        "summary": "Get an ETL version by build type and build number",
        "description": "Returns the details of a version of the library ETL identified by build type\nand build number.\n",
        "operationId": "getVersionByBuildTypeAndBuildNumber",
        "parameters": [
          {
            "name": "buildType",
            "in": "path",
            "required": true,
            "description": "Build type (e.g. \"development\", \"production\")",
            "schema": {
              "type": "string",
              "example": "development"
            }
          },
          {
            "name": "buildNumber",
            "in": "path",
            "required": true,
            "description": "Build number",
            "schema": {
              "type": "integer",
              "format": "int32",
              "example": 123
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ETL version details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EtlLibraryVersionApiDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Version not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/package/download": {
      "get": {
        "tags": [
          "Package"
        ],
        "summary": "Get URL for package download",
        "description": "Returns a temporary URL to download a package of projects and configurations.\n",
        "operationId": "getUrlDownload",
        "responses": {
          "200": {
            "description": "Download URL",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Temporary URL for download"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/package/upload": {
      "get": {
        "tags": [
          "Package"
        ],
        "summary": "Get URL for package upload",
        "description": "Returns a temporary URL to upload a package of projects and configurations.\n",
        "operationId": "getUrlUpload",
        "responses": {
          "200": {
            "description": "URL di upload",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Temporary URL for upload"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/package/export/all": {
      "get": {
        "tags": [
          "Package"
        ],
        "summary": "Start export of all projects",
        "description": "Starts the export process for all projects and system configurations\nin a compressed package.\n",
        "operationId": "start_export_All",
        "responses": {
          "200": {
            "description": "Export started successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "exportId": {
                      "type": "string",
                      "description": "Export operation ID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `package:export` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/package/export/id/{projectId}": {
      "get": {
        "tags": [
          "Package"
        ],
        "summary": "Start export of a specific project",
        "description": "Starts the export process for a specific project and its configurations\nin a compressed package.\n",
        "operationId": "start_export_project",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID to export",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Export started successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "exportId": {
                      "type": "string",
                      "description": "Export operation ID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `package:export` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/package/import/all": {
      "get": {
        "tags": [
          "Package"
        ],
        "summary": "Start import of all projects",
        "description": "Starts the import process of all projects and configurations from a compressed package.\n\n**Warning:** This operation may overwrite existing projects.\n",
        "operationId": "start_import_All",
        "responses": {
          "200": {
            "description": "Import started successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "importId": {
                      "type": "string",
                      "description": "Import operation ID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `package:import` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/package/import/id/{projectId}": {
      "get": {
        "tags": [
          "Package"
        ],
        "summary": "Start import of a specific project",
        "description": "Starts the import process of a specific project and its configurations from a compressed package.\n\n**Warning:** This operation may overwrite the existing project if present.\n",
        "operationId": "start_import_project",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID to import",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Import started successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "importId": {
                      "type": "string",
                      "description": "Import operation ID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `package:import` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found in the package",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugins/{pluginId}/disable": {
      "post": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Disable a plugin",
        "description": "Disable a plugin in the system for a specific build type.\n\nDisabled plugins will not be available for use in jobs.\n",
        "operationId": "disablePlugin",
        "parameters": [
          {
            "name": "pluginId",
            "in": "path",
            "required": true,
            "description": "Plugin ID",
            "schema": {
              "type": "string",
              "example": "ean-image-sourcing"
            }
          },
          {
            "name": "buildType",
            "in": "query",
            "description": "Build type (default: development)",
            "schema": {
              "type": "string",
              "default": "development",
              "example": "development"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Plugin disabled successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Plugin not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugins/{pluginId}/enable": {
      "post": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Enable a plugin",
        "description": "Enable a plugin in the system for a specific build type.\n\nEnabled plugins will be available for use in jobs.\n",
        "operationId": "enablePlugin",
        "parameters": [
          {
            "name": "pluginId",
            "in": "path",
            "required": true,
            "description": "Plugin ID",
            "schema": {
              "type": "string",
              "example": "ean-image-sourcing"
            }
          },
          {
            "name": "buildType",
            "in": "query",
            "description": "Build type (default: development)",
            "schema": {
              "type": "string",
              "default": "development",
              "example": "development"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Plugin enabled successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Plugin not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugins": {
      "get": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "List all plugins",
        "description": "Returns the list of all plugins available in the system, filtered by build type.\n",
        "operationId": "listPlugins",
        "parameters": [
          {
            "name": "buildType",
            "in": "query",
            "description": "Build type (default: development)",
            "schema": {
              "type": "string",
              "default": "development",
              "example": "development"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of plugins",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugins/upload": {
      "post": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Upload a new plugin",
        "description": "Uploads a new plugin to the system as a JAR file.\n\nThe plugin can be associated with one or more organizations and a specific build type.\n",
        "operationId": "uploadPlugin",
        "requestBody": {
          "required": true,
          "description": "Plugin file and metadata",
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "file",
                  "pluginId"
                ],
                "properties": {
                  "file": {
                    "$ref": "#/components/schemas/FormDataContentDisposition",
                    "description": "Plugin JAR file"
                  },
                  "pluginId": {
                    "type": "string",
                    "description": "Plugin ID",
                    "example": "my-plugin"
                  },
                  "buildType": {
                    "type": "string",
                    "description": "Build type (default: development)",
                    "default": "development",
                    "example": "development"
                  },
                  "buildNumber": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Plugin build number",
                    "example": 1
                  },
                  "organizationIds": {
                    "type": "string",
                    "description": "List of organization IDs separated by comma",
                    "example": "1,2,3"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Plugin uploaded successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid file or data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugin-installations/{id}": {
      "get": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Get a specific plugin installation",
        "description": "Returns the details of a plugin installation identified by the ID.\n",
        "operationId": "getInstallationById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Installation ID",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Plugin installation details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PluginInstallation"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Installation not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Update a plugin installation",
        "description": "Updates the data of an existing plugin installation, including configurations and metadata.\n",
        "operationId": "updateInstallation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Unique ID of the installation to update",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated installation data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PluginInstallation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Installation updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PluginInstallation"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Installation not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Delete a plugin installation",
        "description": "Deletes a plugin installation from the system.\n\n**Warning:** This operation is irreversible. The plugin will no longer be available\nfor use in jobs.\n",
        "operationId": "deleteInstallation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Unique ID of the installation to delete",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Installation deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Installation not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugin-installations/{id}/disable": {
      "post": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Disable a plugin installation",
        "description": "Disable a plugin installation in the system.\n\nDisabled plugins will not be available for use in jobs.\n",
        "operationId": "disablePlugin_1",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Installation ID",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Installation disabled successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Installation not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugin-installations/{id}/enable": {
      "post": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Enable a plugin installation",
        "description": "Enable a plugin installation in the system.\n\nEnabled plugins will be available for use in jobs.\n",
        "operationId": "enablePlugin_1",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Installation ID",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Installation enabled successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Installation not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugin-installations": {
      "get": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Get all plugin installations",
        "description": "Returns the list of all plugin installations available in the system,\nwith support for filtering by organization and enabled status.\n",
        "operationId": "getAllInstallations",
        "parameters": [
          {
            "name": "organizationId",
            "in": "query",
            "description": "Filter by organization ID",
            "schema": {
              "type": "string",
              "example": "1"
            }
          },
          {
            "name": "enabledOnly",
            "in": "query",
            "description": "Return only enabled installations",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of plugin installations",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PluginInstallation"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Register a new plugin",
        "description": "Registers a new plugin in the system as an installation.\n\nThe plugin can be associated with one or more organizations.\n",
        "operationId": "registerPlugin",
        "requestBody": {
          "required": true,
          "description": "Plugin installation data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PluginInstallation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Plugin registered successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PluginInstallation"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/admin/plugin-installations/reload": {
      "post": {
        "tags": [
          "Admin",
          "Plugins"
        ],
        "summary": "Reload all plugins",
        "description": "Reloads all plugins in the system, updating configurations and installations.\n\nUseful after uploading or modifying plugins to apply changes without restarting the system.\n",
        "operationId": "reloadPlugins",
        "responses": {
          "200": {
            "description": "Plugins reloaded successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "Plugins reloaded successfully"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs": {
      "get": {
        "tags": [
          "Projects",
          "Jobs"
        ],
        "summary": "Get all jobs of a project",
        "description": "Returns the list of all ETL jobs associated with a specific project.\n",
        "operationId": "getProjectJobs",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of jobs for the project",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Projects",
          "Jobs"
        ],
        "summary": "Add a job to a project",
        "description": "Creates a new ETL job and associates it with an existing project.\n\nThe job must be associated with an agent with valid PySpark code.\n",
        "operationId": "addJobToProject",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Job data to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Job created and added to project successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects": {
      "get": {
        "tags": [
          "Projects"
        ],
        "summary": "Get all projects",
        "description": "Returns the list of all projects available in the system.\n\nProjects are used to organize related jobs, tasks, and datasets.\n",
        "operationId": "getAllProjects",
        "responses": {
          "200": {
            "description": "List of projects",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobProjectDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Projects"
        ],
        "summary": "Create a new project",
        "description": "Creates a new project in the system.\n\nA project can contain multiple ETL jobs and can be scheduled for automatic execution.\n",
        "operationId": "createProject",
        "requestBody": {
          "required": true,
          "description": "Project data to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobProjectDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Project created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobProjectDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/tasks": {
      "get": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Get all tasks of a job",
        "description": "Returns the list of all tasks associated with a specific job.\n\nTasks represent the individual operations that make up an ETL job.\n",
        "operationId": "getAllTasks",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of tasks for the job",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TaskDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Create a new task in a job",
        "description": "Creates a new task and associates it with an existing job.\n\nA task can be of type SPARK, AUTONOMOUS_AGENT, or BACKGROUND_TASK.\n",
        "operationId": "createTask",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Task data to create",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaskDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Task created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaskDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}": {
      "get": {
        "tags": [
          "Projects"
        ],
        "summary": "Get a specific project",
        "description": "Returns the details of a specific project, including the list of associated jobs.\n",
        "operationId": "getProject",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Project details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobProjectDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Projects"
        ],
        "summary": "Update a project",
        "description": "Updates the data of an existing project, including configurations and scheduling.\n",
        "operationId": "updateProject",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the project to update",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated project data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobProjectDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Project updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobProjectDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Projects"
        ],
        "summary": "Delete a project",
        "description": "Deletes a project from the system.\n\n**Warning:** This operation is irreversible. All associated jobs, tasks and data\nwill be deleted.\n",
        "operationId": "deleteProject",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the project to delete",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Project deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/tasks/{taskId}": {
      "get": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Get a specific task",
        "description": "Returns the details of a specific task, including configurations and execution status.\n",
        "operationId": "getTask",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Task ID",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Task details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaskDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project, job, or task not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Update a task",
        "description": "Updates the data of an existing task, including configurations and metadata.\n",
        "operationId": "updateTask",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the task to update",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated task data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaskDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Task updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaskDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project, job, or task not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Delete a task",
        "description": "Deletes a task from a job.\n\n**Warning:** This operation is irreversible. The task will be removed from the job.\n",
        "operationId": "deleteTask",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the task to delete",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Task deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project, job, or task not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/execute": {
      "post": {
        "tags": [
          "Jobs",
          "ETL Execution"
        ],
        "summary": "Execute a Spark job immediately",
        "description": "Executes a Spark job immediately, allocating resources in the Kubernetes cluster.\n\nThe job is executed with the configurations specified in the job itself or through\noptional parameters in the request.\n\n**Important notes:**\n- The job must be associated with an agent with valid PySpark code\n- Cloud credentials are injected automatically if configured\n- The webhook is called automatically at start (RUNNING) and at the end (COMPLETED/FAILED)\n\n**Rate limiting:** Max 10 concurrent executions per project\n",
        "operationId": "executeJob_1",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID to execute",
            "schema": {
              "type": "string",
              "example": "210"
            }
          }
        ],
        "requestBody": {
          "required": false,
          "description": "Optional parameters for job execution.\n\nIf not provided, the job's default values are used.\n",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "cloudCredentialIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "List of cloud credential IDs to use"
                  },
                  "arguments": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Additional arguments to pass to the Spark job"
                  }
                }
              },
              "examples": {
                "default": {
                  "summary": "Execution with default parameters",
                  "value": {}
                },
                "withCredentials": {
                  "summary": "Execution with specific cloud credentials",
                  "value": {
                    "cloudCredentialIds": [
                      "550e8400-e29b-41d4-a716-446655440000"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Job executed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "executionId": {
                      "type": "string",
                      "description": "Spark execution ID",
                      "example": "spark-2d53940045a6-95379617"
                    },
                    "status": {
                      "type": "string",
                      "description": "Execution status",
                      "example": "SUBMITTED"
                    },
                    "message": {
                      "type": "string",
                      "description": "Descriptive message",
                      "example": "Job execution submitted successfully"
                    },
                    "clusterId": {
                      "type": "string",
                      "description": "Cluster ID used",
                      "example": "default-cluster"
                    },
                    "success": {
                      "type": "boolean",
                      "description": "Indicates whether the submission succeeded",
                      "example": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - scope `etl:execute` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Job already running",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/executions/{executionId}/logs": {
      "get": {
        "tags": [
          "Projects",
          "Jobs",
          "Execution"
        ],
        "summary": "Get logs of a job execution",
        "description": "Returns execution logs for a specific Spark job, with support for filtering\nby pod type (driver/executor) and limiting the number of lines.\n",
        "operationId": "getExecutionLogs",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "executionId",
            "in": "path",
            "required": true,
            "description": "Spark execution ID",
            "schema": {
              "type": "string",
              "example": "spark-2d53940045a6-95379617"
            }
          },
          {
            "name": "podType",
            "in": "query",
            "description": "Pod type to fetch logs from (driver, executor; if omitted, returns all)",
            "schema": {
              "type": "string",
              "enum": [
                "driver",
                "executor"
              ],
              "example": "driver"
            }
          },
          {
            "name": "tail",
            "in": "query",
            "description": "Number of trailing lines to return (optional)",
            "schema": {
              "type": "integer",
              "format": "int32",
              "example": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Execution logs",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "logs": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Execution not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/executions/{executionId}/status": {
      "get": {
        "tags": [
          "Projects",
          "Jobs",
          "Execution"
        ],
        "summary": "Get status of a job execution",
        "description": "Returns the detailed status of a Spark job execution, including information on\nprogress, duration, metrics, and any errors.\n\nThe status is retrieved from the database and includes details such as:\n- Execution status (PENDING, RUNNING, COMPLETED, FAILED)\n- Start and end timestamps\n- Execution time\n- URL Spark UI\n- Number of executor pods\n- Error messages (if failed)\n",
        "operationId": "getExecutionStatus",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "executionId",
            "in": "path",
            "required": true,
            "description": "Spark execution ID",
            "schema": {
              "type": "string",
              "example": "spark-2d53940045a6-95379617"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Execution status",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "executionId": {
                      "type": "string",
                      "example": "spark-2d53940045a6-95379617"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "PENDING",
                        "RUNNING",
                        "COMPLETED",
                        "FAILED",
                        "UNKNOWN"
                      ],
                      "example": "COMPLETED"
                    },
                    "startedAt": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    },
                    "completedAt": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    },
                    "executionTimeSeconds": {
                      "type": "integer",
                      "nullable": true,
                      "description": "Execution time in seconds"
                    },
                    "errorMessage": {
                      "type": "string",
                      "nullable": true
                    },
                    "sparkUiUrl": {
                      "type": "string",
                      "nullable": true
                    },
                    "executorPodCount": {
                      "type": "integer",
                      "nullable": true
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Execution not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}": {
      "get": {
        "tags": [
          "Projects",
          "Jobs"
        ],
        "summary": "Get a specific job",
        "description": "Returns the details of a specific ETL job, including configurations and execution status.\n",
        "operationId": "getJob",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Projects",
          "Jobs"
        ],
        "summary": "Update a job",
        "description": "Updates the data of an existing job, including configurations and metadata.\n",
        "operationId": "updateJob",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the job to update",
            "schema": {
              "type": "string",
              "example": "210"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated job data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Job updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Projects",
          "Jobs"
        ],
        "summary": "Remove a job from a project",
        "description": "Remove a job from a project by removing the association.\n\n**Warning:** The job itself is not deleted, only the association to the project.\n",
        "operationId": "removeJobFromProject",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID to remove",
            "schema": {
              "type": "string",
              "example": "210"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job removed from project successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:delete` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/{projectName}": {
      "get": {
        "tags": [
          "Projects"
        ],
        "summary": "Get a project by name",
        "description": "Returns the details of a project searching by name.\n",
        "operationId": "getProjectFromName",
        "parameters": [
          {
            "name": "projectName",
            "in": "path",
            "required": true,
            "description": "Project name",
            "schema": {
              "type": "string",
              "example": "my-project"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Project details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobProjectDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/schedule": {
      "get": {
        "tags": [
          "Projects",
          "Scheduler"
        ],
        "summary": "Get project schedule",
        "description": "Returns the project's schedule configuration, including information about\nwhen and how it is executed automatically.\n",
        "operationId": "getProjectSchedule",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Schedule configuration",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectScheduleRequest"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Projects",
          "Scheduler"
        ],
        "summary": "Set project schedule",
        "description": "Sets or updates the schedule of a project for automatic execution.\n\nThe schedule uses cron expressions to define when to execute the project.\n",
        "operationId": "setProjectSchedule",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Schedule configuration",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectScheduleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Schedule set successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectScheduleRequest"
                }
              }
            }
          },
          "400": {
            "description": "Invalid configuration",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:write` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/tasks/{taskId}/status": {
      "get": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Get status of a task",
        "description": "Returns the current status of a task, including execution details and progress.\n",
        "operationId": "getTaskStatus",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Task ID",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Task status",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "PENDING",
                        "RUNNING",
                        "COMPLETED",
                        "FAILED"
                      ]
                    },
                    "progress": {
                      "type": "number",
                      "format": "float",
                      "description": "Progress percentage (0-100)"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project, job, or task not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/completion": {
      "post": {
        "tags": [
          "Projects",
          "Jobs",
          "Webhooks"
        ],
        "summary": "Webhook to notify job completion",
        "description": "Webhook endpoint called by Spark jobs to notify completion or failure\nof a job execution.\n\nThis endpoint is called automatically by the Spark system when a job terminates\n(with status RUNNING, COMPLETED or FAILED).\n",
        "operationId": "jobCompletionWebhook",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Job completion webhook payload",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobCompletionWebhookRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook processed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/tasks/{taskId}/start": {
      "post": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Start a task",
        "description": "Starts execution of a specific task.\n\nThe task must be of type SPARK, AUTONOMOUS_AGENT, or BACKGROUND_TASK.\n",
        "operationId": "startTask",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the task to start",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Task started successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:execute` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project, job, or task not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Task already running",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/tasks/{taskId}/stop": {
      "post": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks"
        ],
        "summary": "Stop a task",
        "description": "Stops execution of a task in progress.\n\n**Warning:** This operation may interrupt a running task, potentially causing\ndata loss or inconsistency.\n",
        "operationId": "stopTask",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "210"
            }
          },
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Task ID to stop",
            "schema": {
              "type": "string",
              "example": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Task stopped successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:execute` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project, job, or task not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Task non running",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/tasks/{taskId}/metrics": {
      "get": {
        "tags": [
          "Projects",
          "Jobs",
          "Tasks",
          "Metrics"
        ],
        "summary": "Get metrics of a task",
        "description": "Returns detailed metrics for a specific task, including duration, processed records,\nmemory usage, CPU usage, and other performance metrics.\n\nMetrics are extracted from the task `executionLog` and include:\n- Execution duration\n- Processed and output records\n- Memory usage (driver and executors)\n- CPU usage\n- Error and warning counts\n- Output file size\n",
        "operationId": "getTaskMetrics",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "220"
            }
          },
          {
            "name": "taskId",
            "in": "path",
            "required": true,
            "description": "Task ID",
            "schema": {
              "type": "string",
              "example": "229"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Task metrics",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "taskId": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Task ID"
                    },
                    "durationSeconds": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Execution duration in seconds"
                    },
                    "recordsProcessed": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Number of processed records"
                    },
                    "recordsOutput": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Number of output records"
                    },
                    "outputFileSizeBytes": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Output file size in bytes"
                    },
                    "driverMemoryUsedBytes": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Memory used by the driver in bytes"
                    },
                    "executorMemoryUsedBytes": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Memory used by executors in bytes"
                    },
                    "executorCount": {
                      "type": "integer",
                      "format": "int32",
                      "description": "Number of executors used"
                    },
                    "totalCpuTimeSeconds": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Total CPU time used in seconds"
                    },
                    "errorCount": {
                      "type": "integer",
                      "format": "int32",
                      "description": "Number of errors during execution"
                    },
                    "warningCount": {
                      "type": "integer",
                      "format": "int32",
                      "description": "Number of warnings during execution"
                    },
                    "status": {
                      "type": "string",
                      "description": "Final task status"
                    },
                    "startedAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Execution start timestamp"
                    },
                    "completedAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Execution completion timestamp"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project, job, or task not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/jobs/{jobId}/metrics": {
      "get": {
        "tags": [
          "Projects",
          "Jobs",
          "Metrics"
        ],
        "summary": "Get metrics aggregate of a job",
        "description": "Returns the aggregated metrics of all executions of a job, including sums, averages\nand counts by status.\n\nMetrics are computed at the database level for optimal performance and include:\n- Total number of executions\n- Total and average duration\n- Total processed and output records\n- Total memory usage\n- Execution counts by status (COMPLETED, FAILED, RUNNING)\n\nMetrics can be filtered by time range using `startTime` and `endTime`.\n",
        "operationId": "getJobMetrics",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Job ID",
            "schema": {
              "type": "string",
              "example": "220"
            }
          },
          {
            "name": "startTime",
            "in": "query",
            "required": false,
            "description": "Start timestamp for filtering executions (ISO 8601 format).\nExample: \"2025-12-11T00:00:00Z\"\n",
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2025-12-11T00:00:00Z"
            }
          },
          {
            "name": "endTime",
            "in": "query",
            "required": false,
            "description": "End timestamp for filtering executions (ISO 8601 format).\nExample: \"2025-12-11T23:59:59Z\"\n",
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2025-12-11T23:59:59Z"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Aggregated job metrics",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jobId": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Job ID"
                    },
                    "startTime": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Filter start timestamp (if specified)"
                    },
                    "endTime": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Filter end timestamp (if specified)"
                    },
                    "aggregated": {
                      "type": "object",
                      "properties": {
                        "totalExecutions": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total number of executions"
                        },
                        "totalDurationSeconds": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total duration in seconds"
                        },
                        "averageDurationSeconds": {
                          "type": "number",
                          "format": "double",
                          "description": "Average duration in seconds"
                        },
                        "totalRecordsProcessed": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total processed records"
                        },
                        "totalRecordsOutput": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total output records"
                        },
                        "totalOutputFileSizeBytes": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total output file size in bytes"
                        },
                        "totalDriverMemoryUsedBytes": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total memory used by the driver in bytes"
                        },
                        "totalExecutorMemoryUsedBytes": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total memory used by executors in bytes"
                        },
                        "totalCpuTimeSeconds": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total CPU time used in seconds"
                        },
                        "totalErrorCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total errors"
                        },
                        "totalWarningCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total warnings"
                        },
                        "completedCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Number of successful executions"
                        },
                        "failedCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Number of failed executions"
                        },
                        "runningCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Number of executions in progress"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `jobs:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project or job not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/id/{projectId}/metrics": {
      "get": {
        "tags": [
          "Projects",
          "Metrics"
        ],
        "summary": "Get metrics aggregate of a project",
        "description": "Returns the aggregated metrics of all executions of all jobs of a project,\nincluding sums, averages, and counts by status.\n\nMetrics are computed at the database level for optimal performance and include:\n- Total number of executions for the project\n- Total and average duration\n- Total processed and output records\n- Total memory usage\n- Execution counts by status (COMPLETED, FAILED, RUNNING)\n- Per-job breakdown with metrics for each job\n\nMetrics can be filtered by time range using `startTime` and `endTime`.\n",
        "operationId": "getProjectMetrics",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Project ID",
            "schema": {
              "type": "string",
              "example": "98"
            }
          },
          {
            "name": "startTime",
            "in": "query",
            "required": false,
            "description": "Start timestamp for filtering executions (ISO 8601 format).\nExample: \"2025-12-11T00:00:00Z\"\n",
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2025-12-11T00:00:00Z"
            }
          },
          {
            "name": "endTime",
            "in": "query",
            "required": false,
            "description": "End timestamp for filtering executions (ISO 8601 format).\nExample: \"2025-12-11T23:59:59Z\"\n",
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2025-12-11T23:59:59Z"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Aggregated project metrics",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "projectId": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Project ID"
                    },
                    "startTime": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Filter start timestamp (if specified)"
                    },
                    "endTime": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Filter end timestamp (if specified)"
                    },
                    "aggregated": {
                      "type": "object",
                      "properties": {
                        "totalExecutions": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total number of executions in the project"
                        },
                        "totalDurationSeconds": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total duration in seconds"
                        },
                        "averageDurationSeconds": {
                          "type": "number",
                          "format": "double",
                          "description": "Average duration in seconds"
                        },
                        "totalRecordsProcessed": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total processed records"
                        },
                        "totalRecordsOutput": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total output records"
                        },
                        "totalOutputFileSizeBytes": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total output file size in bytes"
                        },
                        "totalDriverMemoryUsedBytes": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total memory used by the driver in bytes"
                        },
                        "totalExecutorMemoryUsedBytes": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total memory used by executors in bytes"
                        },
                        "totalCpuTimeSeconds": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total CPU time used in seconds"
                        },
                        "totalErrorCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total errors"
                        },
                        "totalWarningCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Total warnings"
                        },
                        "completedCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Number of successful executions"
                        },
                        "failedCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Number of failed executions"
                        },
                        "runningCount": {
                          "type": "integer",
                          "format": "int64",
                          "description": "Number of executions in progress"
                        }
                      }
                    },
                    "jobs": {
                      "type": "array",
                      "description": "Aggregated metrics by job within the project",
                      "items": {
                        "type": "object",
                        "properties": {
                          "jobId": {
                            "type": "integer",
                            "format": "int64",
                            "description": "Job ID"
                          },
                          "executionCount": {
                            "type": "integer",
                            "format": "int64",
                            "description": "Number of executions of the job"
                          },
                          "totalDurationSeconds": {
                            "type": "integer",
                            "format": "int64",
                            "description": "Total job duration in seconds"
                          },
                          "totalRecordsProcessed": {
                            "type": "integer",
                            "format": "int64",
                            "description": "Total records processed by the job"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `projects:read` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Project not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/admin/tasks/mark-zombies": {
      "post": {
        "tags": [
          "Projects",
          "Admin",
          "Tasks"
        ],
        "summary": "Mark zombie tasks as FAILED",
        "description": "Detects and marks as FAILED tasks that are RUNNING for longer than the specified timeout\n(\\\"zombie\\\" tasks).\n\nA task is considered a \\\"zombie\\\" if:\n- It has status RUNNING\n- It has been running longer than the specified timeout (default: 24 hours)\n- The `startedAt` timestamp (or `scheduledTime` as a fallback) exceeds the timeout\n\nWhen a task is marked as a zombie:\n- Status is updated to FAILED\n- `executionLog` is updated with FAILED status, `completedAt`, and an error message\n- Total execution duration is computed\n\n**Note:** This endpoint requires admin privileges (scope `admin`).\n",
        "operationId": "markZombieTasks",
        "parameters": [
          {
            "name": "timeoutHours",
            "in": "query",
            "required": false,
            "description": "Timeout in hours to consider a task a \\\"zombie\\\" (default: 24).\nRUNNING tasks exceeding this value will be marked as FAILED.\n",
            "schema": {
              "type": "integer",
              "format": "int64",
              "default": 24,
              "example": 24
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Zombie tasks marked successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "markedCount": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Number of tasks marked as FAILED"
                    },
                    "markedTaskIds": {
                      "type": "array",
                      "description": "List of task IDs marked as FAILED",
                      "items": {
                        "type": "integer",
                        "format": "int64"
                      }
                    },
                    "timeoutHours": {
                      "type": "integer",
                      "format": "int64",
                      "description": "Timeout used (in hours)"
                    },
                    "message": {
                      "type": "string",
                      "description": "Confirmation message",
                      "example": "Marked 5 zombie task(s) as FAILED"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - scope `admin` required",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/projects/test": {
      "get": {
        "tags": [
          "Projects"
        ],
        "summary": "Test endpoint for projects",
        "description": "Test endpoint to verify API connectivity and authentication for projects.\n",
        "operationId": "test_1",
        "responses": {
          "200": {
            "description": "Test completed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "OK"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/html/{url}/{protocol}": {
      "get": {
        "operationId": "getHtml",
        "parameters": [
          {
            "name": "protocol",
            "in": "path",
            "required": true,
            "description": "HTTP protocol (http or https)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "path",
            "required": true,
            "description": "URL to fetch HTML content from",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "text/html": {}
            }
          }
        }
      }
    },
    "/api/strapi-tables/{table}/{id}": {
      "get": {
        "operationId": "getById",
        "parameters": [
          {
            "name": "table",
            "in": "path",
            "required": true,
            "description": "Table name in Strapi",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "name": "table",
            "in": "path",
            "required": true,
            "description": "Table name in Strapi",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      },
      "delete": {
        "operationId": "delete",
        "parameters": [
          {
            "name": "table",
            "in": "path",
            "required": true,
            "description": "Table name in Strapi",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Record ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/api/strapi-tables/{table}": {
      "get": {
        "operationId": "findAll",
        "parameters": [
          {
            "name": "table",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Number of records per page",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      },
      "post": {
        "operationId": "insert",
        "parameters": [
          {
            "name": "table",
            "in": "path",
            "required": true,
            "description": "Table name in Strapi",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/health": {
      "get": {
        "operationId": "getHealth",
        "responses": {
          "default": {
            "description": "default response",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/python-extensions/{extensionId}": {
      "put": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Update a Python extension",
        "description": "Updates the data of an existing Python extension, including configurations and metadata.\n",
        "operationId": "updatePythonExtension",
        "parameters": [
          {
            "name": "extensionId",
            "in": "path",
            "required": true,
            "description": "Extension ID",
            "schema": {
              "type": "string",
              "example": "my-extension"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Updated extension data",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Extension updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Extension not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Delete a Python extension",
        "description": "Deletes a Python extension from the system.\n\n**Warning:** This operation is irreversible. Agents that use this extension\nmay not work correctly.\n",
        "operationId": "deletePythonExtension",
        "parameters": [
          {
            "name": "extensionId",
            "in": "path",
            "required": true,
            "description": "Unique ID of the extension to delete",
            "schema": {
              "type": "string",
              "example": "my-extension"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Extension deleted successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Extension not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/python-extensions/{extensionId}/generate-pyspark": {
      "post": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Generate PySpark code from an extension",
        "description": "Generates PySpark code from a Python extension registered in the system.\n\nUseful for converting Python extensions into PySpark code usable in Spark jobs.\n",
        "operationId": "generatePysparkCode",
        "parameters": [
          {
            "name": "extensionId",
            "in": "path",
            "required": true,
            "description": "Extension ID",
            "schema": {
              "type": "string",
              "example": "my-extension"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "PySpark code generated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string",
                      "description": "Generated PySpark code"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Extension not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/agents/{agentId}/extensions": {
      "get": {
        "tags": [
          "Python Extensions",
          "Agents"
        ],
        "summary": "Get extensions of an agent",
        "description": "Returns the list of all Python extensions associated with a specific agent.\n",
        "operationId": "getAgentExtensions",
        "parameters": [
          {
            "name": "agentId",
            "in": "path",
            "required": true,
            "description": "Agent ID",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of the agent's extensions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Agent not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/agents/{agentId}/python-extensions": {
      "get": {
        "tags": [
          "Python Extensions",
          "Agents"
        ],
        "summary": "Get Python extensions of an agent",
        "description": "Returns the list of all Python extensions associated with a specific agent.\n",
        "operationId": "getAgentPythonExtensions",
        "parameters": [
          {
            "name": "agentId",
            "in": "path",
            "required": true,
            "description": "Agent ID",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of the agent's Python extensions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Agent not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Python Extensions",
          "Agents"
        ],
        "summary": "Update Python extensions of an agent",
        "description": "Updates the list of Python extensions associated with a specific agent.\n",
        "operationId": "updateAgentPythonExtensions",
        "parameters": [
          {
            "name": "agentId",
            "in": "path",
            "required": true,
            "description": "Agent ID",
            "schema": {
              "type": "string",
              "example": "123"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "List of Python extensions to associate with the agent",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Extensions updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Agent not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/info": {
      "get": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Get information about the Python Extensions plugin",
        "description": "Returns general information about the Python Extensions plugin, including versions and\nconfigurations.\n",
        "operationId": "getPluginInfo_1",
        "responses": {
          "200": {
            "description": "Plugin information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/supported-types": {
      "get": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Get supported extension types",
        "description": "Returns the list of all Python extension types supported by the system.\n",
        "operationId": "getSupportedExtensionTypes",
        "responses": {
          "200": {
            "description": "List of supported types",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/process-yaml": {
      "post": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Process Python extensions from YAML",
        "description": "Processes and registers Python extensions from a YAML definition.\n\nUseful for importing extensions from configuration files.\n",
        "operationId": "processYamlExtensions",
        "requestBody": {
          "required": true,
          "description": "YAML definition of extensions",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Extensions processed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid YAML",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/python-extensions/register": {
      "post": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Register a new Python extension",
        "description": "Registers a new Python extension in the system.\n\nThe extension can be used by agents to extend Spark jobs functionality.\n",
        "operationId": "registerPythonExtension",
        "requestBody": {
          "required": true,
          "description": "Extension data to register",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Extension registered successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/webrobot/api/python-extensions/validate": {
      "post": {
        "tags": [
          "Python Extensions"
        ],
        "summary": "Validate a Python extension",
        "description": "Validates the structure and syntax of a Python extension without registering it in the system.\n\nUseful for verifying the correctness of an extension before registration.\n",
        "operationId": "validatePythonExtension",
        "requestBody": {
          "required": true,
          "description": "Extension data to validate",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Extension is valid",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "valid": {
                      "type": "boolean",
                      "example": true
                    },
                    "errors": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "List of validation errors (if any)"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Extension is not valid",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "API key used for authentication. Format: `{organization}:{key}`\n\nExample: `your-organization:your-api-key`\n"
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Standard error response object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Descriptive error message",
            "example": "Job not found or invalid configuration"
          },
          "code": {
            "type": "integer",
            "description": "HTTP status code",
            "example": 400
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "Error timestamp",
            "example": "2025-12-10T23:15:30Z"
          }
        }
      },
      "CronJobRequest": {
        "type": "object",
        "description": "Request payload for creating or updating a Kubernetes CronJob",
        "properties": {
          "name": {
            "type": "string",
            "description": "CronJob name"
          },
          "namespace": {
            "type": "string",
            "description": "Kubernetes namespace"
          },
          "schedule": {
            "type": "string",
            "description": "Cron schedule expression"
          },
          "webhookUrl": {
            "type": "string",
            "description": "Webhook URL to call on job completion"
          },
          "jobId": {
            "type": "string",
            "description": "Job ID to execute"
          },
          "projectId": {
            "type": "string",
            "description": "Project ID"
          },
          "clusterProvider": {
            "type": "string",
            "description": "Cluster provider name"
          },
          "clusterConfigId": {
            "type": "string",
            "description": "Cluster configuration ID"
          },
          "secretName": {
            "type": "string",
            "description": "Kubernetes secret name"
          },
          "secretKey": {
            "type": "string",
            "description": "Secret key name"
          },
          "image": {
            "type": "string",
            "description": "Docker image to use"
          }
        }
      },
      "BodyPart": {
        "type": "object",
        "description": "Represents a part of a multipart request body",
        "properties": {
          "contentDisposition": {
            "$ref": "#/components/schemas/ContentDisposition"
          },
          "entity": {
            "type": "object",
            "description": "Entity"
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Headers"
          },
          "mediaType": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "subtype": {
                "type": "string"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              "wildcardType": {
                "type": "boolean"
              },
              "wildcardSubtype": {
                "type": "boolean"
              }
            },
            "description": "Mediatype"
          },
          "messageBodyWorkers": {
            "$ref": "#/components/schemas/MessageBodyWorkers"
          },
          "parent": {
            "$ref": "#/components/schemas/MultiPart"
          },
          "providers": {
            "type": "object",
            "description": "Providers"
          },
          "parameterizedHeaders": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/ParameterizedHeader"
              }
            },
            "description": "Parameterizedheaders"
          }
        }
      },
      "ContentDisposition": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Type"
          },
          "parameters": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Parameters"
          },
          "fileName": {
            "type": "string",
            "description": "Filename"
          },
          "creationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Creationdate"
          },
          "modificationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Modificationdate"
          },
          "readDate": {
            "type": "string",
            "format": "date-time",
            "description": "Readdate"
          },
          "size": {
            "type": "integer",
            "format": "int64",
            "description": "Size"
          }
        }
      },
      "FormDataBodyPart": {
        "type": "object",
        "properties": {
          "contentDisposition": {
            "$ref": "#/components/schemas/ContentDisposition"
          },
          "entity": {
            "type": "object",
            "description": "Entity"
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Headers"
          },
          "mediaType": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "subtype": {
                "type": "string"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              "wildcardType": {
                "type": "boolean"
              },
              "wildcardSubtype": {
                "type": "boolean"
              }
            },
            "description": "Mediatype"
          },
          "messageBodyWorkers": {
            "$ref": "#/components/schemas/MessageBodyWorkers"
          },
          "parent": {
            "$ref": "#/components/schemas/MultiPart"
          },
          "providers": {
            "type": "object",
            "description": "Providers"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "value": {
            "type": "string",
            "description": "Value"
          },
          "formDataContentDisposition": {
            "$ref": "#/components/schemas/FormDataContentDisposition"
          },
          "simple": {
            "type": "boolean",
            "description": "Simple"
          },
          "parameterizedHeaders": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/ParameterizedHeader"
              }
            },
            "description": "Parameterizedheaders"
          }
        }
      },
      "FormDataContentDisposition": {
        "type": "object",
        "description": "Content disposition information for form data",
        "properties": {
          "type": {
            "type": "string",
            "description": "Type"
          },
          "parameters": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Parameters"
          },
          "fileName": {
            "type": "string",
            "description": "Filename"
          },
          "creationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Creationdate"
          },
          "modificationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Modificationdate"
          },
          "readDate": {
            "type": "string",
            "format": "date-time",
            "description": "Readdate"
          },
          "size": {
            "type": "integer",
            "format": "int64",
            "description": "Size"
          },
          "name": {
            "type": "string",
            "description": "Name"
          }
        }
      },
      "FormDataMultiPart": {
        "type": "object",
        "description": "Multipart form data container",
        "properties": {
          "contentDisposition": {
            "$ref": "#/components/schemas/ContentDisposition"
          },
          "entity": {
            "type": "object",
            "description": "Entity"
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Headers"
          },
          "mediaType": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "subtype": {
                "type": "string"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              "wildcardType": {
                "type": "boolean"
              },
              "wildcardSubtype": {
                "type": "boolean"
              }
            },
            "description": "Mediatype"
          },
          "messageBodyWorkers": {
            "$ref": "#/components/schemas/MessageBodyWorkers"
          },
          "parent": {
            "$ref": "#/components/schemas/MultiPart"
          },
          "providers": {
            "type": "object",
            "description": "Providers"
          },
          "bodyParts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BodyPart"
            },
            "description": "Bodyparts"
          },
          "fields": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/FormDataBodyPart"
              }
            },
            "description": "Fields"
          },
          "parameterizedHeaders": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/ParameterizedHeader"
              }
            },
            "description": "Parameterizedheaders"
          }
        }
      },
      "MessageBodyWorkers": {
        "type": "object",
        "description": "Message body workers for processing request/response bodies"
      },
      "MultiPart": {
        "type": "object",
        "description": "Multipart request/response container",
        "properties": {
          "contentDisposition": {
            "$ref": "#/components/schemas/ContentDisposition"
          },
          "entity": {
            "type": "object",
            "description": "Entity"
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Headers"
          },
          "mediaType": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "subtype": {
                "type": "string"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              "wildcardType": {
                "type": "boolean"
              },
              "wildcardSubtype": {
                "type": "boolean"
              }
            },
            "description": "Mediatype"
          },
          "messageBodyWorkers": {
            "$ref": "#/components/schemas/MessageBodyWorkers"
          },
          "parent": {
            "$ref": "#/components/schemas/MultiPart"
          },
          "providers": {
            "type": "object",
            "description": "Providers"
          },
          "bodyParts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BodyPart"
            },
            "description": "Bodyparts"
          },
          "parameterizedHeaders": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/ParameterizedHeader"
              }
            },
            "description": "Parameterizedheaders"
          }
        }
      },
      "ParameterizedHeader": {
        "type": "object",
        "description": "HTTP header with parameters",
        "properties": {
          "value": {
            "type": "string",
            "description": "Value"
          },
          "parameters": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Parameters"
          }
        }
      },
      "TrainingRequestBean": {
        "type": "object",
        "description": "Request payload for AI/ML training job",
        "properties": {
          "model": {
            "type": "string",
            "description": "Model"
          },
          "trainingFile": {
            "type": "string",
            "description": "Trainingfile"
          },
          "validationFile": {
            "type": "string",
            "description": "Validationfile"
          },
          "datasetId": {
            "type": "string",
            "description": "Datasetid"
          },
          "hyperparameters": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "description": "Hyperparameters"
          }
        }
      },
      "ModelPublishRequest": {
        "type": "object",
        "description": "Request payload for publishing a trained model",
        "properties": {
          "localModelPath": {
            "type": "string",
            "description": "Localmodelpath"
          },
          "modelName": {
            "type": "string",
            "description": "Modelname"
          },
          "description": {
            "type": "string",
            "description": "Description"
          }
        }
      },
      "DatasetUploadRequest": {
        "type": "object",
        "description": "Request payload for uploading a dataset",
        "properties": {
          "localPath": {
            "type": "string",
            "description": "Localpath"
          },
          "format": {
            "type": "string",
            "description": "Format"
          },
          "description": {
            "type": "string",
            "description": "Description"
          }
        }
      },
      "AgentDto": {
        "type": "object",
        "description": "PySpark agent data transfer object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "apiEndpoint": {
            "type": "string",
            "description": "Apiendpoint"
          },
          "executionMode": {
            "type": "string",
            "enum": [
              "MANUAL",
              "SCHEDULED",
              "EVENT_DRIVEN"
            ],
            "description": "Executionmode"
          },
          "categoryId": {
            "type": "string",
            "description": "Categoryid"
          },
          "type": {
            "type": "string",
            "enum": [
              "SCRAPING_AGENT",
              "LEADGEN_AGENT",
              "TRADING_AGENT",
              "DATA_ANALYTICS_AGENT",
              "REPORTING_AGENT",
              "ML_AGENT"
            ],
            "description": "Type"
          },
          "role": {
            "type": "string",
            "description": "Role"
          },
          "backstory": {
            "type": "string",
            "description": "Backstory"
          },
          "defaultPrompt": {
            "type": "string",
            "description": "Defaultprompt"
          },
          "prompts": {
            "type": "string",
            "description": "Prompts"
          },
          "config": {
            "type": "string",
            "description": "Config"
          },
          "code": {
            "type": "string",
            "description": "Code"
          },
          "codeTypeId": {
            "type": "string",
            "description": "Codetypeid"
          },
          "pysparkCode": {
            "type": "string",
            "description": "Pysparkcode"
          },
          "pythonExtensions": {
            "type": "string",
            "description": "Pythonextensions"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Generatedat"
          },
          "toolIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Toolids"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Createdat"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Updatedat"
          }
        }
      },
      "JobCategoryDto": {
        "type": "object",
        "description": "Job category data transfer object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "icon": {
            "type": "string",
            "description": "Icon"
          },
          "visibility": {
            "type": "string",
            "enum": [
              "PUBLIC",
              "PRIVATE"
            ],
            "description": "Visibility"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "agentIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Agentids"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Createdat"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Updatedat"
          }
        }
      },
      "CloudCredential": {
        "type": "object",
        "description": "Cloud service credential configuration",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Id"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "provider": {
            "type": "string",
            "enum": [
              "OPENAI",
              "ANTHROPIC",
              "HUGGING_FACE",
              "COHERE",
              "AZURE_AI_STUDIO",
              "MOSAICML",
              "REPLIC",
              "STEEL_DEV",
              "TOGETHERAI",
              "AWS",
              "AZURE",
              "GCP",
              "AWS_BEDROCK",
              "GOOGLE_VERTEX",
              "DATABRICKS",
              "TWITTER",
              "REDDIT",
              "FACEBOOK",
              "INSTAGRAM",
              "LINKEDIN",
              "TIKTOK",
              "YOUTUBE",
              "ALPHAVANTAGE",
              "POLYGON",
              "TWELVEDATA",
              "MARKETSTACK",
              "FMP",
              "IEXCLOUD",
              "CBOND",
              "GOOGLE_SEARCH",
              "BING_SEARCH"
            ],
            "description": "Provider"
          },
          "apiKey": {
            "type": "string",
            "description": "Apikey"
          },
          "apiSecret": {
            "type": "string",
            "description": "Apisecret"
          },
          "organizationId": {
            "type": "string",
            "description": "Organizationid"
          },
          "projectId": {
            "type": "string",
            "description": "Projectid"
          },
          "region": {
            "type": "string",
            "description": "Region"
          },
          "endpoint": {
            "type": "string",
            "description": "Endpoint"
          },
          "accessKeyId": {
            "type": "string",
            "description": "Accesskeyid"
          },
          "secretAccessKey": {
            "type": "string",
            "description": "Secretaccesskey"
          },
          "sessionToken": {
            "type": "string",
            "description": "Sessiontoken"
          },
          "accountId": {
            "type": "string",
            "description": "Accountid"
          },
          "subscriptionId": {
            "type": "string",
            "description": "Subscriptionid"
          },
          "resourceGroup": {
            "type": "string",
            "description": "Resourcegroup"
          },
          "workspaceName": {
            "type": "string",
            "description": "Workspacename"
          },
          "huggingFaceToken": {
            "type": "string",
            "description": "Huggingfacetoken"
          },
          "cohereApiKey": {
            "type": "string",
            "description": "Cohereapikey"
          },
          "azureAiStudioEndpoint": {
            "type": "string",
            "description": "Azureaistudioendpoint"
          },
          "mosaicmlApiKey": {
            "type": "string",
            "description": "Mosaicmlapikey"
          },
          "replicateApiToken": {
            "type": "string",
            "description": "Replicateapitoken"
          },
          "twitterBearerToken": {
            "type": "string",
            "description": "Twitterbearertoken"
          },
          "twitterApiKey": {
            "type": "string",
            "description": "Twitterapikey"
          },
          "twitterApiSecret": {
            "type": "string",
            "description": "Twitterapisecret"
          },
          "redditClientId": {
            "type": "string",
            "description": "Redditclientid"
          },
          "redditClientSecret": {
            "type": "string",
            "description": "Redditclientsecret"
          },
          "redditUserAgent": {
            "type": "string",
            "description": "Reddituseragent"
          },
          "facebookAccessToken": {
            "type": "string",
            "description": "Facebookaccesstoken"
          },
          "facebookAppId": {
            "type": "string",
            "description": "Facebookappid"
          },
          "facebookAppSecret": {
            "type": "string",
            "description": "Facebookappsecret"
          },
          "instagramAccessToken": {
            "type": "string",
            "description": "Instagramaccesstoken"
          },
          "linkedinAccessToken": {
            "type": "string",
            "description": "Linkedinaccesstoken"
          },
          "linkedinClientId": {
            "type": "string",
            "description": "Linkedinclientid"
          },
          "linkedinClientSecret": {
            "type": "string",
            "description": "Linkedinclientsecret"
          },
          "tiktokClientKey": {
            "type": "string",
            "description": "Tiktokclientkey"
          },
          "tiktokClientSecret": {
            "type": "string",
            "description": "Tiktokclientsecret"
          },
          "youtubeApiKey": {
            "type": "string",
            "description": "Youtubeapikey"
          },
          "databricksWorkspaceUrl": {
            "type": "string",
            "description": "Databricksworkspaceurl"
          },
          "databricksAccessToken": {
            "type": "string",
            "description": "Databricksaccesstoken"
          },
          "databricksClusterId": {
            "type": "string",
            "description": "Databricksclusterid"
          },
          "oauthAccessToken": {
            "type": "string",
            "description": "Oauthaccesstoken"
          },
          "oauthRefreshToken": {
            "type": "string",
            "description": "Oauthrefreshtoken"
          },
          "oauthTokenExpiresAt": {
            "type": "string",
            "format": "date-time",
            "description": "Oauthtokenexpiresat"
          },
          "oauthTokenType": {
            "type": "string",
            "description": "Oauthtokentype"
          },
          "alphavantageApiKey": {
            "type": "string",
            "description": "Alphavantageapikey"
          },
          "polygonApiKey": {
            "type": "string",
            "description": "Polygonapikey"
          },
          "twelvedataApiKey": {
            "type": "string",
            "description": "Twelvedataapikey"
          },
          "marketstackAccessKey": {
            "type": "string",
            "description": "Marketstackaccesskey"
          },
          "fmpApiKey": {
            "type": "string",
            "description": "Fmpapikey"
          },
          "iexcloudToken": {
            "type": "string",
            "description": "Iexcloudtoken"
          },
          "cbondApiKey": {
            "type": "string",
            "description": "Cbondapikey"
          },
          "cbondClientId": {
            "type": "string",
            "description": "Cbondclientid"
          },
          "cbondClientSecret": {
            "type": "string",
            "description": "Cbondclientsecret"
          },
          "googleSearchApiKey": {
            "type": "string",
            "description": "Googlesearchapikey"
          },
          "googleSearchEngineId": {
            "type": "string",
            "description": "Googlesearchengineid"
          },
          "bingSearchApiKey": {
            "type": "string",
            "description": "Bingsearchapikey"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          }
        }
      },
      "TimePeriod": {
        "type": "object",
        "description": "Time period with start and end times",
        "properties": {
          "startTimePeriod": {
            "type": "string",
            "description": "Starttimeperiod"
          },
          "endTimePeriod": {
            "type": "string",
            "description": "Endtimeperiod"
          }
        }
      },
      "DatasetUploadApiDto": {
        "type": "object",
        "description": "Dataset upload API data transfer object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name"
          },
          "version": {
            "type": "string",
            "description": "Version"
          },
          "comments": {
            "type": "string",
            "description": "Comments"
          },
          "attachmentName": {
            "type": "string",
            "description": "Attachmentname"
          },
          "headerline": {
            "type": "string",
            "description": "Headerline"
          }
        }
      },
      "DatasetDto": {
        "type": "object",
        "description": "Dataset data transfer object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "userId": {
            "type": "string",
            "description": "Userid"
          },
          "sourceUrl": {
            "type": "string",
            "description": "Sourceurl"
          },
          "sourceType": {
            "type": "string",
            "description": "Sourcetype"
          },
          "filePath": {
            "type": "string",
            "description": "Filepath"
          },
          "fileFormat": {
            "type": "string",
            "description": "Fileformat"
          },
          "fileSize": {
            "type": "integer",
            "format": "int64",
            "description": "Filesize"
          },
          "schema": {
            "type": "string",
            "description": "Schema"
          },
          "metadata": {
            "type": "string",
            "description": "Metadata"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "fieldIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Fieldids"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Createdat"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Updatedat"
          },
          "storagePath": {
            "type": "string",
            "description": "Storagepath"
          },
          "format": {
            "type": "string",
            "description": "Format"
          },
          "datasetType": {
            "type": "string",
            "description": "Datasettype"
          },
          "trinoSchema": {
            "type": "string",
            "description": "Trinoschema"
          }
        }
      },
      "PrestoQueryRequest": {
        "type": "object",
        "description": "Request payload for executing a Presto SQL query",
        "properties": {
          "sql": {
            "type": "string",
            "description": "Sql"
          },
          "catalog": {
            "type": "string",
            "description": "Catalog"
          },
          "schema": {
            "type": "string",
            "description": "Schema"
          },
          "limit": {
            "type": "integer",
            "format": "int32",
            "description": "Limit"
          },
          "offset": {
            "type": "integer",
            "format": "int32",
            "description": "Offset"
          }
        }
      },
      "EtlLibraryVersionApiDto": {
        "type": "object",
        "description": "ETL library version API data transfer object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "description": "Id"
          },
          "buildType": {
            "type": "string",
            "description": "Buildtype"
          },
          "buildNumber": {
            "type": "integer",
            "format": "int32",
            "description": "Buildnumber"
          },
          "version": {
            "type": "string",
            "description": "Version"
          },
          "jarPath": {
            "type": "string",
            "description": "Jarpath"
          },
          "jarPathObfuscated": {
            "type": "string",
            "description": "Jarpathobfuscated"
          },
          "jarSizeBytes": {
            "type": "integer",
            "format": "int64",
            "description": "Jarsizebytes"
          },
          "uploadedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Uploadedat"
          },
          "active": {
            "type": "boolean",
            "description": "Active"
          },
          "description": {
            "type": "string",
            "description": "Description"
          }
        }
      },
      "PluginInstallation": {
        "type": "object",
        "description": "Plugin installation information",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "description": "Id"
          },
          "pluginId": {
            "type": "string",
            "description": "Pluginid"
          },
          "pluginType": {
            "type": "string",
            "description": "Plugintype"
          },
          "buildType": {
            "type": "string",
            "description": "Buildtype"
          },
          "buildNumber": {
            "type": "integer",
            "format": "int32",
            "description": "Buildnumber"
          },
          "version": {
            "type": "string",
            "description": "Version"
          },
          "jarPath": {
            "type": "string",
            "description": "Jarpath"
          },
          "manifestPath": {
            "type": "string",
            "description": "Manifestpath"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "organizationId": {
            "type": "string",
            "description": "Organizationid"
          },
          "organizationIdsJson": {
            "type": "string",
            "description": "Organizationidsjson"
          },
          "mainClass": {
            "type": "string",
            "description": "Mainclass"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "installedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Installedat"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Updatedat"
          },
          "enabledAt": {
            "type": "string",
            "format": "date-time",
            "description": "Enabledat"
          },
          "enabledBy": {
            "type": "string",
            "description": "Enabledby"
          },
          "installedBy": {
            "type": "string",
            "description": "Installedby"
          }
        }
      },
      "JobDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "projectId": {
            "type": "string",
            "description": "Projectid"
          },
          "agentId": {
            "type": "string",
            "description": "Agentid"
          },
          "inputDatasetId": {
            "type": "string",
            "description": "Inputdatasetid"
          },
          "cloudCredentialId": {
            "type": "string",
            "description": "Cloudcredentialid"
          },
          "cloudCredentialIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Cloudcredentialids"
          },
          "executionStatus": {
            "type": "string",
            "enum": [
              "PENDING",
              "RUNNING",
              "COMPLETED",
              "FAILED"
            ],
            "description": "Executionstatus"
          },
          "scheduledTime": {
            "type": "string",
            "format": "date-time",
            "description": "Scheduledtime"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "taskIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Taskids"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Createdat"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Updatedat"
          }
        }
      },
      "JobProjectDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "cronSchedule": {
            "type": "string",
            "description": "Cronschedule"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "jobIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Jobids"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Createdat"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Updatedat"
          }
        }
      },
      "TaskDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id"
          },
          "name": {
            "type": "string",
            "description": "Name"
          },
          "description": {
            "type": "string",
            "description": "Description"
          },
          "jobId": {
            "type": "string",
            "description": "Jobid"
          },
          "botId": {
            "type": "string",
            "description": "Botid"
          },
          "outputDatasetId": {
            "type": "string",
            "description": "Outputdatasetid"
          },
          "taskType": {
            "type": "string",
            "enum": [
              "SPARK",
              "AUTONOMOUS_AGENT",
              "BACKGROUND_TASK"
            ],
            "description": "Tasktype"
          },
          "executionReferenceId": {
            "type": "string",
            "description": "Executionreferenceid"
          },
          "executionStatus": {
            "type": "string",
            "enum": [
              "PENDING",
              "RUNNING",
              "COMPLETED",
              "FAILED"
            ],
            "description": "Executionstatus"
          },
          "executionLog": {
            "type": "string",
            "description": "Executionlog"
          },
          "scheduledTime": {
            "type": "string",
            "format": "date-time",
            "description": "Scheduledtime"
          },
          "executionMode": {
            "type": "string",
            "enum": [
              "MANUAL",
              "SCHEDULED",
              "EVENT_DRIVEN"
            ],
            "description": "Executionmode"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "apiKey": {
            "type": "string",
            "description": "Apikey"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Createdat"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Updatedat"
          }
        }
      },
      "JobCompletionWebhookRequest": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "Jobid"
          },
          "executionId": {
            "type": "string",
            "description": "Executionid"
          },
          "sparkApplicationName": {
            "type": "string",
            "description": "Sparkapplicationname"
          },
          "status": {
            "type": "string",
            "description": "Status"
          },
          "outputDatasetPath": {
            "type": "string",
            "description": "Outputdatasetpath"
          },
          "outputDatasetFormat": {
            "type": "string",
            "description": "Outputdatasetformat"
          },
          "outputDatasetSchema": {
            "type": "string",
            "description": "Outputdatasetschema"
          },
          "durationSeconds": {
            "type": "integer",
            "format": "int64",
            "description": "Durationseconds"
          },
          "recordsProcessed": {
            "type": "integer",
            "format": "int64",
            "description": "Recordsprocessed"
          },
          "recordsOutput": {
            "type": "integer",
            "format": "int64",
            "description": "Recordsoutput"
          },
          "outputFileSizeBytes": {
            "type": "integer",
            "format": "int64",
            "description": "Outputfilesizebytes"
          },
          "partitionsCount": {
            "type": "integer",
            "format": "int32",
            "description": "Partitionscount"
          },
          "driverMemoryUsedBytes": {
            "type": "integer",
            "format": "int64",
            "description": "Drivermemoryusedbytes"
          },
          "executorMemoryUsedBytes": {
            "type": "integer",
            "format": "int64",
            "description": "Executormemoryusedbytes"
          },
          "executorCount": {
            "type": "integer",
            "format": "int32",
            "description": "Executorcount"
          },
          "totalCpuTimeSeconds": {
            "type": "integer",
            "format": "int64",
            "description": "Totalcputimeseconds"
          },
          "errorCount": {
            "type": "integer",
            "format": "int32",
            "description": "Errorcount"
          },
          "warningCount": {
            "type": "integer",
            "format": "int32",
            "description": "Warningcount"
          },
          "errorMessage": {
            "type": "string",
            "description": "Errormessage"
          },
          "additionalMetrics": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "writeOnly": true,
            "description": "Additionalmetrics"
          },
          "startedAt": {
            "type": "string",
            "description": "Startedat"
          },
          "completedAt": {
            "type": "string",
            "description": "Completedat"
          },
          "sparkUiUrl": {
            "type": "string",
            "description": "Sparkuiurl"
          },
          "metrics": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "writeOnly": true,
            "description": "Metrics"
          }
        }
      },
      "ProjectScheduleRequest": {
        "type": "object",
        "properties": {
          "cronSchedule": {
            "type": "string",
            "description": "Cronschedule"
          },
          "enabled": {
            "type": "boolean",
            "description": "Enabled"
          },
          "timezone": {
            "type": "string",
            "description": "Timezone"
          }
        }
      }
    }
  }
}