{ "openapi": "3.1.0", "info": { "title": "Coolify", "version": "0.1" }, "servers": [ { "url": "https:\/\/app.coolify.io\/api\/v1", "description": "Coolify Cloud API. Change the host to your own instance if you are self-hosting." } ], "paths": { "\/applications\/{uuid}\/previews": { "get": { "tags": [ "Applications" ], "summary": "List Preview Deployments", "description": "List the preview deployments of an application, newest pull request first.", "operationId": "list-preview-deployments-by-application-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "List of preview deployments.", "content": { "application\/json": { "schema": { "type": "array", "items": { "$ref": "#\/components\/schemas\/ApplicationPreview" } } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Applications" ], "summary": "Create Preview Deployment", "description": "Open a preview deployment for a pull request and queue its deployment. When the preview already exists, it is redeployed. Git based applications need git_type unless they use a GitHub or GitLab App source; Bitbucket also needs commit. Docker Image applications need docker_tag for a new preview.", "operationId": "create-preview-deployment-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": [ "pull_request_id" ], "properties": { "pull_request_id": { "type": "integer", "example": 42, "maximum": 2147483647, "minimum": 1 }, "pull_request_html_url": { "type": [ "string", "null" ], "example": "https:\/\/github.com\/org\/repo\/pull\/42" }, "git_type": { "description": "Git provider that hosts the pull request. Sets the ref Coolify fetches (pull\/{id}\/head or merge-requests\/{id}\/head).", "type": [ "string", "null" ], "enum": [ "github", "gitlab", "gitea", "bitbucket" ] }, "commit": { "description": "Commit SHA to deploy. Required for Bitbucket.", "type": [ "string", "null" ] }, "docker_tag": { "description": "Docker image tag. Docker Image applications only.", "type": [ "string", "null" ] }, "force": { "description": "Rebuild without cache.", "type": "boolean", "default": false }, "instant_deploy": { "description": "Queue a deployment. Set to false to only create the preview, for example to set its domains first.", "type": "boolean", "default": true } }, "type": "object" } } } }, "responses": { "200": { "description": "Existing preview deployment updated.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/ApplicationPreviewDeployment" } } } }, "201": { "description": "Preview deployment created.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/ApplicationPreviewDeployment" } } } }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" }, "429": { "description": "Deployment queue is full." } }, "security": [ { "bearerAuth": [] } ] } }, "\/applications\/{uuid}\/previews\/{pull_request_id}": { "get": { "tags": [ "Applications" ], "summary": "Get Preview Deployment", "description": "Get a preview deployment by pull request ID.", "operationId": "get-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.", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Preview deployment.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/ApplicationPreview" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] }, "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. Needs a token with the write and deploy permissions.", "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" }, "403": { "description": "The token needs the write and deploy permissions." } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Applications" ], "summary": "Update Preview Domains", "description": "Replace domains for a preview deployment. Use domains for regular applications or docker_compose_domains for Docker Compose applications. Ports are stored as internal overrides while public domains remain portless.", "operationId": "update-preview-domains-by-pull-request-id", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "pull_request_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "domains": { "type": [ "string", "null" ], "example": "https:\/\/pr.example.com:3000" }, "docker_compose_domains": { "type": [ "array", "null" ], "items": { "properties": { "name": { "type": "string" }, "domain": { "type": [ "string", "null" ] }, "redirect": { "type": [ "string", "null" ], "enum": [ "www", "non-www", "both" ] } }, "type": "object" } }, "force_domain_override": { "type": "boolean", "default": false } }, "type": "object" } } } }, "responses": { "200": { "description": "Preview domains updated." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "$ref": "#\/components\/responses\/403" }, "404": { "$ref": "#\/components\/responses\/404" }, "409": { "description": "Domain conflict." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/applications\/{uuid}\/secret-manager": { "patch": { "tags": [ "Secret Managers" ], "summary": "Configure Application Secret Manager", "description": "Configure the secret manager source used by an application.", "operationId": "configure-application-secret-manager", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "integration_token_uuid" ], "properties": { "integration_token_uuid": { "type": "string" }, "settings": { "type": "object" } }, "type": "object" } } } }, "responses": { "200": { "description": "Secret manager configured." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/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", "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." }, "noindex_domains": { "type": "array", "items": { "type": "string" }, "description": "The subset of the application domains served with an X-Robots-Tag: noindex, nofollow response header, keeping them out of search engines. Entries that are not among the application domains are ignored." }, "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. Needs the deploy ability." }, "manual_webhook_secret_gitlab": { "type": "string", "description": "Manual webhook secret for Gitlab. Needs the deploy ability." }, "manual_webhook_secret_bitbucket": { "type": "string", "description": "Manual webhook secret for Bitbucket. Needs the deploy ability." }, "manual_webhook_secret_gitea": { "type": "string", "description": "Manual webhook secret for Gitea. Needs the deploy ability." }, "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." }, "dockerfile_target_build": { "type": "string", "nullable": true, "description": "The Docker build target (stage) in the Dockerfile." }, "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.coolify.io,https:\/\/app2.coolify.io\")" }, "redirect": { "type": "string", "nullable": true, "description": "Per-service www\/non-www redirect for this compose service.", "enum": [ "www", "non-www", "both" ] } }, "type": "object" } }, "watch_paths": { "type": "string", "description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns." }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "default": true, "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Redeploy to apply it." }, "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." }, "rolling_update_drain_seconds": { "type": "integer", "minimum": 0, "maximum": 300, "description": "Seconds to wait after the new container is healthy before old containers stop during a rolling update. 0 turns the wait off. Default: 5." }, "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_permanent_redirect_enabled": { "type": "boolean", "description": "Use permanent redirects (301\/308) instead of temporary (302\/307) for the HTTP to HTTPS and www redirects. Defaults to false." }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver for this application. Null uses the server setting, \"none\" uses no resolver." }, "is_container_label_readonly_enabled": { "type": "boolean", "default": true, "description": "Let Coolify manage the container labels. True regenerates custom_labels from domains, redirect, and proxy settings. False keeps custom_labels as you set them: domains, redirect, and basic auth changes then do not change the labels." }, "is_raw_compose_deployment_enabled": { "type": "boolean", "description": "Deploy the raw Docker Compose definition." }, "is_log_drain_enabled": { "type": "boolean", "description": "Enable log drain for the application." }, "is_gpu_enabled": { "type": "boolean", "description": "Enable GPU support." }, "gpu_driver": { "type": "string", "nullable": true, "description": "GPU driver name." }, "gpu_count": { "type": "string", "nullable": true, "description": "Number of GPUs to allocate." }, "gpu_device_ids": { "type": "string", "nullable": true, "description": "Comma-separated GPU device IDs." }, "gpu_options": { "type": "string", "nullable": true, "description": "Additional GPU options." }, "is_consistent_container_name_enabled": { "type": "boolean", "description": "Use a consistent container name across deployments." }, "custom_internal_name": { "type": "string", "nullable": true, "description": "Custom internal container name. Turns is_consistent_container_name_enabled on when that field is not sent; sending it as false together with a name returns 422." }, "custom_container_name_prefix": { "type": "string", "nullable": true, "description": "Prefix for generated container names (prefix-20260908T141530). Slugified and unique across the instance." }, "preview_url_template": { "type": "string", "description": "Preview URL template." }, "max_restart_count": { "type": "integer", "minimum": 0, "description": "Maximum container restart count before stopping." }, "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" }, "http_basic_auth_hash_algorithm": { "type": "string", "enum": [ "bcrypt", "argon2id" ], "default": "bcrypt", "description": "Hash algorithm for the HTTP Basic Authentication password. Argon2id needs the Caddy proxy, version 2.11 or newer." }, "http_basic_auth_bcrypt_cost": { "type": "integer", "minimum": 4, "maximum": 14, "default": 10, "description": "Bcrypt cost for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_memory_cost": { "type": "integer", "minimum": 8192, "maximum": 262144, "default": 65536, "description": "Argon2id memory cost in KiB for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_time_cost": { "type": "integer", "minimum": 1, "maximum": 12, "default": 4, "description": "Argon2id time cost (iterations) for the HTTP Basic Authentication password." }, "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. Ignored for the dockercompose build pack, which uses docker_compose_domains. 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" }, "403": { "description": "The token needs the deploy ability to set a manual webhook secret." }, "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", "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." }, "noindex_domains": { "type": "array", "items": { "type": "string" }, "description": "The subset of the application domains served with an X-Robots-Tag: noindex, nofollow response header, keeping them out of search engines. Entries that are not among the application domains are ignored." }, "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. Needs the deploy ability." }, "manual_webhook_secret_gitlab": { "type": "string", "description": "Manual webhook secret for Gitlab. Needs the deploy ability." }, "manual_webhook_secret_bitbucket": { "type": "string", "description": "Manual webhook secret for Bitbucket. Needs the deploy ability." }, "manual_webhook_secret_gitea": { "type": "string", "description": "Manual webhook secret for Gitea. Needs the deploy ability." }, "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" }, "dockerfile_target_build": { "type": "string", "nullable": true, "description": "The Docker build target (stage) in the Dockerfile." }, "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.coolify.io,https:\/\/app2.coolify.io\")" }, "redirect": { "type": "string", "nullable": true, "description": "Per-service www\/non-www redirect for this compose service.", "enum": [ "www", "non-www", "both" ] } }, "type": "object" } }, "watch_paths": { "type": "string", "description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns." }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "default": true, "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Redeploy to apply it." }, "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." }, "rolling_update_drain_seconds": { "type": "integer", "minimum": 0, "maximum": 300, "description": "Seconds to wait after the new container is healthy before old containers stop during a rolling update. 0 turns the wait off. Default: 5." }, "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_permanent_redirect_enabled": { "type": "boolean", "description": "Use permanent redirects (301\/308) instead of temporary (302\/307) for the HTTP to HTTPS and www redirects. Defaults to false." }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver for this application. Null uses the server setting, \"none\" uses no resolver." }, "is_container_label_readonly_enabled": { "type": "boolean", "default": true, "description": "Let Coolify manage the container labels. True regenerates custom_labels from domains, redirect, and proxy settings. False keeps custom_labels as you set them: domains, redirect, and basic auth changes then do not change the labels." }, "is_raw_compose_deployment_enabled": { "type": "boolean", "description": "Deploy the raw Docker Compose definition." }, "is_log_drain_enabled": { "type": "boolean", "description": "Enable log drain for the application." }, "is_gpu_enabled": { "type": "boolean", "description": "Enable GPU support." }, "gpu_driver": { "type": "string", "nullable": true, "description": "GPU driver name." }, "gpu_count": { "type": "string", "nullable": true, "description": "Number of GPUs to allocate." }, "gpu_device_ids": { "type": "string", "nullable": true, "description": "Comma-separated GPU device IDs." }, "gpu_options": { "type": "string", "nullable": true, "description": "Additional GPU options." }, "is_consistent_container_name_enabled": { "type": "boolean", "description": "Use a consistent container name across deployments." }, "custom_internal_name": { "type": "string", "nullable": true, "description": "Custom internal container name. Turns is_consistent_container_name_enabled on when that field is not sent; sending it as false together with a name returns 422." }, "custom_container_name_prefix": { "type": "string", "nullable": true, "description": "Prefix for generated container names (prefix-20260908T141530). Slugified and unique across the instance." }, "preview_url_template": { "type": "string", "description": "Preview URL template." }, "max_restart_count": { "type": "integer", "minimum": 0, "description": "Maximum container restart count before stopping." }, "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" }, "http_basic_auth_hash_algorithm": { "type": "string", "enum": [ "bcrypt", "argon2id" ], "default": "bcrypt", "description": "Hash algorithm for the HTTP Basic Authentication password. Argon2id needs the Caddy proxy, version 2.11 or newer." }, "http_basic_auth_bcrypt_cost": { "type": "integer", "minimum": 4, "maximum": 14, "default": 10, "description": "Bcrypt cost for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_memory_cost": { "type": "integer", "minimum": 8192, "maximum": 262144, "default": 65536, "description": "Argon2id memory cost in KiB for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_time_cost": { "type": "integer", "minimum": 1, "maximum": 12, "default": 4, "description": "Argon2id time cost (iterations) for the HTTP Basic Authentication password." }, "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. Ignored for the dockercompose build pack, which uses docker_compose_domains. 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" }, "403": { "description": "The token needs the deploy ability to set a manual webhook secret." }, "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", "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." }, "noindex_domains": { "type": "array", "items": { "type": "string" }, "description": "The subset of the application domains served with an X-Robots-Tag: noindex, nofollow response header, keeping them out of search engines. Entries that are not among the application domains are ignored." }, "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. Needs the deploy ability." }, "manual_webhook_secret_gitlab": { "type": "string", "description": "Manual webhook secret for Gitlab. Needs the deploy ability." }, "manual_webhook_secret_bitbucket": { "type": "string", "description": "Manual webhook secret for Bitbucket. Needs the deploy ability." }, "manual_webhook_secret_gitea": { "type": "string", "description": "Manual webhook secret for Gitea. Needs the deploy ability." }, "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." }, "dockerfile_target_build": { "type": "string", "nullable": true, "description": "The Docker build target (stage) in the Dockerfile." }, "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.coolify.io,https:\/\/app2.coolify.io\")" }, "redirect": { "type": "string", "nullable": true, "description": "Per-service www\/non-www redirect for this compose service.", "enum": [ "www", "non-www", "both" ] } }, "type": "object" } }, "watch_paths": { "type": "string", "description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns." }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "default": true, "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Redeploy to apply it." }, "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." }, "rolling_update_drain_seconds": { "type": "integer", "minimum": 0, "maximum": 300, "description": "Seconds to wait after the new container is healthy before old containers stop during a rolling update. 0 turns the wait off. Default: 5." }, "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_permanent_redirect_enabled": { "type": "boolean", "description": "Use permanent redirects (301\/308) instead of temporary (302\/307) for the HTTP to HTTPS and www redirects. Defaults to false." }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver for this application. Null uses the server setting, \"none\" uses no resolver." }, "is_container_label_readonly_enabled": { "type": "boolean", "default": true, "description": "Let Coolify manage the container labels. True regenerates custom_labels from domains, redirect, and proxy settings. False keeps custom_labels as you set them: domains, redirect, and basic auth changes then do not change the labels." }, "is_raw_compose_deployment_enabled": { "type": "boolean", "description": "Deploy the raw Docker Compose definition." }, "is_log_drain_enabled": { "type": "boolean", "description": "Enable log drain for the application." }, "is_gpu_enabled": { "type": "boolean", "description": "Enable GPU support." }, "gpu_driver": { "type": "string", "nullable": true, "description": "GPU driver name." }, "gpu_count": { "type": "string", "nullable": true, "description": "Number of GPUs to allocate." }, "gpu_device_ids": { "type": "string", "nullable": true, "description": "Comma-separated GPU device IDs." }, "gpu_options": { "type": "string", "nullable": true, "description": "Additional GPU options." }, "is_consistent_container_name_enabled": { "type": "boolean", "description": "Use a consistent container name across deployments." }, "custom_internal_name": { "type": "string", "nullable": true, "description": "Custom internal container name. Turns is_consistent_container_name_enabled on when that field is not sent; sending it as false together with a name returns 422." }, "custom_container_name_prefix": { "type": "string", "nullable": true, "description": "Prefix for generated container names (prefix-20260908T141530). Slugified and unique across the instance." }, "preview_url_template": { "type": "string", "description": "Preview URL template." }, "max_restart_count": { "type": "integer", "minimum": 0, "description": "Maximum container restart count before stopping." }, "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" }, "http_basic_auth_hash_algorithm": { "type": "string", "enum": [ "bcrypt", "argon2id" ], "default": "bcrypt", "description": "Hash algorithm for the HTTP Basic Authentication password. Argon2id needs the Caddy proxy, version 2.11 or newer." }, "http_basic_auth_bcrypt_cost": { "type": "integer", "minimum": 4, "maximum": 14, "default": 10, "description": "Bcrypt cost for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_memory_cost": { "type": "integer", "minimum": 8192, "maximum": 262144, "default": 65536, "description": "Argon2id memory cost in KiB for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_time_cost": { "type": "integer", "minimum": 1, "maximum": 12, "default": 4, "description": "Argon2id time cost (iterations) for the HTTP Basic Authentication password." }, "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. Ignored for the dockercompose build pack, which uses docker_compose_domains. 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" }, "403": { "description": "The token needs the deploy ability to set a manual webhook secret." }, "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", "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." }, "noindex_domains": { "type": "array", "items": { "type": "string" }, "description": "The subset of the application domains served with an X-Robots-Tag: noindex, nofollow response header, keeping them out of search engines. Entries that are not among the application domains are ignored." }, "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. Needs the deploy ability." }, "manual_webhook_secret_gitlab": { "type": "string", "description": "Manual webhook secret for Gitlab. Needs the deploy ability." }, "manual_webhook_secret_bitbucket": { "type": "string", "description": "Manual webhook secret for Bitbucket. Needs the deploy ability." }, "manual_webhook_secret_gitea": { "type": "string", "description": "Manual webhook secret for Gitea. Needs the deploy ability." }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "default": true, "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Redeploy to apply it." }, "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." }, "rolling_update_drain_seconds": { "type": "integer", "minimum": 0, "maximum": 300, "description": "Seconds to wait after the new container is healthy before old containers stop during a rolling update. 0 turns the wait off. Default: 5." }, "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_permanent_redirect_enabled": { "type": "boolean", "description": "Use permanent redirects (301\/308) instead of temporary (302\/307) for the HTTP to HTTPS and www redirects. Defaults to false." }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver for this application. Null uses the server setting, \"none\" uses no resolver." }, "is_container_label_readonly_enabled": { "type": "boolean", "default": true, "description": "Let Coolify manage the container labels. True regenerates custom_labels from domains, redirect, and proxy settings. False keeps custom_labels as you set them: domains, redirect, and basic auth changes then do not change the labels." }, "is_raw_compose_deployment_enabled": { "type": "boolean", "description": "Deploy the raw Docker Compose definition." }, "is_log_drain_enabled": { "type": "boolean", "description": "Enable log drain for the application." }, "is_gpu_enabled": { "type": "boolean", "description": "Enable GPU support." }, "gpu_driver": { "type": "string", "nullable": true, "description": "GPU driver name." }, "gpu_count": { "type": "string", "nullable": true, "description": "Number of GPUs to allocate." }, "gpu_device_ids": { "type": "string", "nullable": true, "description": "Comma-separated GPU device IDs." }, "gpu_options": { "type": "string", "nullable": true, "description": "Additional GPU options." }, "is_consistent_container_name_enabled": { "type": "boolean", "description": "Use a consistent container name across deployments." }, "custom_internal_name": { "type": "string", "nullable": true, "description": "Custom internal container name. Turns is_consistent_container_name_enabled on when that field is not sent; sending it as false together with a name returns 422." }, "custom_container_name_prefix": { "type": "string", "nullable": true, "description": "Prefix for generated container names (prefix-20260908T141530). Slugified and unique across the instance." }, "preview_url_template": { "type": "string", "description": "Preview URL template." }, "max_restart_count": { "type": "integer", "minimum": 0, "description": "Maximum container restart count before stopping." }, "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" }, "http_basic_auth_hash_algorithm": { "type": "string", "enum": [ "bcrypt", "argon2id" ], "default": "bcrypt", "description": "Hash algorithm for the HTTP Basic Authentication password. Argon2id needs the Caddy proxy, version 2.11 or newer." }, "http_basic_auth_bcrypt_cost": { "type": "integer", "minimum": 4, "maximum": 14, "default": 10, "description": "Bcrypt cost for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_memory_cost": { "type": "integer", "minimum": 8192, "maximum": 262144, "default": 65536, "description": "Argon2id memory cost in KiB for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_time_cost": { "type": "integer", "minimum": 1, "maximum": 12, "default": 4, "description": "Argon2id time cost (iterations) for the HTTP Basic Authentication password." }, "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. Ignored for the dockercompose build pack, which uses docker_compose_domains. 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" }, "403": { "description": "The token needs the deploy ability to set a manual webhook secret." }, "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", "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." }, "noindex_domains": { "type": "array", "items": { "type": "string" }, "description": "The subset of the application domains served with an X-Robots-Tag: noindex, nofollow response header, keeping them out of search engines. Entries that are not among the application domains are ignored." }, "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. Needs the deploy ability." }, "manual_webhook_secret_gitlab": { "type": "string", "description": "Manual webhook secret for Gitlab. Needs the deploy ability." }, "manual_webhook_secret_bitbucket": { "type": "string", "description": "Manual webhook secret for Bitbucket. Needs the deploy ability." }, "manual_webhook_secret_gitea": { "type": "string", "description": "Manual webhook secret for Gitea. Needs the deploy ability." }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "default": true, "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Redeploy to apply it." }, "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." }, "rolling_update_drain_seconds": { "type": "integer", "minimum": 0, "maximum": 300, "description": "Seconds to wait after the new container is healthy before old containers stop during a rolling update. 0 turns the wait off. Default: 5." }, "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_permanent_redirect_enabled": { "type": "boolean", "description": "Use permanent redirects (301\/308) instead of temporary (302\/307) for the HTTP to HTTPS and www redirects. Defaults to false." }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver for this application. Null uses the server setting, \"none\" uses no resolver." }, "is_container_label_readonly_enabled": { "type": "boolean", "default": true, "description": "Let Coolify manage the container labels. True regenerates custom_labels from domains, redirect, and proxy settings. False keeps custom_labels as you set them: domains, redirect, and basic auth changes then do not change the labels." }, "is_raw_compose_deployment_enabled": { "type": "boolean", "description": "Deploy the raw Docker Compose definition." }, "is_log_drain_enabled": { "type": "boolean", "description": "Enable log drain for the application." }, "is_gpu_enabled": { "type": "boolean", "description": "Enable GPU support." }, "gpu_driver": { "type": "string", "nullable": true, "description": "GPU driver name." }, "gpu_count": { "type": "string", "nullable": true, "description": "Number of GPUs to allocate." }, "gpu_device_ids": { "type": "string", "nullable": true, "description": "Comma-separated GPU device IDs." }, "gpu_options": { "type": "string", "nullable": true, "description": "Additional GPU options." }, "is_consistent_container_name_enabled": { "type": "boolean", "description": "Use a consistent container name across deployments." }, "custom_internal_name": { "type": "string", "nullable": true, "description": "Custom internal container name. Turns is_consistent_container_name_enabled on when that field is not sent; sending it as false together with a name returns 422." }, "custom_container_name_prefix": { "type": "string", "nullable": true, "description": "Prefix for generated container names (prefix-20260908T141530). Slugified and unique across the instance." }, "preview_url_template": { "type": "string", "description": "Preview URL template." }, "max_restart_count": { "type": "integer", "minimum": 0, "description": "Maximum container restart count before stopping." }, "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" }, "http_basic_auth_hash_algorithm": { "type": "string", "enum": [ "bcrypt", "argon2id" ], "default": "bcrypt", "description": "Hash algorithm for the HTTP Basic Authentication password. Argon2id needs the Caddy proxy, version 2.11 or newer." }, "http_basic_auth_bcrypt_cost": { "type": "integer", "minimum": 4, "maximum": 14, "default": 10, "description": "Bcrypt cost for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_memory_cost": { "type": "integer", "minimum": 8192, "maximum": 262144, "default": 65536, "description": "Argon2id memory cost in KiB for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_time_cost": { "type": "integer", "minimum": 1, "maximum": 12, "default": 4, "description": "Argon2id time cost (iterations) for the HTTP Basic Authentication password." }, "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. Ignored for the dockercompose build pack, which uses docker_compose_domains. 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" }, "403": { "description": "The token needs the deploy ability to set a manual webhook secret." }, "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. Needs a token with the write and deploy permissions.", "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 when the server disk usage is at or above its cleanup threshold. Skipped when a cleanup ran on the server in the last hour.", "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" }, "403": { "description": "The token needs the write and deploy permissions." } }, "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": { "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." }, "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." }, "noindex_domains": { "type": "array", "items": { "type": "string" }, "description": "The subset of the application domains served with an X-Robots-Tag: noindex, nofollow response header, keeping them out of search engines. Entries that are not among the application domains are ignored." }, "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. Needs the deploy ability." }, "manual_webhook_secret_gitlab": { "type": "string", "description": "Manual webhook secret for Gitlab. Needs the deploy ability." }, "manual_webhook_secret_bitbucket": { "type": "string", "description": "Manual webhook secret for Bitbucket. Needs the deploy ability." }, "manual_webhook_secret_gitea": { "type": "string", "description": "Manual webhook secret for Gitea. Needs the deploy ability." }, "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." }, "dockerfile_target_build": { "type": "string", "nullable": true, "description": "The Docker build target (stage) in the Dockerfile." }, "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.coolify.io,https:\/\/app2.coolify.io\")" }, "redirect": { "type": "string", "nullable": true, "description": "Per-service www\/non-www redirect for this compose service.", "enum": [ "www", "non-www", "both" ] } }, "type": "object" } }, "watch_paths": { "type": "string", "description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns." }, "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." }, "http_basic_auth_hash_algorithm": { "type": "string", "enum": [ "bcrypt", "argon2id" ], "description": "Hash algorithm for the HTTP Basic Authentication password. Argon2id needs the Caddy proxy, version 2.11 or newer." }, "http_basic_auth_bcrypt_cost": { "type": "integer", "minimum": 4, "maximum": 14, "description": "Bcrypt cost for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_memory_cost": { "type": "integer", "minimum": 8192, "maximum": 262144, "description": "Argon2id memory cost in KiB for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_time_cost": { "type": "integer", "minimum": 1, "maximum": 12, "description": "Argon2id time cost (iterations) for the HTTP Basic Authentication password." }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "default": true, "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Redeploy to apply it." }, "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." }, "rolling_update_drain_seconds": { "type": "integer", "minimum": 0, "maximum": 300, "description": "Seconds to wait after the new container is healthy before old containers stop during a rolling update. 0 turns the wait off. Default: 5." }, "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_permanent_redirect_enabled": { "type": "boolean", "description": "Use permanent redirects (301\/308) instead of temporary (302\/307) for the HTTP to HTTPS and www redirects. Defaults to false." }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver for this application. Null uses the server setting, \"none\" uses no resolver." }, "is_container_label_readonly_enabled": { "type": "boolean", "default": true, "description": "Let Coolify manage the container labels. True regenerates custom_labels from domains, redirect, and proxy settings. False keeps custom_labels as you set them: domains, redirect, and basic auth changes then do not change the labels." }, "is_raw_compose_deployment_enabled": { "type": "boolean", "description": "Deploy the raw Docker Compose definition." }, "is_log_drain_enabled": { "type": "boolean", "description": "Enable log drain for the application." }, "is_gpu_enabled": { "type": "boolean", "description": "Enable GPU support." }, "gpu_driver": { "type": "string", "nullable": true, "description": "GPU driver name." }, "gpu_count": { "type": "string", "nullable": true, "description": "Number of GPUs to allocate." }, "gpu_device_ids": { "type": "string", "nullable": true, "description": "Comma-separated GPU device IDs." }, "gpu_options": { "type": "string", "nullable": true, "description": "Additional GPU options." }, "is_consistent_container_name_enabled": { "type": "boolean", "description": "Use a consistent container name across deployments." }, "custom_internal_name": { "type": "string", "nullable": true, "description": "Custom internal container name. Turns is_consistent_container_name_enabled on when that field is not sent; sending it as false together with a name returns 422." }, "custom_container_name_prefix": { "type": "string", "nullable": true, "description": "Prefix for generated container names (prefix-20260908T141530). Slugified and unique across the instance." }, "preview_url_template": { "type": "string", "description": "Preview URL template." }, "max_restart_count": { "type": "integer", "minimum": 0, "description": "Maximum container restart count before stopping." }, "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" }, "403": { "description": "The token needs the deploy ability to set a manual webhook secret." }, "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. Requires the `read:sensitive` or `root` token ability.", "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. Use `all` to return all logs. `-1` remains available as a compatibility alias.", "required": false, "schema": { "oneOf": [ { "type": "integer", "format": "int32", "default": 100, "maximum": 10000, "minimum": -1 }, { "type": "string", "enum": [ "all" ] } ] } }, { "name": "show_timestamps", "in": "query", "description": "Show timestamps in the logs.", "required": false, "schema": { "type": "boolean", "default": false } }, { "name": "service_name", "in": "query", "description": "Return logs only from the container of the Docker Compose service with this name. Returns 404 when no container matches. Stopped containers are included.", "required": false, "schema": { "type": "string" } } ], "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}\/previews\/{pull_request_id}\/logs": { "get": { "tags": [ "Applications" ], "summary": "Get preview application logs.", "description": "Get runtime container logs for a preview deployment by application UUID and pull request ID. Requires the `read:sensitive` or `root` token ability.", "operationId": "get-preview-application-logs-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 deployment.", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "lines", "in": "query", "description": "Number of lines to show from the end of the logs. Use `all` to return all logs. `-1` remains available as a compatibility alias.", "required": false, "schema": { "oneOf": [ { "type": "integer", "format": "int32", "default": 100, "maximum": 10000, "minimum": -1 }, { "type": "string", "enum": [ "all" ] } ] } }, { "name": "show_timestamps", "in": "query", "description": "Show timestamps in the logs.", "required": false, "schema": { "type": "boolean", "default": false } }, { "name": "service_name", "in": "query", "description": "Return logs only from the container of the Docker Compose service with this name. Returns 404 when no container matches. Stopped containers are included.", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Preview runtime logs.", "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" }, "422": { "$ref": "#\/components\/responses\/422" } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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": "Run docker cleanup when the server disk usage is at or above its cleanup threshold. Skipped when a cleanup ran on the server in the last hour.", "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 \u2014 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}\/migrate": { "post": { "tags": [ "Applications" ], "summary": "Migrate to Server", "description": "Migrate an application to another destination\/server owned by the authenticated team. Stops the application, optionally transfers persistent volume data when both servers are managed by Coolify, and updates database records. Redeploy after migration completes.", "operationId": "migrate-application-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "destination_uuid" ], "properties": { "destination_uuid": { "description": "UUID of the target destination.", "type": "string" }, "migrate_volumes": { "description": "Whether to transfer persistent volume data when migrating across servers.", "type": "boolean", "default": true } }, "type": "object" } } } }, "responses": { "200": { "description": "Application migration started or completed." }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "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." }, "content": { "type": "string", "nullable": true, "description": "File content (file only, optional). Needs the deploy ability when set." }, "is_directory": { "type": "boolean", "description": "Whether this is a directory mount (file only, default false)." }, "fs_path": { "type": "string", "description": "Host path. Required for directory mounts and host file mounts. Optional for file mounts with content (default: inside the resource directory). An absolute path can be anywhere on the host; a relative path is inside the resource directory. A directory or file mount outside the resource directory needs a token with the deploy permission. Coolify never deletes a path outside the resource directory." } }, "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" }, "403": { "description": "The token needs the deploy permission for a mount outside the resource directory or for a file storage with content." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Applications" ], "summary": "Update Storage", "description": "Update a persistent storage or file storage by application UUID. Changed file content is saved right away and written to the server in the background, so a failed write does not change the response.", "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)." }, "content": { "type": "string", "nullable": true, "description": "The file content (file only, not allowed for read-only storages). Changing the content needs the deploy permission." } }, "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" }, "403": { "description": "The token needs the deploy permission to change the content of a file outside the resource directory." }, "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}\/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": [] } ] } }, "\/applications\/{uuid}\/clone": { "post": { "tags": [ "Applications" ], "summary": "Clone", "description": "Clone an application to a destination owned by the authenticated team.", "operationId": "clone-application-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "destination_uuid" ], "properties": { "destination_uuid": { "description": "UUID of the destination to clone into.", "type": "string" }, "name": { "description": "Optional name for the cloned application.", "type": [ "string", "null" ] }, "clone_volumes": { "description": "Whether to clone volume data. Needs the deploy ability.", "type": "boolean", "default": false } }, "type": "object" } } } }, "responses": { "201": { "description": "Application cloned.", "content": { "application\/json": { "schema": { "properties": { "uuid": { "type": "string" }, "message": { "type": "string", "example": "Application cloned." } }, "type": "object" } } } }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy ability to clone volume data." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/applications\/{uuid}\/rollback-images": { "get": { "tags": [ "Applications" ], "summary": "List Rollback Images", "description": "List available Docker images for rolling back an application: images on the server (`local`) and, when a Docker registry image name is set, images of recent successful deployments in the registry (`registry`). Returns an empty list when the server is unavailable or remote inspection is not possible.", "operationId": "list-application-rollback-images", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Rollback images.", "content": { "application\/json": { "schema": { "properties": { "current": { "type": [ "string", "null" ] }, "images": { "type": "array", "items": { "properties": { "tag": { "type": "string" }, "created_at": { "type": "string" }, "is_current": { "type": "boolean" }, "source": { "type": "string", "enum": [ "local", "registry" ] } }, "type": "object" } } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] } }, "\/applications\/{uuid}\/rollback": { "post": { "tags": [ "Applications" ], "summary": "Rollback", "description": "Queue a rollback deployment for an application to a previous image commit\/tag.", "operationId": "rollback-application-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "commit" ], "properties": { "commit": { "description": "Image tag \/ commit to roll back to.", "type": "string" } }, "type": "object" } } } }, "responses": { "200": { "description": "Rollback deployment queued.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string" }, "deployment_uuid": { "type": "string" } }, "type": "object" } } } }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/applications\/{uuid}\/destinations": { "get": { "tags": [ "Applications" ], "summary": "List Destinations", "description": "List primary and additional destinations for a standalone application.", "operationId": "list-application-destinations", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Application destinations." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Applications" ], "summary": "Add Destination", "description": "Attach an additional standalone Docker destination to an application.", "operationId": "add-application-destination", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "destination_uuid" ], "properties": { "destination_uuid": { "type": "string" } }, "type": "object" } } } }, "responses": { "201": { "description": "Destination attached." }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/applications\/{uuid}\/destinations\/{destination_uuid}": { "delete": { "tags": [ "Applications" ], "summary": "Remove Destination", "description": "Detach an additional destination from an application.", "operationId": "remove-application-destination", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the application.", "required": true, "schema": { "type": "string" } }, { "name": "destination_uuid", "in": "path", "description": "UUID of the destination.", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Destination detached." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/audit-events": { "get": { "tags": [ "Audit Events" ], "summary": "List", "description": "List audit events of the team. Only team admins and owners can view audit events. Actor e-mail, token, metadata, changes, IP address, and user agent are returned only for tokens with the read:sensitive or root permission.", "operationId": "list-audit-events", "parameters": [ { "name": "per_page", "in": "query", "description": "Items per page.", "required": false, "schema": { "type": "integer", "default": 25, "maximum": 100, "minimum": 1 } }, { "name": "page", "in": "query", "description": "Page number.", "required": false, "schema": { "type": "integer", "default": 1, "minimum": 1 } }, { "name": "search", "in": "query", "description": "Search text.", "required": false, "schema": { "type": "string", "maxLength": 255 } }, { "name": "action", "in": "query", "description": "Filter by action. Use all for every action.", "required": false, "schema": { "type": "string", "maxLength": 255 } }, { "name": "source", "in": "query", "description": "Filter by source.", "required": false, "schema": { "type": "string", "enum": [ "all", "ui", "api", "mcp", "webhook", "system", "scheduler" ] } } ], "responses": { "200": { "description": "A page of audit events, newest first.", "content": { "application\/json": { "schema": { "properties": { "current_page": { "type": "integer" }, "data": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "team_id": { "type": "integer", "nullable": true }, "event": { "type": "string" }, "source": { "type": "string" }, "action": { "type": "string" }, "level": { "type": "string" }, "actor_type": { "type": "string", "nullable": true }, "actor_id": { "type": "integer", "nullable": true }, "actor_name": { "type": "string", "nullable": true }, "resource_type": { "type": "string", "nullable": true }, "resource_uuid": { "type": "string", "nullable": true }, "resource_name": { "type": "string", "nullable": true }, "description": { "type": "string", "nullable": true }, "created_at": { "type": "string", "format": "date-time" } } } }, "per_page": { "type": "integer" }, "last_page": { "type": "integer" }, "total": { "type": "integer" } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Only team admins and owners can view audit logs." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/cloud-init-scripts": { "get": { "tags": [ "Cloud-init Scripts" ], "summary": "List Cloud-init Scripts", "description": "List all cloud-init scripts for the authenticated team.", "operationId": "list-cloud-init-scripts", "responses": { "200": { "description": "Cloud-init scripts for the team." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Forbidden." } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Cloud-init Scripts" ], "summary": "Create Cloud-init Script", "description": "Create a new cloud-init script for the authenticated team.", "operationId": "create-cloud-init-script", "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "name", "script" ], "properties": { "name": { "type": "string" }, "script": { "description": "Bash script (#!) or cloud-config YAML.", "type": "string" } }, "type": "object" } } } }, "responses": { "201": { "description": "Cloud-init script created." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/cloud-init-scripts\/{uuid}": { "get": { "tags": [ "Cloud-init Scripts" ], "summary": "Get Cloud-init Script", "description": "Get a cloud-init script by UUID.", "operationId": "get-cloud-init-script-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Cloud-init script." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Forbidden." }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "delete": { "tags": [ "Cloud-init Scripts" ], "summary": "Delete Cloud-init Script", "description": "Delete a cloud-init script by UUID.", "operationId": "delete-cloud-init-script-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Cloud-init script deleted." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Forbidden." }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Cloud-init Scripts" ], "summary": "Update Cloud-init Script", "description": "Update a cloud-init script by UUID.", "operationId": "update-cloud-init-script-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "name": { "type": "string" }, "script": { "type": "string" } }, "type": "object" } } } }, "responses": { "200": { "description": "Cloud-init script updated." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Forbidden." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "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", "hostinger" ] }, "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", "hostinger" ], "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\/{uuid}\/imports\/uploads": { "post": { "tags": [ "Databases" ], "summary": "Upload database import", "operationId": "upload-database-import", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the database.", "required": true, "schema": { "type": "string" } } ], "responses": { "201": { "description": "Upload completed" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/databases\/{uuid}\/imports": { "post": { "tags": [ "Databases" ], "summary": "Import database backup", "description": "Restore a backup into the database. Every import source requires the deploy ability.", "operationId": "create-database-import", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the database.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/DatabaseImportRequest" } } } }, "responses": { "202": { "description": "Import queued" }, "403": { "description": "The token needs the deploy ability." }, "409": { "description": "Another start, restart or import of this database is already in progress." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/databases\/{uuid}\/imports\/{activity_id}": { "get": { "tags": [ "Databases" ], "summary": "Get database import status", "operationId": "get-database-import", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the database.", "required": true, "schema": { "type": "string" } }, { "name": "activity_id", "in": "path", "description": "Import activity ID.", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Import status", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/DatabaseImportStatus" } } } }, "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": "array", "items": { "$ref": "#\/components\/schemas\/Database" } } } } }, "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. Each backup includes s3_storage_uuid (primary S3 destination) and s3_storage_uuids (every S3 destination, primary first).", "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 }, "disable_local_backup": { "type": "boolean", "description": "Delete the local backup file after the upload to S3. Only allowed when save_s3 is true.", "default": false }, "s3_storage_uuid": { "type": "string", "description": "Primary S3 storage UUID. Sent without s3_storage_uuids, it selects this storage as the only destination. Either field is required if save_s3 is true." }, "s3_storage_uuids": { "type": "array", "items": { "type": "string" }, "description": "UUIDs of every S3 storage the backup is uploaded to. Replaces the current destinations. When s3_storage_uuid is also sent, it must be in this list and becomes the primary destination; otherwise the first entry is the primary destination." }, "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. Needs a token with the deploy permission." }, "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 }, "missing_backup_notification_days": { "type": "integer", "description": "Alert after this many days without an execution; 0 disables alerts", "minimum": 0, "maximum": 365, "default": 0 } }, "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" }, "403": { "description": "The token needs the deploy permission to use backup_now." }, "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 database by UUID", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/Database" } } } }, "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. Needs a token with the write and deploy permissions.", "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 when the server disk usage is at or above its cleanup threshold. Skipped when a cleanup ran on the server in the last hour.", "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" }, "403": { "description": "The token needs the write and deploy permissions." } }, "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? Changing it starts or stops the database proxy, so it needs a token with the deploy permission." }, "public_port": { "type": "integer", "description": "Public port of the database (1024-65535)" }, "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": "Restart the database after the update. Requires the deploy ability." }, "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" }, "sqlite_databases": { "type": "string", "description": "Comma-separated SQLite database file names" }, "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 }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Redact all environment variable values in logs. When false, only locked (shown once) values, database passwords, and remote secrets are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Restart the database to apply it." }, "is_log_drain_enabled": { "type": "boolean", "description": "Send the database logs to the log drain of the server. Log drain must be enabled on the server. Restart the database to apply it." } }, "type": "object" } } } }, "responses": { "200": { "description": "Database updated" }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "The token needs the deploy permission to change is_public or to use instant_deploy." }, "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" }, "disable_local_backup": { "type": "boolean", "description": "Delete the local backup file after the upload to S3. Only allowed when save_s3 is true. Turning save_s3 off also turns this off." }, "s3_storage_uuid": { "type": "string", "description": "Primary S3 storage UUID. Sent without s3_storage_uuids, it selects this storage as the only destination; when it is already a destination, it becomes the primary destination and the other destinations stay." }, "s3_storage_uuids": { "type": "array", "items": { "type": "string" }, "description": "UUIDs of every S3 storage the backup is uploaded to. Replaces the current destinations. When s3_storage_uuid is also sent, it must be in this list and becomes the primary destination; otherwise the first entry is the primary destination." }, "backup_now": { "type": "boolean", "description": "Whether to take a backup now or not. Needs a token with the deploy permission." }, "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 }, "missing_backup_notification_days": { "type": "integer", "description": "Alert after this many days without an execution; 0 disables alerts", "minimum": 0, "maximum": 365 } }, "type": "object" } } } }, "responses": { "200": { "description": "Database backup configuration updated" }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "The token needs the deploy permission to use backup_now." }, "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" ], "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" ], "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" ], "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" ], "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" ], "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" ], "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" ], "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" ], "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\/sqlite": { "post": { "tags": [ "Databases" ], "summary": "Create (SQLite)", "description": "Create a new SQLite database.", "operationId": "create-database-sqlite", "requestBody": { "description": "Database data", "required": true, "content": { "application\/json": { "schema": { "required": [ "server_uuid", "project_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" }, "sqlite_databases": { "type": "string", "description": "Comma-separated SQLite database file names" }, "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" }, "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. Requires the `read:sensitive` or `root` token ability.", "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. Use `all` to return all logs. `-1` remains available as a compatibility alias.", "required": false, "schema": { "oneOf": [ { "type": "integer", "format": "int32", "default": 100, "maximum": 10000, "minimum": -1 }, { "type": "string", "enum": [ "all" ] } ] } }, { "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. The execution `message` is only returned (redacted) to tokens with the `read:sensitive` or `root` ability; otherwise it is `null`.", "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": { "description": "Redacted execution output. Null unless the token has the `read:sensitive` or `root` ability.", "type": [ "string", "null" ] }, "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 \u2014 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}\/migrate": { "post": { "tags": [ "Databases" ], "summary": "Migrate to Server", "description": "Migrate a database to another destination\/server owned by the authenticated team. Stops the database, optionally transfers persistent volume data when both servers are managed by Coolify, and updates database records. Redeploy after migration completes.", "operationId": "migrate-database-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the database.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "destination_uuid" ], "properties": { "destination_uuid": { "description": "UUID of the target destination.", "type": "string" }, "migrate_volumes": { "description": "Whether to transfer persistent volume data when migrating across servers.", "type": "boolean", "default": true } }, "type": "object" } } } }, "responses": { "200": { "description": "Database migration started or completed." }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "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" }, "409": { "description": "Another start, restart or import of this database is already in progress." }, "422": { "description": "The database cannot start yet, for example because a CA certificate is missing." } }, "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": "Run docker cleanup when the server disk usage is at or above its cleanup threshold. Skipped when a cleanup ran on the server in the last hour.", "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" }, "409": { "description": "Another start, restart or import of this database is already in progress." }, "422": { "description": "The database cannot start yet, for example because a CA certificate is missing." } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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." }, "content": { "type": "string", "nullable": true, "description": "File content (file only, optional). Needs the deploy ability when set." }, "is_directory": { "type": "boolean", "description": "Whether this is a directory mount (file only, default false)." }, "fs_path": { "type": "string", "description": "Host path. Required for directory mounts and host file mounts. Optional for file mounts with content (default: inside the resource directory). An absolute path can be anywhere on the host; a relative path is inside the resource directory. A directory or file mount outside the resource directory needs a token with the deploy permission. Coolify never deletes a path outside the resource directory." } }, "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" }, "403": { "description": "The token needs the deploy permission for a mount outside the resource directory or for a file storage with content." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Databases" ], "summary": "Update Storage", "description": "Update a persistent storage or file storage by database UUID. Changed file content is saved right away and written to the server in the background, so a failed write does not change the response.", "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)." }, "content": { "type": "string", "nullable": true, "description": "The file content (file only, not allowed for read-only storages). Changing the content needs the deploy permission." } }, "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" }, "403": { "description": "The token needs the deploy permission to change the content of a file outside the resource directory." }, "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": [] } ] } }, "\/databases\/{uuid}\/clone": { "post": { "tags": [ "Databases" ], "summary": "Clone", "description": "Clone a database to a destination owned by the authenticated team.", "operationId": "clone-database-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the database.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "destination_uuid" ], "properties": { "destination_uuid": { "type": "string" }, "name": { "type": [ "string", "null" ] }, "clone_volumes": { "description": "Whether to clone volume data. Needs the deploy ability.", "type": "boolean", "default": false } }, "type": "object" } } } }, "responses": { "201": { "description": "Database cloned." }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy ability to clone volume data." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "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", "maximum": 2147483647 } }, { "name": "pull_request_id", "in": "query", "description": "Preview deployment identifier. Alias of pr.", "schema": { "type": "integer", "maximum": 2147483647 } }, { "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. The network must be new: Docker's built-in networks (bridge, host, none) and networks that already exist on a standalone server are rejected, because Coolify connects the proxy to the destination network.", "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": { "description": "Name of a new Docker network. Must not be bridge, host, none, or a network that already exists on the server.", "type": "string", "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]*$", "maxLength": 255 }, "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": { "description": "Validation failed, the network is reserved or already exists on the server, or the server could not be checked." } }, "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": [] } ] }, "patch": { "tags": [ "Destinations" ], "summary": "Update destination", "description": "Update a Docker network destination name. Network cannot be changed via the API.", "operationId": "update-destination-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "Destination UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "name": { "type": "string", "maxLength": 255 } }, "type": "object" } } } }, "responses": { "200": { "description": "Destination updated.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/Destination" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "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", "description": "Create a DigitalOcean droplet and link it as a Coolify server. A cloud-init script or extra SSH key IDs need a token with the deploy permission.", "operationId": "create-digitalocean-server", "responses": { "201": { "description": "DigitalOcean droplet created and linked to a Coolify server." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy permission for a cloud-init script or extra SSH keys." }, "422": { "description": "Validation failed." }, "429": { "description": "DigitalOcean rate limit exceeded." }, "502": { "$ref": "#\/components\/responses\/502" } }, "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": [] } ] } }, "\/gitlab-apps": { "get": { "tags": [ "GitLab Apps" ], "summary": "List", "description": "List all GitLab apps for the current team (and system-wide sources).", "operationId": "list-gitlab-apps", "responses": { "200": { "description": "List of GitLab apps.", "content": { "application\/json": { "schema": { "type": "array", "items": { "properties": { "id": { "type": "integer" }, "uuid": { "type": "string" }, "name": { "type": "string" }, "api_url": { "type": "string" }, "html_url": { "type": "string" }, "custom_user": { "type": "string" }, "custom_port": { "type": "integer" }, "client_id": { "type": "string", "nullable": true }, "group_name": { "type": "string", "nullable": true }, "redirect_uri": { "type": "string", "nullable": true }, "is_system_wide": { "type": "boolean" }, "is_public": { "type": "boolean" }, "team_id": { "type": "integer" } }, "type": "object" } } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "GitLab Apps" ], "summary": "Create GitLab App", "description": "Create a new GitLab app (OAuth source). Credentials may be supplied later via the UI or update endpoint.", "operationId": "create-gitlab-app", "requestBody": { "description": "GitLab app creation payload.", "required": true, "content": { "application\/json": { "schema": { "required": [ "name", "html_url" ], "properties": { "name": { "type": "string", "description": "Name of the GitLab app." }, "html_url": { "type": "string", "description": "GitLab instance URL (e.g., https:\/\/gitlab.com)." }, "api_url": { "type": "string", "description": "GitLab API URL (defaults to {html_url}\/api\/v4)." }, "custom_user": { "type": "string", "description": "Custom user for SSH access (default: git)." }, "custom_port": { "type": "integer", "description": "Custom port for SSH access (default: 22)." }, "group_name": { "type": "string", "nullable": true, "description": "Optional comma-separated group names to filter repositories." }, "client_id": { "type": "string", "nullable": true, "description": "GitLab OAuth Application ID." }, "client_secret": { "type": "string", "nullable": true, "description": "GitLab OAuth Application Secret." }, "webhook_token": { "type": "string", "nullable": true, "description": "Webhook secret token (auto-generated when omitted)." }, "redirect_uri": { "type": "string", "nullable": true, "description": "OAuth redirect URI registered in GitLab." }, "is_system_wide": { "type": "boolean", "description": "Is this app system-wide (non-cloud instances only)." } }, "type": "object" } } } }, "responses": { "201": { "description": "GitLab app created successfully.", "content": { "application\/json": { "schema": { "properties": { "id": { "type": "integer" }, "uuid": { "type": "string" }, "name": { "type": "string" }, "api_url": { "type": "string" }, "html_url": { "type": "string" }, "custom_user": { "type": "string" }, "custom_port": { "type": "integer" }, "client_id": { "type": "string", "nullable": true }, "group_name": { "type": "string", "nullable": true }, "redirect_uri": { "type": "string", "nullable": true }, "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": [] } ] } }, "\/gitlab-apps\/{gitlab_app_id}": { "delete": { "tags": [ "GitLab Apps" ], "summary": "Delete GitLab App", "description": "Delete a GitLab app if it is not being used by any applications.", "operationId": "deleteGitlabApp", "parameters": [ { "name": "gitlab_app_id", "in": "path", "description": "GitLab App ID", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "GitLab app deleted successfully", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "GitLab app deleted successfully" } }, "type": "object" } } } }, "401": { "description": "Unauthorized" }, "404": { "description": "GitLab app not found" }, "409": { "description": "Conflict - GitLab app is in use", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "This GitLab app is being used by 5 application(s). Please delete all applications first." } }, "type": "object" } } } } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "GitLab Apps" ], "summary": "Update GitLab App", "description": "Update an existing GitLab app.", "operationId": "updateGitlabApp", "parameters": [ { "name": "gitlab_app_id", "in": "path", "description": "GitLab App ID", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "name": { "type": "string", "description": "GitLab App name" }, "html_url": { "type": "string", "description": "GitLab HTML URL" }, "api_url": { "type": "string", "description": "GitLab API URL" }, "custom_user": { "type": "string", "description": "Custom user for SSH" }, "custom_port": { "type": "integer", "description": "Custom port for SSH" }, "group_name": { "type": "string", "nullable": true, "description": "Optional group filter" }, "client_id": { "type": "string", "nullable": true, "description": "OAuth Application ID" }, "client_secret": { "type": "string", "nullable": true, "description": "OAuth Application Secret" }, "webhook_token": { "type": "string", "nullable": true, "description": "Webhook secret token" }, "redirect_uri": { "type": "string", "nullable": true, "description": "OAuth redirect URI" }, "is_system_wide": { "type": "boolean", "description": "Is system wide (non-cloud instances only)" } }, "type": "object" } } } }, "responses": { "200": { "description": "GitLab app updated successfully", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "GitLab app updated successfully" }, "data": { "type": "object", "description": "Updated GitLab app data" } }, "type": "object" } } } }, "401": { "description": "Unauthorized" }, "404": { "description": "GitLab 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" }, "502": { "$ref": "#\/components\/responses\/502" } }, "security": [ { "bearerAuth": [] } ] } }, "\/hetzner\/server-types": { "get": { "tags": [ "Hetzner" ], "summary": "Get Hetzner Server Types", "description": "Get the Hetzner server types (instance sizes) that can be ordered now. Each type lists only the locations where it is in stock and not deprecated.", "operationId": "get-hetzner-server-types", "parameters": [ { "name": "location", "in": "query", "description": "Return only the server types that can be ordered in this location, for example nbg1.", "required": false, "schema": { "type": "string" } }, { "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" }, "502": { "$ref": "#\/components\/responses\/502" } }, "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" }, "502": { "$ref": "#\/components\/responses\/502" } }, "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" }, "502": { "$ref": "#\/components\/responses\/502" } }, "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" }, "502": { "$ref": "#\/components\/responses\/502" } }, "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" }, "502": { "$ref": "#\/components\/responses\/502" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/hetzner": { "post": { "tags": [ "Hetzner" ], "summary": "Create Hetzner Server", "description": "Create a new server on Hetzner and register it in Coolify. A cloud-init script or extra SSH key IDs need a token with the deploy permission.", "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. Needs a token with the deploy permission." }, "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). Needs a token with the deploy permission." }, "instant_validate": { "type": "boolean", "example": false, "description": "Validate the server and install Docker when it is running. Defaults to true for tokens with the deploy permission, and needs that permission." } }, "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" }, "403": { "description": "The token needs the deploy permission for a cloud-init script or extra SSH keys." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" }, "429": { "$ref": "#\/components\/responses\/429" }, "502": { "$ref": "#\/components\/responses\/502" } }, "security": [ { "bearerAuth": [] } ] } }, "\/hostinger\/data-centers": { "get": { "tags": [ "Hostinger" ], "summary": "Get Hostinger VPS data centers", "operationId": "get-hostinger-data-centers", "responses": { "200": { "description": "List of Hostinger VPS data centers." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Hostinger denied access to this resource for the cloud provider token." }, "422": { "description": "Validation failed." }, "429": { "description": "Hostinger rate limit exceeded." } }, "security": [ { "bearerAuth": [] } ] } }, "\/hostinger\/catalog": { "get": { "tags": [ "Hostinger" ], "summary": "Get Hostinger VPS plans and prices", "operationId": "get-hostinger-catalog", "responses": { "200": { "description": "List of Hostinger VPS plans and prices." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Hostinger denied access to this resource for the cloud provider token." }, "422": { "description": "Validation failed." }, "429": { "description": "Hostinger rate limit exceeded." } }, "security": [ { "bearerAuth": [] } ] } }, "\/hostinger\/templates": { "get": { "tags": [ "Hostinger" ], "summary": "Get Hostinger VPS operating system templates", "operationId": "get-hostinger-templates", "responses": { "200": { "description": "List of Hostinger VPS templates." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Hostinger denied access to this resource for the cloud provider token." }, "422": { "description": "Validation failed." }, "429": { "description": "Hostinger rate limit exceeded." } }, "security": [ { "bearerAuth": [] } ] } }, "\/hostinger\/ssh-keys": { "get": { "tags": [ "Hostinger" ], "summary": "Get Hostinger account SSH keys", "operationId": "get-hostinger-ssh-keys", "responses": { "200": { "description": "List of Hostinger account SSH keys." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Hostinger denied access to this resource for the cloud provider token." }, "422": { "description": "Validation failed." }, "429": { "description": "Hostinger rate limit exceeded." } }, "security": [ { "bearerAuth": [] } ] } }, "\/hostinger\/post-install-scripts": { "get": { "tags": [ "Hostinger" ], "summary": "Get Hostinger post-install scripts", "operationId": "get-hostinger-post-install-scripts", "responses": { "200": { "description": "List of Hostinger post-install scripts." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Hostinger denied access to this resource for the cloud provider token." }, "422": { "description": "Validation failed." }, "429": { "description": "Hostinger rate limit exceeded." } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/hostinger": { "post": { "tags": [ "Hostinger" ], "summary": "Purchase a Hostinger VPS and create a linked server", "operationId": "create-hostinger-server", "responses": { "201": { "description": "Hostinger VPS purchased and linked to a Coolify server." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy permission for a post-install script or extra SSH keys." }, "422": { "description": "Validation failed." }, "429": { "description": "Hostinger rate limit exceeded." } }, "security": [ { "bearerAuth": [] } ] } }, "\/settings\/email": { "get": { "tags": [ "Settings" ], "summary": "Get instance email settings", "description": "Get instance-wide SMTP and Resend settings. Requires a root-team token belonging to a root-team admin or owner. Sensitive fields require the `read:sensitive` or `root` token ability.", "operationId": "get-instance-email-settings", "responses": { "200": { "description": "Instance email settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Forbidden." } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Settings" ], "summary": "Update instance email settings", "description": "Update instance-wide SMTP and Resend settings. Requires `write:sensitive` and a root-team token belonging to a root-team admin or owner.", "operationId": "update-instance-email-settings", "responses": { "200": { "description": "Updated instance email settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/security\/integration-tokens": { "post": { "tags": [ "Secret Managers" ], "summary": "Create Secret Manager Token", "description": "Create and validate a Doppler, Infisical, or Vault integration token.", "operationId": "create-secret-manager-integration-token", "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "provider", "name", "token" ], "properties": { "provider": { "type": "string", "enum": [ "doppler", "infisical", "vault" ] }, "name": { "type": "string" }, "token": { "type": "string" }, "metadata": { "type": "object" } }, "type": "object" } } } }, "responses": { "201": { "description": "Integration token created." }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/notifications\/email": { "get": { "tags": [ "Notifications" ], "summary": "Get email notification settings", "description": "Get the current team email notification settings, including `smtp_ehlo_domain`, the hostname sent with SMTP EHLO. Encrypted secrets are only returned when the token has `read:sensitive` (or `root`) and the user is a team admin\/owner.", "operationId": "get-current-team-email-notifications", "responses": { "200": { "description": "Email notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Notifications" ], "summary": "Update email notification settings", "description": "Update the current team email notification settings. Set `smtp_ehlo_domain` to a valid hostname to control the SMTP EHLO domain, or `null` to use the system default.", "operationId": "update-current-team-email-notifications", "responses": { "200": { "description": "Updated email notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/notifications\/discord": { "get": { "tags": [ "Notifications" ], "summary": "Get Discord notification settings", "description": "Get the current team Discord notification settings. Encrypted secrets are only returned when the token has `read:sensitive` (or `root`) and the user is a team admin\/owner.", "operationId": "get-current-team-discord-notifications", "responses": { "200": { "description": "Discord notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Notifications" ], "summary": "Update Discord notification settings", "description": "Update the current team Discord notification settings.", "operationId": "update-current-team-discord-notifications", "responses": { "200": { "description": "Updated Discord notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/notifications\/slack": { "get": { "tags": [ "Notifications" ], "summary": "Get Slack notification settings", "description": "Get the current team Slack notification settings. Encrypted secrets are only returned when the token has `read:sensitive` (or `root`) and the user is a team admin\/owner.", "operationId": "get-current-team-slack-notifications", "responses": { "200": { "description": "Slack notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Notifications" ], "summary": "Update Slack notification settings", "description": "Update the current team Slack notification settings.", "operationId": "update-current-team-slack-notifications", "responses": { "200": { "description": "Updated Slack notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/notifications\/telegram": { "get": { "tags": [ "Notifications" ], "summary": "Get Telegram notification settings", "description": "Get the current team Telegram notification settings. Encrypted secrets are only returned when the token has `read:sensitive` (or `root`) and the user is a team admin\/owner.", "operationId": "get-current-team-telegram-notifications", "responses": { "200": { "description": "Telegram notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Notifications" ], "summary": "Update Telegram notification settings", "description": "Update the current team Telegram notification settings.", "operationId": "update-current-team-telegram-notifications", "responses": { "200": { "description": "Updated Telegram notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/notifications\/pushover": { "get": { "tags": [ "Notifications" ], "summary": "Get Pushover notification settings", "description": "Get the current team Pushover notification settings. Encrypted secrets are only returned when the token has `read:sensitive` (or `root`) and the user is a team admin\/owner.", "operationId": "get-current-team-pushover-notifications", "responses": { "200": { "description": "Pushover notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Notifications" ], "summary": "Update Pushover notification settings", "description": "Update the current team Pushover notification settings.", "operationId": "update-current-team-pushover-notifications", "responses": { "200": { "description": "Updated Pushover notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/notifications\/webhook": { "get": { "tags": [ "Notifications" ], "summary": "Get webhook notification settings", "description": "Get the current team webhook notification settings. Encrypted secrets are only returned when the token has `read:sensitive` (or `root`) and the user is a team admin\/owner.", "operationId": "get-current-team-webhook-notifications", "responses": { "200": { "description": "Webhook notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Notifications" ], "summary": "Update webhook notification settings", "description": "Update the current team webhook notification settings.", "operationId": "update-current-team-webhook-notifications", "responses": { "200": { "description": "Updated webhook notification settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/version": { "get": { "summary": "Version", "description": "Get Coolify 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": [] } ] } }, "\/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": [] } ] }, "patch": { "tags": [ "Projects" ], "summary": "Update Environment", "description": "Update environment by name or UUID within a project.", "operationId": "update-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" } } ], "requestBody": { "description": "Environment fields to update.", "required": true, "content": { "application\/json": { "schema": { "properties": { "name": { "type": "string", "description": "The name of the environment." }, "description": { "type": "string", "description": "The description of the environment." } }, "type": "object" } } } }, "responses": { "200": { "description": "Environment updated.", "content": { "application\/json": { "schema": { "properties": { "uuid": { "type": "string", "example": "env123" }, "name": { "type": "string", "example": "staging" }, "description": { "type": "string", "example": "Staging environment" } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "description": "Project or environment not found." }, "409": { "description": "Environment with this name already exists." }, "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 applications, services and standalone databases. The other fields of each resource are the fields of the Application, Service or Database schema.", "content": { "application\/json": { "schema": { "type": "array", "items": { "properties": { "uuid": { "type": "string" }, "name": { "type": "string" }, "description": { "type": [ "string", "null" ] }, "type": { "description": "application, service, or standalone- for databases (for example standalone-postgresql).", "type": "string" }, "status": { "description": "For example running:healthy or exited:unhealthy.", "type": "string" }, "environment_id": { "type": "integer" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } }, "type": "object", "additionalProperties": true } } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] } }, "\/s3-storages": { "get": { "tags": [ "S3 Storages" ], "summary": "List S3 Storages", "description": "List all S3 storages for the authenticated team.", "operationId": "list-s3-storages", "responses": { "200": { "description": "Get all S3 storages.", "content": { "application\/json": { "schema": { "type": "array", "items": { "properties": { "uuid": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string", "nullable": true }, "endpoint": { "type": "string" }, "bucket": { "type": "string" }, "region": { "type": "string" }, "use_path_style_endpoint": { "type": "boolean" }, "is_usable": { "type": "boolean" }, "team_id": { "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": [ "S3 Storages" ], "summary": "Create S3 Storage", "description": "Create a new S3 storage configuration for the authenticated team.", "operationId": "create-s3-storage", "requestBody": { "description": "S3 storage details", "required": true, "content": { "application\/json": { "schema": { "required": [ "name", "endpoint", "bucket", "region", "key", "secret" ], "properties": { "name": { "type": "string", "example": "My S3 Storage", "description": "A friendly name for the storage." }, "description": { "type": "string", "nullable": true, "description": "Optional description." }, "endpoint": { "type": "string", "example": "https:\/\/s3.us-east-1.amazonaws.com", "description": "S3-compatible endpoint URL." }, "bucket": { "type": "string", "example": "my-bucket", "description": "S3 bucket name." }, "region": { "type": "string", "example": "us-east-1", "description": "S3 region." }, "use_path_style_endpoint": { "type": "boolean", "description": "Use path-style URLs (endpoint\/bucket). Set to false for providers that only accept virtual-hosted-style URLs (bucket.endpoint). Default: false for Alibaba Cloud OSS, Tencent Cloud COS, and Volcengine TOS endpoints, true for all other endpoints." }, "key": { "type": "string", "description": "Access key." }, "secret": { "type": "string", "description": "Secret key." }, "is_usable": { "type": "boolean", "description": "Whether the storage is marked usable." } }, "type": "object" } } } }, "responses": { "201": { "description": "S3 storage created.", "content": { "application\/json": { "schema": { "properties": { "uuid": { "type": "string", "example": "og888os", "description": "The UUID of the S3 storage." } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/s3-storages\/{uuid}": { "get": { "tags": [ "S3 Storages" ], "summary": "Get S3 Storage", "description": "Get S3 storage by UUID.", "operationId": "get-s3-storage-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "S3 Storage UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Get S3 storage by UUID", "content": { "application\/json": { "schema": { "properties": { "uuid": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string", "nullable": true }, "endpoint": { "type": "string" }, "bucket": { "type": "string" }, "region": { "type": "string" }, "use_path_style_endpoint": { "type": "boolean" }, "is_usable": { "type": "boolean" }, "team_id": { "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": [ "S3 Storages" ], "summary": "Delete S3 Storage", "description": "Delete S3 storage by UUID.", "operationId": "delete-s3-storage-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the S3 storage.", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "S3 storage deleted.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "S3 storage deleted." } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "S3 Storages" ], "summary": "Update S3 Storage", "description": "Update S3 storage by UUID.", "operationId": "update-s3-storage-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "S3 Storage UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "description": "S3 storage fields to update.", "required": true, "content": { "application\/json": { "schema": { "properties": { "name": { "type": "string", "description": "A friendly name for the storage." }, "description": { "type": "string", "nullable": true, "description": "Optional description." }, "endpoint": { "type": "string", "description": "S3-compatible endpoint URL." }, "bucket": { "type": "string", "description": "S3 bucket name." }, "region": { "type": "string", "description": "S3 region." }, "use_path_style_endpoint": { "type": "boolean", "description": "Use path-style URLs (endpoint\/bucket). Set to false for providers that only accept virtual-hosted-style URLs (bucket.endpoint), such as Alibaba Cloud OSS." }, "key": { "type": "string", "description": "Access key." }, "secret": { "type": "string", "description": "Secret key." }, "is_usable": { "type": "boolean", "description": "Whether the storage is marked usable." } }, "type": "object" } } } }, "responses": { "200": { "description": "S3 storage 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": [] } ] } }, "\/s3-storages\/{uuid}\/validate": { "post": { "tags": [ "S3 Storages" ], "summary": "Validate S3 Storage", "description": "Validate an S3 storage connection using ListObjectsV2.", "operationId": "validate-s3-storage-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "S3 Storage UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "S3 storage validation result.", "content": { "application\/json": { "schema": { "properties": { "valid": { "type": "boolean", "example": true }, "message": { "type": "string", "example": "S3 storage connection is valid." } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "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, "maximum": 36000 }, "enabled": { "type": "boolean", "description": "The flag to indicate if the scheduled task is enabled. An enabled task requires the deploy ability.", "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" }, "403": { "description": "The token needs the deploy ability for an enabled task." }, "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, "maximum": 36000 }, "enabled": { "type": "boolean", "description": "The flag to indicate if the scheduled task is enabled. An enabled task requires the deploy ability.", "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" }, "403": { "description": "The token needs the deploy ability for an enabled task." }, "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, "maximum": 36000 }, "enabled": { "type": "boolean", "description": "The flag to indicate if the scheduled task is enabled. An enabled task requires the deploy ability.", "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" }, "403": { "description": "The token needs the deploy ability for an enabled task." }, "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, "maximum": 36000 }, "enabled": { "type": "boolean", "description": "The flag to indicate if the scheduled task is enabled. An enabled task requires the deploy ability.", "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" }, "403": { "description": "The token needs the deploy ability for an enabled task." }, "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": [] } ] } }, "\/applications\/{uuid}\/scheduled-tasks\/{task_uuid}\/execute": { "post": { "tags": [ "Scheduled Tasks" ], "summary": "Execute Task", "description": "Queue immediate execution of a scheduled task for an application. Requires the deploy ability.", "operationId": "execute-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 execution queued." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy ability." }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] } }, "\/services\/{uuid}\/scheduled-tasks\/{task_uuid}\/execute": { "post": { "tags": [ "Scheduled Tasks" ], "summary": "Execute Task", "description": "Queue immediate execution of a scheduled task for a service. Requires the deploy ability.", "operationId": "execute-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 execution queued." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy ability." }, "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": [] } ] } }, "\/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": [] } ] }, "patch": { "tags": [ "Private Keys" ], "summary": "Update", "description": "Update a private key.", "operationId": "update-private-key", "parameters": [ { "name": "uuid", "in": "path", "description": "Private Key UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "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" }, "404": { "description": "Private Key not found." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/cloudflare-tunnel": { "get": { "tags": [ "Servers" ], "summary": "Get Cloudflare Tunnel settings", "description": "Get Cloudflare Tunnel settings for a server owned by the authenticated team.", "operationId": "get-server-cloudflare-tunnel", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Cloudflare Tunnel settings.", "content": { "application\/json": { "schema": { "properties": { "is_cloudflare_tunnel": { "type": "boolean" }, "ip": { "type": "string" }, "ip_previous": { "type": [ "string", "null" ] } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Servers" ], "summary": "Update Cloudflare Tunnel settings", "description": "Update stored Cloudflare Tunnel settings for a server. Does not run remote cloudflared configuration; use enable\/disable for the manual UI actions.", "operationId": "update-server-cloudflare-tunnel", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "is_cloudflare_tunnel": { "type": "boolean" } }, "type": "object" } } } }, "responses": { "200": { "description": "Updated Cloudflare Tunnel settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/cloudflare-tunnel\/enable": { "post": { "tags": [ "Servers" ], "summary": "Enable Cloudflare Tunnel (manual)", "description": "Manually mark Cloudflare Tunnel as enabled for a server (matches UI manual enable). Does not deploy cloudflared remotely.", "operationId": "enable-server-cloudflare-tunnel", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Cloudflare Tunnel enabled." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/cloudflare-tunnel\/disable": { "post": { "tags": [ "Servers" ], "summary": "Disable Cloudflare Tunnel", "description": "Mark Cloudflare Tunnel as disabled and restore ip_previous when available. Does not remove the remote cloudflared container.", "operationId": "disable-server-cloudflare-tunnel", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Cloudflare Tunnel disabled." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/docker-cleanup": { "get": { "tags": [ "Servers" ], "summary": "Get Docker cleanup settings", "description": "Get Docker cleanup settings for a server owned by the authenticated team.", "operationId": "get-server-docker-cleanup", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Docker cleanup settings.", "content": { "application\/json": { "schema": { "properties": { "docker_cleanup_frequency": { "type": "string" }, "docker_cleanup_threshold": { "type": "integer" }, "force_docker_cleanup": { "type": "boolean" }, "delete_unused_volumes": { "type": "boolean" }, "delete_unused_networks": { "type": "boolean" }, "disable_application_image_retention": { "type": "boolean" } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Servers" ], "summary": "Update Docker cleanup settings", "description": "Update Docker cleanup settings for a server owned by the authenticated team. Turning on `delete_unused_volumes` needs a token with the `deploy` permission.", "operationId": "update-server-docker-cleanup", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "docker_cleanup_frequency": { "description": "Cron \/ human frequency expression.", "type": "string" }, "docker_cleanup_threshold": { "type": "integer", "maximum": 99, "minimum": 1 }, "force_docker_cleanup": { "type": "boolean" }, "delete_unused_volumes": { "type": "boolean" }, "delete_unused_networks": { "type": "boolean" }, "disable_application_image_retention": { "type": "boolean" } }, "type": "object" } } } }, "responses": { "200": { "description": "Updated Docker cleanup settings.", "content": { "application\/json": { "schema": { "properties": { "docker_cleanup_frequency": { "type": "string" }, "docker_cleanup_threshold": { "type": "integer" }, "force_docker_cleanup": { "type": "boolean" }, "delete_unused_volumes": { "type": "boolean" }, "delete_unused_networks": { "type": "boolean" }, "disable_application_image_retention": { "type": "boolean" } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Turning on `delete_unused_volumes` needs the deploy permission." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/docker-cleanup\/run": { "post": { "tags": [ "Servers" ], "summary": "Run Docker cleanup", "description": "Dispatch a manual Docker cleanup job for a server owned by the authenticated team. Needs a token with the write and deploy permissions.", "operationId": "run-server-docker-cleanup", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": false, "content": { "application\/json": { "schema": { "properties": { "delete_unused_volumes": { "type": "boolean" }, "delete_unused_networks": { "type": "boolean" } }, "type": "object" } } } }, "responses": { "200": { "description": "Docker cleanup job dispatched.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "Manual cleanup job started." } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "The token needs the write and deploy permissions." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/docker-cleanup\/executions": { "get": { "tags": [ "Servers" ], "summary": "List Docker cleanup executions", "description": "List recent Docker cleanup execution logs for a server owned by the authenticated team.", "operationId": "list-server-docker-cleanup-executions", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Recent Docker cleanup executions.", "content": { "application\/json": { "schema": { "type": "array", "items": { "properties": { "uuid": { "type": "string" }, "status": { "type": "string" }, "message": { "type": [ "string", "null" ] }, "finished_at": { "type": [ "string", "null" ] }, "created_at": { "type": "string" }, "updated_at": { "type": "string" } }, "type": "object" } } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/registries": { "get": { "tags": [ "Servers" ], "summary": "List server registry logins", "description": "List the Docker registries a server is logged in to and the registries its resources pull from or push to. Reads the Docker config of the server over SSH. Credentials are never returned, only registry names and usernames. Requires the `read:sensitive` ability.", "operationId": "list-server-registries", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Registry logins of the server.", "content": { "application\/json": { "schema": { "properties": { "registries": { "type": "array", "items": { "properties": { "registry": { "type": "string", "example": "ghcr.io" }, "logged_in": { "type": "boolean", "example": true }, "source": { "description": "Where the Docker config stores the credentials.", "type": [ "string", "null" ], "enum": [ "auths", "credHelpers" ] }, "username": { "type": [ "string", "null" ], "example": "octocat" }, "used_by": { "type": "array", "items": { "properties": { "type": { "type": "string", "example": "Application" }, "name": { "type": "string" }, "link": { "type": [ "string", "null" ] } }, "type": "object" } } }, "type": "object" } }, "error": { "description": "Set when the logins could not be read from the server.", "type": [ "string", "null" ] } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Servers" ], "summary": "Log in to a registry on a server", "description": "Run docker login on the server, writing to the Docker config that deployments use. Logging in again to the same registry replaces the saved login. Needs a token with the write and deploy permissions.", "operationId": "login-server-registry", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "registry", "username", "password" ], "properties": { "registry": { "description": "Registry host, optionally with a port. Use docker.io for Docker Hub.", "type": "string", "example": "ghcr.io" }, "username": { "type": "string", "example": "octocat" }, "password": { "description": "Password or access token. Never returned.", "type": "string" } }, "type": "object" } } } }, "responses": { "200": { "description": "Logged in.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "Logged in to ghcr.io." } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "The token needs the write and deploy permissions." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/registries\/{registry}\/check": { "post": { "tags": [ "Servers" ], "summary": "Check a registry login on a server", "description": "Check that the saved login of the server for a registry still works. Runs docker login with the saved credentials on the server.", "operationId": "check-server-registry-login", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } }, { "name": "registry", "in": "path", "description": "Registry host, optionally with a port, for example registry.example.com:5000.", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "The login works.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "The login for ghcr.io works." } }, "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}\/registries\/{registry}": { "delete": { "tags": [ "Servers" ], "summary": "Log out from a registry on a server", "description": "Run docker logout on the server for a registry.", "operationId": "logout-server-registry", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } }, { "name": "registry", "in": "path", "description": "Registry host, optionally with a port, for example registry.example.com:5000.", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Logged out.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "Logged out from ghcr.io." } }, "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}\/log-drains": { "get": { "tags": [ "Servers" ], "summary": "Get log drain settings", "description": "Get log drain settings for a server owned by the authenticated team. Sensitive fields require the read:sensitive or root token ability.", "operationId": "get-server-log-drains", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Log drain settings.", "content": { "application\/json": { "schema": { "properties": { "is_logdrain_newrelic_enabled": { "type": "boolean" }, "logdrain_newrelic_license_key": { "description": "Only present with read:sensitive.", "type": "string" }, "logdrain_newrelic_base_uri": { "type": [ "string", "null" ] }, "is_logdrain_axiom_enabled": { "type": "boolean" }, "logdrain_axiom_dataset_name": { "type": [ "string", "null" ] }, "logdrain_axiom_domain": { "type": [ "string", "null" ] }, "logdrain_axiom_api_key": { "description": "Only present with read:sensitive.", "type": "string" }, "is_logdrain_custom_enabled": { "type": "boolean" }, "logdrain_custom_config": { "description": "Only present with read:sensitive.", "type": "string" }, "logdrain_custom_config_parser": { "description": "Only present with read:sensitive.", "type": "string" }, "is_logdrain_cloudwatch_enabled": { "type": "boolean" }, "logdrain_cloudwatch_region": { "type": [ "string", "null" ] }, "logdrain_cloudwatch_group": { "type": [ "string", "null" ] }, "logdrain_cloudwatch_stream_prefix": { "description": "Prepended to the container name to form the log stream name.", "type": [ "string", "null" ] } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Servers" ], "summary": "Update log drain settings", "description": "Update New Relic, Axiom, or custom log drain settings for a server owned by the authenticated team. Needs a token with the write and deploy permissions. Custom configs cannot use the lua, wasm, exec, exec_wasi, or file plugins, @INCLUDE, or plugins_file, and the parser file can only contain [PARSER] and [MULTILINE_PARSER] sections.", "operationId": "update-server-log-drains", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "is_logdrain_newrelic_enabled": { "type": "boolean" }, "logdrain_newrelic_license_key": { "type": "string" }, "logdrain_newrelic_base_uri": { "type": "string" }, "is_logdrain_axiom_enabled": { "type": "boolean" }, "logdrain_axiom_dataset_name": { "type": "string" }, "logdrain_axiom_domain": { "description": "Base domain of the Axiom edge deployment. Default: us-east-1.aws.edge.axiom.co. Use eu-central-1.aws.edge.axiom.co for EU datasets.", "type": "string" }, "logdrain_axiom_api_key": { "type": "string" }, "is_logdrain_custom_enabled": { "type": "boolean" }, "logdrain_custom_config": { "type": "string" }, "logdrain_custom_config_parser": { "type": "string" }, "is_logdrain_cloudwatch_enabled": { "type": "boolean" }, "logdrain_cloudwatch_region": { "type": [ "string", "null" ] }, "logdrain_cloudwatch_group": { "type": [ "string", "null" ] }, "logdrain_cloudwatch_stream_prefix": { "description": "Prepended to the container name to form the log stream name.", "type": [ "string", "null" ] } }, "type": "object" } } } }, "responses": { "200": { "description": "Updated log drain settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "The token needs the write and deploy permissions." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/proxy": { "get": { "tags": [ "Servers" ], "summary": "Get server proxy", "description": "Get proxy settings for a server owned by the authenticated team. The raw proxy configuration is only returned when the token has `read:sensitive` (or `root`) and the user is a team admin\/owner, and only when already stored in the database (no remote fetch).", "operationId": "get-server-proxy", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Server proxy settings.", "content": { "application\/json": { "schema": { "properties": { "proxy_type": { "type": [ "string", "null" ], "example": "TRAEFIK" }, "status": { "type": [ "string", "null" ], "example": "running" }, "redirect_enabled": { "type": "boolean", "example": true }, "redirect_url": { "type": [ "string", "null" ], "example": "https:\/\/example.com" }, "proxy_error_page": { "type": [ "string", "null" ] }, "generate_exact_labels": { "type": "boolean", "example": false }, "traefik_certificate_resolver": { "description": "Traefik certificate resolver for generated HTTPS routers. Null when the proxy uses its own certificates.", "type": [ "string", "null" ], "example": "letsencrypt" }, "configuration": { "description": "Docker Compose proxy configuration when stored in the database. Only present with read:sensitive.", "type": [ "string", "null" ] } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Servers" ], "summary": "Update server proxy", "description": "Update proxy redirect settings, exact labels generation, the Traefik certificate resolver, and optionally the proxy type for a team-owned server. Changing proxy_type needs a token with the `write` and `deploy` permissions.", "operationId": "update-server-proxy", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "redirect_enabled": { "type": "boolean" }, "redirect_url": { "description": "Public http(s) redirect URL, or null to clear.", "type": [ "string", "null" ] }, "proxy_error_page": { "description": "Custom HTML error page that the proxy shows for unknown hosts (when redirect_url is empty) and for resources in maintenance mode. Null restores the default page.", "type": [ "string", "null" ] }, "generate_exact_labels": { "type": "boolean" }, "traefik_certificate_resolver": { "description": "Traefik certificate resolver for generated HTTPS routers (letters, digits, _ and -). Null or empty to use your own certificates. Redeploy resources to apply.", "type": [ "string", "null" ] }, "proxy_type": { "description": "Proxy type (case-insensitive). Changing it starts the new proxy on the server and needs the deploy permission.", "type": "string", "enum": [ "traefik", "caddy", "nginx", "none" ] } }, "type": "object" } } } }, "responses": { "200": { "description": "Proxy settings updated.", "content": { "application\/json": { "schema": { "properties": { "proxy_type": { "type": [ "string", "null" ] }, "status": { "type": [ "string", "null" ] }, "redirect_enabled": { "type": "boolean" }, "redirect_url": { "type": [ "string", "null" ] }, "proxy_error_page": { "type": [ "string", "null" ] }, "generate_exact_labels": { "type": "boolean" }, "traefik_certificate_resolver": { "type": [ "string", "null" ] }, "configuration": { "type": [ "string", "null" ] } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "The token needs the deploy permission to change the proxy type." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/proxy\/configuration": { "put": { "tags": [ "Servers" ], "summary": "Save server proxy configuration", "description": "Save the raw proxy Docker Compose configuration for a team-owned server. Needs a token with the `write` and `deploy` permissions. Multi-line configuration must be base64 encoded (same pattern as other compose payloads).", "operationId": "save-server-proxy-configuration", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "configuration" ], "properties": { "configuration": { "description": "Proxy docker-compose YAML. Prefer base64 encoding for multi-line content.", "type": "string" } }, "type": "object" } } } }, "responses": { "200": { "description": "Proxy configuration saved.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "Proxy configuration saved." }, "proxy_type": { "type": [ "string", "null" ] }, "status": { "type": [ "string", "null" ] }, "redirect_enabled": { "type": "boolean" }, "redirect_url": { "type": [ "string", "null" ] }, "proxy_error_page": { "type": [ "string", "null" ] }, "generate_exact_labels": { "type": "boolean" }, "configuration": { "type": [ "string", "null" ] } }, "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}\/proxy\/restart": { "post": { "tags": [ "Servers" ], "summary": "Restart server proxy", "description": "Queue a proxy restart for a team-owned server. Needs a token with the `deploy` permission.", "operationId": "restart-server-proxy", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Proxy restart queued.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "Proxy restart queued." } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/sentinel": { "get": { "tags": [ "Servers" ], "summary": "Get Sentinel settings", "description": "Get Sentinel settings for a server owned by the authenticated team. sentinel_token and sentinel_custom_url require the read:sensitive or root token ability.", "operationId": "get-server-sentinel", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Sentinel settings.", "content": { "application\/json": { "schema": { "properties": { "is_sentinel_enabled": { "description": "Sentinel is mandatory on regular managed servers.", "type": "boolean", "readOnly": true }, "is_metrics_enabled": { "type": "boolean" }, "is_sentinel_debug_enabled": { "type": "boolean" }, "sentinel_token": { "description": "Only present with read:sensitive.", "type": "string" }, "sentinel_metrics_refresh_rate_seconds": { "type": "integer" }, "sentinel_metrics_history_days": { "type": "integer" }, "sentinel_push_interval_seconds": { "type": "integer" }, "sentinel_custom_url": { "description": "Only present with read:sensitive.", "type": "string" }, "sentinel_updated_at": { "type": [ "string", "null" ] }, "traffic_topn": { "type": "integer" }, "traffic_sample_threshold": { "type": "integer" }, "traffic_retention_1h_days": { "type": "integer" }, "traffic_retention_1d_days": { "type": "integer" }, "is_geoip_enabled": { "type": "boolean" }, "geoip_refresh_days": { "type": "integer" }, "traffic_ip_mode": { "description": "How Sentinel stores client IPs for the Top IPs breakdown.", "type": "string", "enum": [ "full", "anonymized", "off" ] }, "geoip_maxmind_license_key": { "description": "Only present with read:sensitive.", "type": "string" } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Servers" ], "summary": "Update Sentinel settings", "description": "Update Sentinel settings for a server owned by the authenticated team. Changing token\/metrics timing fields may restart Sentinel. Needs a token with the write and deploy permissions.", "operationId": "update-server-sentinel", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "is_metrics_enabled": { "type": "boolean" }, "is_sentinel_debug_enabled": { "type": "boolean" }, "sentinel_token": { "type": "string" }, "sentinel_metrics_refresh_rate_seconds": { "type": "integer", "minimum": 1 }, "sentinel_metrics_history_days": { "type": "integer", "minimum": 1 }, "sentinel_push_interval_seconds": { "type": "integer", "minimum": 10 }, "sentinel_custom_url": { "type": [ "string", "null" ] }, "traffic_topn": { "type": "integer", "maximum": 1000, "minimum": 1 }, "traffic_sample_threshold": { "type": "integer", "minimum": 0 }, "traffic_retention_1h_days": { "type": "integer", "maximum": 365, "minimum": 1 }, "traffic_retention_1d_days": { "type": "integer", "maximum": 3650, "minimum": 1 }, "is_geoip_enabled": { "type": "boolean" }, "geoip_refresh_days": { "type": "integer", "minimum": 1 }, "geoip_maxmind_license_key": { "type": [ "string", "null" ] }, "traffic_ip_mode": { "description": "How Sentinel stores client IPs: full, anonymized (IPv4 \/24, IPv6 \/48), or off.", "type": "string", "enum": [ "full", "anonymized", "off" ] } }, "type": "object" } } } }, "responses": { "200": { "description": "Updated Sentinel settings." }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "The token needs the write and deploy permissions." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/migrate": { "post": { "tags": [ "Servers" ], "summary": "Migrate server to another Coolify instance", "description": "Start a transfer in the background: export this server, import and claim it on the target instance (with the given token), then disable automations here. All secrets of the server, also locked environment variables, are sent to the target. Follow the progress with GET \/servers\/{uuid}\/transfer. The target URL must use https. Requires read:sensitive and write, and the owner role of the server team.", "operationId": "migrate-server-between-instances", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "target_url", "target_token" ], "properties": { "target_url": { "type": "string", "example": "https:\/\/coolify-b.example.com" }, "target_token": { "description": "API token on the target instance (root or write)", "type": "string" } }, "type": "object" } } } }, "responses": { "202": { "description": "Transfer started" }, "403": { "description": "Missing sensitive permission or not an owner of the server team" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "description": "Validation or remote import failed" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/transfer": { "get": { "tags": [ "Servers" ], "summary": "Get server transfer status", "description": "Show the transfer state of a server on this instance: the import\/claim state (transfer) and the state of a running or finished transfer to another instance (migration).", "operationId": "get-server-transfer-status", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Transfer status" }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/import\/check": { "get": { "tags": [ "Servers" ], "summary": "Check server import", "description": "Check that this instance can import a server, before the source instance starts the transfer. It checks the token, the bundle version, the server limit, servers with the same UUID or IP, and that this instance can reach the SSH port of the server.", "operationId": "check-server-import", "parameters": [ { "name": "server_uuid", "in": "query", "required": true, "schema": { "type": "string" } }, { "name": "ip", "in": "query", "required": true, "schema": { "type": "string" } }, { "name": "port", "in": "query", "required": false, "schema": { "type": "integer", "default": 22 } }, { "name": "schema_version", "in": "query", "required": false, "schema": { "type": "integer" } }, { "name": "system_github_apps[]", "in": "query", "description": "UUIDs of system-wide GitHub Apps that the server uses. The response lists the ones this instance does not have.", "required": false, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "system_gitlab_apps[]", "in": "query", "description": "UUIDs of system-wide GitLab Apps that the server uses. The response lists the ones this instance does not have.", "required": false, "schema": { "type": "array", "items": { "type": "string" } } } ], "responses": { "200": { "description": "The server can be imported. Lists every check with its result." }, "401": { "$ref": "#\/components\/responses\/401" }, "422": { "description": "One or more checks failed. Lists every check with its result." } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/import": { "post": { "tags": [ "Servers" ], "summary": "Import server transfer bundle", "description": "Import a server transfer bundle into this Coolify instance (adopt mode by default). This instance then manages the server, and Sentinel reports to it. Needs a token with the write and deploy permissions.", "operationId": "import-server-transfer-bundle", "requestBody": { "required": true, "content": { "application\/json": { "schema": { "properties": { "bundle": { "description": "Transfer bundle", "type": "object" }, "dry_run": { "type": "boolean", "default": false }, "preserve_uuids": { "type": "boolean", "default": true }, "adopt_mode": { "description": "Import without forcing redeploy; keep statuses for adoption", "type": "boolean", "default": true } }, "type": "object" } } } }, "responses": { "200": { "description": "Dry-run result" }, "201": { "description": "Imported" }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the write and deploy permissions." }, "422": { "description": "Validation failed" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/transfer\/complete": { "post": { "tags": [ "Servers" ], "summary": "Mark server transferred", "description": "Source-instance recovery step: disable automations here when the target already manages the server but the transfer could not finish on this instance.", "operationId": "complete-server-transfer", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application\/json": { "schema": { "properties": { "export_id": { "type": [ "string", "null" ] }, "target_instance_url": { "type": [ "string", "null" ] } }, "type": "object" } } } }, "responses": { "200": { "description": "Marked transferred" }, "404": { "$ref": "#\/components\/responses\/404" } }, "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. Must not contain control characters such as new lines." }, "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." }, "server_role": { "type": "string", "enum": [ "deployment", "build", "both" ], "example": "both", "description": "Server role." }, "is_build_server": { "type": "boolean", "deprecated": true, "description": "Deprecated: use server_role instead. true sets server_role to build, false sets it to both. Must not conflict with server_role." }, "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. With force or delete_from_provider, needs a token with the write and deploy permissions.", "operationId": "delete-server-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the server.", "required": true, "schema": { "type": "string" } }, { "name": "force", "in": "query", "description": "Also delete all resources on the server. Needs the deploy permission.", "required": false, "schema": { "type": "boolean", "default": false } }, { "name": "delete_from_provider", "in": "query", "description": "Also delete the server from its cloud provider (Hetzner, Vultr or DigitalOcean). This cannot be undone. Needs the deploy permission.", "required": false, "schema": { "type": "boolean", "default": false } } ], "responses": { "403": { "description": "The token needs the deploy permission to delete the resources or the cloud server." }, "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. Changing proxy_type needs a token with the write and deploy permissions.", "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. Must not contain control characters such as new lines." }, "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." }, "server_role": { "type": "string", "enum": [ "deployment", "build", "both" ], "description": "Server role." }, "is_build_server": { "type": "boolean", "deprecated": true, "description": "Deprecated: use server_role instead. true sets server_role to build, false changes a build server to both and leaves other roles unchanged. Must not conflict with server_role." }, "instant_validate": { "type": "boolean", "description": "Instant validate." }, "proxy_type": { "type": "string", "enum": [ "traefik", "caddy", "none" ], "description": "The proxy type. Changing it starts the new proxy on the server and needs the deploy permission." }, "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." }, "server_disk_usage_notification_interval_hours": { "type": "integer", "description": "Minimum hours between high disk usage notifications (1-720). Default: 24." }, "connection_timeout": { "type": "integer", "description": "SSH connection timeout in seconds (1-300). Default: 10." }, "wildcard_domain": { "type": "string", "nullable": true, "description": "Wildcard domain (URL) used to generate domains for new resources on this server. Null removes it." }, "server_timezone": { "type": "string", "description": "Timezone of the server, for example Europe\/Berlin. Scheduled tasks and backups use it." }, "backup_compression_cpu_percentage": { "type": "integer", "enum": [ 25, 50, 75, 100 ], "description": "Maximum CPU percentage that backup compression can use. Default: 25." } }, "type": "object" } } } }, "responses": { "403": { "description": "The token needs the deploy permission to change the proxy type." }, "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. With install=true, needs a token with the write and deploy permissions.", "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, then start the proxy. This can restart the Docker daemon. Needs the deploy permission.", "type": "boolean", "default": false } }, "type": "object" } } } }, "responses": { "403": { "description": "The token needs the deploy permission to install the server." }, "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" ] }, "noindex_domains": { "description": "The subset of the service application domains served with an X-Robots-Tag: noindex, nofollow response header, keeping them out of search engines. Entries that are not among the domains are ignored.", "type": [ "array", "null" ], "items": { "type": "string" } }, "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" ] }, "traefik_certificate_resolver": { "description": "Traefik certificate resolver for this service application. Null uses the server setting, \"none\" uses no resolver.", "type": [ "string", "null" ] }, "is_stripprefix_enabled": { "type": [ "boolean", "null" ] }, "is_force_https_enabled": { "type": [ "boolean", "null" ] }, "is_permanent_redirect_enabled": { "description": "Use permanent redirects (301\/308) instead of temporary (302\/307) for the HTTP to HTTPS and www redirects. Defaults to false.", "type": [ "boolean", "null" ] }, "redirect": { "description": "How to handle www and non-www domains. \"www\" redirects non-www to www, \"non-www\" redirects www to non-www. Both need a www and a non-www domain in url.", "type": "string", "enum": [ "both", "www", "non-www" ] }, "max_restart_count": { "description": "Maximum Docker restart count before Coolify stops the container. Set to 0 to disable the limit.", "type": [ "integer", "null" ], "minimum": 0 } }, "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. Requires the `read:sensitive` or `root` token ability.", "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. Use `all` to return all logs. `-1` remains available as a compatibility alias.", "required": false, "schema": { "oneOf": [ { "type": "integer", "format": "int32", "default": 100, "maximum": 10000, "minimum": -1 }, { "type": "string", "enum": [ "all" ] } ] } } ], "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. Requires the `read:sensitive` or `root` token ability.", "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", "description": "Number of lines to show from the end of the logs. Use `all` to return all logs. `-1` remains available as a compatibility alias.", "required": false, "schema": { "oneOf": [ { "type": "integer", "format": "int32", "default": 100, "maximum": 10000, "minimum": -1 }, { "type": "string", "enum": [ "all" ] } ] } } ], "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\/{database_uuid}\/imports\/uploads": { "post": { "tags": [ "Service databases" ], "summary": "Upload service database import", "operationId": "upload-service-database-import", "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": { "201": { "description": "Upload completed" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/services\/{uuid}\/databases\/{database_uuid}\/imports": { "post": { "tags": [ "Service databases" ], "summary": "Import service database backup", "description": "Restore a backup into the service database. Every import source requires the deploy ability.", "operationId": "create-service-database-import", "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": { "required": true, "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/DatabaseImportRequest" } } } }, "responses": { "202": { "description": "Import queued" }, "403": { "description": "The token needs the deploy ability." }, "409": { "description": "Another start, restart or import of this database is already in progress." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/services\/{uuid}\/databases\/{database_uuid}\/imports\/{activity_id}": { "get": { "tags": [ "Service databases" ], "summary": "Get service database import status", "operationId": "get-service-database-import", "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" } }, { "name": "activity_id", "in": "path", "description": "Import activity ID.", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Import status", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/DatabaseImportStatus" } } } }, "404": { "$ref": "#\/components\/responses\/404" } }, "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": { "description": "Changing it starts or stops the database proxy, so it needs a token with the deploy permission.", "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" }, "403": { "description": "The token needs the deploy permission to change is_public." }, "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. Requires the `read:sensitive` or `root` token ability.", "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", "description": "Number of lines to show from the end of the logs. Use `all` to return all logs. `-1` remains available as a compatibility alias.", "required": false, "schema": { "oneOf": [ { "type": "integer", "format": "int32", "default": 100, "maximum": 10000, "minimum": -1 }, { "type": "string", "enum": [ "all" ] } ] } } ], "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" ], "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." }, "connect_to_docker_network": { "type": "boolean", "default": false, "description": "Connect the service to the predefined docker network." }, "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.coolify.io,https:\/\/app2.coolify.io\")." } }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "default": true, "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "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. Needs a token with the write and deploy permissions.", "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 when the server disk usage is at or above its cleanup threshold. Skipped when a cleanup ran on the server in the last hour.", "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" }, "403": { "description": "The token needs the write and deploy permissions." }, "422": { "$ref": "#\/components\/responses\/422" } }, "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.coolify.io,https:\/\/app2.coolify.io\")." } }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "default": true, "description": "Redact all environment variable values in logs. When false, only locked (shown once) values are redacted. Requires team admin permissions." }, "include_coolify_default_variables": { "type": "boolean", "default": true, "description": "Add the predefined COOLIFY_* variables (COOLIFY_URL, COOLIFY_FQDN, ...) to the environment. Requires team admin permissions. Redeploy to apply it." } }, "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}`. Requires the `read:sensitive` or `root` token ability.", "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. Use `all` to return all logs. `-1` remains available as a compatibility alias.", "required": false, "schema": { "oneOf": [ { "type": "integer", "format": "int32", "default": 100, "maximum": 10000, "minimum": -1 }, { "type": "string", "enum": [ "all" ] } ] } }, { "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." } }, "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 \u2014 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}\/migrate": { "post": { "tags": [ "Services" ], "summary": "Migrate to Server", "description": "Migrate a service to another destination\/server owned by the authenticated team. Stops the service, optionally transfers persistent volume data when both servers are managed by Coolify, and updates database records. Redeploy after migration completes.", "operationId": "migrate-service-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the service.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "destination_uuid" ], "properties": { "destination_uuid": { "description": "UUID of the target destination.", "type": "string" }, "migrate_volumes": { "description": "Whether to transfer persistent volume data when migrating across servers.", "type": "boolean", "default": true } }, "type": "object" } } } }, "responses": { "200": { "description": "Service migration started or completed." }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "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": "Run docker cleanup when the server disk usage is at or above its cleanup threshold. Skipped when a cleanup ran on the server in the last hour.", "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." }, "content": { "type": "string", "nullable": true, "description": "File content (file only, optional). Needs the deploy ability when set." }, "is_directory": { "type": "boolean", "description": "Whether this is a directory mount (file only, default false)." }, "fs_path": { "type": "string", "description": "Host path. Required for directory mounts and host file mounts. Optional for file mounts with content (default: inside the resource directory). An absolute path can be anywhere on the host; a relative path is inside the resource directory. A directory or file mount outside the resource directory needs a token with the deploy permission. Coolify never deletes a path outside the resource directory." } }, "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" }, "403": { "description": "The token needs the deploy permission for a mount outside the resource directory or for a file storage with content." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Services" ], "summary": "Update Storage", "description": "Update a persistent storage or file storage by service UUID. Changed file content is saved right away and written to the server in the background, so a failed write does not change the response.", "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)." }, "content": { "type": "string", "nullable": true, "description": "The file content (file only, not allowed for read-only storages). Changing the content needs the deploy permission." } }, "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" }, "403": { "description": "The token needs the deploy permission to change the content of a file outside the resource directory." }, "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": [] } ] } }, "\/services\/{uuid}\/clone": { "post": { "tags": [ "Services" ], "summary": "Clone", "description": "Clone a service to a destination owned by the authenticated team.", "operationId": "clone-service-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "UUID of the service.", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "destination_uuid" ], "properties": { "destination_uuid": { "type": "string" }, "name": { "type": [ "string", "null" ] }, "clone_volumes": { "description": "Whether to clone volume data. Needs the deploy ability.", "type": "boolean", "default": false } }, "type": "object" } } } }, "responses": { "201": { "description": "Service cloned." }, "400": { "$ref": "#\/components\/responses\/400" }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy ability to clone volume data." }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/team\/envs": { "get": { "tags": [ "Shared Environment Variables" ], "summary": "List Team Shared Envs", "description": "List shared environment variables for the current team (type=team).", "operationId": "list-team-shared-envs", "responses": { "200": { "description": "Team shared environment variables." }, "401": { "$ref": "#\/components\/responses\/401" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Shared Environment Variables" ], "summary": "Create Team Shared Env", "description": "Create a shared environment variable for the current team (type=team).", "operationId": "create-team-shared-env", "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "key" ], "properties": { "key": { "type": "string" }, "value": { "type": [ "string", "null" ] }, "is_literal": { "type": "boolean" }, "is_multiline": { "type": "boolean" }, "is_shown_once": { "description": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values.", "type": "boolean" }, "comment": { "type": [ "string", "null" ] } }, "type": "object" } } } }, "responses": { "201": { "description": "Environment variable created." }, "401": { "$ref": "#\/components\/responses\/401" }, "409": { "description": "Environment variable already exists." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/team\/envs\/{env_id}": { "delete": { "tags": [ "Shared Environment Variables" ], "summary": "Delete Team Shared Env", "description": "Delete a team shared environment variable by id.", "operationId": "delete-team-shared-env", "parameters": [ { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable deleted." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Shared Environment Variables" ], "summary": "Update Team Shared Env", "description": "Update a team shared environment variable by id.", "operationId": "update-team-shared-env", "parameters": [ { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable updated." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/projects\/{uuid}\/envs": { "get": { "tags": [ "Shared Environment Variables" ], "summary": "List Project Shared Envs", "description": "List shared environment variables for a project (type=project).", "operationId": "list-project-shared-envs", "parameters": [ { "name": "uuid", "in": "path", "description": "Project UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Project shared environment variables." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Shared Environment Variables" ], "summary": "Create Project Shared Env", "description": "Create a shared environment variable for a project (type=project).", "operationId": "create-project-shared-env", "parameters": [ { "name": "uuid", "in": "path", "description": "Project UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "201": { "description": "Environment variable created." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "409": { "description": "Environment variable already exists." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/projects\/{uuid}\/envs\/{env_id}": { "delete": { "tags": [ "Shared Environment Variables" ], "summary": "Delete Project Shared Env", "description": "Delete a project shared environment variable by id.", "operationId": "delete-project-shared-env", "parameters": [ { "name": "uuid", "in": "path", "description": "Project UUID", "required": true, "schema": { "type": "string" } }, { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable deleted." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Shared Environment Variables" ], "summary": "Update Project Shared Env", "description": "Update a project shared environment variable by id.", "operationId": "update-project-shared-env", "parameters": [ { "name": "uuid", "in": "path", "description": "Project UUID", "required": true, "schema": { "type": "string" } }, { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable updated." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/projects\/{uuid}\/environments\/{environment_name_or_uuid}\/envs": { "get": { "tags": [ "Shared Environment Variables" ], "summary": "List Environment Shared Envs", "description": "List shared environment variables for a project environment (type=environment).", "operationId": "list-environment-shared-envs", "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 shared environment variables." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Shared Environment Variables" ], "summary": "Create Environment Shared Env", "description": "Create a shared environment variable for a project environment (type=environment).", "operationId": "create-environment-shared-env", "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": { "201": { "description": "Environment variable created." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "409": { "description": "Environment variable already exists." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/projects\/{uuid}\/environments\/{environment_name_or_uuid}\/envs\/{env_id}": { "delete": { "tags": [ "Shared Environment Variables" ], "summary": "Delete Environment Shared Env", "description": "Delete an environment shared environment variable by id.", "operationId": "delete-environment-shared-env", "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" } }, { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable deleted." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Shared Environment Variables" ], "summary": "Update Environment Shared Env", "description": "Update an environment shared environment variable by id.", "operationId": "update-environment-shared-env", "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" } }, { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable updated." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/envs": { "get": { "tags": [ "Shared Environment Variables" ], "summary": "List Server Shared Envs", "description": "List shared environment variables for a server (type=server).", "operationId": "list-server-shared-envs", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Server shared environment variables." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "post": { "tags": [ "Shared Environment Variables" ], "summary": "Create Server Shared Env", "description": "Create a shared environment variable for a server (type=server).", "operationId": "create-server-shared-env", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "201": { "description": "Environment variable created." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "409": { "description": "Environment variable already exists." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/servers\/{uuid}\/envs\/{env_id}": { "delete": { "tags": [ "Shared Environment Variables" ], "summary": "Delete Server Shared Env", "description": "Delete a server shared environment variable by id.", "operationId": "delete-server-shared-env", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } }, { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable deleted." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Shared Environment Variables" ], "summary": "Update Server Shared Env", "description": "Update a server shared environment variable by id.", "operationId": "update-server-shared-env", "parameters": [ { "name": "uuid", "in": "path", "description": "Server UUID", "required": true, "schema": { "type": "string" } }, { "name": "env_id", "in": "path", "description": "Shared env id (integer).", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Environment variable updated." }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" }, "422": { "$ref": "#\/components\/responses\/422" } }, "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": [] } ] }, "post": { "tags": [ "Tags" ], "summary": "Create", "description": "Create a tag for the current team.", "operationId": "create-tag", "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "name" ], "properties": { "name": { "type": "string", "maxLength": 255, "minLength": 2 } }, "type": "object" } } } }, "responses": { "201": { "description": "Tag created.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/Tag" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "409": { "description": "Tag with this name already exists." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/tags\/{uuid}": { "delete": { "tags": [ "Tags" ], "summary": "Delete", "description": "Delete a tag for the current team. Detaches the tag from all resources via cascade.", "operationId": "delete-tag-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "Tag UUID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Tag deleted.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "Tag deleted." } }, "type": "object" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Tags" ], "summary": "Update", "description": "Update a tag name for the current team.", "operationId": "update-tag-by-uuid", "parameters": [ { "name": "uuid", "in": "path", "description": "Tag UUID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "name" ], "properties": { "name": { "type": "string", "maxLength": 255, "minLength": 2 } }, "type": "object" } } } }, "responses": { "200": { "description": "Tag updated.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/Tag" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "404": { "$ref": "#\/components\/responses\/404" }, "409": { "description": "Tag with this name already exists." }, "422": { "$ref": "#\/components\/responses\/422" } }, "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": [] } ] } }, "\/team": { "get": { "tags": [ "Teams" ], "summary": "Authenticated Team", "description": "Get the team bound to the API token.", "operationId": "get-token-team", "responses": { "200": { "description": "Team bound to the API token.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/Team" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" } }, "security": [ { "bearerAuth": [] } ] }, "patch": { "tags": [ "Teams" ], "summary": "Update authenticated team", "description": "Update settings for the team bound to the API token.", "operationId": "update-token-team", "requestBody": { "required": true, "content": { "application\/json": { "schema": { "required": [ "is_build_server_fallback_enabled" ], "properties": { "is_build_server_fallback_enabled": { "type": "boolean", "description": "Whether deployments can fall back to the deployment server when no usable dedicated build server is available." } }, "type": "object" } } } }, "responses": { "200": { "description": "Updated team.", "content": { "application\/json": { "schema": { "$ref": "#\/components\/schemas\/Team" } } } }, "401": { "$ref": "#\/components\/responses\/401" }, "400": { "$ref": "#\/components\/responses\/400" }, "403": { "description": "Forbidden." }, "422": { "$ref": "#\/components\/responses\/422" } }, "security": [ { "bearerAuth": [] } ] } }, "\/team\/members": { "get": { "tags": [ "Teams" ], "summary": "Authenticated Team Members", "description": "Get members of the team bound to the API token.", "operationId": "get-token-team-members", "responses": { "200": { "description": "Members of the team bound to the API token.", "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. A schedule with stop_during_backup needs a token with the deploy permission.", "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, or the token needs the deploy permission for stop_during_backup." }, "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. A schedule with stop_during_backup needs a token with the deploy permission.", "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, or the token needs the deploy permission for stop_during_backup." }, "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. A schedule with stop_during_backup needs a token with the deploy permission.", "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, or the token needs the deploy permission for stop_during_backup." }, "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": [] } ] } }, "\/applications\/{uuid}\/storages\/{storage_uuid}\/backups\/run": { "post": { "tags": [ "Applications" ], "summary": "Run application storage backup", "description": "Queue an immediate volume backup for an application storage that has a schedule. Needs a token with the write and deploy permissions.", "operationId": "run-application-storage-backup", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "storage_uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Storage backup queued." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the write and deploy permissions." }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] } }, "\/databases\/{uuid}\/storages\/{storage_uuid}\/backups\/run": { "post": { "tags": [ "Databases" ], "summary": "Run database storage backup", "description": "Queue an immediate volume backup for a database storage that has a schedule. Needs a token with the write and deploy permissions.", "operationId": "run-database-storage-backup", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "storage_uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Storage backup queued." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the write and deploy permissions." }, "404": { "$ref": "#\/components\/responses\/404" } }, "security": [ { "bearerAuth": [] } ] } }, "\/services\/{uuid}\/storages\/{storage_uuid}\/backups\/run": { "post": { "tags": [ "Services" ], "summary": "Run service storage backup", "description": "Queue an immediate volume backup for a service storage that has a schedule. Needs a token with the write and deploy permissions.", "operationId": "run-service-storage-backup", "parameters": [ { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "storage_uuid", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Storage backup queued." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the write and deploy permissions." }, "404": { "$ref": "#\/components\/responses\/404" } }, "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 Coolify server. A cloud-init script or extra SSH key IDs need a token with the deploy permission.", "operationId": "create-vultr-server", "responses": { "201": { "description": "Vultr server created." }, "401": { "$ref": "#\/components\/responses\/401" }, "403": { "description": "The token needs the deploy permission for a cloud-init script or extra SSH keys." }, "422": { "description": "Validation failed." }, "429": { "description": "Vultr API rate limit exceeded." }, "502": { "$ref": "#\/components\/responses\/502" } }, "security": [ { "bearerAuth": [] } ] } } }, "components": { "schemas": { "DatabaseImportRequest": { "type": "object", "oneOf": [ { "required": [ "source", "upload_id" ], "properties": { "source": { "type": "string", "enum": [ "upload" ] }, "upload_id": { "type": "string", "format": "uuid" }, "dump_all": { "type": "boolean", "default": false }, "replace_existing": { "description": "Drop matching PostgreSQL objects before restoring a single-database archive.", "type": "boolean", "default": false }, "keep_owners": { "description": "Restore object owners and privileges from a single-database PostgreSQL archive. By default they are skipped, because the roles of another server usually do not exist.", "type": "boolean", "default": false }, "restore_mysql_users": { "description": "MySQL and MariaDB backups containing all databases: also restore the mysql system database (users, passwords, and privileges). By default the system databases are skipped, so the database keeps its own users and passwords.", "type": "boolean", "default": false }, "sqlite_database": { "description": "SQLite: the database file to restore into. Must be one of the database files. Defaults to the file named in the backup file name, else the first file.", "type": "string", "example": "app.db" } }, "type": "object", "additionalProperties": false }, { "required": [ "source", "s3_storage_uuid", "path" ], "properties": { "source": { "type": "string", "enum": [ "s3" ] }, "s3_storage_uuid": { "type": "string" }, "path": { "type": "string" }, "dump_all": { "type": "boolean", "default": false }, "replace_existing": { "description": "Drop matching PostgreSQL objects before restoring a single-database archive.", "type": "boolean", "default": false }, "keep_owners": { "description": "Restore object owners and privileges from a single-database PostgreSQL archive. By default they are skipped, because the roles of another server usually do not exist.", "type": "boolean", "default": false }, "restore_mysql_users": { "description": "MySQL and MariaDB backups containing all databases: also restore the mysql system database (users, passwords, and privileges). By default the system databases are skipped, so the database keeps its own users and passwords.", "type": "boolean", "default": false }, "sqlite_database": { "description": "SQLite: the database file to restore into. Must be one of the database files. Defaults to the file named in the backup file name, else the first file.", "type": "string", "example": "app.db" } }, "type": "object", "additionalProperties": false }, { "required": [ "source", "path" ], "properties": { "source": { "type": "string", "enum": [ "server" ] }, "path": { "type": "string", "example": "\/var\/backups\/database.sql.gz" }, "dump_all": { "type": "boolean", "default": false }, "replace_existing": { "description": "Drop matching PostgreSQL objects before restoring a single-database archive.", "type": "boolean", "default": false }, "keep_owners": { "description": "Restore object owners and privileges from a single-database PostgreSQL archive. By default they are skipped, because the roles of another server usually do not exist.", "type": "boolean", "default": false }, "restore_mysql_users": { "description": "MySQL and MariaDB backups containing all databases: also restore the mysql system database (users, passwords, and privileges). By default the system databases are skipped, so the database keeps its own users and passwords.", "type": "boolean", "default": false }, "sqlite_database": { "description": "SQLite: the database file to restore into. Must be one of the database files. Defaults to the file named in the backup file name, else the first file.", "type": "string", "example": "app.db" } }, "type": "object", "additionalProperties": false } ] }, "DatabaseImportStatus": { "properties": { "id": { "type": "integer" }, "status": { "type": "string", "enum": [ "queued", "in_progress", "finished", "error", "killed", "cancelled", "closed" ] }, "exit_code": { "type": [ "integer", "null" ] }, "output": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "finished_at": { "type": [ "string", "null" ], "format": "date-time" } }, "type": "object" }, "Database": { "description": "Standalone database. The fields that start with an engine name (for example postgres_ or redis_) are only returned for that engine. Passwords, connection URLs and init_scripts are only returned for tokens with the read:sensitive or root ability.", "properties": { "uuid": { "type": "string" }, "name": { "type": "string" }, "description": { "type": [ "string", "null" ] }, "database_type": { "type": "string", "enum": [ "standalone-postgresql", "standalone-redis", "standalone-mongodb", "standalone-mysql", "standalone-mariadb", "standalone-keydb", "standalone-dragonfly", "standalone-clickhouse", "standalone-sqlite" ] }, "image": { "type": "string" }, "status": { "description": "Container status and health, for example running:healthy or exited:unhealthy.", "type": "string" }, "server_status": { "description": "True when the server of the database is reachable and usable.", "type": "boolean" }, "environment_id": { "type": "integer" }, "environment": { "$ref": "#\/components\/schemas\/Environment", "description": "Only returned by GET \/databases\/{uuid}. Includes the project." }, "destination_id": { "type": "integer" }, "destination_type": { "type": "string" }, "destination": { "description": "Docker network destination of the database, with its server.", "properties": { "uuid": { "type": "string" }, "name": { "type": "string" }, "network": { "type": "string" }, "server_id": { "type": "integer" }, "server": { "$ref": "#\/components\/schemas\/Server" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } }, "type": "object" }, "is_public": { "description": "Not returned for SQLite.", "type": "boolean" }, "public_port": { "description": "Not returned for SQLite.", "type": [ "integer", "null" ] }, "public_port_timeout": { "description": "Proxy timeout of the public port in seconds. Not returned for SQLite.", "type": [ "integer", "null" ] }, "ports_mappings": { "description": "Comma-separated host:container port mappings. Not returned for SQLite.", "type": [ "string", "null" ] }, "enable_ssl": { "description": "Not returned for ClickHouse and SQLite.", "type": "boolean" }, "ssl_mode": { "description": "PostgreSQL, MongoDB and MySQL only.", "type": [ "string", "null" ] }, "internal_db_url": { "description": "Connection URL inside the Docker network. Contains the password. Not returned for SQLite.", "type": [ "string", "null" ] }, "external_db_url": { "description": "Public connection URL, when the database is public. Contains the password. Not returned for SQLite.", "type": [ "string", "null" ] }, "init_scripts": { "description": "PostgreSQL only.", "type": [ "array", "null" ], "items": { "properties": { "index": { "type": "integer" }, "filename": { "type": "string" }, "content": { "type": "string" } }, "type": "object" } }, "custom_docker_run_options": { "type": [ "string", "null" ] }, "is_log_drain_enabled": { "type": "boolean" }, "is_include_timestamps": { "description": "Not returned for MariaDB.", "type": "boolean" }, "include_coolify_default_variables": { "type": "boolean" }, "redact_all_env_values_in_logs": { "type": "boolean" }, "health_check_enabled": { "type": "boolean" }, "health_check_interval": { "type": "integer" }, "health_check_timeout": { "type": "integer" }, "health_check_retries": { "type": "integer" }, "health_check_start_period": { "type": "integer" }, "limits_memory": { "type": "string" }, "limits_memory_swap": { "type": "string" }, "limits_memory_swappiness": { "type": "integer" }, "limits_memory_reservation": { "type": "string" }, "limits_cpus": { "type": "string" }, "limits_cpuset": { "type": [ "string", "null" ] }, "limits_cpu_shares": { "type": "integer" }, "config_hash": { "description": "Internal hash that Coolify uses to find configuration changes that need a restart. It changes only when the database starts, so do not use it to compare configurations.", "type": [ "string", "null" ] }, "restart_count": { "type": "integer" }, "last_restart_at": { "type": [ "string", "null" ], "format": "date-time" }, "last_restart_type": { "type": [ "string", "null" ] }, "last_online_at": { "type": [ "string", "null" ] }, "started_at": { "type": [ "string", "null" ], "format": "date-time" }, "backup_configs": { "description": "Only returned by GET \/databases. The scheduled backups of the database, as returned by GET \/databases\/{uuid}\/backups.", "type": "array", "items": { "type": "object" } }, "postgres_user": { "type": "string" }, "postgres_password": { "type": "string", "format": "password" }, "postgres_db": { "type": "string" }, "postgres_initdb_args": { "type": [ "string", "null" ] }, "postgres_host_auth_method": { "type": [ "string", "null" ] }, "postgres_conf": { "type": [ "string", "null" ] }, "redis_password": { "type": "string", "format": "password" }, "redis_conf": { "type": [ "string", "null" ] }, "mongo_initdb_root_username": { "type": "string" }, "mongo_initdb_root_password": { "type": "string", "format": "password" }, "mongo_initdb_database": { "type": "string" }, "mongo_conf": { "type": [ "string", "null" ] }, "mysql_user": { "type": "string" }, "mysql_password": { "type": "string", "format": "password" }, "mysql_root_password": { "type": "string", "format": "password" }, "mysql_database": { "type": "string" }, "mysql_conf": { "type": [ "string", "null" ] }, "mariadb_user": { "type": "string" }, "mariadb_password": { "type": "string", "format": "password" }, "mariadb_root_password": { "type": "string", "format": "password" }, "mariadb_database": { "type": "string" }, "mariadb_conf": { "type": [ "string", "null" ] }, "keydb_password": { "type": "string", "format": "password" }, "keydb_conf": { "type": [ "string", "null" ] }, "dragonfly_password": { "type": "string", "format": "password" }, "clickhouse_admin_user": { "type": "string" }, "clickhouse_admin_password": { "type": "string", "format": "password" }, "clickhouse_db": { "type": "string" }, "sqlite_databases": { "description": "Comma-separated SQLite database file names.", "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "deleted_at": { "type": [ "string", "null" ], "format": "date-time" } }, "type": "object" }, "ApplicationPreview": { "properties": { "uuid": { "type": "string" }, "pull_request_id": { "type": "integer" }, "pull_request_html_url": { "type": [ "string", "null" ] }, "git_type": { "type": [ "string", "null" ] }, "status": { "type": "string" }, "domains": { "type": [ "string", "null" ] }, "docker_compose_domains": { "type": [ "array", "null" ], "items": { "properties": { "name": { "type": "string" }, "domain": { "type": [ "string", "null" ] }, "redirect": { "type": [ "string", "null" ] } }, "type": "object" } }, "domain_port_overrides": { "type": [ "object", "null" ] }, "docker_registry_image_tag": { "type": [ "string", "null" ] }, "last_online_at": { "type": [ "string", "null" ] }, "created_at": { "type": "string" }, "updated_at": { "type": "string" } }, "type": "object" }, "ApplicationPreviewDeployment": { "properties": { "message": { "type": "string" }, "deployment_uuid": { "type": [ "string", "null" ] }, "preview": { "$ref": "#\/components\/schemas\/ApplicationPreview" } }, "type": "object" }, "VolumeBackupScheduleRequest": { "required": [ "frequency" ], "properties": { "frequency": { "type": "string", "example": "0 2 * * *", "maxLength": 255 }, "enabled": { "type": "boolean", "default": true }, "save_s3": { "type": "boolean", "default": false }, "disable_local_backup": { "type": "boolean", "default": false }, "stop_during_backup": { "description": "Stop the resource containers during the backup. Needs a token with the deploy permission.", "type": "boolean", "default": false }, "s3_storage_uuid": { "description": "Primary S3 storage UUID. Sent without s3_storage_uuids, it selects this storage as the only destination.", "type": [ "string", "null" ] }, "s3_storage_uuids": { "description": "UUIDs of every S3 storage the backup is uploaded to. When s3_storage_uuid is also sent, it must be in this list and becomes the primary destination; otherwise the first entry is the primary destination. save_s3 requires at least one destination.", "type": "array", "items": { "type": "string" } }, "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": 36000, "maximum": 36000, "minimum": 60 }, "missing_backup_notification_days": { "description": "Alert after this many days without an execution; 0 disables alerts", "type": "integer", "default": 0, "maximum": 365, "minimum": 0 } }, "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", "missing_backup_notification_days" ], "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": { "description": "Primary S3 destination.", "type": [ "string", "null" ] }, "s3_storage_uuids": { "description": "Every S3 destination, primary first.", "type": "array", "items": { "type": "string" } }, "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" }, "missing_backup_notification_days": { "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." }, "noindex_domains": { "type": "array", "items": { "type": "string" }, "nullable": true, "description": "The subset of the application domains served with an X-Robots-Tag: noindex, nofollow response header." }, "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." }, "max_restart_count": { "type": "integer", "description": "Maximum container restart count before stopping." }, "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 Coolify 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" }, "http_basic_auth_hash_algorithm": { "type": "string", "enum": [ "bcrypt", "argon2id" ], "description": "Hash algorithm for the HTTP Basic Authentication password. Argon2id needs the Caddy proxy, version 2.11 or newer." }, "http_basic_auth_bcrypt_cost": { "type": "integer", "minimum": 4, "maximum": 14, "description": "Bcrypt cost for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_memory_cost": { "type": "integer", "minimum": 8192, "maximum": 262144, "description": "Argon2id memory cost in KiB for the HTTP Basic Authentication password." }, "http_basic_auth_argon2id_time_cost": { "type": "integer", "minimum": 1, "maximum": 12, "description": "Argon2id time cost (iterations) for the HTTP Basic Authentication password." }, "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" }, "parent_deployment_uuid": { "type": "string", "nullable": true }, "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" }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver override. Null uses the server setting, \"none\" uses no resolver." }, "is_stripprefix_enabled": { "type": "boolean" }, "is_permanent_redirect_enabled": { "type": "boolean", "description": "Use permanent (301\/308) instead of temporary (302\/307) proxy redirects." }, "connect_to_docker_network": { "type": "boolean" }, "custom_internal_name": { "type": "string", "nullable": true }, "custom_container_name_prefix": { "type": "string", "nullable": true }, "is_container_label_escape_enabled": { "type": "boolean" }, "is_env_sorting_enabled": { "type": "boolean" }, "include_coolify_default_variables": { "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" }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Hide every environment variable value in logs. When false, only locked values are hidden." }, "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 }, "rolling_update_drain_seconds": { "type": "integer", "description": "Seconds to wait after the new container is healthy before old containers stop during a rolling update. 0 turns the wait off." } }, "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", "description": "If true, the saved value is hidden in the UI and API responses. MCP never returns environment variable values." }, "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" }, "backup_compression_cpu_percentage": { "type": "integer" }, "dynamic_timeout": { "type": "integer" }, "force_disabled": { "type": "boolean" }, "force_server_cleanup": { "type": "boolean" }, "server_role": { "type": "string", "enum": [ "deployment", "build", "both" ] }, "is_build_server": { "type": "boolean", "deprecated": true, "readOnly": true, "description": "Deprecated: use server_role instead. true when server_role is build." }, "is_cloudflare_tunnel": { "type": "boolean" }, "is_jump_server": { "type": "boolean" }, "is_logdrain_axiom_enabled": { "type": "boolean" }, "is_logdrain_cloudwatch_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_traffic_analytics_enabled": { "type": "boolean" }, "traffic_topn": { "type": "integer" }, "traffic_sample_threshold": { "type": "integer" }, "traffic_retention_1h_days": { "type": "integer" }, "traffic_retention_1d_days": { "type": "integer" }, "is_geoip_enabled": { "type": "boolean" }, "geoip_refresh_days": { "type": "integer" }, "traffic_ip_mode": { "type": "string", "enum": [ "full", "anonymized", "off" ] }, "traefik_certificate_resolver": { "type": "string", "nullable": true, "description": "Traefik certificate resolver for generated HTTPS routers. Null when the proxy uses its own certificates." }, "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_axiom_domain": { "type": "string", "description": "Base domain of the Axiom edge deployment, for example us-east-1.aws.edge.axiom.co or eu-central-1.aws.edge.axiom.co." }, "logdrain_cloudwatch_region": { "type": "string" }, "logdrain_cloudwatch_group": { "type": "string" }, "logdrain_cloudwatch_stream_prefix": { "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." }, "docker_version": { "type": "string", "nullable": true, "description": "Detected Docker Engine version on the server." }, "docker_version_checked_at": { "type": "string", "nullable": true, "description": "When Docker Engine version was last detected." }, "compose_version": { "type": "string", "nullable": true, "description": "Detected Docker Compose plugin version on the server." }, "compose_version_checked_at": { "type": "string", "nullable": true, "description": "When Docker Compose version was last detected." } }, "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 Coolify." }, "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." }, "redact_all_env_values_in_logs": { "type": "boolean", "description": "Hide every environment variable value in logs. When false, only locked values are hidden." }, "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." }, "is_build_server_fallback_enabled": { "type": "boolean", "description": "Whether deployments can fall back to the deployment server when no usable dedicated build server is available." }, "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" } } } }, "502": { "description": "The cloud provider API rejected the request.", "content": { "application\/json": { "schema": { "properties": { "message": { "type": "string", "example": "Failed to create Hetzner server. The Hetzner API token does not have permission for this request. Use a token with read and write access." }, "provider_status": { "description": "The HTTP status from the cloud provider API.", "type": "integer", "example": 403 }, "provider_error_code": { "description": "The error code from the cloud provider API, if it has one.", "type": [ "string", "null" ], "example": "forbidden" } }, "type": "object" } } } } }, "securitySchemes": { "bearerAuth": { "type": "http", "description": "Go to `Keys & Tokens` \/ `API tokens` and create a new token. Use the token as the bearer token.", "scheme": "bearer" } } }, "tags": [ { "name": "Applications", "description": "Applications" }, { "name": "Secret Managers", "description": "Secret Managers" }, { "name": "Audit Events", "description": "Audit Events" }, { "name": "Cloud-init Scripts", "description": "Cloud-init Scripts" }, { "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": "GitLab Apps", "description": "GitLab Apps" }, { "name": "Hetzner", "description": "Hetzner" }, { "name": "Hostinger", "description": "Hostinger" }, { "name": "Settings", "description": "Settings" }, { "name": "Notifications", "description": "Notifications" }, { "name": "Projects", "description": "Projects" }, { "name": "Resources", "description": "Resources" }, { "name": "S3 Storages", "description": "S3 Storages" }, { "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": "Shared Environment Variables", "description": "Shared Environment Variables" }, { "name": "Tags", "description": "Tags" }, { "name": "Teams", "description": "Teams" }, { "name": "Vultr", "description": "Vultr" } ] }