Files
coolify/openapi.yaml
T
Andras BacsaiandClaude Opus 5.5 da7779d061 fix(env): keep locked variables locked but allow a new value
A locked variable used by Docker Compose could not be changed, unlocked,
or deleted, so a lock by mistake had no fix in the UI. A locked value can
now be replaced without showing it. The lock is permanent in the UI, the
API, and MCP, and Lock asks for confirmation.

Closes #6803

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:42:52 +01:00

18301 lines
623 KiB
YAML

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:
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.'
git_https_username:
type: string
nullable: true
description: 'Username for HTTPS access to a private repository on a custom Git host (not github.com).'
git_https_password:
type: string
nullable: true
description: 'Password or access token for HTTPS access to a private repository on a custom Git host (not github.com). It is stored encrypted and never returned.'
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.'
is_auto_cancel_queued_deployments_enabled:
type: boolean
description: 'Cancel older queued webhook deployments when a newer push arrives. Default: true.'
is_auto_cancel_building_deployments_enabled:
type: boolean
description: 'Also stop an older webhook deployment that is still building when a newer push arrives. A deployment that already started to replace containers always finishes. This also cancels queued webhook deployments. Default: false.'
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.'
is_auto_cancel_queued_deployments_enabled:
type: boolean
description: 'Cancel older queued webhook deployments when a newer push arrives. Default: true.'
is_auto_cancel_building_deployments_enabled:
type: boolean
description: 'Also stop an older webhook deployment that is still building when a newer push arrives. A deployment that already started to replace containers always finishes. This also cancels queued webhook deployments. Default: false.'
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.'
is_auto_cancel_queued_deployments_enabled:
type: boolean
description: 'Cancel older queued webhook deployments when a newer push arrives. Default: true.'
is_auto_cancel_building_deployments_enabled:
type: boolean
description: 'Also stop an older webhook deployment that is still building when a newer push arrives. A deployment that already started to replace containers always finishes. This also cancels queued webhook deployments. Default: false.'
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.'
is_auto_cancel_queued_deployments_enabled:
type: boolean
description: 'Cancel older queued webhook deployments when a newer push arrives. Default: true.'
is_auto_cancel_building_deployments_enabled:
type: boolean
description: 'Also stop an older webhook deployment that is still building when a newer push arrives. A deployment that already started to replace containers always finishes. This also cancels queued webhook deployments. Default: false.'
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.'
is_auto_cancel_queued_deployments_enabled:
type: boolean
description: 'Cancel older queued webhook deployments when a newer push arrives. Default: true.'
is_auto_cancel_building_deployments_enabled:
type: boolean
description: 'Also stop an older webhook deployment that is still building when a newer push arrives. A deployment that already started to replace containers always finishes. This also cancels queued webhook deployments. Default: false.'
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.'
git_https_username:
type: string
nullable: true
description: 'Username for HTTPS access to a private repository on a custom Git host. Send null to remove it.'
git_https_password:
type: string
nullable: true
description: 'Password or access token for HTTPS access to a private repository on a custom Git host. It is stored encrypted and never returned. Send null or an empty string to remove the credentials.'
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.'
is_auto_cancel_queued_deployments_enabled:
type: boolean
description: 'Cancel older queued webhook deployments when a newer push arrives. Default: true.'
is_auto_cancel_building_deployments_enabled:
type: boolean
description: 'Also stop an older webhook deployment that is still building when a newer push arrives. A deployment that already started to replace containers always finishes. This also cancels queued webhook deployments. Default: false.'
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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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 — 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 — 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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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
-
name: cancel_previous
in: query
description: 'Cancel the older webhook, API, and MCP deployments of the same application, pull request, and server. `queued` cancels the ones that wait in the queue. `building` also stops the ones that are still building; a deployment that already started to replace containers always finishes. Manual, restart, and rollback deployments are never cancelled. Default: `none`.'
schema:
type: string
default: none
enum:
- none
- queued
- building
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: []
/dns/zones:
get:
tags:
- DNS
summary: 'List DNS Zones'
description: 'List the DNS zones that the Cloudflare tokens of the team can access. Requires admin or owner.'
operationId: list-dns-zones
responses:
'200':
description: 'DNS zones.'
content:
application/json:
schema:
type: array
items:
properties: { zone: { type: string }, account_name: { type: [string, 'null'] }, integration_token_uuid: { type: string }, integration_token_name: { type: string }, managed_records_count: { type: integer } }
type: object
'401':
$ref: '#/components/responses/401'
'403':
description: 'Not an admin or owner of the team.'
security:
-
bearerAuth: []
'/applications/{uuid}/dns':
get:
tags:
- DNS
summary: 'Get Application DNS'
description: 'DNS providers and managed DNS records for the domains of an application.'
operationId: get-application-dns
parameters:
-
name: uuid
in: path
description: 'Application UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'DNS status.'
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceDnsStatus'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No access to the application.'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
post:
tags:
- DNS
summary: 'Create Application DNS Record'
description: 'Create a DNS record at Cloudflare that points a domain of the application to its server. An existing record with the same address is adopted.'
operationId: create-application-dns-record
parameters:
-
name: uuid
in: path
description: 'Application UUID.'
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateDnsRecordRequest'
responses:
'201':
description: 'DNS record created.'
content:
application/json:
schema:
properties:
record: { $ref: '#/components/schemas/ManagedDnsRecord' }
type: object
'400':
description: 'Cloudflare rejected the change.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the application.'
'404':
$ref: '#/components/responses/404'
'409':
description: 'Another record uses the hostname. Replace it with the replace endpoint.'
content:
application/json:
schema:
$ref: '#/components/schemas/DnsRecordConflict'
'422':
$ref: '#/components/responses/422'
'423':
description: 'Another DNS change for the hostname is in progress. Try again.'
security:
-
bearerAuth: []
'/services/{uuid}/dns':
get:
tags:
- DNS
summary: 'Get Service DNS'
description: 'DNS providers and managed DNS records for the domains of a service.'
operationId: get-service-dns
parameters:
-
name: uuid
in: path
description: 'Service UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'DNS status.'
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceDnsStatus'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No access to the service.'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
post:
tags:
- DNS
summary: 'Create Service DNS Record'
description: 'Create a DNS record at Cloudflare that points a domain of the service to its server. An existing record with the same address is adopted.'
operationId: create-service-dns-record
parameters:
-
name: uuid
in: path
description: 'Service UUID.'
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateDnsRecordRequest'
responses:
'201':
description: 'DNS record created.'
content:
application/json:
schema:
properties:
record: { $ref: '#/components/schemas/ManagedDnsRecord' }
type: object
'400':
description: 'Cloudflare rejected the change.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the service.'
'404':
$ref: '#/components/responses/404'
'409':
description: 'Another record uses the hostname. Replace it with the replace endpoint.'
content:
application/json:
schema:
$ref: '#/components/schemas/DnsRecordConflict'
'422':
$ref: '#/components/responses/422'
'423':
description: 'Another DNS change for the hostname is in progress. Try again.'
security:
-
bearerAuth: []
'/applications/{uuid}/dns/replace':
post:
tags:
- DNS
summary: 'Replace Application DNS Record'
description: 'Point the conflicting record from a 409 create response to the server of the application.'
operationId: replace-application-dns-record
parameters:
-
name: uuid
in: path
description: 'Application UUID.'
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReplaceDnsRecordRequest'
responses:
'200':
description: 'DNS record replaced.'
content:
application/json:
schema:
properties:
record: { $ref: '#/components/schemas/ManagedDnsRecord' }
type: object
'400':
description: 'Cloudflare rejected the change, or the record changed since the conflict.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the application.'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
'423':
description: 'Another DNS change for the hostname is in progress. Try again.'
security:
-
bearerAuth: []
'/services/{uuid}/dns/replace':
post:
tags:
- DNS
summary: 'Replace Service DNS Record'
description: 'Point the conflicting record from a 409 create response to the server of the service.'
operationId: replace-service-dns-record
parameters:
-
name: uuid
in: path
description: 'Service UUID.'
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReplaceDnsRecordRequest'
responses:
'200':
description: 'DNS record replaced.'
content:
application/json:
schema:
properties:
record: { $ref: '#/components/schemas/ManagedDnsRecord' }
type: object
'400':
description: 'Cloudflare rejected the change, or the record changed since the conflict.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the service.'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
'423':
description: 'Another DNS change for the hostname is in progress. Try again.'
security:
-
bearerAuth: []
'/applications/{uuid}/dns/{hostname}':
delete:
tags:
- DNS
summary: 'Release Application DNS Record'
description: 'Release the managed DNS record of a hostname that the application no longer uses. Coolify deletes the record at Cloudflare only when it created the record, the record did not change, and no other resource uses the hostname. Removing a domain through the API already queues this release; use this endpoint to retry it or to keep the record.'
operationId: release-application-dns-record
parameters:
-
name: uuid
in: path
description: 'Application UUID.'
required: true
schema:
type: string
-
name: hostname
in: path
description: 'Hostname of the record.'
required: true
schema:
type: string
-
name: delete_record
in: query
description: 'Delete the record at Cloudflare. Default: true.'
required: false
schema:
type: boolean
responses:
'200':
description: 'Record released.'
content:
application/json:
schema:
properties:
result: { type: string, enum: [deleted, already_gone, not_owned, changed_externally, kept] }
message: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the application.'
'404':
description: 'No managed record of the application for the hostname.'
'422':
description: 'The application still uses the hostname.'
'423':
description: 'Another DNS change for the hostname is in progress. Try again.'
'502':
description: 'Cloudflare did not respond. Try again.'
security:
-
bearerAuth: []
'/services/{uuid}/dns/{hostname}':
delete:
tags:
- DNS
summary: 'Release Service DNS Record'
description: 'Release the managed DNS record of a hostname that the service no longer uses. Coolify deletes the record at Cloudflare only when it created the record, the record did not change, and no other resource uses the hostname. Removing a domain through the API already queues this release; use this endpoint to retry it or to keep the record.'
operationId: release-service-dns-record
parameters:
-
name: uuid
in: path
description: 'Service UUID.'
required: true
schema:
type: string
-
name: hostname
in: path
description: 'Hostname of the record.'
required: true
schema:
type: string
-
name: delete_record
in: query
description: 'Delete the record at Cloudflare. Default: true.'
required: false
schema:
type: boolean
responses:
'200':
description: 'Record released.'
content:
application/json:
schema:
properties:
result: { type: string, enum: [deleted, already_gone, not_owned, changed_externally, kept] }
message: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the service.'
'404':
description: 'No managed record of the service for the hostname.'
'422':
description: 'The service still uses the hostname.'
'423':
description: 'Another DNS change for the hostname is in progress. Try again.'
'502':
description: 'Cloudflare did not respond. Try again.'
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:
get:
tags:
- 'Integration Tokens'
summary: 'List Integration Tokens'
description: 'List the integration tokens (Cloudflare, Doppler, Infisical, Vault) of the team. Requires admin or owner.'
operationId: list-integration-tokens
responses:
'200':
description: 'Integration tokens.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/IntegrationToken'
'401':
$ref: '#/components/responses/401'
'403':
description: 'Not an admin or owner of the team.'
security:
-
bearerAuth: []
post:
tags:
- 'Integration Tokens'
summary: 'Create Integration Token'
description: 'Create and validate a Cloudflare, Doppler, Infisical, or Vault integration token. A Cloudflare token also gets its DNS zones; it is not stored when the zones cannot be read. Requires admin or owner.'
operationId: create-secret-manager-integration-token
requestBody:
required: true
content:
application/json:
schema:
required:
- provider
- name
- token
properties:
provider:
type: string
enum: [cloudflare, doppler, infisical, vault]
name:
type: string
token:
type: string
capabilities:
description: 'Cloudflare: dns, tunnel (tunnel needs dns). Default: dns. Secret managers: secrets.'
type: array
items: { type: string, enum: [dns, tunnel, secrets] }
automatic_dns:
description: 'Cloudflare only. Create DNS records when a domain is added. Default: true.'
type: boolean
proxied_dns:
description: 'Cloudflare only. Create new records proxied (orange cloud). Default: false.'
type: boolean
metadata:
description: 'Secret managers only: base_url, client_id (Infisical), namespace (Vault), timeout.'
type: object
type: object
responses:
'201':
description: 'Integration token created.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'400':
description: 'The provider rejected the token, or the Cloudflare zones could not be read.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'Not an admin or owner of the team.'
'422':
$ref: '#/components/responses/422'
'502':
description: 'Coolify could not connect to the provider API.'
security:
-
bearerAuth: []
'/security/integration-tokens/{uuid}':
get:
tags:
- 'Integration Tokens'
summary: 'Get Integration Token'
description: 'Get an integration token of the team by UUID. Requires admin or owner.'
operationId: get-integration-token-by-uuid
parameters:
-
name: uuid
in: path
description: 'Integration token UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'Integration token.'
content:
application/json:
schema:
$ref: '#/components/schemas/IntegrationToken'
'401':
$ref: '#/components/responses/401'
'403':
description: 'Not an admin or owner of the team.'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
delete:
tags:
- 'Integration Tokens'
summary: 'Delete Integration Token'
description: 'Delete an integration token. A token that a resource uses as secret manager source, or that manages DNS records, cannot be deleted. Requires admin or owner.'
operationId: delete-integration-token-by-uuid
parameters:
-
name: uuid
in: path
description: 'Integration token UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'Integration token deleted.'
content:
application/json:
schema:
properties:
message: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'403':
description: 'Not an admin or owner of the team.'
'404':
$ref: '#/components/responses/404'
'409':
description: 'The token is still in use.'
security:
-
bearerAuth: []
patch:
tags:
- 'Integration Tokens'
summary: 'Update Integration Token'
description: 'Rename an integration token, rotate its secret, or change its capabilities and settings. Omitted fields keep their value. The provider checks the token again when the secret, the capabilities, or the settings change. Requires admin or owner.'
operationId: update-integration-token-by-uuid
parameters:
-
name: uuid
in: path
description: 'Integration token UUID.'
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
properties:
name:
type: string
token:
description: 'New secret. Required when base_url, client_id (Infisical), or namespace (Vault) changes.'
type: string
capabilities:
type: array
items: { type: string, enum: [dns, tunnel, secrets] }
automatic_dns:
description: 'Cloudflare only.'
type: boolean
proxied_dns:
description: 'Cloudflare only.'
type: boolean
metadata:
description: 'Secret managers only. Fields to change: base_url, client_id, namespace, timeout. An empty value removes a field.'
type: object
type: object
responses:
'200':
description: 'Integration token updated.'
content:
application/json:
schema:
$ref: '#/components/schemas/IntegrationToken'
'400':
description: 'The provider rejected the token, or the Cloudflare zones could not be read.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'Not an admin or owner of the team.'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
'502':
description: 'Coolify could not connect to the provider API.'
security:
-
bearerAuth: []
'/security/integration-tokens/{uuid}/sync-zones':
post:
tags:
- 'Integration Tokens'
summary: 'Sync Cloudflare Zones'
description: 'Read the DNS zones that a Cloudflare token can access again. Requires admin or owner.'
operationId: sync-integration-token-zones
parameters:
-
name: uuid
in: path
description: 'Integration token UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'Zones synchronized.'
content:
application/json:
schema:
properties:
zones_count: { type: integer }
type: object
'400':
description: 'Cloudflare did not return the zones.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'Not an admin or owner of the team.'
'404':
$ref: '#/components/responses/404'
'422':
description: 'The token is not a Cloudflare token.'
'502':
description: 'Coolify could not connect to the Cloudflare API.'
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-<engine> 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 }, skip_tls_verification: { 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.'
skip_tls_verification:
type: boolean
description: 'Do not check the TLS certificate of the endpoint. Use only for endpoints with a self-signed or private CA certificate. Default: false.'
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 }
skip_tls_verification: { 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.'
skip_tls_verification:
type: boolean
description: 'Do not check the TLS certificate of the endpoint. Use only for endpoints with a self-signed or private CA certificate. Default: false.'
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
use_shell:
type: boolean
description: 'Run the command with `sh -c` in the container. Set it to false for containers without a shell: the command is then split into arguments and run directly, without shell features such as variables, pipes, or redirects.'
default: true
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
use_shell:
type: boolean
description: 'Run the command with `sh -c` in the container. Set it to false for containers without a shell: the command is then split into arguments and run directly, without shell features such as variables, pipes, or redirects.'
default: true
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
use_shell:
type: boolean
description: 'Run the command with `sh -c` in the container. Set it to false for containers without a shell: the command is then split into arguments and run directly, without shell features such as variables, pipes, or redirects.'
default: true
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
use_shell:
type: boolean
description: 'Run the command with `sh -c` in the container. Set it to false for containers without a shell: the command is then split into arguments and run directly, without shell features such as variables, pipes, or redirects.'
default: true
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: []
'/{resource_type}/{uuid}/secret-manager':
get:
tags:
- 'Secret Managers'
summary: 'Get Secret Manager Source'
description: 'The secret manager source of an application, service, or database, and the secret manager tokens of its team that can be linked.'
operationId: get-secret-manager-source
parameters:
-
name: resource_type
in: path
description: 'Resource type.'
required: true
schema:
type: string
enum:
- applications
- services
- databases
-
name: uuid
in: path
description: 'Resource UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'Secret manager source.'
content:
application/json:
schema:
$ref: '#/components/schemas/SecretManagerSource'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No access to the resource.'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
delete:
tags:
- 'Secret Managers'
summary: 'Remove Secret Manager Source'
description: 'Remove the secret manager source. Existing {{vault.*}} variables stay and fail the next deployment until they are removed.'
operationId: remove-secret-manager-source
parameters:
-
name: resource_type
in: path
description: 'Resource type.'
required: true
schema:
type: string
enum:
- applications
- services
- databases
-
name: uuid
in: path
description: 'Resource UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'Source removed.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the resource.'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
patch:
tags:
- 'Secret Managers'
summary: 'Set Secret Manager Source'
description: 'Link a secret manager token of the team to an application, service, or database, or change the token or settings of the link. References resolve at the next deployment.'
operationId: set-secret-manager-source
parameters:
-
name: resource_type
in: path
description: 'Resource type.'
required: true
schema:
type: string
enum:
- applications
- services
- databases
-
name: uuid
in: path
description: 'Resource UUID.'
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
required:
- integration_token_uuid
properties:
integration_token_uuid:
type: string
settings:
description: 'Doppler service account: project, config. Infisical: project_id, environment, secret_path. Vault: mount, path.'
type: object
type: object
responses:
'200':
description: 'Secret manager configured.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the resource.'
'404':
$ref: '#/components/responses/404'
'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. Same as Set Secret Manager Source with resource_type applications.'
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'
'403':
description: 'No write access to the resource.'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/{resource_type}/{uuid}/secret-manager/keys':
get:
tags:
- 'Secret Managers'
summary: 'List Secret Manager Keys'
description: 'Key names of the secrets in the linked source. Values are never returned. Requires write access, like the resource page, because the stored secret is sent to the secret manager.'
operationId: list-secret-manager-keys
parameters:
-
name: resource_type
in: path
description: 'Resource type.'
required: true
schema:
type: string
enum:
- applications
- services
- databases
-
name: uuid
in: path
description: 'Resource UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'Key names.'
content:
application/json:
schema:
properties:
keys: { type: array, items: { type: string } }
type: object
'400':
description: 'The secret manager did not return the keys.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the resource.'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/{resource_type}/{uuid}/secret-manager/references':
post:
tags:
- 'Secret Managers'
summary: 'Add Secret Manager Reference'
description: 'Add a {{vault.KEY}} environment variable for one key of the linked source.'
operationId: add-secret-manager-reference
parameters:
-
name: resource_type
in: path
description: 'Resource type.'
required: true
schema:
type: string
enum:
- applications
- services
- databases
-
name: uuid
in: path
description: 'Resource UUID.'
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
required:
- key
properties:
key:
type: string
type: object
responses:
'201':
description: 'Variable added.'
'400':
description: 'The secret manager did not return the keys.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the resource.'
'404':
$ref: '#/components/responses/404'
'422':
description: 'Not a key of the source, not a valid variable name, or the variable exists.'
security:
-
bearerAuth: []
'/{resource_type}/{uuid}/secret-manager/import':
post:
tags:
- 'Secret Managers'
summary: 'Import Secret Manager References'
description: 'Add a {{vault.KEY}} environment variable for every key of the linked source that has no variable yet. Keys that are not valid variable names are skipped.'
operationId: import-secret-manager-references
parameters:
-
name: resource_type
in: path
description: 'Resource type.'
required: true
schema:
type: string
enum:
- applications
- services
- databases
-
name: uuid
in: path
description: 'Resource UUID.'
required: true
schema:
type: string
responses:
'200':
description: 'Import result.'
content:
application/json:
schema:
properties:
imported: { type: array, items: { type: string } }
skipped: { type: array, items: { type: string } }
type: object
'400':
description: 'The secret manager did not return the keys.'
'401':
$ref: '#/components/responses/401'
'403':
description: 'No write access to the resource.'
'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. Needs a token with the write and deploy permissions.'
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 whose main destination is on the server. Applications that use the server only as an additional destination are not deleted. They are removed from the server and keep running on their other servers. 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_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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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_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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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_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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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 — 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:
$ref: '#/components/schemas/SharedEnvironmentVariableCreateRequest'
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SharedEnvironmentVariableUpdateRequest'
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SharedEnvironmentVariableCreateRequest'
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SharedEnvironmentVariableUpdateRequest'
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SharedEnvironmentVariableCreateRequest'
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SharedEnvironmentVariableUpdateRequest'
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SharedEnvironmentVariableCreateRequest'
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SharedEnvironmentVariableUpdateRequest'
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
ManagedDnsRecord:
description: 'DNS record that Coolify manages at a DNS provider.'
properties:
uuid:
type: string
hostname:
type: string
type:
type: string
enum:
- A
- AAAA
address:
description: 'Server IP address that the record points to.'
type: string
owned:
description: 'Coolify created the record, so it can delete it.'
type: boolean
integration_token_uuid:
type: string
type: object
ResourceDnsStatus:
description: 'DNS providers and managed records for the domains of a resource.'
properties:
default_address:
description: 'Address of a new record when none is given: the first public server address. Null when the server has no public address.'
type:
- string
- 'null'
public_addresses:
type: array
items:
type: string
hostnames:
type: array
items:
properties:
hostname:
type: string
providers:
type: array
items:
properties: { integration_token_uuid: { type: string }, integration_token_name: { type: string }, zone: { type: string }, automatic_dns: { type: boolean }, proxied_dns: { type: boolean } }
type: object
records:
type: array
items:
$ref: '#/components/schemas/ManagedDnsRecord'
type: object
type: object
CreateDnsRecordRequest:
required:
- hostname
properties:
hostname:
description: 'A saved domain of the resource.'
type: string
integration_token_uuid:
description: 'Cloudflare token to use. Required when several tokens manage the zone of the hostname.'
type: string
address:
description: 'A public address of the server. Default: default_address of the DNS status.'
type: string
type: object
ReplaceDnsRecordRequest:
required:
- hostname
- record_id
- current
properties:
hostname:
description: 'A saved domain of the resource.'
type: string
integration_token_uuid:
description: 'Cloudflare token to use. Required when several tokens manage the zone of the hostname.'
type: string
record_id:
description: 'conflict.record_id from the 409 response of the create request.'
type: string
current:
description: 'conflict.current from the 409 response. The record is replaced only when it still has this value.'
type: string
address:
description: 'A public address of the server. Default: default_address of the DNS status.'
type: string
type: object
DnsRecordConflict:
properties:
message:
type: string
conflict:
properties:
record_id:
type: string
current:
type: string
proposed:
type: string
type: object
type: object
IntegrationToken:
description: 'Integration token. The secret is never returned.'
properties:
uuid:
type: string
name:
type: string
provider:
type: string
enum:
- cloudflare
- doppler
- infisical
- vault
capabilities:
type: array
items:
type: string
enum:
- dns
- tunnel
- secrets
automatic_dns:
description: 'Cloudflare only. Create DNS records when a domain is added.'
type: boolean
proxied_dns:
description: 'Cloudflare only. Create new records proxied (orange cloud).'
type: boolean
dns_zones_count:
description: 'Cloudflare only.'
type: integer
zones_synced_at:
description: 'Cloudflare only.'
type:
- string
- 'null'
created_at:
type: string
updated_at:
type: string
type: object
SecretManagerSource:
description: 'The secret manager source of an application, service, or database. Routes start with the resource type (`applications`, `services`, `databases`), so tokens limited to some resources can use them.'
properties:
linked:
type: boolean
integration_token_uuid:
type:
- string
- 'null'
provider:
type:
- string
- 'null'
enum:
- doppler
- infisical
- vault
- null
settings:
description: 'Doppler: project, config. Infisical: project_id, environment, secret_path. Vault: mount, path.'
type:
- object
- 'null'
available_tokens:
type: array
items:
properties:
uuid:
type: string
name:
type: string
provider:
type: string
type: object
type: object
SharedEnvironmentVariableCreateRequest:
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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. MCP never returns environment variable values.'
type: boolean
comment:
type:
- string
- 'null'
maxLength: 256
type: object
SharedEnvironmentVariableUpdateRequest:
description: 'Send at least one field.'
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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. MCP never returns environment variable values.'
type: boolean
comment:
type:
- string
- 'null'
maxLength: 256
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.'
git_https_username:
type: string
nullable: true
description: 'Username for HTTPS access to a private repository on a custom Git host. The password or token is never returned.'
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
is_mcp:
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. A lock is permanent: false does not unlock a locked variable, but a new value can still replace the locked one. 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.'
use_shell:
type: boolean
description: 'Run the command with `sh -c` in the container. Set it to false for containers without a shell: the command is then split into arguments and run directly, without shell features such as variables, pipes, or redirects.'
consecutive_failures:
type: integer
description: 'The number of failed runs since the last successful run.'
failing_since:
type: string
format: date-time
nullable: true
description: 'The date and time of the first failed run since the last successful run.'
disabled_reason:
type: string
nullable: true
description: 'Why Coolify disabled the task automatically. It is cleared when the task is enabled again.'
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_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_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: '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: DNS
description: DNS
-
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: 'Integration Tokens'
description: 'Integration Tokens'
-
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: 'Secret Managers'
description: 'Secret Managers'
-
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