openapi: 3.0.1
info:
  title: WebRobot ETL API
  description: >
    API for managing projects, jobs, datasets, and ETL pipelines on WebRobot.


    ## Authentication


    The API uses API Keys for authentication. Include the `X-API-Key` header in
    all requests.


    ## Base URL


    - Production: `https://api.webrobot.eu/api`

    - Development: `http://localhost:8020/api`


    ## Rate Limiting


    Requests are limited to 1000 requests per minute per API key.
  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.

        CronJobs are used to schedule periodic execution of Spark jobs.
      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.


        The CronJob will execute the job according to the specified schedule
        (cron format).
      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.
      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.

        **Warning:** This operation is irreversible.
      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,

        including supported versions, available resources, and configurations.
      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

        e status of the cluster.
      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.
      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.
      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.
      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.

        This endpoint triggers a Spark job that searches for product images
        based on EAN codes in the dataset for the given country.
      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.

        The bootstrap process initializes the dataset and prepares it for
        image sourcing operations.
      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.


        Returns images with:

        - Full image URL

        - Base64 data (if requested)

        - Similarity schours (0.0 - 1.0)

        - Additional metadata


        **Note:**

        - Images are searched in the most recent available dataset

        - Results are sorted by descending score

        - The `includeBase64` field in the request controls whether to include
        base64 data
      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.

          Specifies the EAN codes of products to search images for.
        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
        version, configuration, and available features.
      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.


        Includes execution details such as:

        - Job status (PENDING, RUNNING, COMPLETED, FAILED)

        - Start and end timestamps

        - Execution time

        - Spark UI URL (if available)

        - Number of executor pods

        - Error messages (if failed)
      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.

        Allows querying the dataset with custom filters and conditions.
      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.


        The job will be executed automatically according to the specified
        schedule (cron format).
      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.

        The file must be in CSV format with EAN codes and related data.
      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.


        **Warning:** This operation is irreversible and interrupts training if
        in progress.
      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.

        The model is downloaded to the specified path or the default path.
      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.


        The estimate includes compute, storage and other necessary service
        costs.
      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,
        including information on versions, capabilities and requirements.
      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,
        including information on available capabilities and configurations.
      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.

        The logs include information on progress, errors, and training metrics.
      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

        progress, duration and any errors.
      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.

        The model must have been trained and must be available for publication.
      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.


        The job is executed in the background and can be monitored through the
        status and logs endpoints.
      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.


        The dataset must be in a format supported by the provider.
      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.


        An agent contains the PySpark code that is executed when a job is
        started.

        The agent must be associated with a category.
      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.

        **Warning:** This operation is irreversible. Jobs that use this agent
        will no longer be able to be executed.
      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.
      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.


        **Note:** Updating the source code requires that no job is running

        with this agent.
      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.
      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.
      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.

        Categories are used to organize projects, agents, and jobs.
      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.
      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.
      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.
      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.


        **Warning:** This operation is irreversible. Associated projects will
        not be deleted.
      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.
      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.
      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,
        with support for pagination and provider filtering.

        Cloud credentials are used to access external services such as
        AWS, Azure, GCP, etc. during Spark job execution.
      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.

        Credentials are encrypted and stored securely in the database.
      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.

        **Note:** Sensitive credentials are returned in encrypted form.
      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.

        New credentials are encrypted before being saved.
      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.

        **Warning:** This operation is irreversible. Jobs using this credential
        will no longer be able to access cloud services.
      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.
      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.


        Datasets can be filtered by type, format, and indexing status.
      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.


        The dataset can be associated with a project and used as input or output
        for ETL jobs.
      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.
      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.
      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.

        **Warning:** This operation is irreversible. Jobs that use this dataset
        as input or output may not work correctly.
      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.


        The query is executed on the MinIO catalog and can use all SQL features
        supported by Trino.
      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.
      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.
      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.
      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.


        Useful for analyzing the results of a task after its execution.
      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,
        with support for filtering by build type and active status.
      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.


        ETL versions are used to execute Spark jobs with specific library
        versions.
      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.
      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.
      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.

        **Warning:** This operation is irreversible. Jobs using this version
        may not work correctly.
      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

        and build number.
      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.
      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.
      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
        in a compressed package.
      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
        in a compressed package.
      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.


        **Warning:** This operation may overwrite existing projects.
      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.


        **Warning:** This operation may overwrite the existing project if
        present.
      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.

        Disabled plugins will not be available for use in jobs.
      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.

        Enabled plugins will be available for use in jobs.
      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.
      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.


        The plugin can be associated with one or more organizations and a
        specific build type.
      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.
      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.
      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.


        **Warning:** This operation is irreversible. The plugin will no longer
        be available

        for use in jobs.
      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.

        Disabled plugins will not be available for use in jobs.
      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.

        Enabled plugins will be available for use in jobs.
      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,
        with support for filtering by organization and enabled status.
      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.

        The plugin can be associated with one or more organizations.
      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.


        Useful after uploading or modifying plugins to apply changes without
        restarting the system.
      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.
      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.

        The job must be associated with an agent with valid PySpark code.
      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.

        Projects are used to organize related jobs, tasks, and datasets.
      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.


        A project can contain multiple ETL jobs and can be scheduled for
        automatic execution.
      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.

        Tasks represent the individual operations that make up an ETL job.
      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.

        A task can be of type SPARK, AUTONOMOUS_AGENT, or BACKGROUND_TASK.
      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.
      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.
      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.


        **Warning:** This operation is irreversible. All associated jobs, tasks
        and data

        will be deleted.
      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.
      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.
      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.


        **Warning:** This operation is irreversible. The task will be removed
        from the job.
      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.


        The job is executed with the configurations specified in the job itself
        or through

        optional parameters in the request.


        **Important notes:**

        - The job must be associated with an agent with valid PySpark code

        - Cloud credentials are injected automatically if configured

        - The webhook is called automatically at start (RUNNING) and at the end
        (COMPLETED/FAILED)


        **Rate limiting:** Max 10 concurrent executions per project
      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.

          If not provided, the job's default values are used.
        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

        by pod type (driver/executor) and limiting the number of lines.
      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

        progress, duration, metrics, and any errors.


        The status is retrieved from the database and includes details such as:

        - Execution status (PENDING, RUNNING, COMPLETED, FAILED)

        - Start and end timestamps

        - Execution time

        - URL Spark UI

        - Number of executor pods

        - Error messages (if failed)
      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.
      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.
      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.


        **Warning:** The job itself is not deleted, only the association to the
        project.
      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.
      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

        when and how it is executed automatically.
      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.


        The schedule uses cron expressions to define when to execute the
        project.
      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.
      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

        of a job execution.


        This endpoint is called automatically by the Spark system when a job
        terminates

        (with status RUNNING, COMPLETED or FAILED).
      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.

        The task must be of type SPARK, AUTONOMOUS_AGENT, or BACKGROUND_TASK.
      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.


        **Warning:** This operation may interrupt a running task, potentially
        causing

        data loss or inconsistency.
      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,

        memory usage, CPU usage, and other performance metrics.


        Metrics are extracted from the task `executionLog` and include:

        - Execution duration

        - Processed and output records

        - Memory usage (driver and executors)

        - CPU usage

        - Error and warning counts

        - Output file size
      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

        and counts by status.


        Metrics are computed at the database level for optimal performance and
        include:

        - Total number of executions

        - Total and average duration

        - Total processed and output records

        - Total memory usage

        - Execution counts by status (COMPLETED, FAILED, RUNNING)


        Metrics can be filtered by time range using `startTime` and `endTime`.
      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).
            Example: "2025-12-11T00:00:00Z"
          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).
            Example: "2025-12-11T23:59:59Z"
          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,

        including sums, averages, and counts by status.


        Metrics are computed at the database level for optimal performance and
        include:

        - Total number of executions for the project

        - Total and average duration

        - Total processed and output records

        - Total memory usage

        - Execution counts by status (COMPLETED, FAILED, RUNNING)

        - Per-job breakdown with metrics for each job


        Metrics can be filtered by time range using `startTime` and `endTime`.
      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).
            Example: "2025-12-11T00:00:00Z"
          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).
            Example: "2025-12-11T23:59:59Z"
          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

        (\"zombie\" tasks).


        A task is considered a \"zombie\" if:

        - It has status RUNNING

        - It has been running longer than the specified timeout (default: 24
        hours)

        - The `startedAt` timestamp (or `scheduledTime` as a fallback) exceeds
        the timeout


        When a task is marked as a zombie:

        - Status is updated to FAILED

        - `executionLog` is updated with FAILED status, `completedAt`, and an
        error message

        - Total execution duration is computed


        **Note:** This endpoint requires admin privileges (scope `admin`).
      operationId: markZombieTasks
      parameters:
        - name: timeoutHours
          in: query
          required: false
          description: |
            Timeout in hours to consider a task a \"zombie\" (default: 24).
            RUNNING tasks exceeding this value will be marked as FAILED.
          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.
      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.
      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.


        **Warning:** This operation is irreversible. Agents that use this
        extension

        may not work correctly.
      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.


        Useful for converting Python extensions into PySpark code usable in
        Spark jobs.
      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.
      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.
      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.
      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

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

        Useful for importing extensions from configuration files.
      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.

        The extension can be used by agents to extend Spark jobs functionality.
      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.


        Useful for verifying the correctness of an extension before
        registration.
      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}`

        Example: `your-organization:your-api-key`
  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
