openapi: 3.1.0
info:
  title: Cynone
  version: '0.1'
servers:
  -
    url: 'https://cynone.com/api/v1'
    description: 'Cynone Cloud API. Change the host to your own instance if you are self-hosting.'
paths:
  /applications:
    get:
      tags:
        - Applications
      summary: List
      description: 'List all applications.'
      operationId: list-applications
      parameters:
        -
          name: tag
          in: query
          description: 'Filter applications by tag name.'
          required: false
          schema:
            type: string
      responses:
        '200':
          description: 'Get all applications.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Application'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /applications/public:
    post:
      tags:
        - Applications
      summary: 'Create (Public)'
      description: 'Create new application based on a public git repository.'
      operationId: create-public-application
      requestBody:
        description: 'Application object that needs to be created.'
        required: true
        content:
          application/json:
            schema:
              required:
                - project_uuid
                - server_uuid
                - environment_name
                - environment_uuid
                - git_repository
                - git_branch
                - build_pack
              properties:
                project_uuid:
                  type: string
                  description: 'The project UUID.'
                server_uuid:
                  type: string
                  description: 'The server UUID.'
                environment_name:
                  type: string
                  description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
                git_repository:
                  type: string
                  description: 'The git repository URL.'
                git_branch:
                  type: string
                  description: 'The git branch.'
                build_pack:
                  type: string
                  enum: [nixpacks, railpack, static, dockerfile, dockercompose]
                  description: 'The build pack type.'
                ports_exposes:
                  type: string
                  description: 'The ports to expose.'
                destination_uuid:
                  type: string
                  description: 'The destination UUID.'
                name:
                  type: string
                  description: 'The application name.'
                description:
                  type: string
                  description: 'The application description.'
                domains:
                  type: string
                  description: 'The application URLs in a comma-separated list.'
                git_commit_sha:
                  type: string
                  description: 'The git commit SHA.'
                docker_registry_image_name:
                  type: string
                  description: 'The docker registry image name.'
                docker_registry_image_tag:
                  type: string
                  description: 'The docker registry image tag.'
                is_static:
                  type: boolean
                  description: 'The flag to indicate if the application is static.'
                is_spa:
                  type: boolean
                  description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.'
                is_auto_deploy_enabled:
                  type: boolean
                  description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.'
                is_force_https_enabled:
                  type: boolean
                  description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
                is_preview_deployments_enabled:
                  type: boolean
                  description: 'Enable preview deployments for pull requests.'
                static_image:
                  type: string
                  enum: ['nginx:alpine']
                  description: 'The static image.'
                install_command:
                  type: string
                  description: 'The install command.'
                build_command:
                  type: string
                  description: 'The build command.'
                start_command:
                  type: string
                  description: 'The start command.'
                ports_mappings:
                  type: string
                  description: 'The ports mappings.'
                base_directory:
                  type: string
                  description: 'The base directory for all commands.'
                publish_directory:
                  type: string
                  description: 'The publish directory.'
                health_check_enabled:
                  type: boolean
                  description: 'Health check enabled.'
                health_check_path:
                  type: string
                  description: 'Health check path.'
                health_check_port:
                  type: string
                  nullable: true
                  description: 'Health check port.'
                health_check_host:
                  type: string
                  nullable: true
                  description: 'Health check host.'
                health_check_method:
                  type: string
                  description: 'Health check method.'
                health_check_return_code:
                  type: integer
                  description: 'Health check return code.'
                health_check_scheme:
                  type: string
                  description: 'Health check scheme.'
                health_check_response_text:
                  type: string
                  nullable: true
                  description: 'Health check response text.'
                health_check_interval:
                  type: integer
                  description: 'Health check interval in seconds.'
                health_check_timeout:
                  type: integer
                  description: 'Health check timeout in seconds.'
                health_check_retries:
                  type: integer
                  description: 'Health check retries count.'
                health_check_start_period:
                  type: integer
                  description: 'Health check start period in seconds.'
                limits_memory:
                  type: string
                  description: 'Memory limit.'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit.'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness.'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation.'
                limits_cpus:
                  type: string
                  description: 'CPU limit.'
                limits_cpuset:
                  type: string
                  nullable: true
                  description: 'CPU set.'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares.'
                custom_labels:
                  type: string
                  description: 'Custom labels.'
                custom_docker_run_options:
                  type: string
                  description: 'Custom docker run options.'
                post_deployment_command:
                  type: string
                  description: 'Post deployment command.'
                post_deployment_command_container:
                  type: string
                  description: 'Post deployment command container.'
                pre_deployment_command:
                  type: string
                  description: 'Pre deployment command.'
                pre_deployment_command_container:
                  type: string
                  description: 'Pre deployment command container.'
                manual_webhook_secret_github:
                  type: string
                  description: 'Manual webhook secret for Github.'
                manual_webhook_secret_gitlab:
                  type: string
                  description: 'Manual webhook secret for Gitlab.'
                manual_webhook_secret_bitbucket:
                  type: string
                  description: 'Manual webhook secret for Bitbucket.'
                manual_webhook_secret_gitea:
                  type: string
                  description: 'Manual webhook secret for Gitea.'
                redirect:
                  type: string
                  nullable: true
                  description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
                  enum: [www, non-www, both]
                instant_deploy:
                  type: boolean
                  description: 'The flag to indicate if the application should be deployed instantly.'
                dockerfile:
                  type: string
                  description: 'The Dockerfile content.'
                dockerfile_location:
                  type: string
                  description: 'The Dockerfile location in the repository.'
                docker_compose_location:
                  type: string
                  description: 'The Docker Compose location.'
                docker_compose_custom_start_command:
                  type: string
                  description: 'The Docker Compose custom start command.'
                docker_compose_custom_build_command:
                  type: string
                  description: 'The Docker Compose custom build command.'
                docker_compose_domains:
                  type: array
                  description: 'Array of URLs to be applied to containers of a dockercompose application.'
                  items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "https://app.cynone.com,https://app2.cynone.com")' } }, type: object }
                watch_paths:
                  type: string
                  description: 'The watch paths.'
                use_build_server:
                  type: boolean
                  nullable: true
                  description: 'Use build server.'
                use_build_secrets:
                  type: boolean
                  default: false
                  description: 'Use Docker Build Secrets for build-time environment variables.'
                is_git_submodules_enabled:
                  type: boolean
                  description: 'Clone Git submodules.'
                is_git_lfs_enabled:
                  type: boolean
                  description: 'Enable Git LFS.'
                is_git_shallow_clone_enabled:
                  type: boolean
                  description: 'Use a shallow Git clone.'
                disable_build_cache:
                  type: boolean
                  description: 'Disable the build cache.'
                inject_build_args_to_dockerfile:
                  type: boolean
                  description: 'Inject build arguments into the Dockerfile build.'
                include_source_commit_in_build:
                  type: boolean
                  description: 'Include the source commit in the build.'
                is_env_sorting_enabled:
                  type: boolean
                  description: 'Sort environment variables.'
                is_pr_deployments_public_enabled:
                  type: boolean
                  description: 'Make pull request deployments public.'
                stop_grace_period:
                  type: integer
                  nullable: true
                  minimum: 1
                  maximum: 3600
                  description: 'Container stop grace period in seconds.'
                docker_images_to_keep:
                  type: integer
                  minimum: 0
                  maximum: 100
                  description: 'Number of Docker images to retain.'
                is_gzip_enabled:
                  type: boolean
                  description: 'Enable gzip compression.'
                is_stripprefix_enabled:
                  type: boolean
                  description: 'Enable path prefix stripping.'
                is_raw_compose_deployment_enabled:
                  type: boolean
                  description: 'Deploy the raw Docker Compose definition.'
                is_http_basic_auth_enabled:
                  type: boolean
                  description: 'HTTP Basic Authentication enabled.'
                http_basic_auth_username:
                  type: string
                  nullable: true
                  description: 'Username for HTTP Basic Authentication'
                http_basic_auth_password:
                  type: string
                  nullable: true
                  description: 'Password for HTTP Basic Authentication'
                connect_to_docker_network:
                  type: boolean
                  description: 'The flag to connect the service to the predefined Docker network.'
                force_domain_override:
                  type: boolean
                  description: 'Force domain usage even if conflicts are detected. Default is false.'
                autogenerate_domain:
                  type: boolean
                  default: true
                  description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the application.'
                is_preserve_repository_enabled:
                  type: boolean
                  default: false
                  description: 'Preserve repository during deployment.'
              type: object
      responses:
        '201':
          description: 'Application created successfully.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
      security:
        -
          bearerAuth: []
  /applications/private-github-app:
    post:
      tags:
        - Applications
      summary: 'Create (Private - GH App)'
      description: 'Create new application based on a private repository through a Github App.'
      operationId: create-private-github-app-application
      requestBody:
        description: 'Application object that needs to be created.'
        required: true
        content:
          application/json:
            schema:
              required:
                - project_uuid
                - server_uuid
                - environment_name
                - environment_uuid
                - github_app_uuid
                - git_repository
                - git_branch
                - build_pack
              properties:
                project_uuid:
                  type: string
                  description: 'The project UUID.'
                server_uuid:
                  type: string
                  description: 'The server UUID.'
                environment_name:
                  type: string
                  description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
                github_app_uuid:
                  type: string
                  description: 'The Github App UUID.'
                git_repository:
                  type: string
                  description: 'The git repository URL.'
                git_branch:
                  type: string
                  description: 'The git branch.'
                ports_exposes:
                  type: string
                  description: 'The ports to expose.'
                destination_uuid:
                  type: string
                  description: 'The destination UUID.'
                build_pack:
                  type: string
                  enum: [nixpacks, railpack, static, dockerfile, dockercompose]
                  description: 'The build pack type.'
                name:
                  type: string
                  description: 'The application name.'
                description:
                  type: string
                  description: 'The application description.'
                domains:
                  type: string
                  description: 'The application URLs in a comma-separated list.'
                git_commit_sha:
                  type: string
                  description: 'The git commit SHA.'
                docker_registry_image_name:
                  type: string
                  description: 'The docker registry image name.'
                docker_registry_image_tag:
                  type: string
                  description: 'The docker registry image tag.'
                is_static:
                  type: boolean
                  description: 'The flag to indicate if the application is static.'
                is_spa:
                  type: boolean
                  description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.'
                is_auto_deploy_enabled:
                  type: boolean
                  description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.'
                is_force_https_enabled:
                  type: boolean
                  description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
                is_preview_deployments_enabled:
                  type: boolean
                  description: 'Enable preview deployments for pull requests.'
                static_image:
                  type: string
                  enum: ['nginx:alpine']
                  description: 'The static image.'
                install_command:
                  type: string
                  description: 'The install command.'
                build_command:
                  type: string
                  description: 'The build command.'
                start_command:
                  type: string
                  description: 'The start command.'
                ports_mappings:
                  type: string
                  description: 'The ports mappings.'
                base_directory:
                  type: string
                  description: 'The base directory for all commands.'
                publish_directory:
                  type: string
                  description: 'The publish directory.'
                health_check_enabled:
                  type: boolean
                  description: 'Health check enabled.'
                health_check_path:
                  type: string
                  description: 'Health check path.'
                health_check_port:
                  type: string
                  nullable: true
                  description: 'Health check port.'
                health_check_host:
                  type: string
                  nullable: true
                  description: 'Health check host.'
                health_check_method:
                  type: string
                  description: 'Health check method.'
                health_check_return_code:
                  type: integer
                  description: 'Health check return code.'
                health_check_scheme:
                  type: string
                  description: 'Health check scheme.'
                health_check_response_text:
                  type: string
                  nullable: true
                  description: 'Health check response text.'
                health_check_interval:
                  type: integer
                  description: 'Health check interval in seconds.'
                health_check_timeout:
                  type: integer
                  description: 'Health check timeout in seconds.'
                health_check_retries:
                  type: integer
                  description: 'Health check retries count.'
                health_check_start_period:
                  type: integer
                  description: 'Health check start period in seconds.'
                limits_memory:
                  type: string
                  description: 'Memory limit.'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit.'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness.'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation.'
                limits_cpus:
                  type: string
                  description: 'CPU limit.'
                limits_cpuset:
                  type: string
                  nullable: true
                  description: 'CPU set.'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares.'
                custom_labels:
                  type: string
                  description: 'Custom labels.'
                custom_docker_run_options:
                  type: string
                  description: 'Custom docker run options.'
                post_deployment_command:
                  type: string
                  description: 'Post deployment command.'
                post_deployment_command_container:
                  type: string
                  description: 'Post deployment command container.'
                pre_deployment_command:
                  type: string
                  description: 'Pre deployment command.'
                pre_deployment_command_container:
                  type: string
                  description: 'Pre deployment command container.'
                manual_webhook_secret_github:
                  type: string
                  description: 'Manual webhook secret for Github.'
                manual_webhook_secret_gitlab:
                  type: string
                  description: 'Manual webhook secret for Gitlab.'
                manual_webhook_secret_bitbucket:
                  type: string
                  description: 'Manual webhook secret for Bitbucket.'
                manual_webhook_secret_gitea:
                  type: string
                  description: 'Manual webhook secret for Gitea.'
                redirect:
                  type: string
                  nullable: true
                  description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
                  enum: [www, non-www, both]
                instant_deploy:
                  type: boolean
                  description: 'The flag to indicate if the application should be deployed instantly.'
                dockerfile:
                  type: string
                  description: 'The Dockerfile content.'
                dockerfile_location:
                  type: string
                  description: 'The Dockerfile location in the repository'
                docker_compose_location:
                  type: string
                  description: 'The Docker Compose location.'
                docker_compose_custom_start_command:
                  type: string
                  description: 'The Docker Compose custom start command.'
                docker_compose_custom_build_command:
                  type: string
                  description: 'The Docker Compose custom build command.'
                docker_compose_domains:
                  type: array
                  description: 'Array of URLs to be applied to containers of a dockercompose application.'
                  items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "https://app.cynone.com,https://app2.cynone.com")' } }, type: object }
                watch_paths:
                  type: string
                  description: 'The watch paths.'
                use_build_server:
                  type: boolean
                  nullable: true
                  description: 'Use build server.'
                use_build_secrets:
                  type: boolean
                  default: false
                  description: 'Use Docker Build Secrets for build-time environment variables.'
                is_git_submodules_enabled:
                  type: boolean
                  description: 'Clone Git submodules.'
                is_git_lfs_enabled:
                  type: boolean
                  description: 'Enable Git LFS.'
                is_git_shallow_clone_enabled:
                  type: boolean
                  description: 'Use a shallow Git clone.'
                disable_build_cache:
                  type: boolean
                  description: 'Disable the build cache.'
                inject_build_args_to_dockerfile:
                  type: boolean
                  description: 'Inject build arguments into the Dockerfile build.'
                include_source_commit_in_build:
                  type: boolean
                  description: 'Include the source commit in the build.'
                is_env_sorting_enabled:
                  type: boolean
                  description: 'Sort environment variables.'
                is_pr_deployments_public_enabled:
                  type: boolean
                  description: 'Make pull request deployments public.'
                stop_grace_period:
                  type: integer
                  nullable: true
                  minimum: 1
                  maximum: 3600
                  description: 'Container stop grace period in seconds.'
                docker_images_to_keep:
                  type: integer
                  minimum: 0
                  maximum: 100
                  description: 'Number of Docker images to retain.'
                is_gzip_enabled:
                  type: boolean
                  description: 'Enable gzip compression.'
                is_stripprefix_enabled:
                  type: boolean
                  description: 'Enable path prefix stripping.'
                is_raw_compose_deployment_enabled:
                  type: boolean
                  description: 'Deploy the raw Docker Compose definition.'
                is_http_basic_auth_enabled:
                  type: boolean
                  description: 'HTTP Basic Authentication enabled.'
                http_basic_auth_username:
                  type: string
                  nullable: true
                  description: 'Username for HTTP Basic Authentication'
                http_basic_auth_password:
                  type: string
                  nullable: true
                  description: 'Password for HTTP Basic Authentication'
                connect_to_docker_network:
                  type: boolean
                  description: 'The flag to connect the service to the predefined Docker network.'
                force_domain_override:
                  type: boolean
                  description: 'Force domain usage even if conflicts are detected. Default is false.'
                autogenerate_domain:
                  type: boolean
                  default: true
                  description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the application.'
                is_preserve_repository_enabled:
                  type: boolean
                  default: false
                  description: 'Preserve repository during deployment.'
              type: object
      responses:
        '201':
          description: 'Application created successfully.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
      security:
        -
          bearerAuth: []
  /applications/private-deploy-key:
    post:
      tags:
        - Applications
      summary: 'Create (Private - Deploy Key)'
      description: 'Create new application based on a private repository through a Deploy Key.'
      operationId: create-private-deploy-key-application
      requestBody:
        description: 'Application object that needs to be created.'
        required: true
        content:
          application/json:
            schema:
              required:
                - project_uuid
                - server_uuid
                - environment_name
                - environment_uuid
                - private_key_uuid
                - git_repository
                - git_branch
                - build_pack
              properties:
                project_uuid:
                  type: string
                  description: 'The project UUID.'
                server_uuid:
                  type: string
                  description: 'The server UUID.'
                environment_name:
                  type: string
                  description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
                private_key_uuid:
                  type: string
                  description: 'The private key UUID.'
                git_repository:
                  type: string
                  description: 'The git repository URL.'
                git_branch:
                  type: string
                  description: 'The git branch.'
                ports_exposes:
                  type: string
                  description: 'The ports to expose.'
                destination_uuid:
                  type: string
                  description: 'The destination UUID.'
                build_pack:
                  type: string
                  enum: [nixpacks, railpack, static, dockerfile, dockercompose]
                  description: 'The build pack type.'
                name:
                  type: string
                  description: 'The application name.'
                description:
                  type: string
                  description: 'The application description.'
                domains:
                  type: string
                  description: 'The application URLs in a comma-separated list.'
                git_commit_sha:
                  type: string
                  description: 'The git commit SHA.'
                docker_registry_image_name:
                  type: string
                  description: 'The docker registry image name.'
                docker_registry_image_tag:
                  type: string
                  description: 'The docker registry image tag.'
                is_static:
                  type: boolean
                  description: 'The flag to indicate if the application is static.'
                is_spa:
                  type: boolean
                  description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.'
                is_auto_deploy_enabled:
                  type: boolean
                  description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.'
                is_force_https_enabled:
                  type: boolean
                  description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
                is_preview_deployments_enabled:
                  type: boolean
                  description: 'Enable preview deployments for pull requests.'
                static_image:
                  type: string
                  enum: ['nginx:alpine']
                  description: 'The static image.'
                install_command:
                  type: string
                  description: 'The install command.'
                build_command:
                  type: string
                  description: 'The build command.'
                start_command:
                  type: string
                  description: 'The start command.'
                ports_mappings:
                  type: string
                  description: 'The ports mappings.'
                base_directory:
                  type: string
                  description: 'The base directory for all commands.'
                publish_directory:
                  type: string
                  description: 'The publish directory.'
                health_check_enabled:
                  type: boolean
                  description: 'Health check enabled.'
                health_check_path:
                  type: string
                  description: 'Health check path.'
                health_check_port:
                  type: string
                  nullable: true
                  description: 'Health check port.'
                health_check_host:
                  type: string
                  nullable: true
                  description: 'Health check host.'
                health_check_method:
                  type: string
                  description: 'Health check method.'
                health_check_return_code:
                  type: integer
                  description: 'Health check return code.'
                health_check_scheme:
                  type: string
                  description: 'Health check scheme.'
                health_check_response_text:
                  type: string
                  nullable: true
                  description: 'Health check response text.'
                health_check_interval:
                  type: integer
                  description: 'Health check interval in seconds.'
                health_check_timeout:
                  type: integer
                  description: 'Health check timeout in seconds.'
                health_check_retries:
                  type: integer
                  description: 'Health check retries count.'
                health_check_start_period:
                  type: integer
                  description: 'Health check start period in seconds.'
                limits_memory:
                  type: string
                  description: 'Memory limit.'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit.'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness.'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation.'
                limits_cpus:
                  type: string
                  description: 'CPU limit.'
                limits_cpuset:
                  type: string
                  nullable: true
                  description: 'CPU set.'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares.'
                custom_labels:
                  type: string
                  description: 'Custom labels.'
                custom_docker_run_options:
                  type: string
                  description: 'Custom docker run options.'
                post_deployment_command:
                  type: string
                  description: 'Post deployment command.'
                post_deployment_command_container:
                  type: string
                  description: 'Post deployment command container.'
                pre_deployment_command:
                  type: string
                  description: 'Pre deployment command.'
                pre_deployment_command_container:
                  type: string
                  description: 'Pre deployment command container.'
                manual_webhook_secret_github:
                  type: string
                  description: 'Manual webhook secret for Github.'
                manual_webhook_secret_gitlab:
                  type: string
                  description: 'Manual webhook secret for Gitlab.'
                manual_webhook_secret_bitbucket:
                  type: string
                  description: 'Manual webhook secret for Bitbucket.'
                manual_webhook_secret_gitea:
                  type: string
                  description: 'Manual webhook secret for Gitea.'
                redirect:
                  type: string
                  nullable: true
                  description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
                  enum: [www, non-www, both]
                instant_deploy:
                  type: boolean
                  description: 'The flag to indicate if the application should be deployed instantly.'
                dockerfile:
                  type: string
                  description: 'The Dockerfile content.'
                dockerfile_location:
                  type: string
                  description: 'The Dockerfile location in the repository.'
                docker_compose_location:
                  type: string
                  description: 'The Docker Compose location.'
                docker_compose_custom_start_command:
                  type: string
                  description: 'The Docker Compose custom start command.'
                docker_compose_custom_build_command:
                  type: string
                  description: 'The Docker Compose custom build command.'
                docker_compose_domains:
                  type: array
                  description: 'Array of URLs to be applied to containers of a dockercompose application.'
                  items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "https://app.cynone.com,https://app2.cynone.com")' } }, type: object }
                watch_paths:
                  type: string
                  description: 'The watch paths.'
                use_build_server:
                  type: boolean
                  nullable: true
                  description: 'Use build server.'
                use_build_secrets:
                  type: boolean
                  default: false
                  description: 'Use Docker Build Secrets for build-time environment variables.'
                is_git_submodules_enabled:
                  type: boolean
                  description: 'Clone Git submodules.'
                is_git_lfs_enabled:
                  type: boolean
                  description: 'Enable Git LFS.'
                is_git_shallow_clone_enabled:
                  type: boolean
                  description: 'Use a shallow Git clone.'
                disable_build_cache:
                  type: boolean
                  description: 'Disable the build cache.'
                inject_build_args_to_dockerfile:
                  type: boolean
                  description: 'Inject build arguments into the Dockerfile build.'
                include_source_commit_in_build:
                  type: boolean
                  description: 'Include the source commit in the build.'
                is_env_sorting_enabled:
                  type: boolean
                  description: 'Sort environment variables.'
                is_pr_deployments_public_enabled:
                  type: boolean
                  description: 'Make pull request deployments public.'
                stop_grace_period:
                  type: integer
                  nullable: true
                  minimum: 1
                  maximum: 3600
                  description: 'Container stop grace period in seconds.'
                docker_images_to_keep:
                  type: integer
                  minimum: 0
                  maximum: 100
                  description: 'Number of Docker images to retain.'
                is_gzip_enabled:
                  type: boolean
                  description: 'Enable gzip compression.'
                is_stripprefix_enabled:
                  type: boolean
                  description: 'Enable path prefix stripping.'
                is_raw_compose_deployment_enabled:
                  type: boolean
                  description: 'Deploy the raw Docker Compose definition.'
                is_http_basic_auth_enabled:
                  type: boolean
                  description: 'HTTP Basic Authentication enabled.'
                http_basic_auth_username:
                  type: string
                  nullable: true
                  description: 'Username for HTTP Basic Authentication'
                http_basic_auth_password:
                  type: string
                  nullable: true
                  description: 'Password for HTTP Basic Authentication'
                connect_to_docker_network:
                  type: boolean
                  description: 'The flag to connect the service to the predefined Docker network.'
                force_domain_override:
                  type: boolean
                  description: 'Force domain usage even if conflicts are detected. Default is false.'
                autogenerate_domain:
                  type: boolean
                  default: true
                  description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the application.'
                is_preserve_repository_enabled:
                  type: boolean
                  default: false
                  description: 'Preserve repository during deployment.'
              type: object
      responses:
        '201':
          description: 'Application created successfully.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
      security:
        -
          bearerAuth: []
  /applications/dockerfile:
    post:
      tags:
        - Applications
      summary: 'Create (Dockerfile without git)'
      description: 'Create new application based on a simple Dockerfile (without git).'
      operationId: create-dockerfile-application
      requestBody:
        description: 'Application object that needs to be created.'
        required: true
        content:
          application/json:
            schema:
              required:
                - project_uuid
                - server_uuid
                - environment_name
                - environment_uuid
                - dockerfile
              properties:
                project_uuid:
                  type: string
                  description: 'The project UUID.'
                server_uuid:
                  type: string
                  description: 'The server UUID.'
                environment_name:
                  type: string
                  description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
                dockerfile:
                  type: string
                  description: 'The Dockerfile content.'
                build_pack:
                  type: string
                  enum: [dockerfile]
                  description: 'The build pack type.'
                ports_exposes:
                  type: string
                  description: 'The ports to expose.'
                destination_uuid:
                  type: string
                  description: 'The destination UUID.'
                name:
                  type: string
                  description: 'The application name.'
                description:
                  type: string
                  description: 'The application description.'
                domains:
                  type: string
                  description: 'The application URLs in a comma-separated list.'
                docker_registry_image_name:
                  type: string
                  description: 'The docker registry image name.'
                docker_registry_image_tag:
                  type: string
                  description: 'The docker registry image tag.'
                ports_mappings:
                  type: string
                  description: 'The ports mappings.'
                base_directory:
                  type: string
                  description: 'The base directory for all commands.'
                health_check_enabled:
                  type: boolean
                  description: 'Health check enabled.'
                health_check_path:
                  type: string
                  description: 'Health check path.'
                health_check_port:
                  type: string
                  nullable: true
                  description: 'Health check port.'
                health_check_host:
                  type: string
                  nullable: true
                  description: 'Health check host.'
                health_check_method:
                  type: string
                  description: 'Health check method.'
                health_check_return_code:
                  type: integer
                  description: 'Health check return code.'
                health_check_scheme:
                  type: string
                  description: 'Health check scheme.'
                health_check_response_text:
                  type: string
                  nullable: true
                  description: 'Health check response text.'
                health_check_interval:
                  type: integer
                  description: 'Health check interval in seconds.'
                health_check_timeout:
                  type: integer
                  description: 'Health check timeout in seconds.'
                health_check_retries:
                  type: integer
                  description: 'Health check retries count.'
                health_check_start_period:
                  type: integer
                  description: 'Health check start period in seconds.'
                limits_memory:
                  type: string
                  description: 'Memory limit.'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit.'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness.'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation.'
                limits_cpus:
                  type: string
                  description: 'CPU limit.'
                limits_cpuset:
                  type: string
                  nullable: true
                  description: 'CPU set.'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares.'
                custom_labels:
                  type: string
                  description: 'Custom labels.'
                custom_docker_run_options:
                  type: string
                  description: 'Custom docker run options.'
                post_deployment_command:
                  type: string
                  description: 'Post deployment command.'
                post_deployment_command_container:
                  type: string
                  description: 'Post deployment command container.'
                pre_deployment_command:
                  type: string
                  description: 'Pre deployment command.'
                pre_deployment_command_container:
                  type: string
                  description: 'Pre deployment command container.'
                manual_webhook_secret_github:
                  type: string
                  description: 'Manual webhook secret for Github.'
                manual_webhook_secret_gitlab:
                  type: string
                  description: 'Manual webhook secret for Gitlab.'
                manual_webhook_secret_bitbucket:
                  type: string
                  description: 'Manual webhook secret for Bitbucket.'
                manual_webhook_secret_gitea:
                  type: string
                  description: 'Manual webhook secret for Gitea.'
                redirect:
                  type: string
                  nullable: true
                  description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
                  enum: [www, non-www, both]
                instant_deploy:
                  type: boolean
                  description: 'The flag to indicate if the application should be deployed instantly.'
                is_force_https_enabled:
                  type: boolean
                  description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
                is_preview_deployments_enabled:
                  type: boolean
                  description: 'Enable preview deployments for pull requests.'
                use_build_server:
                  type: boolean
                  nullable: true
                  description: 'Use build server.'
                use_build_secrets:
                  type: boolean
                  default: false
                  description: 'Use Docker Build Secrets for build-time environment variables.'
                is_git_submodules_enabled:
                  type: boolean
                  description: 'Clone Git submodules.'
                is_git_lfs_enabled:
                  type: boolean
                  description: 'Enable Git LFS.'
                is_git_shallow_clone_enabled:
                  type: boolean
                  description: 'Use a shallow Git clone.'
                disable_build_cache:
                  type: boolean
                  description: 'Disable the build cache.'
                inject_build_args_to_dockerfile:
                  type: boolean
                  description: 'Inject build arguments into the Dockerfile build.'
                include_source_commit_in_build:
                  type: boolean
                  description: 'Include the source commit in the build.'
                is_env_sorting_enabled:
                  type: boolean
                  description: 'Sort environment variables.'
                is_pr_deployments_public_enabled:
                  type: boolean
                  description: 'Make pull request deployments public.'
                stop_grace_period:
                  type: integer
                  nullable: true
                  minimum: 1
                  maximum: 3600
                  description: 'Container stop grace period in seconds.'
                docker_images_to_keep:
                  type: integer
                  minimum: 0
                  maximum: 100
                  description: 'Number of Docker images to retain.'
                is_gzip_enabled:
                  type: boolean
                  description: 'Enable gzip compression.'
                is_stripprefix_enabled:
                  type: boolean
                  description: 'Enable path prefix stripping.'
                is_raw_compose_deployment_enabled:
                  type: boolean
                  description: 'Deploy the raw Docker Compose definition.'
                is_http_basic_auth_enabled:
                  type: boolean
                  description: 'HTTP Basic Authentication enabled.'
                http_basic_auth_username:
                  type: string
                  nullable: true
                  description: 'Username for HTTP Basic Authentication'
                http_basic_auth_password:
                  type: string
                  nullable: true
                  description: 'Password for HTTP Basic Authentication'
                connect_to_docker_network:
                  type: boolean
                  description: 'The flag to connect the service to the predefined Docker network.'
                force_domain_override:
                  type: boolean
                  description: 'Force domain usage even if conflicts are detected. Default is false.'
                autogenerate_domain:
                  type: boolean
                  default: true
                  description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the application.'
              type: object
      responses:
        '201':
          description: 'Application created successfully.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
      security:
        -
          bearerAuth: []
  /applications/dockerimage:
    post:
      tags:
        - Applications
      summary: 'Create (Docker Image without git)'
      description: 'Create new application based on a prebuilt docker image (without git).'
      operationId: create-dockerimage-application
      requestBody:
        description: 'Application object that needs to be created.'
        required: true
        content:
          application/json:
            schema:
              required:
                - project_uuid
                - server_uuid
                - environment_name
                - environment_uuid
                - docker_registry_image_name
              properties:
                project_uuid:
                  type: string
                  description: 'The project UUID.'
                server_uuid:
                  type: string
                  description: 'The server UUID.'
                environment_name:
                  type: string
                  description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
                docker_registry_image_name:
                  type: string
                  description: 'The docker registry image name.'
                docker_registry_image_tag:
                  type: string
                  description: 'The docker registry image tag.'
                ports_exposes:
                  type: string
                  description: 'The ports to expose.'
                destination_uuid:
                  type: string
                  description: 'The destination UUID.'
                name:
                  type: string
                  description: 'The application name.'
                description:
                  type: string
                  description: 'The application description.'
                domains:
                  type: string
                  description: 'The application URLs in a comma-separated list.'
                ports_mappings:
                  type: string
                  description: 'The ports mappings.'
                health_check_enabled:
                  type: boolean
                  description: 'Health check enabled.'
                health_check_path:
                  type: string
                  description: 'Health check path.'
                health_check_port:
                  type: string
                  nullable: true
                  description: 'Health check port.'
                health_check_host:
                  type: string
                  nullable: true
                  description: 'Health check host.'
                health_check_method:
                  type: string
                  description: 'Health check method.'
                health_check_return_code:
                  type: integer
                  description: 'Health check return code.'
                health_check_scheme:
                  type: string
                  description: 'Health check scheme.'
                health_check_response_text:
                  type: string
                  nullable: true
                  description: 'Health check response text.'
                health_check_interval:
                  type: integer
                  description: 'Health check interval in seconds.'
                health_check_timeout:
                  type: integer
                  description: 'Health check timeout in seconds.'
                health_check_retries:
                  type: integer
                  description: 'Health check retries count.'
                health_check_start_period:
                  type: integer
                  description: 'Health check start period in seconds.'
                limits_memory:
                  type: string
                  description: 'Memory limit.'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit.'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness.'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation.'
                limits_cpus:
                  type: string
                  description: 'CPU limit.'
                limits_cpuset:
                  type: string
                  nullable: true
                  description: 'CPU set.'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares.'
                custom_labels:
                  type: string
                  description: 'Custom labels.'
                custom_docker_run_options:
                  type: string
                  description: 'Custom docker run options.'
                post_deployment_command:
                  type: string
                  description: 'Post deployment command.'
                post_deployment_command_container:
                  type: string
                  description: 'Post deployment command container.'
                pre_deployment_command:
                  type: string
                  description: 'Pre deployment command.'
                pre_deployment_command_container:
                  type: string
                  description: 'Pre deployment command container.'
                manual_webhook_secret_github:
                  type: string
                  description: 'Manual webhook secret for Github.'
                manual_webhook_secret_gitlab:
                  type: string
                  description: 'Manual webhook secret for Gitlab.'
                manual_webhook_secret_bitbucket:
                  type: string
                  description: 'Manual webhook secret for Bitbucket.'
                manual_webhook_secret_gitea:
                  type: string
                  description: 'Manual webhook secret for Gitea.'
                redirect:
                  type: string
                  nullable: true
                  description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
                  enum: [www, non-www, both]
                instant_deploy:
                  type: boolean
                  description: 'The flag to indicate if the application should be deployed instantly.'
                is_force_https_enabled:
                  type: boolean
                  description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
                is_preview_deployments_enabled:
                  type: boolean
                  description: 'Enable preview deployments for pull requests.'
                use_build_server:
                  type: boolean
                  nullable: true
                  description: 'Use build server.'
                use_build_secrets:
                  type: boolean
                  default: false
                  description: 'Use Docker Build Secrets for build-time environment variables.'
                is_git_submodules_enabled:
                  type: boolean
                  description: 'Clone Git submodules.'
                is_git_lfs_enabled:
                  type: boolean
                  description: 'Enable Git LFS.'
                is_git_shallow_clone_enabled:
                  type: boolean
                  description: 'Use a shallow Git clone.'
                disable_build_cache:
                  type: boolean
                  description: 'Disable the build cache.'
                inject_build_args_to_dockerfile:
                  type: boolean
                  description: 'Inject build arguments into the Dockerfile build.'
                include_source_commit_in_build:
                  type: boolean
                  description: 'Include the source commit in the build.'
                is_env_sorting_enabled:
                  type: boolean
                  description: 'Sort environment variables.'
                is_pr_deployments_public_enabled:
                  type: boolean
                  description: 'Make pull request deployments public.'
                stop_grace_period:
                  type: integer
                  nullable: true
                  minimum: 1
                  maximum: 3600
                  description: 'Container stop grace period in seconds.'
                docker_images_to_keep:
                  type: integer
                  minimum: 0
                  maximum: 100
                  description: 'Number of Docker images to retain.'
                is_gzip_enabled:
                  type: boolean
                  description: 'Enable gzip compression.'
                is_stripprefix_enabled:
                  type: boolean
                  description: 'Enable path prefix stripping.'
                is_raw_compose_deployment_enabled:
                  type: boolean
                  description: 'Deploy the raw Docker Compose definition.'
                is_http_basic_auth_enabled:
                  type: boolean
                  description: 'HTTP Basic Authentication enabled.'
                http_basic_auth_username:
                  type: string
                  nullable: true
                  description: 'Username for HTTP Basic Authentication'
                http_basic_auth_password:
                  type: string
                  nullable: true
                  description: 'Password for HTTP Basic Authentication'
                connect_to_docker_network:
                  type: boolean
                  description: 'The flag to connect the service to the predefined Docker network.'
                force_domain_override:
                  type: boolean
                  description: 'Force domain usage even if conflicts are detected. Default is false.'
                autogenerate_domain:
                  type: boolean
                  default: true
                  description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the application.'
              type: object
      responses:
        '201':
          description: 'Application created successfully.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
      security:
        -
          bearerAuth: []
  '/applications/{uuid}':
    get:
      tags:
        - Applications
      summary: Get
      description: 'Get application by UUID.'
      operationId: get-application-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get application by UUID.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Applications
      summary: Delete
      description: 'Delete application by UUID.'
      operationId: delete-application-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: delete_configurations
          in: query
          description: 'Delete configurations.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: delete_volumes
          in: query
          description: 'Delete volumes.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: docker_cleanup
          in: query
          description: 'Run docker cleanup.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: delete_connected_networks
          in: query
          description: 'Delete connected networks.'
          required: false
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: 'Application deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Application deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Applications
      summary: Update
      description: 'Update application by UUID.'
      operationId: update-application-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Application updated.'
        required: true
        content:
          application/json:
            schema:
              properties:
                project_uuid:
                  type: string
                  description: 'The project UUID.'
                server_uuid:
                  type: string
                  description: 'The server UUID.'
                environment_name:
                  type: string
                  description: 'The environment name.'
                github_app_uuid:
                  type: string
                  description: 'The Github App UUID.'
                git_repository:
                  type: string
                  description: 'The git repository URL.'
                git_branch:
                  type: string
                  description: 'The git branch.'
                ports_exposes:
                  type: string
                  description: 'The ports to expose.'
                destination_uuid:
                  type: string
                  description: 'The destination UUID.'
                build_pack:
                  type: string
                  enum: [nixpacks, railpack, static, dockerfile, dockercompose]
                  description: 'The build pack type.'
                name:
                  type: string
                  description: 'The application name.'
                description:
                  type: string
                  description: 'The application description.'
                domains:
                  type: string
                  description: 'The application URLs in a comma-separated list.'
                git_commit_sha:
                  type: string
                  description: 'The git commit SHA.'
                docker_registry_image_name:
                  type: string
                  description: 'The docker registry image name.'
                docker_registry_image_tag:
                  type: string
                  description: 'The docker registry image tag.'
                is_static:
                  type: boolean
                  description: 'The flag to indicate if the application is static.'
                is_spa:
                  type: boolean
                  description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.'
                is_auto_deploy_enabled:
                  type: boolean
                  description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.'
                is_force_https_enabled:
                  type: boolean
                  description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
                is_preview_deployments_enabled:
                  type: boolean
                  description: 'Enable preview deployments for pull requests.'
                install_command:
                  type: string
                  description: 'The install command.'
                build_command:
                  type: string
                  description: 'The build command.'
                start_command:
                  type: string
                  description: 'The start command.'
                ports_mappings:
                  type: string
                  description: 'The ports mappings.'
                base_directory:
                  type: string
                  description: 'The base directory for all commands.'
                publish_directory:
                  type: string
                  description: 'The publish directory.'
                health_check_enabled:
                  type: boolean
                  description: 'Health check enabled.'
                health_check_path:
                  type: string
                  description: 'Health check path.'
                health_check_port:
                  type: string
                  nullable: true
                  description: 'Health check port.'
                health_check_host:
                  type: string
                  nullable: true
                  description: 'Health check host.'
                health_check_method:
                  type: string
                  description: 'Health check method.'
                health_check_return_code:
                  type: integer
                  description: 'Health check return code.'
                health_check_scheme:
                  type: string
                  description: 'Health check scheme.'
                health_check_response_text:
                  type: string
                  nullable: true
                  description: 'Health check response text.'
                health_check_interval:
                  type: integer
                  description: 'Health check interval in seconds.'
                health_check_timeout:
                  type: integer
                  description: 'Health check timeout in seconds.'
                health_check_retries:
                  type: integer
                  description: 'Health check retries count.'
                health_check_start_period:
                  type: integer
                  description: 'Health check start period in seconds.'
                limits_memory:
                  type: string
                  description: 'Memory limit.'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit.'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness.'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation.'
                limits_cpus:
                  type: string
                  description: 'CPU limit.'
                limits_cpuset:
                  type: string
                  nullable: true
                  description: 'CPU set.'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares.'
                custom_labels:
                  type: string
                  description: 'Custom labels.'
                custom_docker_run_options:
                  type: string
                  description: 'Custom docker run options.'
                post_deployment_command:
                  type: string
                  description: 'Post deployment command.'
                post_deployment_command_container:
                  type: string
                  description: 'Post deployment command container.'
                pre_deployment_command:
                  type: string
                  description: 'Pre deployment command.'
                pre_deployment_command_container:
                  type: string
                  description: 'Pre deployment command container.'
                manual_webhook_secret_github:
                  type: string
                  description: 'Manual webhook secret for Github.'
                manual_webhook_secret_gitlab:
                  type: string
                  description: 'Manual webhook secret for Gitlab.'
                manual_webhook_secret_bitbucket:
                  type: string
                  description: 'Manual webhook secret for Bitbucket.'
                manual_webhook_secret_gitea:
                  type: string
                  description: 'Manual webhook secret for Gitea.'
                redirect:
                  type: string
                  nullable: true
                  description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
                  enum: [www, non-www, both]
                instant_deploy:
                  type: boolean
                  description: 'The flag to indicate if the application should be deployed instantly.'
                dockerfile:
                  type: string
                  description: 'The Dockerfile content.'
                dockerfile_location:
                  type: string
                  description: 'The Dockerfile location in the repository.'
                docker_compose_location:
                  type: string
                  description: 'The Docker Compose location.'
                docker_compose_custom_start_command:
                  type: string
                  description: 'The Docker Compose custom start command.'
                docker_compose_custom_build_command:
                  type: string
                  description: 'The Docker Compose custom build command.'
                docker_compose_domains:
                  type: array
                  description: 'Array of URLs to be applied to containers of a dockercompose application.'
                  items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "https://app.cynone.com,https://app2.cynone.com")' } }, type: object }
                watch_paths:
                  type: string
                  description: 'The watch paths.'
                use_build_server:
                  type: boolean
                  nullable: true
                  description: 'Use build server.'
                use_build_secrets:
                  type: boolean
                  description: 'Use Docker Build Secrets for build-time environment variables.'
                is_git_submodules_enabled:
                  type: boolean
                  description: 'Clone Git submodules.'
                is_git_lfs_enabled:
                  type: boolean
                  description: 'Enable Git LFS.'
                is_git_shallow_clone_enabled:
                  type: boolean
                  description: 'Use a shallow Git clone.'
                disable_build_cache:
                  type: boolean
                  description: 'Disable the build cache.'
                inject_build_args_to_dockerfile:
                  type: boolean
                  description: 'Inject build arguments into the Dockerfile build.'
                include_source_commit_in_build:
                  type: boolean
                  description: 'Include the source commit in the build.'
                is_env_sorting_enabled:
                  type: boolean
                  description: 'Sort environment variables.'
                is_pr_deployments_public_enabled:
                  type: boolean
                  description: 'Make pull request deployments public.'
                stop_grace_period:
                  type: integer
                  nullable: true
                  minimum: 1
                  maximum: 3600
                  description: 'Container stop grace period in seconds.'
                docker_images_to_keep:
                  type: integer
                  minimum: 0
                  maximum: 100
                  description: 'Number of Docker images to retain.'
                is_gzip_enabled:
                  type: boolean
                  description: 'Enable gzip compression.'
                is_stripprefix_enabled:
                  type: boolean
                  description: 'Enable path prefix stripping.'
                is_raw_compose_deployment_enabled:
                  type: boolean
                  description: 'Deploy the raw Docker Compose definition.'
                connect_to_docker_network:
                  type: boolean
                  description: 'The flag to connect the service to the predefined Docker network.'
                force_domain_override:
                  type: boolean
                  description: 'Force domain usage even if conflicts are detected. Default is false.'
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
                is_preserve_repository_enabled:
                  type: boolean
                  description: 'Preserve git repository during application update. If false, the existing repository will be removed and replaced with the new one. If true, the existing repository will be kept and the new one will be ignored. Default is false.'
              type: object
      responses:
        '200':
          description: 'Application updated.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/logs':
    get:
      tags:
        - Applications
      summary: 'Get application logs.'
      description: 'Get application logs by UUID.'
      operationId: get-application-logs-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: lines
          in: query
          description: 'Number of lines to show from the end of the logs.'
          required: false
          schema:
            type: integer
            format: int32
            default: 100
        -
          name: show_timestamps
          in: query
          description: 'Show timestamps in the logs.'
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Get application logs by UUID.'
          content:
            application/json:
              schema:
                properties:
                  logs: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/envs':
    get:
      tags:
        - Applications
      summary: 'List Envs'
      description: 'List all envs by application UUID.'
      operationId: list-envs-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'All environment variables by application UUID.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Applications
      summary: 'Create Env'
      description: 'Create env by application UUID.'
      operationId: create-env-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Env created.'
        required: true
        content:
          application/json:
            schema:
              properties:
                key:
                  type: string
                  description: 'The key of the environment variable.'
                value:
                  type: string
                  description: 'The value of the environment variable.'
                is_preview:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is used in preview deployments.'
                is_literal:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
                is_multiline:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is multiline.'
                is_shown_once:
                  type: boolean
                  description: "The flag to indicate if the environment variable's value is shown on the UI."
              type: object
      responses:
        '201':
          description: 'Environment variable created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Applications
      summary: 'Update Env'
      description: 'Update env by application UUID.'
      operationId: update-env-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Env updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - key
                - value
              properties:
                key:
                  type: string
                  description: 'The key of the environment variable.'
                value:
                  type: string
                  description: 'The value of the environment variable.'
                is_preview:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is used in preview deployments.'
                is_literal:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
                is_multiline:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is multiline.'
                is_shown_once:
                  type: boolean
                  description: "The flag to indicate if the environment variable's value is shown on the UI."
              type: object
      responses:
        '201':
          description: 'Environment variable updated.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/envs/bulk':
    patch:
      tags:
        - Applications
      summary: 'Update Envs (Bulk)'
      description: 'Update multiple envs by application UUID.'
      operationId: update-envs-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Bulk envs updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - data
              properties:
                data:
                  type: array
                  items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object }
              type: object
      responses:
        '201':
          description: 'Environment variables updated.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/envs/{env_uuid}':
    delete:
      tags:
        - Applications
      summary: 'Delete Env'
      description: 'Delete env by UUID.'
      operationId: delete-env-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: env_uuid
          in: path
          description: 'UUID of the environment variable.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Environment variable deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Environment variable deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/start':
    post:
      tags:
        - Applications
      summary: Start
      description: 'Start application.'
      operationId: start-application-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: force
          in: query
          description: 'Force rebuild.'
          schema:
            type: boolean
            default: false
        -
          name: instant_deploy
          in: query
          description: 'Instant deploy (skip queuing).'
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Start application.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Deployment request queued.', description: Message. }
                  deployment_uuid: { type: string, example: doogksw, description: 'UUID of the deployment.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/stop':
    post:
      tags:
        - Applications
      summary: Stop
      description: 'Stop application.'
      operationId: stop-application-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: docker_cleanup
          in: query
          description: 'Perform docker cleanup (prune networks, volumes, etc.).'
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: 'Stop application.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Application stopping request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/restart':
    post:
      tags:
        - Applications
      summary: Restart
      description: 'Restart application.'
      operationId: restart-application-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Restart application.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Restart request queued.' }
                  deployment_uuid: { type: string, example: doogksw, description: 'UUID of the deployment.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/move':
    post:
      tags:
        - Applications
      summary: Move
      description: 'Move application to another project/environment. This is a purely organizational change — running containers are not affected. Note: after moving, the application will pick up shared environment variables from the new environment on the next deployment.'
      operationId: move-application-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Target environment to move the application to.'
        required: true
        content:
          application/json:
            schema:
              required:
                - environment_uuid
              properties:
                environment_uuid:
                  type: string
                  description: 'UUID of the target environment.'
              type: object
      responses:
        '200':
          description: 'Application moved successfully.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Application moved successfully.' }
                  uuid: { type: string }
                  project_uuid: { type: string }
                  environment_uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/storages':
    get:
      tags:
        - Applications
      summary: 'List Storages'
      description: 'List all persistent storages and file storages by application UUID.'
      operationId: list-storages-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'All storages by application UUID.'
          content:
            application/json:
              schema:
                properties:
                  persistent_storages: { type: array, items: { type: object } }
                  file_storages: { type: array, items: { type: object } }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Applications
      summary: 'Create Storage'
      description: 'Create a persistent storage or file storage for an application.'
      operationId: create-storage-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - type
                - mount_path
              properties:
                type:
                  type: string
                  enum: [persistent, file]
                  description: 'The type of storage.'
                name:
                  type: string
                  description: 'Volume name (persistent only, required for persistent).'
                mount_path:
                  type: string
                  description: 'The container mount path.'
                host_path:
                  type: string
                  nullable: true
                  description: 'The host path (persistent only, optional).'
                content:
                  type: string
                  nullable: true
                  description: 'File content (file only, optional).'
                is_directory:
                  type: boolean
                  description: 'Whether this is a directory mount (file only, default false).'
                fs_path:
                  type: string
                  description: 'Host directory path (required when is_directory is true).'
              type: object
              additionalProperties: false
      responses:
        '201':
          description: 'Storage created.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Applications
      summary: 'Update Storage'
      description: 'Update a persistent storage or file storage by application UUID.'
      operationId: update-storage-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Storage updated. For read-only storages (from docker-compose or services), only is_preview_suffix_enabled can be updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - type
              properties:
                uuid:
                  type: string
                  description: 'The UUID of the storage (preferred).'
                id:
                  type: integer
                  description: 'The ID of the storage (deprecated, use uuid instead).'
                type:
                  type: string
                  enum: [persistent, file]
                  description: 'The type of storage: persistent or file.'
                is_preview_suffix_enabled:
                  type: boolean
                  description: 'Whether to add -pr-N suffix for preview deployments.'
                name:
                  type: string
                  description: 'The volume name (persistent only, not allowed for read-only storages).'
                mount_path:
                  type: string
                  description: 'The container mount path (not allowed for read-only storages).'
                host_path:
                  type: string
                  nullable: true
                  description: 'The host path (persistent only, not allowed for read-only storages).'
                content:
                  type: string
                  nullable: true
                  description: 'The file content (file only, not allowed for read-only storages).'
              type: object
              additionalProperties: false
      responses:
        '200':
          description: 'Storage updated.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/storages/{storage_uuid}':
    delete:
      tags:
        - Applications
      summary: 'Delete Storage'
      description: 'Delete a persistent storage or file storage by application UUID.'
      operationId: delete-storage-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          description: 'UUID of the storage.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Storage deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/previews/{pull_request_id}':
    delete:
      tags:
        - Applications
      summary: 'Delete Preview Deployment'
      description: 'Delete a preview deployment for a pull request. Cancels active deployments, stops containers, removes volumes/networks, and deletes the preview record.'
      operationId: delete-preview-deployment-by-pull-request-id
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: pull_request_id
          in: path
          description: 'Pull request ID of the preview to delete.'
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: 'Preview deletion queued.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/tags':
    get:
      tags:
        - Applications
      summary: 'List Tags'
      description: 'List tags for an application by UUID.'
      operationId: list-tags-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of tags.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Applications
      summary: 'Create Tag'
      description: 'Add tag(s) to an application by UUID.'
      operationId: create-tag-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              properties:
                tag_name:
                  type: string
                  description: 'The tag name (min 2 characters). Required if tag_names is not provided.'
                tag_names:
                  type: array
                  items: { type: string }
                  description: 'Array of tag names (each min 2 characters). Required if tag_name is not provided.'
              type: object
      responses:
        '201':
          description: 'Tags added successfully.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/tags/{tag_uuid}':
    delete:
      tags:
        - Applications
      summary: 'Delete Tag'
      description: 'Remove a tag from an application by UUID.'
      operationId: delete-tag-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: tag_uuid
          in: path
          description: 'UUID of the tag.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Tag removed.'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /cloud-tokens:
    get:
      tags:
        - 'Cloud Tokens'
      summary: 'List Cloud Provider Tokens'
      description: 'List all cloud provider tokens for the authenticated team.'
      operationId: list-cloud-tokens
      responses:
        '200':
          description: 'Get all cloud provider tokens.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { uuid: { type: string }, name: { type: string }, provider: { type: string, enum: [hetzner, digitalocean, vultr] }, team_id: { type: integer }, servers_count: { type: integer }, created_at: { type: string }, updated_at: { type: string } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - 'Cloud Tokens'
      summary: 'Create Cloud Provider Token'
      description: 'Create a new cloud provider token. The token will be validated before being stored.'
      operationId: create-cloud-token
      requestBody:
        description: 'Cloud provider token details'
        required: true
        content:
          application/json:
            schema:
              required:
                - provider
                - token
                - name
              properties:
                provider:
                  type: string
                  enum: [hetzner, digitalocean, vultr]
                  example: hetzner
                  description: 'The cloud provider.'
                token:
                  type: string
                  example: your-api-token-here
                  description: 'The API token for the cloud provider.'
                name:
                  type: string
                  example: 'My Hetzner Token'
                  description: 'A friendly name for the token.'
              type: object
      responses:
        '201':
          description: 'Cloud provider token created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: og888os, description: 'The UUID of the token.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/cloud-tokens/{uuid}':
    get:
      tags:
        - 'Cloud Tokens'
      summary: 'Get Cloud Provider Token'
      description: 'Get cloud provider token by UUID.'
      operationId: get-cloud-token-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Token UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get cloud provider token by UUID'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                  name: { type: string }
                  provider: { type: string }
                  team_id: { type: integer }
                  servers_count: { type: integer }
                  created_at: { type: string }
                  updated_at: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - 'Cloud Tokens'
      summary: 'Delete Cloud Provider Token'
      description: 'Delete cloud provider token by UUID. Cannot delete if token is used by any servers.'
      operationId: delete-cloud-token-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the cloud provider token.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Cloud provider token deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Cloud provider token deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - 'Cloud Tokens'
      summary: 'Update Cloud Provider Token'
      description: 'Update cloud provider token name.'
      operationId: update-cloud-token-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Token UUID'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Cloud provider token updated.'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The friendly name for the token.'
              type: object
      responses:
        '200':
          description: 'Cloud provider token updated.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/cloud-tokens/{uuid}/validate':
    post:
      tags:
        - 'Cloud Tokens'
      summary: 'Validate Cloud Provider Token'
      description: 'Validate a cloud provider token against the provider API.'
      operationId: validate-cloud-token-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Token UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Token validation result.'
          content:
            application/json:
              schema:
                properties:
                  valid: { type: boolean, example: true }
                  message: { type: string, example: 'Token is valid.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /databases:
    get:
      tags:
        - Databases
      summary: List
      description: 'List all databases.'
      operationId: list-databases
      responses:
        '200':
          description: 'Get all databases'
          content:
            application/json:
              schema:
                type: string
              example: 'Content is very complex. Will be implemented later.'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/backups':
    get:
      tags:
        - Databases
      summary: Get
      description: 'Get backups details by database UUID.'
      operationId: get-database-backups-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get all backups for a database'
          content:
            application/json:
              schema:
                type: string
              example: 'Content is very complex. Will be implemented later.'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Databases
      summary: 'Create Backup'
      description: 'Create a new scheduled backup configuration for a database'
      operationId: create-database-backup
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Backup configuration data'
        required: true
        content:
          application/json:
            schema:
              required:
                - frequency
              properties:
                frequency:
                  type: string
                  description: 'Backup frequency (cron expression or: every_minute, hourly, daily, weekly, monthly, yearly)'
                enabled:
                  type: boolean
                  description: 'Whether the backup is enabled'
                  default: true
                save_s3:
                  type: boolean
                  description: 'Whether to save backups to S3'
                  default: false
                s3_storage_uuid:
                  type: string
                  description: 'S3 storage UUID (required if save_s3 is true)'
                databases_to_backup:
                  type: string
                  description: 'Comma separated list of databases to backup'
                dump_all:
                  type: boolean
                  description: 'Whether to dump all databases'
                  default: false
                backup_now:
                  type: boolean
                  description: 'Whether to trigger backup immediately after creation'
                database_backup_retention_amount_locally:
                  type: integer
                  description: 'Number of backups to retain locally'
                database_backup_retention_days_locally:
                  type: integer
                  description: 'Number of days to retain backups locally'
                database_backup_retention_max_storage_locally:
                  type: number
                  description: 'Max storage (GB) for local backups'
                database_backup_retention_amount_s3:
                  type: integer
                  description: 'Number of backups to retain in S3'
                database_backup_retention_days_s3:
                  type: integer
                  description: 'Number of days to retain backups in S3'
                database_backup_retention_max_storage_s3:
                  type: number
                  description: 'Max storage (GB) for S3 backups'
                timeout:
                  type: integer
                  description: 'Backup job timeout in seconds (min: 60, max: 36000)'
                  default: 3600
              type: object
      responses:
        '201':
          description: 'Backup configuration created successfully'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, format: uuid, example: 550e8400-e29b-41d4-a716-446655440000 }
                  message: { type: string, example: 'Backup configuration created successfully.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}':
    get:
      tags:
        - Databases
      summary: Get
      description: 'Get database by UUID.'
      operationId: get-database-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get all databases'
          content:
            application/json:
              schema:
                type: string
              example: 'Content is very complex. Will be implemented later.'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Databases
      summary: Delete
      description: 'Delete database by UUID.'
      operationId: delete-database-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
        -
          name: delete_configurations
          in: query
          description: 'Delete configurations.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: delete_volumes
          in: query
          description: 'Delete volumes.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: docker_cleanup
          in: query
          description: 'Run docker cleanup.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: delete_connected_networks
          in: query
          description: 'Delete connected networks.'
          required: false
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: 'Database deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Database deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Databases
      summary: Update
      description: 'Update database by UUID.'
      operationId: update-database-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                postgres_user:
                  type: string
                  description: 'PostgreSQL user'
                postgres_password:
                  type: string
                  description: 'PostgreSQL password'
                postgres_db:
                  type: string
                  description: 'PostgreSQL database'
                postgres_initdb_args:
                  type: string
                  description: 'PostgreSQL initdb args'
                postgres_host_auth_method:
                  type: string
                  description: 'PostgreSQL host auth method'
                postgres_conf:
                  type: string
                  description: 'PostgreSQL conf'
                clickhouse_admin_user:
                  type: string
                  description: 'Clickhouse admin user'
                clickhouse_admin_password:
                  type: string
                  description: 'Clickhouse admin password'
                dragonfly_password:
                  type: string
                  description: 'DragonFly password'
                redis_password:
                  type: string
                  description: 'Redis password'
                redis_conf:
                  type: string
                  description: 'Redis conf'
                keydb_password:
                  type: string
                  description: 'KeyDB password'
                keydb_conf:
                  type: string
                  description: 'KeyDB conf'
                mariadb_conf:
                  type: string
                  description: 'MariaDB conf'
                mariadb_root_password:
                  type: string
                  description: 'MariaDB root password'
                mariadb_user:
                  type: string
                  description: 'MariaDB user'
                mariadb_password:
                  type: string
                  description: 'MariaDB password'
                mariadb_database:
                  type: string
                  description: 'MariaDB database'
                mongo_conf:
                  type: string
                  description: 'Mongo conf'
                mongo_initdb_root_username:
                  type: string
                  description: 'Mongo initdb root username'
                mongo_initdb_root_password:
                  type: string
                  description: 'Mongo initdb root password'
                mongo_initdb_database:
                  type: string
                  description: 'Mongo initdb init database'
                mysql_root_password:
                  type: string
                  description: 'MySQL root password'
                mysql_password:
                  type: string
                  description: 'MySQL password'
                mysql_user:
                  type: string
                  description: 'MySQL user'
                mysql_database:
                  type: string
                  description: 'MySQL database'
                mysql_conf:
                  type: string
                  description: 'MySQL conf'
                health_check_enabled:
                  type: boolean
                  description: 'Enable the database healthcheck probe.'
                  default: true
                health_check_interval:
                  type: integer
                  description: 'Healthcheck interval in seconds.'
                  minimum: 1
                  default: 15
                health_check_timeout:
                  type: integer
                  description: 'Healthcheck timeout in seconds.'
                  minimum: 1
                  default: 5
                health_check_retries:
                  type: integer
                  description: 'Healthcheck retries count.'
                  minimum: 1
                  default: 5
                health_check_start_period:
                  type: integer
                  description: 'Healthcheck start period in seconds.'
                  minimum: 0
                  default: 5
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/backups/{scheduled_backup_uuid}':
    delete:
      tags:
        - Databases
      summary: 'Delete backup configuration'
      description: 'Deletes a backup configuration and all its executions.'
      operationId: delete-backup-configuration-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database'
          required: true
          schema:
            type: string
        -
          name: scheduled_backup_uuid
          in: path
          description: 'UUID of the backup configuration to delete'
          required: true
          schema:
            type: string
        -
          name: delete_s3
          in: query
          description: 'Whether to delete all backup files from S3'
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Backup configuration deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Backup configuration and all executions deleted.' }
                type: object
        '404':
          description: 'Backup configuration not found.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Backup configuration not found.' }
                type: object
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Databases
      summary: Update
      description: 'Update a specific backup configuration for a given database, identified by its UUID and the backup ID'
      operationId: update-database-backup
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
        -
          name: scheduled_backup_uuid
          in: path
          description: 'UUID of the backup configuration.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Database backup configuration data'
        required: true
        content:
          application/json:
            schema:
              properties:
                save_s3:
                  type: boolean
                  description: 'Whether data is saved in s3 or not'
                s3_storage_uuid:
                  type: string
                  description: 'S3 storage UUID'
                backup_now:
                  type: boolean
                  description: 'Whether to take a backup now or not'
                enabled:
                  type: boolean
                  description: 'Whether the backup is enabled or not'
                databases_to_backup:
                  type: string
                  description: 'Comma separated list of databases to backup'
                dump_all:
                  type: boolean
                  description: 'Whether all databases are dumped or not'
                frequency:
                  type: string
                  description: 'Frequency of the backup'
                database_backup_retention_amount_locally:
                  type: integer
                  description: 'Retention amount of the backup locally'
                database_backup_retention_days_locally:
                  type: integer
                  description: 'Retention days of the backup locally'
                database_backup_retention_max_storage_locally:
                  type: number
                  description: 'Max storage of the backup locally'
                database_backup_retention_amount_s3:
                  type: integer
                  description: 'Retention amount of the backup in s3'
                database_backup_retention_days_s3:
                  type: integer
                  description: 'Retention days of the backup in s3'
                database_backup_retention_max_storage_s3:
                  type: number
                  description: 'Max storage of the backup in S3'
                timeout:
                  type: integer
                  description: 'Backup job timeout in seconds (min: 60, max: 36000)'
                  default: 3600
              type: object
      responses:
        '200':
          description: 'Database backup configuration updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/postgresql:
    post:
      tags:
        - Databases
      summary: 'Create (PostgreSQL)'
      description: 'Create a new PostgreSQL database.'
      operationId: create-database-postgresql
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                postgres_user:
                  type: string
                  description: 'PostgreSQL user'
                postgres_password:
                  type: string
                  description: 'PostgreSQL password'
                postgres_db:
                  type: string
                  description: 'PostgreSQL database'
                postgres_initdb_args:
                  type: string
                  description: 'PostgreSQL initdb args'
                postgres_host_auth_method:
                  type: string
                  description: 'PostgreSQL host auth method'
                postgres_conf:
                  type: string
                  description: 'PostgreSQL conf'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/clickhouse:
    post:
      tags:
        - Databases
      summary: 'Create (Clickhouse)'
      description: 'Create a new Clickhouse database.'
      operationId: create-database-clickhouse
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                clickhouse_admin_user:
                  type: string
                  description: 'Clickhouse admin user'
                clickhouse_admin_password:
                  type: string
                  description: 'Clickhouse admin password'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/dragonfly:
    post:
      tags:
        - Databases
      summary: 'Create (DragonFly)'
      description: 'Create a new DragonFly database.'
      operationId: create-database-dragonfly
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                dragonfly_password:
                  type: string
                  description: 'DragonFly password'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/redis:
    post:
      tags:
        - Databases
      summary: 'Create (Redis)'
      description: 'Create a new Redis database.'
      operationId: create-database-redis
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                redis_password:
                  type: string
                  description: 'Redis password'
                redis_conf:
                  type: string
                  description: 'Redis conf'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/keydb:
    post:
      tags:
        - Databases
      summary: 'Create (KeyDB)'
      description: 'Create a new KeyDB database.'
      operationId: create-database-keydb
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                keydb_password:
                  type: string
                  description: 'KeyDB password'
                keydb_conf:
                  type: string
                  description: 'KeyDB conf'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/mariadb:
    post:
      tags:
        - Databases
      summary: 'Create (MariaDB)'
      description: 'Create a new MariaDB database.'
      operationId: create-database-mariadb
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                mariadb_conf:
                  type: string
                  description: 'MariaDB conf'
                mariadb_root_password:
                  type: string
                  description: 'MariaDB root password'
                mariadb_user:
                  type: string
                  description: 'MariaDB user'
                mariadb_password:
                  type: string
                  description: 'MariaDB password'
                mariadb_database:
                  type: string
                  description: 'MariaDB database'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/mysql:
    post:
      tags:
        - Databases
      summary: 'Create (MySQL)'
      description: 'Create a new MySQL database.'
      operationId: create-database-mysql
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                mysql_root_password:
                  type: string
                  description: 'MySQL root password'
                mysql_password:
                  type: string
                  description: 'MySQL password'
                mysql_user:
                  type: string
                  description: 'MySQL user'
                mysql_database:
                  type: string
                  description: 'MySQL database'
                mysql_conf:
                  type: string
                  description: 'MySQL conf'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /databases/mongodb:
    post:
      tags:
        - Databases
      summary: 'Create (MongoDB)'
      description: 'Create a new MongoDB database.'
      operationId: create-database-mongodb
      requestBody:
        description: 'Database data'
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                server_uuid:
                  type: string
                  description: 'UUID of the server'
                project_uuid:
                  type: string
                  description: 'UUID of the project'
                environment_name:
                  type: string
                  description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
                destination_uuid:
                  type: string
                  description: 'UUID of the destination if the server has multiple destinations'
                mongo_conf:
                  type: string
                  description: 'MongoDB conf'
                mongo_initdb_root_username:
                  type: string
                  description: 'MongoDB initdb root username'
                name:
                  type: string
                  description: 'Name of the database'
                description:
                  type: string
                  description: 'Description of the database'
                image:
                  type: string
                  description: 'Docker Image of the database'
                is_public:
                  type: boolean
                  description: 'Is the database public?'
                public_port:
                  type: integer
                  description: 'Public port of the database'
                public_port_timeout:
                  type: integer
                  description: 'Public port timeout in seconds (default: 3600)'
                limits_memory:
                  type: string
                  description: 'Memory limit of the database'
                limits_memory_swap:
                  type: string
                  description: 'Memory swap limit of the database'
                limits_memory_swappiness:
                  type: integer
                  description: 'Memory swappiness of the database'
                limits_memory_reservation:
                  type: string
                  description: 'Memory reservation of the database'
                limits_cpus:
                  type: string
                  description: 'CPU limit of the database'
                limits_cpuset:
                  type: string
                  description: 'CPU set of the database'
                limits_cpu_shares:
                  type: integer
                  description: 'CPU shares of the database'
                instant_deploy:
                  type: boolean
                  description: 'Instant deploy the database'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the database.'
              type: object
      responses:
        '200':
          description: 'Database updated'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/logs':
    get:
      tags:
        - Databases
      summary: 'Get database logs.'
      description: 'Get database logs by UUID.'
      operationId: get-database-logs-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
            format: uuid
        -
          name: lines
          in: query
          description: 'Number of lines to show from the end of the logs.'
          required: false
          schema:
            type: integer
            format: int32
            default: 100
        -
          name: show_timestamps
          in: query
          description: 'Show timestamps in the logs.'
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Get database logs by UUID.'
          content:
            application/json:
              schema:
                properties:
                  logs: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}':
    delete:
      tags:
        - Databases
      summary: 'Delete backup execution'
      description: 'Deletes a specific backup execution.'
      operationId: delete-backup-execution-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database'
          required: true
          schema:
            type: string
        -
          name: scheduled_backup_uuid
          in: path
          description: 'UUID of the backup configuration'
          required: true
          schema:
            type: string
        -
          name: execution_uuid
          in: path
          description: 'UUID of the backup execution to delete'
          required: true
          schema:
            type: string
        -
          name: delete_s3
          in: query
          description: 'Whether to delete the backup from S3'
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Backup execution deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Backup execution deleted.' }
                type: object
        '404':
          description: 'Backup execution not found.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Backup execution not found.' }
                type: object
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/backups/{scheduled_backup_uuid}/executions':
    get:
      tags:
        - Databases
      summary: 'List backup executions'
      description: 'Get all executions for a specific backup configuration.'
      operationId: list-backup-executions
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database'
          required: true
          schema:
            type: string
        -
          name: scheduled_backup_uuid
          in: path
          description: 'UUID of the backup configuration'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of backup executions'
          content:
            application/json:
              schema:
                properties:
                  executions: { type: array, items: { properties: { uuid: { type: string }, filename: { type: string }, size: { type: integer }, created_at: { type: string }, message: { type: string }, status: { type: string } }, type: object } }
                type: object
        '404':
          description: 'Backup configuration not found.'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/move':
    post:
      tags:
        - Databases
      summary: Move
      description: 'Move database to another project/environment. This is a purely organizational change — running containers are not affected. Note: after moving, the database will pick up shared environment variables from the new environment on the next deployment.'
      operationId: move-database-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Target environment to move the database to.'
        required: true
        content:
          application/json:
            schema:
              required:
                - environment_uuid
              properties:
                environment_uuid:
                  type: string
                  description: 'UUID of the target environment.'
              type: object
      responses:
        '200':
          description: 'Database moved successfully.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Database moved successfully.' }
                  uuid: { type: string }
                  project_uuid: { type: string }
                  environment_uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/start':
    post:
      tags:
        - Databases
      summary: Start
      description: 'Start database.'
      operationId: start-database-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Start database.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Database starting request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/stop':
    post:
      tags:
        - Databases
      summary: Stop
      description: 'Stop database.'
      operationId: stop-database-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
        -
          name: docker_cleanup
          in: query
          description: 'Perform docker cleanup (prune networks, volumes, etc.).'
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: 'Stop database.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Database stopping request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/restart':
    post:
      tags:
        - Databases
      summary: Restart
      description: 'Restart database.'
      operationId: restart-database-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Restart database.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Database restaring request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/envs':
    get:
      tags:
        - Databases
      summary: 'List Envs'
      description: 'List all envs by database UUID.'
      operationId: list-envs-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Environment variables.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Databases
      summary: 'Create Env'
      description: 'Create env by database UUID.'
      operationId: create-env-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Env created.'
        required: true
        content:
          application/json:
            schema:
              properties:
                key:
                  type: string
                  description: 'The key of the environment variable.'
                value:
                  type: string
                  description: 'The value of the environment variable.'
                is_literal:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
                is_multiline:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is multiline.'
                is_shown_once:
                  type: boolean
                  description: "The flag to indicate if the environment variable's value is shown on the UI."
              type: object
      responses:
        '201':
          description: 'Environment variable created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Databases
      summary: 'Update Env'
      description: 'Update env by database UUID.'
      operationId: update-env-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Env updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - key
                - value
              properties:
                key:
                  type: string
                  description: 'The key of the environment variable.'
                value:
                  type: string
                  description: 'The value of the environment variable.'
                is_literal:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
                is_multiline:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is multiline.'
                is_shown_once:
                  type: boolean
                  description: "The flag to indicate if the environment variable's value is shown on the UI."
              type: object
      responses:
        '201':
          description: 'Environment variable updated.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/envs/bulk':
    patch:
      tags:
        - Databases
      summary: 'Update Envs (Bulk)'
      description: 'Update multiple envs by database UUID.'
      operationId: update-envs-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Bulk envs updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - data
              properties:
                data:
                  type: array
                  items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object }
              type: object
      responses:
        '201':
          description: 'Environment variables updated.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/envs/{env_uuid}':
    delete:
      tags:
        - Databases
      summary: 'Delete Env'
      description: 'Delete env by UUID.'
      operationId: delete-env-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
        -
          name: env_uuid
          in: path
          description: 'UUID of the environment variable.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Environment variable deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Environment variable deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/storages':
    get:
      tags:
        - Databases
      summary: 'List Storages'
      description: 'List all persistent storages and file storages by database UUID.'
      operationId: list-storages-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'All storages by database UUID.'
          content:
            application/json:
              schema:
                properties:
                  persistent_storages: { type: array, items: { type: object } }
                  file_storages: { type: array, items: { type: object } }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Databases
      summary: 'Create Storage'
      description: 'Create a persistent storage or file storage for a database.'
      operationId: create-storage-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - type
                - mount_path
              properties:
                type:
                  type: string
                  enum: [persistent, file]
                  description: 'The type of storage.'
                name:
                  type: string
                  description: 'Volume name (persistent only, required for persistent).'
                mount_path:
                  type: string
                  description: 'The container mount path.'
                host_path:
                  type: string
                  nullable: true
                  description: 'The host path (persistent only, optional).'
                content:
                  type: string
                  nullable: true
                  description: 'File content (file only, optional).'
                is_directory:
                  type: boolean
                  description: 'Whether this is a directory mount (file only, default false).'
                fs_path:
                  type: string
                  description: 'Host directory path (required when is_directory is true).'
              type: object
              additionalProperties: false
      responses:
        '201':
          description: 'Storage created.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Databases
      summary: 'Update Storage'
      description: 'Update a persistent storage or file storage by database UUID.'
      operationId: update-storage-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Storage updated. For read-only storages (from docker-compose or services), only is_preview_suffix_enabled can be updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - type
              properties:
                uuid:
                  type: string
                  description: 'The UUID of the storage (preferred).'
                id:
                  type: integer
                  description: 'The ID of the storage (deprecated, use uuid instead).'
                type:
                  type: string
                  enum: [persistent, file]
                  description: 'The type of storage: persistent or file.'
                is_preview_suffix_enabled:
                  type: boolean
                  description: 'Whether to add -pr-N suffix for preview deployments.'
                name:
                  type: string
                  description: 'The volume name (persistent only, not allowed for read-only storages).'
                mount_path:
                  type: string
                  description: 'The container mount path (not allowed for read-only storages).'
                host_path:
                  type: string
                  nullable: true
                  description: 'The host path (persistent only, not allowed for read-only storages).'
                content:
                  type: string
                  nullable: true
                  description: 'The file content (file only, not allowed for read-only storages).'
              type: object
              additionalProperties: false
      responses:
        '200':
          description: 'Storage updated.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/storages/{storage_uuid}':
    delete:
      tags:
        - Databases
      summary: 'Delete Storage'
      description: 'Delete a persistent storage or file storage by database UUID.'
      operationId: delete-storage-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          description: 'UUID of the storage.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Storage deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/tags':
    get:
      tags:
        - Databases
      summary: 'List Tags'
      description: 'List tags for a database by UUID.'
      operationId: list-tags-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of tags.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Databases
      summary: 'Create Tag'
      description: 'Add tag(s) to a database by UUID.'
      operationId: create-tag-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              properties:
                tag_name:
                  type: string
                  description: 'The tag name (min 2 characters). Required if tag_names is not provided.'
                tag_names:
                  type: array
                  items: { type: string }
                  description: 'Array of tag names (each min 2 characters). Required if tag_name is not provided.'
              type: object
      responses:
        '201':
          description: 'Tags added successfully.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/tags/{tag_uuid}':
    delete:
      tags:
        - Databases
      summary: 'Delete Tag'
      description: 'Remove a tag from a database by UUID.'
      operationId: delete-tag-by-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
        -
          name: tag_uuid
          in: path
          description: 'UUID of the tag.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Tag removed.'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /deployments:
    get:
      tags:
        - Deployments
      summary: List
      description: 'List currently running deployments'
      operationId: list-deployments
      responses:
        '200':
          description: 'Get all currently running deployments.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ApplicationDeploymentQueue'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/deployments/{uuid}':
    get:
      tags:
        - Deployments
      summary: Get
      description: 'Get deployment by UUID.'
      operationId: get-deployment-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Deployment UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get deployment by UUID.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApplicationDeploymentQueue'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/deployments/{uuid}/cancel':
    post:
      tags:
        - Deployments
      summary: Cancel
      description: 'Cancel a deployment by UUID.'
      operationId: cancel-deployment-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Deployment UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Deployment cancelled successfully.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Deployment cancelled successfully.' }
                  deployment_uuid: { type: string, example: cm37r6cqj000008jm0veg5tkm }
                  status: { type: string, example: cancelled-by-user }
                type: object
        '400':
          description: 'Deployment cannot be cancelled (already finished/failed/cancelled).'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Deployment cannot be cancelled. Current status: finished' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: "User doesn't have permission to cancel this deployment."
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'You do not have permission to cancel this deployment.' }
                type: object
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /deploy:
    post:
      tags:
        - Deployments
      summary: Deploy
      description: 'Deploy by tag or UUID using query parameters or a JSON body.'
      operationId: deploy-by-tag-or-uuid
      parameters:
        -
          name: tag
          in: query
          description: 'Tag name(s). Comma separated list is also accepted.'
          schema:
            type: string
        -
          name: uuid
          in: query
          description: 'Resource UUID(s). Comma separated list is also accepted.'
          schema:
            type: string
        -
          name: force
          in: query
          description: 'Force rebuild (without cache)'
          schema:
            type: boolean
        -
          name: pr
          in: query
          description: 'Pull Request Id for deploying specific PR builds. Cannot be used with tag parameter.'
          schema:
            type: integer
        -
          name: pull_request_id
          in: query
          description: 'Preview deployment identifier. Alias of pr.'
          schema:
            type: integer
        -
          name: docker_tag
          in: query
          description: 'Docker image tag for Docker Image preview deployments. Requires pull_request_id.'
          schema:
            type: string
      responses:
        '200':
          description: "Get deployment(s) UUID's"
          content:
            application/json:
              schema:
                properties:
                  deployments: { type: array, items: { properties: { message: { type: string }, resource_uuid: { type: string }, deployment_uuid: { type: string } }, type: object } }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/deployments/applications/{uuid}':
    get:
      tags:
        - Deployments
      summary: 'List application deployments'
      description: 'List application deployments by using the app uuid'
      operationId: list-deployments-by-app-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: skip
          in: query
          description: 'Number of records to skip.'
          required: false
          schema:
            type: integer
            default: 0
            minimum: 0
        -
          name: take
          in: query
          description: 'Number of records to take.'
          required: false
          schema:
            type: integer
            default: 10
            minimum: 1
      responses:
        '200':
          description: 'List application deployments by using the app uuid.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Application'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /destinations:
    get:
      tags:
        - Destinations
      summary: 'List destinations'
      description: 'List all Docker network destinations for the authenticated team.'
      operationId: list-destinations
      responses:
        '200':
          description: 'Destinations for the authenticated team.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Destination'
        '401':
          $ref: '#/components/responses/401'
      security:
        -
          bearerAuth: []
  '/servers/{server_uuid}/destinations':
    get:
      tags:
        - Destinations
      summary: 'List destinations by server'
      description: 'List Docker network destinations attached to a server owned by the authenticated team.'
      operationId: list-server-destinations
      parameters:
        -
          name: server_uuid
          in: path
          description: 'Server UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Destinations attached to the server.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Destination'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Destinations
      summary: 'Create destination'
      description: 'Create a Docker network destination on a server owned by the authenticated team.'
      operationId: create-server-destination
      parameters:
        -
          name: server_uuid
          in: path
          description: 'Server UUID'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - network
              properties:
                name:
                  type: string
                  maxLength: 255
                network:
                  type: string
                  maxLength: 255
                  pattern: '^[a-zA-Z0-9][a-zA-Z0-9._-]*$'
                type:
                  type: string
                  enum: [standalone, swarm]
              type: object
      responses:
        '201':
          description: 'Destination created.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Destination'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'A destination with this network already exists.'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/destinations/{uuid}':
    get:
      tags:
        - Destinations
      summary: 'Get destination'
      description: 'Get a Docker network destination by UUID.'
      operationId: get-destination-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Destination UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Destination details.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Destination'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Destinations
      summary: 'Delete destination'
      description: 'Delete an unused Docker network destination.'
      operationId: delete-destination-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Destination UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Destination deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: Deleted. }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'Destination has attached resources.'
      security:
        -
          bearerAuth: []
  /digitalocean/regions:
    get:
      tags:
        - DigitalOcean
      summary: 'Get DigitalOcean regions'
      operationId: get-digitalocean-regions
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of DigitalOcean regions.'
        '401':
          $ref: '#/components/responses/401'
        '422':
          description: 'Validation failed.'
      security:
        -
          bearerAuth: []
  /digitalocean/sizes:
    get:
      tags:
        - DigitalOcean
      summary: 'Get DigitalOcean sizes'
      operationId: get-digitalocean-sizes
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of DigitalOcean sizes.'
        '401':
          $ref: '#/components/responses/401'
        '422':
          description: 'Validation failed.'
      security:
        -
          bearerAuth: []
  /digitalocean/images:
    get:
      tags:
        - DigitalOcean
      summary: 'Get DigitalOcean images'
      operationId: get-digitalocean-images
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of DigitalOcean images.'
        '401':
          $ref: '#/components/responses/401'
        '422':
          description: 'Validation failed.'
      security:
        -
          bearerAuth: []
  /digitalocean/ssh-keys:
    get:
      tags:
        - DigitalOcean
      summary: 'Get DigitalOcean SSH keys'
      operationId: get-digitalocean-ssh-keys
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of DigitalOcean SSH keys.'
        '401':
          $ref: '#/components/responses/401'
        '422':
          description: 'Validation failed.'
      security:
        -
          bearerAuth: []
  /servers/digitalocean:
    post:
      tags:
        - DigitalOcean
      summary: 'Create a server on DigitalOcean'
      operationId: create-digitalocean-server
      responses:
        '201':
          description: 'DigitalOcean droplet created and linked to a Cynone server.'
        '401':
          $ref: '#/components/responses/401'
        '422':
          description: 'Validation failed.'
        '429':
          description: 'DigitalOcean rate limit exceeded.'
      security:
        -
          bearerAuth: []
  /github-apps:
    get:
      tags:
        - 'GitHub Apps'
      summary: List
      description: 'List all GitHub apps.'
      operationId: list-github-apps
      responses:
        '200':
          description: 'List of GitHub apps.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, uuid: { type: string }, name: { type: string }, organization: { type: string, nullable: true }, api_url: { type: string }, html_url: { type: string }, custom_user: { type: string }, custom_port: { type: integer }, app_id: { type: integer }, installation_id: { type: integer }, client_id: { type: string }, private_key_id: { type: integer }, is_system_wide: { type: boolean }, is_public: { type: boolean }, team_id: { type: integer }, type: { type: string } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - 'GitHub Apps'
      summary: 'Create GitHub App'
      description: 'Create a new GitHub app.'
      operationId: create-github-app
      requestBody:
        description: 'GitHub app creation payload.'
        required: true
        content:
          application/json:
            schema:
              required:
                - name
                - html_url
                - app_id
                - installation_id
                - client_id
                - client_secret
                - private_key_uuid
              properties:
                name:
                  type: string
                  description: 'Name of the GitHub app.'
                organization:
                  type: string
                  nullable: true
                  description: 'Organization to associate the app with.'
                api_url:
                  type: string
                  description: 'API URL for the GitHub app (e.g., https://api.github.com).'
                html_url:
                  type: string
                  description: 'HTML URL for the GitHub app (e.g., https://github.com).'
                custom_user:
                  type: string
                  description: 'Custom user for SSH access (default: git).'
                custom_port:
                  type: integer
                  description: 'Custom port for SSH access (default: 22).'
                app_id:
                  type: integer
                  description: 'GitHub App ID from GitHub.'
                installation_id:
                  type: integer
                  description: 'GitHub Installation ID.'
                client_id:
                  type: string
                  description: 'GitHub OAuth App Client ID.'
                client_secret:
                  type: string
                  description: 'GitHub OAuth App Client Secret.'
                webhook_secret:
                  type: string
                  description: 'Webhook secret for GitHub webhooks.'
                private_key_uuid:
                  type: string
                  description: 'UUID of an existing private key for GitHub App authentication.'
                is_system_wide:
                  type: boolean
                  description: 'Is this app system-wide (cloud only).'
              type: object
      responses:
        '201':
          description: 'GitHub app created successfully.'
          content:
            application/json:
              schema:
                properties:
                  id: { type: integer }
                  uuid: { type: string }
                  name: { type: string }
                  organization: { type: string, nullable: true }
                  api_url: { type: string }
                  html_url: { type: string }
                  custom_user: { type: string }
                  custom_port: { type: integer }
                  app_id: { type: integer }
                  installation_id: { type: integer }
                  client_id: { type: string }
                  private_key_id: { type: integer }
                  is_system_wide: { type: boolean }
                  team_id: { type: integer }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/github-apps/{github_app_id}/repositories':
    get:
      tags:
        - 'GitHub Apps'
      summary: 'Load Repositories for a GitHub App'
      description: 'Fetch repositories from GitHub for a given GitHub app.'
      operationId: load-repositories
      parameters:
        -
          name: github_app_id
          in: path
          description: 'GitHub App ID'
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: 'Repositories loaded successfully.'
          content:
            application/json:
              schema:
                properties:
                  repositories: { type: array, items: { type: object } }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/github-apps/{github_app_id}/repositories/{owner}/{repo}/branches':
    get:
      tags:
        - 'GitHub Apps'
      summary: 'Load Branches for a GitHub Repository'
      description: 'Fetch branches from GitHub for a given repository.'
      operationId: load-branches
      parameters:
        -
          name: github_app_id
          in: path
          description: 'GitHub App ID'
          required: true
          schema:
            type: integer
        -
          name: owner
          in: path
          description: 'Repository owner'
          required: true
          schema:
            type: string
        -
          name: repo
          in: path
          description: 'Repository name'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Branches loaded successfully.'
          content:
            application/json:
              schema:
                properties:
                  branches: { type: array, items: { type: object } }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/github-apps/{github_app_id}':
    delete:
      tags:
        - 'GitHub Apps'
      summary: 'Delete GitHub App'
      description: "Delete a GitHub app if it's not being used by any applications."
      operationId: deleteGithubApp
      parameters:
        -
          name: github_app_id
          in: path
          description: 'GitHub App ID'
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: 'GitHub app deleted successfully'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'GitHub app deleted successfully' }
                type: object
        '401':
          description: Unauthorized
        '404':
          description: 'GitHub app not found'
        '409':
          description: 'Conflict - GitHub app is in use'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'This GitHub app is being used by 5 application(s). Please delete all applications first.' }
                type: object
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - 'GitHub Apps'
      summary: 'Update GitHub App'
      description: 'Update an existing GitHub app.'
      operationId: updateGithubApp
      parameters:
        -
          name: github_app_id
          in: path
          description: 'GitHub App ID'
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'GitHub App name'
                organization:
                  type: string
                  nullable: true
                  description: 'GitHub organization'
                api_url:
                  type: string
                  description: 'GitHub API URL'
                html_url:
                  type: string
                  description: 'GitHub HTML URL'
                custom_user:
                  type: string
                  description: 'Custom user for SSH'
                custom_port:
                  type: integer
                  description: 'Custom port for SSH'
                app_id:
                  type: integer
                  description: 'GitHub App ID'
                installation_id:
                  type: integer
                  description: 'GitHub Installation ID'
                client_id:
                  type: string
                  description: 'GitHub Client ID'
                client_secret:
                  type: string
                  description: 'GitHub Client Secret'
                webhook_secret:
                  type: string
                  description: 'GitHub Webhook Secret'
                private_key_uuid:
                  type: string
                  description: 'Private key UUID'
                is_system_wide:
                  type: boolean
                  description: 'Is system wide (non-cloud instances only)'
              type: object
      responses:
        '200':
          description: 'GitHub app updated successfully'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'GitHub app updated successfully' }
                  data: { type: object, description: 'Updated GitHub app data' }
                type: object
        '401':
          description: Unauthorized
        '404':
          description: 'GitHub app not found'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /hetzner/locations:
    get:
      tags:
        - Hetzner
      summary: 'Get Hetzner Locations'
      description: 'Get all available Hetzner datacenter locations.'
      operationId: get-hetzner-locations
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of Hetzner locations.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, name: { type: string }, description: { type: string }, country: { type: string }, city: { type: string }, latitude: { type: number }, longitude: { type: number } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /hetzner/server-types:
    get:
      tags:
        - Hetzner
      summary: 'Get Hetzner Server Types'
      description: 'Get all available Hetzner server types (instance sizes).'
      operationId: get-hetzner-server-types
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of Hetzner server types.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, name: { type: string }, description: { type: string }, cores: { type: integer }, memory: { type: number }, disk: { type: integer }, prices: { type: array, items: { type: object, properties: { location: { type: string, description: 'Datacenter location name' }, price_hourly: { type: object, properties: { net: { type: string }, gross: { type: string } } }, price_monthly: { type: object, properties: { net: { type: string }, gross: { type: string } } } } } } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /hetzner/images:
    get:
      tags:
        - Hetzner
      summary: 'Get Hetzner Images'
      description: 'Get all available Hetzner system images (operating systems).'
      operationId: get-hetzner-images
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of Hetzner images.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, name: { type: string }, description: { type: string }, type: { type: string }, os_flavor: { type: string }, os_version: { type: string }, architecture: { type: string } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /hetzner/ssh-keys:
    get:
      tags:
        - Hetzner
      summary: 'Get Hetzner SSH Keys'
      description: 'Get all SSH keys stored in the Hetzner account.'
      operationId: get-hetzner-ssh-keys
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of Hetzner SSH keys.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, name: { type: string }, fingerprint: { type: string }, public_key: { type: string } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /hetzner/firewalls:
    get:
      tags:
        - Hetzner
      summary: 'Get Hetzner Firewalls'
      description: 'Get all existing Hetzner firewalls for the current project.'
      operationId: get-hetzner-firewalls
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of Hetzner firewalls.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, name: { type: string } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /hetzner/networks:
    get:
      tags:
        - Hetzner
      summary: 'Get Hetzner Networks'
      description: 'Get all existing Hetzner private networks for the current project.'
      operationId: get-hetzner-networks
      parameters:
        -
          name: cloud_provider_token_uuid
          in: query
          description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
          required: false
          schema:
            type: string
        -
          name: cloud_provider_token_id
          in: query
          description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
          required: false
          deprecated: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of Hetzner networks.'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, name: { type: string }, ip_range: { type: string } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /servers/hetzner:
    post:
      tags:
        - Hetzner
      summary: 'Create Hetzner Server'
      description: 'Create a new server on Hetzner and register it in Cynone.'
      operationId: create-hetzner-server
      requestBody:
        description: 'Hetzner server creation parameters'
        required: true
        content:
          application/json:
            schema:
              required:
                - location
                - server_type
                - image
                - private_key_uuid
              properties:
                cloud_provider_token_uuid:
                  type: string
                  example: abc123
                  description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
                cloud_provider_token_id:
                  type: string
                  example: abc123
                  description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
                  deprecated: true
                location:
                  type: string
                  example: nbg1
                  description: 'Hetzner location name'
                server_type:
                  type: string
                  example: cx11
                  description: 'Hetzner server type name'
                image:
                  type: integer
                  example: 15512617
                  description: 'Hetzner image ID'
                name:
                  type: string
                  example: my-server
                  description: 'Server name (auto-generated if not provided)'
                private_key_uuid:
                  type: string
                  example: xyz789
                  description: 'Private key UUID'
                enable_ipv4:
                  type: boolean
                  example: true
                  description: 'Enable IPv4 (default: true)'
                enable_ipv6:
                  type: boolean
                  example: true
                  description: 'Enable IPv6 (default: true)'
                enable_backups:
                  type: boolean
                  example: false
                  description: 'Enable Hetzner server backups after creation (adds 20% to the monthly server fee)'
                hetzner_ssh_key_ids:
                  type: array
                  items: { type: integer }
                  description: 'Additional Hetzner SSH key IDs'
                hetzner_firewall_ids:
                  type: array
                  items: { type: integer }
                  description: 'Existing Hetzner firewall IDs to apply during server creation'
                hetzner_network_ids:
                  type: array
                  items: { type: integer }
                  description: 'Existing Hetzner network IDs to attach during server creation'
                cloud_init_script:
                  type: string
                  description: 'Cloud-init YAML script (optional)'
                instant_validate:
                  type: boolean
                  example: false
                  description: 'Validate server immediately after creation'
              type: object
      responses:
        '201':
          description: 'Hetzner server created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: og888os, description: 'The UUID of the server.' }
                  hetzner_server_id: { type: integer, description: 'The Hetzner server ID.' }
                  ip: { type: string, description: 'The server IP address.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
        '429':
          $ref: '#/components/responses/429'
      security:
        -
          bearerAuth: []
  /version:
    get:
      summary: Version
      description: 'Get Cynone version.'
      operationId: version
      responses:
        '200':
          description: 'Returns the version of the application'
          content:
            text/html:
              schema:
                type: string
              example: v4.0.0
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /enable:
    post:
      summary: 'Enable API'
      description: 'Enable API (only with root permissions).'
      operationId: enable-api
      responses:
        '200':
          description: 'Enable API.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'API enabled.' }
                type: object
        '403':
          description: 'You are not allowed to enable the API.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'You are not allowed to enable the API.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /disable:
    post:
      summary: 'Disable API'
      description: 'Disable API (only with root permissions).'
      operationId: disable-api
      responses:
        '200':
          description: 'Disable API.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'API disabled.' }
                type: object
        '403':
          description: 'You are not allowed to disable the API.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'You are not allowed to disable the API.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /mcp/enable:
    post:
      summary: 'Enable MCP Server'
      description: 'Enable the MCP server endpoint at /mcp (only with root permissions).'
      operationId: enable-mcp
      responses:
        '200':
          description: 'MCP server enabled.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'MCP server enabled.' }
                type: object
        '403':
          description: 'You are not allowed to enable the MCP server.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'You are not allowed to enable the MCP server.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /mcp/disable:
    post:
      summary: 'Disable MCP Server'
      description: 'Disable the MCP server endpoint at /mcp (only with root permissions).'
      operationId: disable-mcp
      responses:
        '200':
          description: 'MCP server disabled.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'MCP server disabled.' }
                type: object
        '403':
          description: 'You are not allowed to disable the MCP server.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'You are not allowed to disable the MCP server.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /health:
    get:
      summary: Healthcheck
      description: 'Healthcheck endpoint.'
      operationId: healthcheck
      responses:
        '200':
          description: 'Healthcheck endpoint.'
          content:
            text/html:
              schema:
                type: string
              example: OK
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
  /projects:
    get:
      tags:
        - Projects
      summary: List
      description: 'List projects.'
      operationId: list-projects
      responses:
        '200':
          description: 'Get all projects.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Projects
      summary: Create
      description: 'Create Project.'
      operationId: create-project
      requestBody:
        description: 'Project created.'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The name of the project.'
                description:
                  type: string
                  description: 'The description of the project.'
              type: object
      responses:
        '201':
          description: 'Project created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: og888os, description: 'The UUID of the project.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/projects/{uuid}':
    get:
      tags:
        - Projects
      summary: Get
      description: 'Get project by UUID.'
      operationId: get-project-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Project UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Project details'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          description: 'Project not found.'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Projects
      summary: Delete
      description: 'Delete project by UUID.'
      operationId: delete-project-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Project deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Project deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Projects
      summary: Update
      description: 'Update Project.'
      operationId: update-project-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the project.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Project updated.'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The name of the project.'
                description:
                  type: string
                  description: 'The description of the project.'
              type: object
      responses:
        '201':
          description: 'Project updated.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: og888os }
                  name: { type: string, example: 'Project Name' }
                  description: { type: string, example: 'Project Description' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/projects/{uuid}/{environment_name_or_uuid}':
    get:
      tags:
        - Projects
      summary: Environment
      description: 'Get environment by name or UUID.'
      operationId: get-environment-by-name-or-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Project UUID'
          required: true
          schema:
            type: string
        -
          name: environment_name_or_uuid
          in: path
          description: 'Environment name or UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Environment details'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Environment'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/projects/{uuid}/environments':
    get:
      tags:
        - Projects
      summary: 'List Environments'
      description: 'List all environments in a project.'
      operationId: get-environments
      parameters:
        -
          name: uuid
          in: path
          description: 'Project UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of environments'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Environment'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          description: 'Project not found.'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Projects
      summary: 'Create Environment'
      description: 'Create environment in project.'
      operationId: create-environment
      parameters:
        -
          name: uuid
          in: path
          description: 'Project UUID'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Environment created.'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The name of the environment.'
              type: object
      responses:
        '201':
          description: 'Environment created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: env123, description: 'The UUID of the environment.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          description: 'Project not found.'
        '409':
          description: 'Environment with this name already exists.'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/projects/{uuid}/environments/{environment_name_or_uuid}':
    delete:
      tags:
        - Projects
      summary: 'Delete Environment'
      description: 'Delete environment by name or UUID. Environment must be empty.'
      operationId: delete-environment
      parameters:
        -
          name: uuid
          in: path
          description: 'Project UUID'
          required: true
          schema:
            type: string
        -
          name: environment_name_or_uuid
          in: path
          description: 'Environment name or UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Environment deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Environment deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          description: 'Environment has resources, so it cannot be deleted.'
        '404':
          description: 'Project or environment not found.'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  /resources:
    get:
      tags:
        - Resources
      summary: List
      description: 'Get all resources.'
      operationId: list-resources
      responses:
        '200':
          description: 'Get all resources'
          content:
            application/json:
              schema:
                type: string
              example: 'Content is very complex. Will be implemented later.'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/scheduled-tasks':
    get:
      tags:
        - 'Scheduled Tasks'
      summary: 'List Tasks'
      description: 'List all scheduled tasks for an application.'
      operationId: list-scheduled-tasks-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get all scheduled tasks for an application.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ScheduledTask'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - 'Scheduled Tasks'
      summary: 'Create Task'
      description: 'Create a new scheduled task for an application.'
      operationId: create-scheduled-task-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Scheduled task data'
        required: true
        content:
          application/json:
            schema:
              required:
                - name
                - command
                - frequency
              properties:
                name:
                  type: string
                  description: 'The name of the scheduled task.'
                command:
                  type: string
                  description: 'The command to execute.'
                frequency:
                  type: string
                  description: 'The frequency of the scheduled task.'
                container:
                  type: string
                  nullable: true
                  description: 'The container where the command should be executed.'
                timeout:
                  type: integer
                  description: 'The timeout of the scheduled task in seconds.'
                  default: 300
                enabled:
                  type: boolean
                  description: 'The flag to indicate if the scheduled task is enabled.'
                  default: true
              type: object
      responses:
        '201':
          description: 'Scheduled task created.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledTask'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/scheduled-tasks/{task_uuid}':
    delete:
      tags:
        - 'Scheduled Tasks'
      summary: 'Delete Task'
      description: 'Delete a scheduled task for an application.'
      operationId: delete-scheduled-task-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: task_uuid
          in: path
          description: 'UUID of the scheduled task.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Scheduled task deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Scheduled task deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - 'Scheduled Tasks'
      summary: 'Update Task'
      description: 'Update a scheduled task for an application.'
      operationId: update-scheduled-task-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: task_uuid
          in: path
          description: 'UUID of the scheduled task.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Scheduled task data'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The name of the scheduled task.'
                command:
                  type: string
                  description: 'The command to execute.'
                frequency:
                  type: string
                  description: 'The frequency of the scheduled task.'
                container:
                  type: string
                  nullable: true
                  description: 'The container where the command should be executed.'
                timeout:
                  type: integer
                  description: 'The timeout of the scheduled task in seconds.'
                  default: 300
                enabled:
                  type: boolean
                  description: 'The flag to indicate if the scheduled task is enabled.'
                  default: true
              type: object
      responses:
        '200':
          description: 'Scheduled task updated.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledTask'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/scheduled-tasks/{task_uuid}/executions':
    get:
      tags:
        - 'Scheduled Tasks'
      summary: 'List Executions'
      description: 'List all executions for a scheduled task on an application.'
      operationId: list-scheduled-task-executions-by-application-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: task_uuid
          in: path
          description: 'UUID of the scheduled task.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get all executions for a scheduled task.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ScheduledTaskExecution'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/scheduled-tasks':
    get:
      tags:
        - 'Scheduled Tasks'
      summary: 'List Tasks'
      description: 'List all scheduled tasks for a service.'
      operationId: list-scheduled-tasks-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get all scheduled tasks for a service.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ScheduledTask'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - 'Scheduled Tasks'
      summary: 'Create Task'
      description: 'Create a new scheduled task for a service.'
      operationId: create-scheduled-task-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Scheduled task data'
        required: true
        content:
          application/json:
            schema:
              required:
                - name
                - command
                - frequency
              properties:
                name:
                  type: string
                  description: 'The name of the scheduled task.'
                command:
                  type: string
                  description: 'The command to execute.'
                frequency:
                  type: string
                  description: 'The frequency of the scheduled task.'
                container:
                  type: string
                  nullable: true
                  description: 'The container where the command should be executed.'
                timeout:
                  type: integer
                  description: 'The timeout of the scheduled task in seconds.'
                  default: 300
                enabled:
                  type: boolean
                  description: 'The flag to indicate if the scheduled task is enabled.'
                  default: true
              type: object
      responses:
        '201':
          description: 'Scheduled task created.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledTask'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/scheduled-tasks/{task_uuid}':
    delete:
      tags:
        - 'Scheduled Tasks'
      summary: 'Delete Task'
      description: 'Delete a scheduled task for a service.'
      operationId: delete-scheduled-task-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: task_uuid
          in: path
          description: 'UUID of the scheduled task.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Scheduled task deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Scheduled task deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - 'Scheduled Tasks'
      summary: 'Update Task'
      description: 'Update a scheduled task for a service.'
      operationId: update-scheduled-task-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: task_uuid
          in: path
          description: 'UUID of the scheduled task.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Scheduled task data'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The name of the scheduled task.'
                command:
                  type: string
                  description: 'The command to execute.'
                frequency:
                  type: string
                  description: 'The frequency of the scheduled task.'
                container:
                  type: string
                  nullable: true
                  description: 'The container where the command should be executed.'
                timeout:
                  type: integer
                  description: 'The timeout of the scheduled task in seconds.'
                  default: 300
                enabled:
                  type: boolean
                  description: 'The flag to indicate if the scheduled task is enabled.'
                  default: true
              type: object
      responses:
        '200':
          description: 'Scheduled task updated.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledTask'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/scheduled-tasks/{task_uuid}/executions':
    get:
      tags:
        - 'Scheduled Tasks'
      summary: 'List Executions'
      description: 'List all executions for a scheduled task on a service.'
      operationId: list-scheduled-task-executions-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: task_uuid
          in: path
          description: 'UUID of the scheduled task.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get all executions for a scheduled task.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ScheduledTaskExecution'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /security/keys:
    get:
      tags:
        - 'Private Keys'
      summary: List
      description: 'List all private keys.'
      operationId: list-private-keys
      responses:
        '200':
          description: 'Get all private keys.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PrivateKey'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - 'Private Keys'
      summary: Create
      description: 'Create a new private key.'
      operationId: create-private-key
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - private_key
              properties:
                name:
                  type: string
                description:
                  type: string
                private_key:
                  type: string
              type: object
              additionalProperties: false
      responses:
        '201':
          description: "The created private key's UUID."
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - 'Private Keys'
      summary: Update
      description: 'Update a private key.'
      operationId: update-private-key
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - private_key
              properties:
                name:
                  type: string
                description:
                  type: string
                private_key:
                  type: string
              type: object
              additionalProperties: false
      responses:
        '201':
          description: "The updated private key's UUID."
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/security/keys/{uuid}':
    get:
      tags:
        - 'Private Keys'
      summary: Get
      description: 'Get key by UUID.'
      operationId: get-private-key-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Private Key UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get all private keys.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PrivateKey'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          description: 'Private Key not found.'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - 'Private Keys'
      summary: Delete
      description: 'Delete a private key.'
      operationId: delete-private-key-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Private Key UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Private Key deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Private Key deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          description: 'Private Key not found.'
        '422':
          description: 'Private Key is in use and cannot be deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Private Key is in use and cannot be deleted.' }
                type: object
      security:
        -
          bearerAuth: []
  /servers:
    get:
      tags:
        - Servers
      summary: List
      description: 'List all servers.'
      operationId: list-servers
      responses:
        '200':
          description: 'Get all servers.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Server'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Servers
      summary: Create
      description: 'Create Server.'
      operationId: create-server
      requestBody:
        description: 'Server created.'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  example: 'My Server'
                  description: 'The name of the server.'
                description:
                  type: string
                  example: 'My Server Description'
                  description: 'The description of the server.'
                ip:
                  type: string
                  example: 127.0.0.1
                  description: 'The IP of the server.'
                port:
                  type: integer
                  example: 22
                  description: 'The port of the server.'
                user:
                  type: string
                  example: root
                  description: 'The user of the server.'
                private_key_uuid:
                  type: string
                  example: og888os
                  description: 'The UUID of the private key.'
                is_build_server:
                  type: boolean
                  example: false
                  description: 'Is build server.'
                instant_validate:
                  type: boolean
                  example: false
                  description: 'Instant validate.'
                proxy_type:
                  type: string
                  enum: [traefik, caddy, none]
                  example: traefik
                  description: 'The proxy type.'
              type: object
      responses:
        '201':
          description: 'Server created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: og888os, description: 'The UUID of the server.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/servers/{uuid}':
    get:
      tags:
        - Servers
      summary: Get
      description: 'Get server by UUID.'
      operationId: get-server-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: "Server's UUID"
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get server by UUID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Server'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Servers
      summary: Delete
      description: 'Delete server by UUID.'
      operationId: delete-server-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the server.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Server deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Server deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Servers
      summary: Update
      description: 'Update Server.'
      operationId: update-server-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Server UUID'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Server updated.'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The name of the server.'
                description:
                  type: string
                  description: 'The description of the server.'
                ip:
                  type: string
                  description: 'The IP of the server.'
                port:
                  type: integer
                  description: 'The port of the server.'
                user:
                  type: string
                  description: 'The user of the server.'
                private_key_uuid:
                  type: string
                  description: 'The UUID of the private key.'
                is_build_server:
                  type: boolean
                  description: 'Is build server.'
                instant_validate:
                  type: boolean
                  description: 'Instant validate.'
                proxy_type:
                  type: string
                  enum: [traefik, caddy, none]
                  description: 'The proxy type.'
                concurrent_builds:
                  type: integer
                  description: 'Number of concurrent builds.'
                dynamic_timeout:
                  type: integer
                  description: 'Deployment timeout in seconds.'
                deployment_queue_limit:
                  type: integer
                  description: 'Maximum number of queued deployments.'
                server_disk_usage_notification_threshold:
                  type: integer
                  description: 'Server disk usage notification threshold (%).'
                server_disk_usage_check_frequency:
                  type: string
                  description: 'Cron expression for disk usage check frequency.'
                connection_timeout:
                  type: integer
                  description: 'SSH connection timeout in seconds (1-300). Default: 10.'
              type: object
      responses:
        '201':
          description: 'Server updated.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Server'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/servers/{uuid}/resources':
    get:
      tags:
        - Servers
      summary: Resources
      description: 'Get resources by server.'
      operationId: get-resources-by-server-uuid
      parameters:
        -
          name: uuid
          in: path
          description: "Server's UUID"
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get resources by server'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { id: { type: integer }, uuid: { type: string }, name: { type: string }, type: { type: string }, created_at: { type: string }, updated_at: { type: string }, status: { type: string } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/servers/{uuid}/domains':
    get:
      tags:
        - Servers
      summary: Domains
      description: 'Get domains by server.'
      operationId: get-domains-by-server-uuid
      parameters:
        -
          name: uuid
          in: path
          description: "Server's UUID"
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get domains by server'
          content:
            application/json:
              schema:
                type: array
                items:
                  properties: { ip: { type: string }, domains: { type: array, items: { type: string } } }
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/servers/{uuid}/validate':
    post:
      tags:
        - Servers
      summary: Validate
      description: 'Validate server by UUID.'
      operationId: validate-server-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Server UUID'
          required: true
          schema:
            type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              properties:
                install:
                  description: 'Install missing prerequisites and Docker. This can restart the Docker daemon.'
                  type: boolean
                  default: false
              type: object
      responses:
        '201':
          description: 'Server validation started.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Validation started.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/applications':
    get:
      tags:
        - 'Service applications'
      summary: 'List service applications'
      description: 'List compose service applications (containers) for a single service.'
      operationId: list-service-applications-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Service applications for this service.'
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/applications/{app_uuid}':
    get:
      tags:
        - 'Service applications'
      summary: 'Get service application'
      description: 'Get a single compose service application by service UUID and application UUID.'
      operationId: get-service-application-by-service-and-app-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID.'
          required: true
          schema:
            type: string
        -
          name: app_uuid
          in: path
          description: 'Service application UUID.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Service application.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - 'Service applications'
      summary: 'Update service application'
      description: 'Update fields for a compose service application. Use `url` for comma-separated public URLs (same rules as `urls[].url` on PATCH /services/{uuid}).'
      operationId: patch-service-application-by-service-and-app-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID.'
          required: true
          schema:
            type: string
        -
          name: app_uuid
          in: path
          description: 'Service application UUID.'
          required: true
          schema:
            type: string
        -
          name: force_domain_override
          in: query
          description: 'When true, allow duplicate URLs in the request and proceed despite domain conflicts (same as service PATCH).'
          required: false
          schema:
            type: boolean
            default: false
      requestBody:
        content:
          application/json:
            schema:
              properties:
                url:
                  description: 'Comma-separated list of URLs (e.g. "http://app.example.com:8080,https://app2.example.com"). Stored as fqdn.'
                  type: [string, 'null']
                human_name:
                  type: [string, 'null']
                description:
                  type: [string, 'null']
                image:
                  type: [string, 'null']
                exclude_from_status:
                  type: [boolean, 'null']
                is_log_drain_enabled:
                  type: [boolean, 'null']
                is_gzip_enabled:
                  type: [boolean, 'null']
                is_stripprefix_enabled:
                  type: [boolean, 'null']
              type: object
      responses:
        '200':
          description: 'Updated service application.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'Domain conflicts (unless force_domain_override).'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/applications/{app_uuid}/logs':
    get:
      tags:
        - 'Service applications'
      summary: 'Get service application logs'
      description: 'Get Docker logs for a single compose service container.'
      operationId: get-service-application-logs-by-service-and-app-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID.'
          required: true
          schema:
            type: string
        -
          name: app_uuid
          in: path
          description: 'Service application UUID.'
          required: true
          schema:
            type: string
        -
          name: lines
          in: query
          description: 'Number of lines to show from the end of the logs.'
          required: false
          schema:
            type: integer
            format: int32
            default: 100
      responses:
        '200':
          description: Logs.
          content:
            application/json:
              schema:
                properties:
                  logs: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - 'Service applications'
      summary: 'Get service application logs'
      description: 'Get Docker logs for a single compose service container.'
      operationId: post-service-application-logs-by-service-and-app-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: app_uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: lines
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 100
      responses:
        '200':
          description: Logs.
          content:
            application/json:
              schema:
                properties:
                  logs: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/applications/{app_uuid}/start':
    post:
      tags:
        - 'Service applications'
      summary: 'Start or redeploy service application container'
      description: 'Runs docker compose up for a single compose service (no-deps), optionally pulling the image and rebuilding.'
      operationId: post-start-service-application-by-service-and-app-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: app_uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: force
          in: query
          required: false
          schema:
            type: boolean
            default: false
        -
          name: latest
          in: query
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Deploy request queued.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/applications/{app_uuid}/restart':
    post:
      tags:
        - 'Service applications'
      summary: 'Restart service application container'
      description: 'Restarts a single compose service container.'
      operationId: post-restart-service-application-by-service-and-app-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: app_uuid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Restart queued.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/applications/{app_uuid}/stop':
    post:
      tags:
        - 'Service applications'
      summary: 'Stop service application container'
      description: 'Stops a single compose service container.'
      operationId: post-stop-service-application-by-service-and-app-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: app_uuid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Stop queued.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/databases':
    get:
      tags:
        - 'Service databases'
      summary: 'List service databases'
      description: 'List compose databases for a single service.'
      operationId: list-service-databases-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Service databases.'
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/databases/{database_uuid}':
    get:
      tags:
        - 'Service databases'
      summary: 'Get service database'
      description: 'Get a compose database by service UUID and database UUID.'
      operationId: get-service-database-by-service-and-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID.'
          required: true
          schema:
            type: string
        -
          name: database_uuid
          in: path
          description: 'Service database UUID.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Service database.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - 'Service databases'
      summary: 'Update service database'
      description: 'Update mutable fields for a compose service database.'
      operationId: patch-service-database-by-service-and-database-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID.'
          required: true
          schema:
            type: string
        -
          name: database_uuid
          in: path
          description: 'Service database UUID.'
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              properties:
                human_name:
                  type: [string, 'null']
                description:
                  type: [string, 'null']
                image:
                  type: string
                exclude_from_status:
                  type: boolean
                is_log_drain_enabled:
                  type: boolean
                is_public:
                  type: boolean
                public_port:
                  type: [integer, 'null']
                  maximum: 65535
                  minimum: 1
                public_port_timeout:
                  type: [integer, 'null']
                  minimum: 1
              type: object
              additionalProperties: false
      responses:
        '200':
          description: 'Updated service database.'
          content:
            application/json:
              schema:
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/databases/{database_uuid}/logs':
    get:
      tags:
        - 'Service databases'
      summary: 'Get service database logs'
      description: 'Get Docker logs for a compose database container.'
      operationId: get-service-database-logs-by-service-and-database-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: database_uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: lines
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 100
      responses:
        '200':
          description: Logs.
          content:
            application/json:
              schema:
                properties:
                  logs: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/databases/{database_uuid}/start':
    post:
      tags:
        - 'Service databases'
      summary: 'Start or redeploy service database container'
      description: 'Run docker compose up for a single compose database.'
      operationId: start-service-database-by-service-and-database-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: database_uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: force
          in: query
          required: false
          schema:
            type: boolean
            default: false
        -
          name: latest
          in: query
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Deploy request queued.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/databases/{database_uuid}/restart':
    post:
      tags:
        - 'Service databases'
      summary: 'Restart service database container'
      description: 'Restart a compose database container.'
      operationId: restart-service-database-by-service-and-database-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: database_uuid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Restart queued.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/databases/{database_uuid}/stop':
    post:
      tags:
        - 'Service databases'
      summary: 'Stop service database container'
      description: 'Stop a compose database container.'
      operationId: stop-service-database-by-service-and-database-uuid
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: database_uuid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Stop queued.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '501':
          description: 'Swarm not supported.'
      security:
        -
          bearerAuth: []
  /services:
    get:
      tags:
        - Services
      summary: List
      description: 'List all services.'
      operationId: list-services
      responses:
        '200':
          description: 'Get all services'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Service'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Services
      summary: 'Create service'
      description: 'Create a one-click / custom service'
      operationId: create-service
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - server_uuid
                - project_uuid
                - environment_name
                - environment_uuid
              properties:
                type:
                  description: 'The one-click service type (e.g. "actualbudget", "calibre-web", "gitea-with-mysql" ...)'
                  type: string
                name:
                  type: string
                  maxLength: 255
                  description: 'Name of the service.'
                description:
                  type: string
                  nullable: true
                  description: 'Description of the service.'
                project_uuid:
                  type: string
                  description: 'Project UUID.'
                environment_name:
                  type: string
                  description: 'Environment name. You need to provide at least one of environment_name or environment_uuid.'
                environment_uuid:
                  type: string
                  description: 'Environment UUID. You need to provide at least one of environment_name or environment_uuid.'
                server_uuid:
                  type: string
                  description: 'Server UUID.'
                destination_uuid:
                  type: string
                  description: 'Destination UUID. Required if server has multiple destinations.'
                instant_deploy:
                  type: boolean
                  default: false
                  description: 'Start the service immediately after creation.'
                docker_compose_raw:
                  type: string
                  description: 'The base64 encoded Docker Compose content.'
                urls:
                  type: array
                  description: 'Array of URLs to be applied to containers of a service.'
                  items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, url: { type: string, description: 'Comma-separated list of URLs (e.g. "https://app.cynone.com,https://app2.cynone.com").' } }, type: object }
                force_domain_override:
                  type: boolean
                  default: false
                  description: 'Force domain override even if conflicts are detected.'
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. If you want to use env variables inside the labels, turn this off.'
                tags:
                  type: array
                  items: { type: string }
                  description: 'Tags to assign to the service.'
              type: object
      responses:
        '201':
          description: 'Service created successfully.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, description: 'Service UUID.' }
                  domains: { type: array, items: { type: string }, description: 'Service domains.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}':
    get:
      tags:
        - Services
      summary: Get
      description: 'Get service by UUID.'
      operationId: get-service-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Get a service by UUID.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Service'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Services
      summary: Delete
      description: 'Delete service by UUID.'
      operationId: delete-service-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'Service UUID'
          required: true
          schema:
            type: string
        -
          name: delete_configurations
          in: query
          description: 'Delete configurations.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: delete_volumes
          in: query
          description: 'Delete volumes.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: docker_cleanup
          in: query
          description: 'Run docker cleanup.'
          required: false
          schema:
            type: boolean
            default: true
        -
          name: delete_connected_networks
          in: query
          description: 'Delete connected networks.'
          required: false
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: 'Delete a service by UUID'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Service deletion request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Services
      summary: Update
      description: 'Update service by UUID.'
      operationId: update-service-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Service updated.'
        required: true
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                  description: 'The service name.'
                description:
                  type: string
                  description: 'The service description.'
                instant_deploy:
                  type: boolean
                  description: 'The flag to indicate if the service should be deployed instantly.'
                connect_to_docker_network:
                  type: boolean
                  default: false
                  description: 'Connect the service to the predefined docker network.'
                docker_compose_raw:
                  type: string
                  description: 'The base64 encoded Docker Compose content.'
                urls:
                  type: array
                  description: 'Array of URLs to be applied to containers of a service.'
                  items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, url: { type: string, description: 'Comma-separated list of URLs (e.g. "https://app.cynone.com,https://app2.cynone.com").' } }, type: object }
                force_domain_override:
                  type: boolean
                  default: false
                  description: 'Force domain override even if conflicts are detected.'
                is_container_label_escape_enabled:
                  type: boolean
                  default: true
                  description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. If you want to use env variables inside the labels, turn this off.'
              type: object
      responses:
        '200':
          description: 'Service updated.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, description: 'Service UUID.' }
                  domains: { type: array, items: { type: string }, description: 'Service domains.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'Domain conflicts detected.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
                  warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
                  conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
                type: object
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/logs':
    get:
      tags:
        - Services
      summary: 'Get service logs.'
      description: 'Get logs for a specific service sub-resource by service UUID. The `sub_service_name` query parameter must match the `name` field of one of the service applications or databases returned by `GET /services/{uuid}`.'
      operationId: get-service-logs-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
            format: uuid
        -
          name: sub_service_name
          in: query
          description: 'Sub-service name from `GET /services/{uuid}` under `applications[].name` or `databases[].name`. Do not use `human_name` or the Docker container name with the service UUID suffix.'
          required: true
          schema:
            type: string
            example: appwrite-console
        -
          name: lines
          in: query
          description: 'Number of lines to show from the end of the logs.'
          required: false
          schema:
            type: integer
            format: int32
            default: 100
        -
          name: show_timestamps
          in: query
          description: 'Show timestamps in the logs.'
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Get service logs by UUID.'
          content:
            application/json:
              schema:
                properties:
                  logs: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/envs':
    get:
      tags:
        - Services
      summary: 'List Envs'
      description: 'List all envs by service UUID.'
      operationId: list-envs-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'All environment variables by service UUID.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Services
      summary: 'Create Env'
      description: 'Create env by service UUID.'
      operationId: create-env-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Env created.'
        required: true
        content:
          application/json:
            schema:
              properties:
                key:
                  type: string
                  description: 'The key of the environment variable.'
                value:
                  type: string
                  description: 'The value of the environment variable.'
                is_preview:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is used in preview deployments.'
                is_literal:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
                is_multiline:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is multiline.'
                is_shown_once:
                  type: boolean
                  description: "The flag to indicate if the environment variable's value is shown on the UI."
              type: object
      responses:
        '201':
          description: 'Environment variable created.'
          content:
            application/json:
              schema:
                properties:
                  uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Services
      summary: 'Update Env'
      description: 'Update env by service UUID.'
      operationId: update-env-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Env updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - key
                - value
              properties:
                key:
                  type: string
                  description: 'The key of the environment variable.'
                value:
                  type: string
                  description: 'The value of the environment variable.'
                is_preview:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is used in preview deployments.'
                is_literal:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
                is_multiline:
                  type: boolean
                  description: 'The flag to indicate if the environment variable is multiline.'
                is_shown_once:
                  type: boolean
                  description: "The flag to indicate if the environment variable's value is shown on the UI."
              type: object
      responses:
        '201':
          description: 'Environment variable updated.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/envs/bulk':
    patch:
      tags:
        - Services
      summary: 'Update Envs (Bulk)'
      description: 'Update multiple envs by service UUID.'
      operationId: update-envs-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Bulk envs updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - data
              properties:
                data:
                  type: array
                  items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object }
              type: object
      responses:
        '201':
          description: 'Environment variables updated.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EnvironmentVariable'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/envs/{env_uuid}':
    delete:
      tags:
        - Services
      summary: 'Delete Env'
      description: 'Delete env by UUID.'
      operationId: delete-env-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: env_uuid
          in: path
          description: 'UUID of the environment variable.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Environment variable deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Environment variable deleted.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/move':
    post:
      tags:
        - Services
      summary: Move
      description: 'Move service to another project/environment. This is a purely organizational change — running containers are not affected. Note: after moving, the service will pick up shared environment variables from the new environment on the next deployment.'
      operationId: move-service-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Target environment to move the service to.'
        required: true
        content:
          application/json:
            schema:
              required:
                - environment_uuid
              properties:
                environment_uuid:
                  type: string
                  description: 'UUID of the target environment.'
              type: object
      responses:
        '200':
          description: 'Service moved successfully.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Service moved successfully.' }
                  uuid: { type: string }
                  project_uuid: { type: string }
                  environment_uuid: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/start':
    post:
      tags:
        - Services
      summary: Start
      description: 'Start service.'
      operationId: start-service-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Start service.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Service starting request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/stop':
    post:
      tags:
        - Services
      summary: Stop
      description: 'Stop service.'
      operationId: stop-service-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: docker_cleanup
          in: query
          description: 'Perform docker cleanup (prune networks, volumes, etc.).'
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: 'Stop service.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Service stopping request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/restart':
    post:
      tags:
        - Services
      summary: Restart
      description: 'Restart service.'
      operationId: restart-service-by-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: latest
          in: query
          description: 'Pull latest images.'
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: 'Restart service.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Service restaring request queued.' }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/storages':
    get:
      tags:
        - Services
      summary: 'List Storages'
      description: 'List all persistent storages and file storages by service UUID.'
      operationId: list-storages-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'All storages by service UUID.'
          content:
            application/json:
              schema:
                properties:
                  persistent_storages: { type: array, items: { type: object } }
                  file_storages: { type: array, items: { type: object } }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Services
      summary: 'Create Storage'
      description: 'Create a persistent storage or file storage for a service sub-resource.'
      operationId: create-storage-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - type
                - mount_path
                - resource_uuid
              properties:
                type:
                  type: string
                  enum: [persistent, file]
                  description: 'The type of storage.'
                resource_uuid:
                  type: string
                  description: 'UUID of the service application or database sub-resource.'
                name:
                  type: string
                  description: 'Volume name (persistent only, required for persistent).'
                mount_path:
                  type: string
                  description: 'The container mount path.'
                host_path:
                  type: string
                  nullable: true
                  description: 'The host path (persistent only, optional).'
                content:
                  type: string
                  nullable: true
                  description: 'File content (file only, optional).'
                is_directory:
                  type: boolean
                  description: 'Whether this is a directory mount (file only, default false).'
                fs_path:
                  type: string
                  description: 'Host directory path (required when is_directory is true).'
              type: object
              additionalProperties: false
      responses:
        '201':
          description: 'Storage created.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    patch:
      tags:
        - Services
      summary: 'Update Storage'
      description: 'Update a persistent storage or file storage by service UUID.'
      operationId: update-storage-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Storage updated. For read-only storages (from docker-compose or services), only is_preview_suffix_enabled can be updated.'
        required: true
        content:
          application/json:
            schema:
              required:
                - type
              properties:
                uuid:
                  type: string
                  description: 'The UUID of the storage (preferred).'
                id:
                  type: integer
                  description: 'The ID of the storage (deprecated, use uuid instead).'
                type:
                  type: string
                  enum: [persistent, file]
                  description: 'The type of storage: persistent or file.'
                is_preview_suffix_enabled:
                  type: boolean
                  description: 'Whether to add -pr-N suffix for preview deployments.'
                name:
                  type: string
                  description: 'The volume name (persistent only, not allowed for read-only storages).'
                mount_path:
                  type: string
                  description: 'The container mount path (not allowed for read-only storages).'
                host_path:
                  type: string
                  nullable: true
                  description: 'The host path (persistent only, not allowed for read-only storages).'
                content:
                  type: string
                  nullable: true
                  description: 'The file content (file only, not allowed for read-only storages).'
              type: object
              additionalProperties: false
      responses:
        '200':
          description: 'Storage updated.'
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/storages/{storage_uuid}':
    delete:
      tags:
        - Services
      summary: 'Delete Storage'
      description: 'Delete a persistent storage or file storage by service UUID.'
      operationId: delete-storage-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          description: 'UUID of the storage.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Storage deleted.'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string }
                type: object
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/tags':
    get:
      tags:
        - Services
      summary: 'List Tags'
      description: 'List tags for a service by UUID.'
      operationId: list-tags-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'List of tags.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
    post:
      tags:
        - Services
      summary: 'Create Tag'
      description: 'Add tag(s) to a service by UUID.'
      operationId: create-tag-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              properties:
                tag_name:
                  type: string
                  description: 'The tag name (min 2 characters). Required if tag_names is not provided.'
                tag_names:
                  type: array
                  items: { type: string }
                  description: 'Array of tag names (each min 2 characters). Required if tag_name is not provided.'
              type: object
      responses:
        '201':
          description: 'Tags added successfully.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/tags/{tag_uuid}':
    delete:
      tags:
        - Services
      summary: 'Delete Tag'
      description: 'Remove a tag from a service by UUID.'
      operationId: delete-tag-by-service-uuid
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: tag_uuid
          in: path
          description: 'UUID of the tag.'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Tag removed.'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /tags:
    get:
      tags:
        - Tags
      summary: List
      description: 'List all tags for the current team.'
      operationId: list-tags
      responses:
        '200':
          description: 'All tags for the current team.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /teams:
    get:
      tags:
        - Teams
      summary: List
      description: 'Get all teams.'
      operationId: list-teams
      responses:
        '200':
          description: 'List of teams.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Team'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/teams/{id}':
    get:
      tags:
        - Teams
      summary: Get
      description: 'Get team by TeamId.'
      operationId: get-team-by-id
      parameters:
        -
          name: id
          in: path
          description: 'Team ID'
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: 'List of teams.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Team'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  '/teams/{id}/members':
    get:
      tags:
        - Teams
      summary: Members
      description: 'Get members by TeamId.'
      operationId: get-members-by-team-id
      parameters:
        -
          name: id
          in: path
          description: 'Team ID'
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: 'List of members.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /teams/current:
    get:
      tags:
        - Teams
      summary: 'Authenticated Team'
      description: 'Get currently authenticated team.'
      operationId: get-current-team
      responses:
        '200':
          description: 'Current Team.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Team'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  /teams/current/members:
    get:
      tags:
        - Teams
      summary: 'Authenticated Team Members'
      description: 'Get currently authenticated team members.'
      operationId: get-current-team-members
      responses:
        '200':
          description: 'Currently authenticated team members.'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/401'
        '400':
          $ref: '#/components/responses/400'
      security:
        -
          bearerAuth: []
  '/applications/{uuid}/storages/{storage_uuid}/backups':
    put:
      tags:
        - Applications
      summary: 'Set application storage backup schedule'
      description: 'Create or replace the backup schedule for an application persistent volume or directory storage.'
      operationId: set-application-storage-backup-schedule
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the application.'
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          description: 'UUID of the persistent volume or directory storage.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VolumeBackupScheduleRequest'
      responses:
        '200':
          description: 'Backup schedule replaced.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VolumeBackupScheduleResponse'
        '201':
          description: 'Backup schedule created.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VolumeBackupScheduleResponse'
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: Forbidden.
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Applications
      summary: 'Delete application storage backup schedule'
      description: 'Delete the backup schedule and its local and S3 archives for an application storage.'
      operationId: delete-application-storage-backup-schedule
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Backup schedule and archives deleted.'
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: Forbidden.
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'Backup or recovery operation is still running.'
      security:
        -
          bearerAuth: []
  '/databases/{uuid}/storages/{storage_uuid}/backups':
    put:
      tags:
        - Databases
      summary: 'Set database storage backup schedule'
      description: 'Create or replace the backup schedule for a database persistent volume or directory storage.'
      operationId: set-database-storage-backup-schedule
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the database.'
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          description: 'UUID of the persistent volume or directory storage.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VolumeBackupScheduleRequest'
      responses:
        '200':
          description: 'Backup schedule replaced.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VolumeBackupScheduleResponse'
        '201':
          description: 'Backup schedule created.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VolumeBackupScheduleResponse'
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: Forbidden.
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Databases
      summary: 'Delete database storage backup schedule'
      description: 'Delete the backup schedule and its local and S3 archives for a database storage.'
      operationId: delete-database-storage-backup-schedule
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Backup schedule and archives deleted.'
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: Forbidden.
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'Backup or recovery operation is still running.'
      security:
        -
          bearerAuth: []
  '/services/{uuid}/storages/{storage_uuid}/backups':
    put:
      tags:
        - Services
      summary: 'Set service storage backup schedule'
      description: 'Create or replace the backup schedule for a service persistent volume or directory storage.'
      operationId: set-service-storage-backup-schedule
      parameters:
        -
          name: uuid
          in: path
          description: 'UUID of the service.'
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          description: 'UUID of the persistent volume or directory storage.'
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VolumeBackupScheduleRequest'
      responses:
        '200':
          description: 'Backup schedule replaced.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VolumeBackupScheduleResponse'
        '201':
          description: 'Backup schedule created.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VolumeBackupScheduleResponse'
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: Forbidden.
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
      security:
        -
          bearerAuth: []
    delete:
      tags:
        - Services
      summary: 'Delete service storage backup schedule'
      description: 'Delete the backup schedule and its local and S3 archives for a service storage.'
      operationId: delete-service-storage-backup-schedule
      parameters:
        -
          name: uuid
          in: path
          required: true
          schema:
            type: string
        -
          name: storage_uuid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Backup schedule and archives deleted.'
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: Forbidden.
        '404':
          $ref: '#/components/responses/404'
        '409':
          description: 'Backup or recovery operation is still running.'
      security:
        -
          bearerAuth: []
  /vultr/regions:
    get:
      tags:
        - Vultr
      summary: 'Get Vultr Regions'
      description: 'Get all available Vultr regions.'
      operationId: get-vultr-regions
      responses:
        '200':
          description: 'List of Vultr regions.'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /vultr/plans:
    get:
      tags:
        - Vultr
      summary: 'Get Vultr Plans'
      description: 'Get all available Vultr plans.'
      operationId: get-vultr-plans
      responses:
        '200':
          description: 'List of Vultr plans.'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /vultr/os:
    get:
      tags:
        - Vultr
      summary: 'Get Vultr Operating Systems'
      description: 'Get all available Vultr operating systems.'
      operationId: get-vultr-operating-systems
      responses:
        '200':
          description: 'List of Vultr operating systems.'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /vultr/ssh-keys:
    get:
      tags:
        - Vultr
      summary: 'Get Vultr SSH Keys'
      description: 'Get all Vultr SSH keys available to the selected token.'
      operationId: get-vultr-ssh-keys
      responses:
        '200':
          description: 'List of Vultr SSH keys.'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
      security:
        -
          bearerAuth: []
  /servers/vultr:
    post:
      tags:
        - Vultr
      summary: 'Create Vultr Server'
      description: 'Create a Vultr instance and link it as a Cynone server.'
      operationId: create-vultr-server
      responses:
        '201':
          description: 'Vultr server created.'
        '401':
          $ref: '#/components/responses/401'
        '422':
          description: 'Validation failed.'
        '429':
          description: 'Vultr API rate limit exceeded.'
      security:
        -
          bearerAuth: []
components:
  schemas:
    VolumeBackupScheduleRequest:
      required:
        - frequency
      properties:
        frequency:
          type: string
          maxLength: 255
          example: '0 2 * * *'
        enabled:
          type: boolean
          default: true
        save_s3:
          type: boolean
          default: false
        disable_local_backup:
          type: boolean
          default: false
        stop_during_backup:
          type: boolean
          default: false
        s3_storage_uuid:
          type:
            - string
            - 'null'
        retention_amount_locally:
          type: integer
          default: 7
          maximum: 10000
          minimum: 0
        retention_days_locally:
          type: integer
          default: 0
          maximum: 2147483647
          minimum: 0
        retention_max_storage_locally:
          type: number
          format: float
          default: 0
          maximum: 9999999999
          minimum: 0
        retention_amount_s3:
          type: integer
          default: 7
          maximum: 10000
          minimum: 0
        retention_days_s3:
          type: integer
          default: 0
          maximum: 2147483647
          minimum: 0
        retention_max_storage_s3:
          type: number
          format: float
          default: 0
          maximum: 9999999999
          minimum: 0
        timeout:
          type: integer
          default: 3600
          maximum: 36000
          minimum: 60
      type: object
      additionalProperties: false
    VolumeBackupScheduleResponse:
      required:
        - uuid
        - message
        - storage_uuid
        - storage_type
        - frequency
        - enabled
        - save_s3
        - disable_local_backup
        - stop_during_backup
        - retention_amount_locally
        - retention_days_locally
        - retention_max_storage_locally
        - retention_amount_s3
        - retention_days_s3
        - retention_max_storage_s3
        - timeout
      properties:
        uuid:
          type: string
        message:
          type: string
        storage_uuid:
          type: string
        storage_type:
          type: string
          enum:
            - persistent
            - directory
        frequency:
          type: string
        enabled:
          type: boolean
        save_s3:
          type: boolean
        disable_local_backup:
          type: boolean
        stop_during_backup:
          type: boolean
        s3_storage_uuid:
          type:
            - string
            - 'null'
        retention_amount_locally:
          type: integer
        retention_days_locally:
          type: integer
        retention_max_storage_locally:
          type: number
          format: float
        retention_amount_s3:
          type: integer
        retention_days_s3:
          type: integer
        retention_max_storage_s3:
          type: number
          format: float
        timeout:
          type: integer
      type: object
    Application:
      description: 'Application model'
      properties:
        id:
          type: integer
          description: 'The application identifier in the database.'
        description:
          type: string
          nullable: true
          description: 'The application description.'
        repository_project_id:
          type: integer
          nullable: true
          description: 'The repository project identifier.'
        uuid:
          type: string
          description: 'The application UUID.'
        name:
          type: string
          description: 'The application name.'
        fqdn:
          type: string
          nullable: true
          description: 'The application domains.'
        config_hash:
          type: string
          description: 'Configuration hash.'
        git_repository:
          type: string
          description: 'Git repository URL.'
        git_branch:
          type: string
          description: 'Git branch.'
        git_commit_sha:
          type: string
          description: 'Git commit SHA.'
        git_full_url:
          type: string
          nullable: true
          description: 'Git full URL.'
        docker_registry_image_name:
          type: string
          nullable: true
          description: 'Docker registry image name.'
        docker_registry_image_tag:
          type: string
          nullable: true
          description: 'Docker registry image tag.'
        build_pack:
          type: string
          description: 'Build pack.'
          enum:
            - nixpacks
            - railpack
            - static
            - dockerfile
            - dockercompose
        static_image:
          type: string
          description: 'Static image used when static site is deployed.'
        install_command:
          type: string
          description: 'Install command.'
        build_command:
          type: string
          description: 'Build command.'
        start_command:
          type: string
          description: 'Start command.'
        ports_exposes:
          type: string
          description: 'Ports exposes.'
        ports_mappings:
          type: string
          nullable: true
          description: 'Ports mappings.'
        custom_network_aliases:
          type: string
          nullable: true
          description: 'Network aliases for Docker container.'
        base_directory:
          type: string
          description: 'Base directory for all commands.'
        publish_directory:
          type: string
          description: 'Publish directory.'
        health_check_enabled:
          type: boolean
          description: 'Health check enabled.'
        health_check_path:
          type: string
          description: 'Health check path.'
        health_check_port:
          type: string
          nullable: true
          description: 'Health check port.'
        health_check_host:
          type: string
          nullable: true
          description: 'Health check host.'
        health_check_method:
          type: string
          description: 'Health check method.'
        health_check_return_code:
          type: integer
          description: 'Health check return code.'
        health_check_scheme:
          type: string
          description: 'Health check scheme.'
        health_check_response_text:
          type: string
          nullable: true
          description: 'Health check response text.'
        health_check_interval:
          type: integer
          description: 'Health check interval in seconds.'
        health_check_timeout:
          type: integer
          description: 'Health check timeout in seconds.'
        health_check_retries:
          type: integer
          description: 'Health check retries count.'
        health_check_start_period:
          type: integer
          description: 'Health check start period in seconds.'
        health_check_type:
          type: string
          description: 'Health check type: http or cmd.'
          enum:
            - http
            - cmd
        health_check_command:
          type: string
          nullable: true
          description: 'Health check command for CMD type.'
        limits_memory:
          type: string
          description: 'Memory limit.'
        limits_memory_swap:
          type: string
          description: 'Memory swap limit.'
        limits_memory_swappiness:
          type: integer
          description: 'Memory swappiness.'
        limits_memory_reservation:
          type: string
          description: 'Memory reservation.'
        limits_cpus:
          type: string
          description: 'CPU limit.'
        limits_cpuset:
          type: string
          nullable: true
          description: 'CPU set.'
        limits_cpu_shares:
          type: integer
          description: 'CPU shares.'
        status:
          type: string
          description: 'Application status.'
        preview_url_template:
          type: string
          description: 'Preview URL template.'
        destination_type:
          type: string
          description: 'Destination type.'
        destination_id:
          type: integer
          description: 'Destination identifier.'
        source_id:
          type: integer
          nullable: true
          description: 'Source identifier.'
        private_key_id:
          type: integer
          nullable: true
          description: 'Private key identifier.'
        environment_id:
          type: integer
          description: 'Environment identifier.'
        dockerfile:
          type: string
          nullable: true
          description: 'Dockerfile content. Used for dockerfile build pack.'
        dockerfile_location:
          type: string
          description: 'Dockerfile location.'
        custom_labels:
          type: string
          nullable: true
          description: 'Custom labels.'
        dockerfile_target_build:
          type: string
          nullable: true
          description: 'Dockerfile target build.'
        manual_webhook_secret_github:
          type: string
          nullable: true
          description: 'Manual webhook secret for GitHub.'
        manual_webhook_secret_gitlab:
          type: string
          nullable: true
          description: 'Manual webhook secret for GitLab.'
        manual_webhook_secret_bitbucket:
          type: string
          nullable: true
          description: 'Manual webhook secret for Bitbucket.'
        manual_webhook_secret_gitea:
          type: string
          nullable: true
          description: 'Manual webhook secret for Gitea.'
        docker_compose_location:
          type: string
          description: 'Docker compose location.'
        docker_compose:
          type: string
          nullable: true
          description: 'Docker compose content. Used for docker compose build pack.'
        docker_compose_raw:
          type: string
          nullable: true
          description: 'Docker compose raw content.'
        docker_compose_domains:
          type: string
          nullable: true
          description: 'Docker compose domains.'
        docker_compose_custom_start_command:
          type: string
          nullable: true
          description: 'Docker compose custom start command.'
        docker_compose_custom_build_command:
          type: string
          nullable: true
          description: 'Docker compose custom build command.'
        swarm_replicas:
          type: integer
          nullable: true
          description: 'Swarm replicas. Only used for swarm deployments.'
        swarm_placement_constraints:
          type: string
          nullable: true
          description: 'Swarm placement constraints. Only used for swarm deployments.'
        custom_docker_run_options:
          type: string
          nullable: true
          description: 'Custom docker run options.'
        post_deployment_command:
          type: string
          nullable: true
          description: 'Post deployment command.'
        post_deployment_command_container:
          type: string
          nullable: true
          description: 'Post deployment command container.'
        pre_deployment_command:
          type: string
          nullable: true
          description: 'Pre deployment command.'
        pre_deployment_command_container:
          type: string
          nullable: true
          description: 'Pre deployment command container.'
        watch_paths:
          type: string
          nullable: true
          description: 'Watch paths.'
        custom_healthcheck_found:
          type: boolean
          description: 'Custom healthcheck found.'
        redirect:
          type: string
          nullable: true
          description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
          enum:
            - www
            - non-www
            - both
        created_at:
          type: string
          format: date-time
          description: 'The date and time when the application was created.'
        updated_at:
          type: string
          format: date-time
          description: 'The date and time when the application was last updated.'
        deleted_at:
          type: string
          format: date-time
          nullable: true
          description: 'The date and time when the application was deleted.'
        compose_parsing_version:
          type: string
          description: 'How Cynone parse the compose file.'
        custom_nginx_configuration:
          type: string
          nullable: true
          description: 'Custom Nginx configuration base64 encoded.'
        is_http_basic_auth_enabled:
          type: boolean
          description: 'HTTP Basic Authentication enabled.'
        http_basic_auth_username:
          type: string
          nullable: true
          description: 'Username for HTTP Basic Authentication'
        http_basic_auth_password:
          type: string
          nullable: true
          description: 'Password for HTTP Basic Authentication'
        settings:
          $ref: '#/components/schemas/ApplicationSetting'
      type: object
    ApplicationDeploymentQueue:
      description: 'Project model'
      properties:
        id:
          type: integer
        application_id:
          type: string
        deployment_uuid:
          type: string
        pull_request_id:
          type: integer
        docker_registry_image_tag:
          type: string
          nullable: true
        configuration_hash:
          type: string
          nullable: true
        configuration_snapshot:
          type: object
          nullable: true
        configuration_diff:
          type: object
          nullable: true
        force_rebuild:
          type: boolean
        commit:
          type: string
        status:
          type: string
        is_webhook:
          type: boolean
        is_api:
          type: boolean
        created_at:
          type: string
        updated_at:
          type: string
        logs:
          type: string
        current_process_id:
          type: string
        restart_only:
          type: boolean
        git_type:
          type: string
        server_id:
          type: integer
        application_name:
          type: string
        server_name:
          type: string
        deployment_url:
          type: string
        destination_id:
          type: string
        only_this_server:
          type: boolean
        rollback:
          type: boolean
        commit_message:
          type: string
      type: object
    ApplicationSetting:
      description: 'Application settings.'
      properties:
        is_static:
          type: boolean
        is_git_submodules_enabled:
          type: boolean
        is_git_lfs_enabled:
          type: boolean
        is_auto_deploy_enabled:
          type: boolean
        is_force_https_enabled:
          type: boolean
        is_debug_enabled:
          type: boolean
        is_preview_deployments_enabled:
          type: boolean
        is_log_drain_enabled:
          type: boolean
        is_gpu_enabled:
          type: boolean
        gpu_driver:
          type: string
          nullable: true
        gpu_count:
          type: string
          nullable: true
        gpu_device_ids:
          type: string
          nullable: true
        gpu_options:
          type: string
          nullable: true
        is_include_timestamps:
          type: boolean
        is_swarm_only_worker_nodes:
          type: boolean
        is_raw_compose_deployment_enabled:
          type: boolean
        is_build_server_enabled:
          type: boolean
        is_consistent_container_name_enabled:
          type: boolean
        is_gzip_enabled:
          type: boolean
        is_stripprefix_enabled:
          type: boolean
        connect_to_docker_network:
          type: boolean
        custom_internal_name:
          type: string
          nullable: true
        is_container_label_escape_enabled:
          type: boolean
        is_env_sorting_enabled:
          type: boolean
        is_container_label_readonly_enabled:
          type: boolean
        is_preserve_repository_enabled:
          type: boolean
        disable_build_cache:
          type: boolean
        is_spa:
          type: boolean
        is_git_shallow_clone_enabled:
          type: boolean
        is_pr_deployments_public_enabled:
          type: boolean
        use_build_secrets:
          type: boolean
        inject_build_args_to_dockerfile:
          type: boolean
        include_source_commit_in_build:
          type: boolean
        docker_images_to_keep:
          type: integer
        stop_grace_period:
          type: integer
          nullable: true
      type: object
    Environment:
      description: 'Environment model'
      properties:
        id:
          type: integer
        name:
          type: string
        project_id:
          type: integer
        created_at:
          type: string
        updated_at:
          type: string
        description:
          type: string
      type: object
    EnvironmentVariable:
      description: 'Environment Variable model'
      properties:
        id:
          type: integer
        uuid:
          type: string
        resourceable_type:
          type: string
        resourceable_id:
          type: integer
        is_literal:
          type: boolean
        is_multiline:
          type: boolean
        is_preview:
          type: boolean
        is_runtime:
          type: boolean
        is_buildtime:
          type: boolean
        is_shared:
          type: boolean
        is_shown_once:
          type: boolean
        key:
          type: string
        value:
          type: string
        real_value:
          type: string
        comment:
          type: string
          nullable: true
        version:
          type: string
        created_at:
          type: string
        updated_at:
          type: string
      type: object
    PrivateKey:
      description: 'Private Key model'
      properties:
        id:
          type: integer
        uuid:
          type: string
        name:
          type: string
        description:
          type: string
        private_key:
          type: string
          format: private-key
        public_key:
          type: string
          description: 'The public key of the private key.'
        fingerprint:
          type: string
          description: 'The fingerprint of the private key.'
        is_git_related:
          type: boolean
        team_id:
          type: integer
        created_at:
          type: string
        updated_at:
          type: string
      type: object
    Project:
      description: 'Project model'
      properties:
        id:
          type: integer
        uuid:
          type: string
        name:
          type: string
        description:
          type: string
      type: object
    ScheduledTask:
      description: 'Scheduled Task model'
      properties:
        id:
          type: integer
          description: 'The unique identifier of the scheduled task in the database.'
        uuid:
          type: string
          description: 'The unique identifier of the scheduled task.'
        enabled:
          type: boolean
          description: 'The flag to indicate if the scheduled task is enabled.'
        name:
          type: string
          description: 'The name of the scheduled task.'
        command:
          type: string
          description: 'The command to execute.'
        frequency:
          type: string
          description: 'The frequency of the scheduled task.'
        container:
          type: string
          nullable: true
          description: 'The container where the command should be executed.'
        timeout:
          type: integer
          description: 'The timeout of the scheduled task in seconds.'
        created_at:
          type: string
          format: date-time
          description: 'The date and time when the scheduled task was created.'
        updated_at:
          type: string
          format: date-time
          description: 'The date and time when the scheduled task was last updated.'
      type: object
    ScheduledTaskExecution:
      description: 'Scheduled Task Execution model'
      properties:
        uuid:
          type: string
          description: 'The unique identifier of the execution.'
        status:
          type: string
          enum:
            - success
            - failed
            - running
          description: 'The status of the execution.'
        message:
          type: string
          nullable: true
          description: 'The output message of the execution.'
        retry_count:
          type: integer
          description: 'The number of retries.'
        duration:
          type: number
          nullable: true
          description: 'Duration in seconds.'
        started_at:
          type: string
          format: date-time
          nullable: true
          description: 'When the execution started.'
        finished_at:
          type: string
          format: date-time
          nullable: true
          description: 'When the execution finished.'
        created_at:
          type: string
          format: date-time
          description: 'When the record was created.'
        updated_at:
          type: string
          format: date-time
          description: 'When the record was last updated.'
      type: object
    Server:
      description: 'Server model'
      properties:
        id:
          type: integer
          description: 'The server ID.'
        uuid:
          type: string
          description: 'The server UUID.'
        name:
          type: string
          description: 'The server name.'
        description:
          type: string
          description: 'The server description.'
        ip:
          type: string
          description: 'The IP address.'
        user:
          type: string
          description: 'The user.'
        port:
          type: integer
          description: 'The port number.'
        proxy:
          type: object
          description: 'The proxy configuration.'
        proxy_type:
          type: string
          enum:
            - traefik
            - caddy
            - none
          description: 'The proxy type.'
        high_disk_usage_notification_sent:
          type: boolean
          description: 'The flag to indicate if the high disk usage notification has been sent.'
        unreachable_notification_sent:
          type: boolean
          description: 'The flag to indicate if the unreachable notification has been sent.'
        unreachable_count:
          type: integer
          description: 'The unreachable count for your server.'
        validation_logs:
          type: string
          description: 'The validation logs.'
        log_drain_notification_sent:
          type: boolean
          description: 'The flag to indicate if the log drain notification has been sent.'
        swarm_cluster:
          type: string
          description: 'The swarm cluster configuration.'
        settings:
          $ref: '#/components/schemas/ServerSetting'
      type: object
    ServerSetting:
      description: 'Server Settings model'
      properties:
        id:
          type: integer
        concurrent_builds:
          type: integer
        deployment_queue_limit:
          type: integer
        dynamic_timeout:
          type: integer
        force_disabled:
          type: boolean
        force_server_cleanup:
          type: boolean
        is_build_server:
          type: boolean
        is_cloudflare_tunnel:
          type: boolean
        is_jump_server:
          type: boolean
        is_logdrain_axiom_enabled:
          type: boolean
        is_logdrain_custom_enabled:
          type: boolean
        is_logdrain_highlight_enabled:
          type: boolean
        is_logdrain_newrelic_enabled:
          type: boolean
        is_metrics_enabled:
          type: boolean
        is_reachable:
          type: boolean
        is_sentinel_enabled:
          type: boolean
        is_swarm_manager:
          type: boolean
        is_swarm_worker:
          type: boolean
        is_terminal_enabled:
          type: boolean
        is_usable:
          type: boolean
        logdrain_axiom_api_key:
          type: string
        logdrain_axiom_dataset_name:
          type: string
        logdrain_custom_config:
          type: string
        logdrain_custom_config_parser:
          type: string
        logdrain_highlight_project_id:
          type: string
        logdrain_newrelic_base_uri:
          type: string
        logdrain_newrelic_license_key:
          type: string
        sentinel_metrics_history_days:
          type: integer
        sentinel_metrics_refresh_rate_seconds:
          type: integer
        sentinel_token:
          type: string
        docker_cleanup_frequency:
          type: string
        docker_cleanup_threshold:
          type: integer
        server_id:
          type: integer
        wildcard_domain:
          type: string
        created_at:
          type: string
        updated_at:
          type: string
        delete_unused_volumes:
          type: boolean
          description: 'The flag to indicate if the unused volumes should be deleted.'
        delete_unused_networks:
          type: boolean
          description: 'The flag to indicate if the unused networks should be deleted.'
        connection_timeout:
          type: integer
          description: 'SSH connection timeout in seconds.'
      type: object
    Service:
      description: 'Service model'
      properties:
        id:
          type: integer
          description: 'The unique identifier of the service. Only used for database identification.'
        uuid:
          type: string
          description: 'The unique identifier of the service.'
        name:
          type: string
          description: 'The name of the service.'
        environment_id:
          type: integer
          description: 'The unique identifier of the environment where the service is attached to.'
        server_id:
          type: integer
          description: 'The unique identifier of the server where the service is running.'
        description:
          type: string
          description: 'The description of the service.'
        docker_compose_raw:
          type: string
          description: 'The raw docker-compose.yml file of the service.'
        docker_compose:
          type: string
          description: 'The docker-compose.yml file that is parsed and modified by Cynone.'
        destination_type:
          type: string
          description: 'Destination type.'
        destination_id:
          type: integer
          description: 'The unique identifier of the destination where the service is running.'
        connect_to_docker_network:
          type: boolean
          description: 'The flag to connect the service to the predefined Docker network.'
        is_container_label_escape_enabled:
          type: boolean
          description: 'The flag to enable the container label escape.'
        is_container_label_readonly_enabled:
          type: boolean
          description: 'The flag to enable the container label readonly.'
        config_hash:
          type: string
          description: 'The hash of the service configuration.'
        service_type:
          type: string
          description: 'The type of the service.'
        created_at:
          type: string
          description: 'The date and time when the service was created.'
        updated_at:
          type: string
          description: 'The date and time when the service was last updated.'
        deleted_at:
          type: string
          description: 'The date and time when the service was deleted.'
      type: object
    Destination:
      description: 'A Docker network destination attached to a server.'
      properties:
        uuid:
          type: string
        name:
          type: string
        network:
          type: string
        type:
          type: string
          enum:
            - standalone
            - swarm
        server_uuid:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      type: object
    Tag:
      description: 'Tag model'
      properties:
        uuid:
          type: string
        name:
          type: string
        created_at:
          type: string
        updated_at:
          type: string
      type: object
    Team:
      description: 'Team model'
      properties:
        id:
          type: integer
          description: 'The unique identifier of the team.'
        name:
          type: string
          description: 'The name of the team.'
        description:
          type: string
          description: 'The description of the team.'
        personal_team:
          type: boolean
          description: 'Whether the team is personal or not.'
        created_at:
          type: string
          description: 'The date and time the team was created.'
        updated_at:
          type: string
          description: 'The date and time the team was last updated.'
        show_boarding:
          type: boolean
          description: 'Whether to show the boarding screen or not.'
        custom_server_limit:
          type: string
          description: 'The custom server limit.'
        members:
          description: 'The members of the team.'
          type: array
          items:
            $ref: '#/components/schemas/User'
      type: object
    User:
      description: 'User model'
      properties:
        id:
          type: integer
          description: 'The user identifier in the database.'
        name:
          type: string
          description: 'The user name.'
        email:
          type: string
          description: 'The user email.'
        email_verified_at:
          type: string
          description: 'The date when the user email was verified.'
        created_at:
          type: string
          description: 'The date when the user was created.'
        updated_at:
          type: string
          description: 'The date when the user was updated.'
        two_factor_confirmed_at:
          type: string
          description: 'The date when the user two factor was confirmed.'
        force_password_reset:
          type: boolean
          description: 'The flag to force the user to reset the password.'
        marketing_emails:
          type: boolean
          description: 'The flag to receive marketing emails.'
      type: object
  responses:
    '400':
      description: 'Invalid token.'
      content:
        application/json:
          schema:
            properties:
              message:
                type: string
                example: 'Invalid token.'
            type: object
    '401':
      description: Unauthenticated.
      content:
        application/json:
          schema:
            properties:
              message:
                type: string
                example: Unauthenticated.
            type: object
    '404':
      description: 'Resource not found.'
      content:
        application/json:
          schema:
            properties:
              message:
                type: string
                example: 'Resource not found.'
            type: object
    '422':
      description: 'Validation error.'
      content:
        application/json:
          schema:
            properties:
              message:
                type: string
                example: 'Validation error.'
              errors:
                type: object
                example:
                  name: ['The name field is required.']
                  api_url: ['The api url field is required.', 'The api url format is invalid.']
                additionalProperties:
                  type: array
                  items: { type: string }
            type: object
    '429':
      description: 'Rate limit exceeded.'
      headers:
        Retry-After:
          description: 'Number of seconds to wait before retrying.'
          schema:
            type: integer
            example: 60
      content:
        application/json:
          schema:
            properties:
              message:
                type: string
                example: 'Rate limit exceeded. Please try again later.'
            type: object
  securitySchemes:
    bearerAuth:
      type: http
      description: 'Go to `Profile` / `API Tokens` and create a new token. Use the token as the bearer token. User tokens are scoped to the team selected when the token is created.'
      scheme: bearer
tags:
  -
    name: Applications
    description: Applications
  -
    name: 'Cloud Tokens'
    description: 'Cloud Tokens'
  -
    name: Databases
    description: Databases
  -
    name: Deployments
    description: Deployments
  -
    name: Destinations
    description: Destinations
  -
    name: DigitalOcean
    description: DigitalOcean
  -
    name: 'GitHub Apps'
    description: 'GitHub Apps'
  -
    name: Hetzner
    description: Hetzner
  -
    name: Projects
    description: Projects
  -
    name: Resources
    description: Resources
  -
    name: 'Scheduled Tasks'
    description: 'Scheduled Tasks'
  -
    name: 'Private Keys'
    description: 'Private Keys'
  -
    name: Servers
    description: Servers
  -
    name: 'Service applications'
    description: 'Service applications'
  -
    name: 'Service databases'
    description: 'Service databases'
  -
    name: Services
    description: Services
  -
    name: Tags
    description: Tags
  -
    name: Teams
    description: Teams
  -
    name: Vultr
    description: Vultr
