coolify/openapi.yaml
peaklabs-dev 0628268875
feat(api): improve service urls update
- add force_domain_override functionality and docs
- delete service on creation if there is URL conflicts as otherwise we will have stale services (we need to create the service because we need to parse it and more)
2026-01-13 19:25:58 +01:00

7125 lines
243 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:
get:
tags:
- Applications
summary: List
description: 'List all applications.'
operationId: list-applications
parameters:
-
name: tag
in: query
description: 'Filter applications by tag name.'
required: false
schema:
type: string
responses:
'200':
description: 'Get all applications.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Application'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
/applications/public:
post:
tags:
- Applications
summary: 'Create (Public)'
description: 'Create new application based on a public git repository.'
operationId: create-public-application
requestBody:
description: 'Application object that needs to be created.'
required: true
content:
application/json:
schema:
required:
- project_uuid
- server_uuid
- environment_name
- environment_uuid
- git_repository
- git_branch
- build_pack
- ports_exposes
properties:
project_uuid:
type: string
description: 'The project UUID.'
server_uuid:
type: string
description: 'The server UUID.'
environment_name:
type: string
description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
git_repository:
type: string
description: 'The git repository URL.'
git_branch:
type: string
description: 'The git branch.'
build_pack:
type: string
enum: [nixpacks, 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 domains.'
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.'
static_image:
type: string
enum: ['nginx:alpine']
description: 'The static image.'
install_command:
type: string
description: 'The install command.'
build_command:
type: string
description: 'The build command.'
start_command:
type: string
description: 'The start command.'
ports_mappings:
type: string
description: 'The ports mappings.'
base_directory:
type: string
description: 'The base directory for all commands.'
publish_directory:
type: string
description: 'The publish directory.'
health_check_enabled:
type: boolean
description: 'Health check enabled.'
health_check_path:
type: string
description: 'Health check path.'
health_check_port:
type: string
nullable: true
description: 'Health check port.'
health_check_host:
type: string
nullable: true
description: 'Health check host.'
health_check_method:
type: string
description: 'Health check method.'
health_check_return_code:
type: integer
description: 'Health check return code.'
health_check_scheme:
type: string
description: 'Health check scheme.'
health_check_response_text:
type: string
nullable: true
description: 'Health check response text.'
health_check_interval:
type: integer
description: 'Health check interval in seconds.'
health_check_timeout:
type: integer
description: 'Health check timeout in seconds.'
health_check_retries:
type: integer
description: 'Health check retries count.'
health_check_start_period:
type: integer
description: 'Health check start period in seconds.'
limits_memory:
type: string
description: 'Memory limit.'
limits_memory_swap:
type: string
description: 'Memory swap limit.'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness.'
limits_memory_reservation:
type: string
description: 'Memory reservation.'
limits_cpus:
type: string
description: 'CPU limit.'
limits_cpuset:
type: string
nullable: true
description: 'CPU set.'
limits_cpu_shares:
type: integer
description: 'CPU shares.'
custom_labels:
type: string
description: 'Custom labels.'
custom_docker_run_options:
type: string
description: 'Custom docker run options.'
post_deployment_command:
type: string
description: 'Post deployment command.'
post_deployment_command_container:
type: string
description: 'Post deployment command container.'
pre_deployment_command:
type: string
description: 'Pre deployment command.'
pre_deployment_command_container:
type: string
description: 'Pre deployment command container.'
manual_webhook_secret_github:
type: string
description: 'Manual webhook secret for Github.'
manual_webhook_secret_gitlab:
type: string
description: 'Manual webhook secret for Gitlab.'
manual_webhook_secret_bitbucket:
type: string
description: 'Manual webhook secret for Bitbucket.'
manual_webhook_secret_gitea:
type: string
description: 'Manual webhook secret for Gitea.'
redirect:
type: string
nullable: true
description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
enum: [www, non-www, both]
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
dockerfile:
type: string
description: 'The Dockerfile content.'
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. "http://app.coolify.io,https://app2.coolify.io")' } }, type: object }
watch_paths:
type: string
description: 'The watch paths.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
is_http_basic_auth_enabled:
type: boolean
description: 'HTTP Basic Authentication enabled.'
http_basic_auth_username:
type: string
nullable: true
description: 'Username for HTTP Basic Authentication'
http_basic_auth_password:
type: string
nullable: true
description: 'Password for HTTP Basic Authentication'
connect_to_docker_network:
type: boolean
description: 'The flag to connect the service to the predefined Docker network.'
force_domain_override:
type: boolean
description: 'Force domain usage even if conflicts are detected. Default is false.'
autogenerate_domain:
type: boolean
default: true
description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
is_container_label_escape_enabled:
type: boolean
default: true
description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
type: object
responses:
'201':
description: 'Application created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
security:
-
bearerAuth: []
/applications/private-github-app:
post:
tags:
- Applications
summary: 'Create (Private - GH App)'
description: 'Create new application based on a private repository through a Github App.'
operationId: create-private-github-app-application
requestBody:
description: 'Application object that needs to be created.'
required: true
content:
application/json:
schema:
required:
- project_uuid
- server_uuid
- environment_name
- environment_uuid
- github_app_uuid
- git_repository
- git_branch
- build_pack
- ports_exposes
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, 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 domains.'
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.'
static_image:
type: string
enum: ['nginx:alpine']
description: 'The static image.'
install_command:
type: string
description: 'The install command.'
build_command:
type: string
description: 'The build command.'
start_command:
type: string
description: 'The start command.'
ports_mappings:
type: string
description: 'The ports mappings.'
base_directory:
type: string
description: 'The base directory for all commands.'
publish_directory:
type: string
description: 'The publish directory.'
health_check_enabled:
type: boolean
description: 'Health check enabled.'
health_check_path:
type: string
description: 'Health check path.'
health_check_port:
type: string
nullable: true
description: 'Health check port.'
health_check_host:
type: string
nullable: true
description: 'Health check host.'
health_check_method:
type: string
description: 'Health check method.'
health_check_return_code:
type: integer
description: 'Health check return code.'
health_check_scheme:
type: string
description: 'Health check scheme.'
health_check_response_text:
type: string
nullable: true
description: 'Health check response text.'
health_check_interval:
type: integer
description: 'Health check interval in seconds.'
health_check_timeout:
type: integer
description: 'Health check timeout in seconds.'
health_check_retries:
type: integer
description: 'Health check retries count.'
health_check_start_period:
type: integer
description: 'Health check start period in seconds.'
limits_memory:
type: string
description: 'Memory limit.'
limits_memory_swap:
type: string
description: 'Memory swap limit.'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness.'
limits_memory_reservation:
type: string
description: 'Memory reservation.'
limits_cpus:
type: string
description: 'CPU limit.'
limits_cpuset:
type: string
nullable: true
description: 'CPU set.'
limits_cpu_shares:
type: integer
description: 'CPU shares.'
custom_labels:
type: string
description: 'Custom labels.'
custom_docker_run_options:
type: string
description: 'Custom docker run options.'
post_deployment_command:
type: string
description: 'Post deployment command.'
post_deployment_command_container:
type: string
description: 'Post deployment command container.'
pre_deployment_command:
type: string
description: 'Pre deployment command.'
pre_deployment_command_container:
type: string
description: 'Pre deployment command container.'
manual_webhook_secret_github:
type: string
description: 'Manual webhook secret for Github.'
manual_webhook_secret_gitlab:
type: string
description: 'Manual webhook secret for Gitlab.'
manual_webhook_secret_bitbucket:
type: string
description: 'Manual webhook secret for Bitbucket.'
manual_webhook_secret_gitea:
type: string
description: 'Manual webhook secret for Gitea.'
redirect:
type: string
nullable: true
description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
enum: [www, non-www, both]
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
dockerfile:
type: string
description: 'The Dockerfile content.'
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. "http://app.coolify.io,https://app2.coolify.io")' } }, type: object }
watch_paths:
type: string
description: 'The watch paths.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
is_http_basic_auth_enabled:
type: boolean
description: 'HTTP Basic Authentication enabled.'
http_basic_auth_username:
type: string
nullable: true
description: 'Username for HTTP Basic Authentication'
http_basic_auth_password:
type: string
nullable: true
description: 'Password for HTTP Basic Authentication'
connect_to_docker_network:
type: boolean
description: 'The flag to connect the service to the predefined Docker network.'
force_domain_override:
type: boolean
description: 'Force domain usage even if conflicts are detected. Default is false.'
autogenerate_domain:
type: boolean
default: true
description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
is_container_label_escape_enabled:
type: boolean
default: true
description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
type: object
responses:
'201':
description: 'Application created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
security:
-
bearerAuth: []
/applications/private-deploy-key:
post:
tags:
- Applications
summary: 'Create (Private - Deploy Key)'
description: 'Create new application based on a private repository through a Deploy Key.'
operationId: create-private-deploy-key-application
requestBody:
description: 'Application object that needs to be created.'
required: true
content:
application/json:
schema:
required:
- project_uuid
- server_uuid
- environment_name
- environment_uuid
- private_key_uuid
- git_repository
- git_branch
- build_pack
- ports_exposes
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, 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 domains.'
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.'
static_image:
type: string
enum: ['nginx:alpine']
description: 'The static image.'
install_command:
type: string
description: 'The install command.'
build_command:
type: string
description: 'The build command.'
start_command:
type: string
description: 'The start command.'
ports_mappings:
type: string
description: 'The ports mappings.'
base_directory:
type: string
description: 'The base directory for all commands.'
publish_directory:
type: string
description: 'The publish directory.'
health_check_enabled:
type: boolean
description: 'Health check enabled.'
health_check_path:
type: string
description: 'Health check path.'
health_check_port:
type: string
nullable: true
description: 'Health check port.'
health_check_host:
type: string
nullable: true
description: 'Health check host.'
health_check_method:
type: string
description: 'Health check method.'
health_check_return_code:
type: integer
description: 'Health check return code.'
health_check_scheme:
type: string
description: 'Health check scheme.'
health_check_response_text:
type: string
nullable: true
description: 'Health check response text.'
health_check_interval:
type: integer
description: 'Health check interval in seconds.'
health_check_timeout:
type: integer
description: 'Health check timeout in seconds.'
health_check_retries:
type: integer
description: 'Health check retries count.'
health_check_start_period:
type: integer
description: 'Health check start period in seconds.'
limits_memory:
type: string
description: 'Memory limit.'
limits_memory_swap:
type: string
description: 'Memory swap limit.'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness.'
limits_memory_reservation:
type: string
description: 'Memory reservation.'
limits_cpus:
type: string
description: 'CPU limit.'
limits_cpuset:
type: string
nullable: true
description: 'CPU set.'
limits_cpu_shares:
type: integer
description: 'CPU shares.'
custom_labels:
type: string
description: 'Custom labels.'
custom_docker_run_options:
type: string
description: 'Custom docker run options.'
post_deployment_command:
type: string
description: 'Post deployment command.'
post_deployment_command_container:
type: string
description: 'Post deployment command container.'
pre_deployment_command:
type: string
description: 'Pre deployment command.'
pre_deployment_command_container:
type: string
description: 'Pre deployment command container.'
manual_webhook_secret_github:
type: string
description: 'Manual webhook secret for Github.'
manual_webhook_secret_gitlab:
type: string
description: 'Manual webhook secret for Gitlab.'
manual_webhook_secret_bitbucket:
type: string
description: 'Manual webhook secret for Bitbucket.'
manual_webhook_secret_gitea:
type: string
description: 'Manual webhook secret for Gitea.'
redirect:
type: string
nullable: true
description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
enum: [www, non-www, both]
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
dockerfile:
type: string
description: 'The Dockerfile content.'
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. "http://app.coolify.io,https://app2.coolify.io")' } }, type: object }
watch_paths:
type: string
description: 'The watch paths.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
is_http_basic_auth_enabled:
type: boolean
description: 'HTTP Basic Authentication enabled.'
http_basic_auth_username:
type: string
nullable: true
description: 'Username for HTTP Basic Authentication'
http_basic_auth_password:
type: string
nullable: true
description: 'Password for HTTP Basic Authentication'
connect_to_docker_network:
type: boolean
description: 'The flag to connect the service to the predefined Docker network.'
force_domain_override:
type: boolean
description: 'Force domain usage even if conflicts are detected. Default is false.'
autogenerate_domain:
type: boolean
default: true
description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
is_container_label_escape_enabled:
type: boolean
default: true
description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
type: object
responses:
'201':
description: 'Application created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
security:
-
bearerAuth: []
/applications/dockerfile:
post:
tags:
- Applications
summary: 'Create (Dockerfile without git)'
description: 'Create new application based on a simple Dockerfile (without git).'
operationId: create-dockerfile-application
requestBody:
description: 'Application object that needs to be created.'
required: true
content:
application/json:
schema:
required:
- project_uuid
- server_uuid
- environment_name
- environment_uuid
- dockerfile
properties:
project_uuid:
type: string
description: 'The project UUID.'
server_uuid:
type: string
description: 'The server UUID.'
environment_name:
type: string
description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
dockerfile:
type: string
description: 'The Dockerfile content.'
build_pack:
type: string
enum: [nixpacks, 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 domains.'
docker_registry_image_name:
type: string
description: 'The docker registry image name.'
docker_registry_image_tag:
type: string
description: 'The docker registry image tag.'
ports_mappings:
type: string
description: 'The ports mappings.'
base_directory:
type: string
description: 'The base directory for all commands.'
health_check_enabled:
type: boolean
description: 'Health check enabled.'
health_check_path:
type: string
description: 'Health check path.'
health_check_port:
type: string
nullable: true
description: 'Health check port.'
health_check_host:
type: string
nullable: true
description: 'Health check host.'
health_check_method:
type: string
description: 'Health check method.'
health_check_return_code:
type: integer
description: 'Health check return code.'
health_check_scheme:
type: string
description: 'Health check scheme.'
health_check_response_text:
type: string
nullable: true
description: 'Health check response text.'
health_check_interval:
type: integer
description: 'Health check interval in seconds.'
health_check_timeout:
type: integer
description: 'Health check timeout in seconds.'
health_check_retries:
type: integer
description: 'Health check retries count.'
health_check_start_period:
type: integer
description: 'Health check start period in seconds.'
limits_memory:
type: string
description: 'Memory limit.'
limits_memory_swap:
type: string
description: 'Memory swap limit.'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness.'
limits_memory_reservation:
type: string
description: 'Memory reservation.'
limits_cpus:
type: string
description: 'CPU limit.'
limits_cpuset:
type: string
nullable: true
description: 'CPU set.'
limits_cpu_shares:
type: integer
description: 'CPU shares.'
custom_labels:
type: string
description: 'Custom labels.'
custom_docker_run_options:
type: string
description: 'Custom docker run options.'
post_deployment_command:
type: string
description: 'Post deployment command.'
post_deployment_command_container:
type: string
description: 'Post deployment command container.'
pre_deployment_command:
type: string
description: 'Pre deployment command.'
pre_deployment_command_container:
type: string
description: 'Pre deployment command container.'
manual_webhook_secret_github:
type: string
description: 'Manual webhook secret for Github.'
manual_webhook_secret_gitlab:
type: string
description: 'Manual webhook secret for Gitlab.'
manual_webhook_secret_bitbucket:
type: string
description: 'Manual webhook secret for Bitbucket.'
manual_webhook_secret_gitea:
type: string
description: 'Manual webhook secret for Gitea.'
redirect:
type: string
nullable: true
description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
enum: [www, non-www, both]
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
is_http_basic_auth_enabled:
type: boolean
description: 'HTTP Basic Authentication enabled.'
http_basic_auth_username:
type: string
nullable: true
description: 'Username for HTTP Basic Authentication'
http_basic_auth_password:
type: string
nullable: true
description: 'Password for HTTP Basic Authentication'
connect_to_docker_network:
type: boolean
description: 'The flag to connect the service to the predefined Docker network.'
force_domain_override:
type: boolean
description: 'Force domain usage even if conflicts are detected. Default is false.'
autogenerate_domain:
type: boolean
default: true
description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
is_container_label_escape_enabled:
type: boolean
default: true
description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
type: object
responses:
'201':
description: 'Application created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
security:
-
bearerAuth: []
/applications/dockerimage:
post:
tags:
- Applications
summary: 'Create (Docker Image without git)'
description: 'Create new application based on a prebuilt docker image (without git).'
operationId: create-dockerimage-application
requestBody:
description: 'Application object that needs to be created.'
required: true
content:
application/json:
schema:
required:
- project_uuid
- server_uuid
- environment_name
- environment_uuid
- docker_registry_image_name
- ports_exposes
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 domains.'
ports_mappings:
type: string
description: 'The ports mappings.'
health_check_enabled:
type: boolean
description: 'Health check enabled.'
health_check_path:
type: string
description: 'Health check path.'
health_check_port:
type: string
nullable: true
description: 'Health check port.'
health_check_host:
type: string
nullable: true
description: 'Health check host.'
health_check_method:
type: string
description: 'Health check method.'
health_check_return_code:
type: integer
description: 'Health check return code.'
health_check_scheme:
type: string
description: 'Health check scheme.'
health_check_response_text:
type: string
nullable: true
description: 'Health check response text.'
health_check_interval:
type: integer
description: 'Health check interval in seconds.'
health_check_timeout:
type: integer
description: 'Health check timeout in seconds.'
health_check_retries:
type: integer
description: 'Health check retries count.'
health_check_start_period:
type: integer
description: 'Health check start period in seconds.'
limits_memory:
type: string
description: 'Memory limit.'
limits_memory_swap:
type: string
description: 'Memory swap limit.'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness.'
limits_memory_reservation:
type: string
description: 'Memory reservation.'
limits_cpus:
type: string
description: 'CPU limit.'
limits_cpuset:
type: string
nullable: true
description: 'CPU set.'
limits_cpu_shares:
type: integer
description: 'CPU shares.'
custom_labels:
type: string
description: 'Custom labels.'
custom_docker_run_options:
type: string
description: 'Custom docker run options.'
post_deployment_command:
type: string
description: 'Post deployment command.'
post_deployment_command_container:
type: string
description: 'Post deployment command container.'
pre_deployment_command:
type: string
description: 'Pre deployment command.'
pre_deployment_command_container:
type: string
description: 'Pre deployment command container.'
manual_webhook_secret_github:
type: string
description: 'Manual webhook secret for Github.'
manual_webhook_secret_gitlab:
type: string
description: 'Manual webhook secret for Gitlab.'
manual_webhook_secret_bitbucket:
type: string
description: 'Manual webhook secret for Bitbucket.'
manual_webhook_secret_gitea:
type: string
description: 'Manual webhook secret for Gitea.'
redirect:
type: string
nullable: true
description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
enum: [www, non-www, both]
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
is_http_basic_auth_enabled:
type: boolean
description: 'HTTP Basic Authentication enabled.'
http_basic_auth_username:
type: string
nullable: true
description: 'Username for HTTP Basic Authentication'
http_basic_auth_password:
type: string
nullable: true
description: 'Password for HTTP Basic Authentication'
connect_to_docker_network:
type: boolean
description: 'The flag to connect the service to the predefined Docker network.'
force_domain_override:
type: boolean
description: 'Force domain usage even if conflicts are detected. Default is false.'
autogenerate_domain:
type: boolean
default: true
description: "If true and domains is empty, auto-generate a domain using the server's wildcard domain or sslip.io fallback. Default: true."
is_container_label_escape_enabled:
type: boolean
default: true
description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
type: object
responses:
'201':
description: 'Application created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
security:
-
bearerAuth: []
/applications/dockercompose:
post:
tags:
- Applications
summary: 'Create (Docker Compose) (Deprecated)'
description: 'Create new application based on a docker-compose file (without git).'
operationId: create-dockercompose-application
requestBody:
description: 'Application object that needs to be created.'
required: true
content:
application/json:
schema:
required:
- project_uuid
- server_uuid
- environment_name
- environment_uuid
- docker_compose_raw
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_compose_raw:
type: string
description: 'The Docker Compose raw content.'
destination_uuid:
type: string
description: 'The destination UUID if the server has more than one destinations.'
name:
type: string
description: 'The application name.'
description:
type: string
description: 'The application description.'
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
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.'
type: object
responses:
'201':
description: 'Application created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
deprecated: true
security:
-
bearerAuth: []
'/applications/{uuid}':
get:
tags:
- Applications
summary: Get
description: 'Get application by UUID.'
operationId: get-application-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
responses:
'200':
description: 'Get application by UUID.'
content:
application/json:
schema:
$ref: '#/components/schemas/Application'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
delete:
tags:
- Applications
summary: Delete
description: 'Delete application by UUID.'
operationId: delete-application-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
-
name: delete_configurations
in: query
description: 'Delete configurations.'
required: false
schema:
type: boolean
default: true
-
name: delete_volumes
in: query
description: 'Delete volumes.'
required: false
schema:
type: boolean
default: true
-
name: docker_cleanup
in: query
description: 'Run docker cleanup.'
required: false
schema:
type: boolean
default: true
-
name: delete_connected_networks
in: query
description: 'Delete connected networks.'
required: false
schema:
type: boolean
default: true
responses:
'200':
description: 'Application deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Application deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
patch:
tags:
- Applications
summary: Update
description: 'Update application by UUID.'
operationId: update-application-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
requestBody:
description: 'Application updated.'
required: true
content:
application/json:
schema:
properties:
project_uuid:
type: string
description: 'The project UUID.'
server_uuid:
type: string
description: 'The server UUID.'
environment_name:
type: string
description: 'The environment name.'
github_app_uuid:
type: string
description: 'The Github App UUID.'
git_repository:
type: string
description: 'The git repository URL.'
git_branch:
type: string
description: 'The git branch.'
ports_exposes:
type: string
description: 'The ports to expose.'
destination_uuid:
type: string
description: 'The destination UUID.'
build_pack:
type: string
enum: [nixpacks, 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 domains.'
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.'
install_command:
type: string
description: 'The install command.'
build_command:
type: string
description: 'The build command.'
start_command:
type: string
description: 'The start command.'
ports_mappings:
type: string
description: 'The ports mappings.'
base_directory:
type: string
description: 'The base directory for all commands.'
publish_directory:
type: string
description: 'The publish directory.'
health_check_enabled:
type: boolean
description: 'Health check enabled.'
health_check_path:
type: string
description: 'Health check path.'
health_check_port:
type: string
nullable: true
description: 'Health check port.'
health_check_host:
type: string
nullable: true
description: 'Health check host.'
health_check_method:
type: string
description: 'Health check method.'
health_check_return_code:
type: integer
description: 'Health check return code.'
health_check_scheme:
type: string
description: 'Health check scheme.'
health_check_response_text:
type: string
nullable: true
description: 'Health check response text.'
health_check_interval:
type: integer
description: 'Health check interval in seconds.'
health_check_timeout:
type: integer
description: 'Health check timeout in seconds.'
health_check_retries:
type: integer
description: 'Health check retries count.'
health_check_start_period:
type: integer
description: 'Health check start period in seconds.'
limits_memory:
type: string
description: 'Memory limit.'
limits_memory_swap:
type: string
description: 'Memory swap limit.'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness.'
limits_memory_reservation:
type: string
description: 'Memory reservation.'
limits_cpus:
type: string
description: 'CPU limit.'
limits_cpuset:
type: string
nullable: true
description: 'CPU set.'
limits_cpu_shares:
type: integer
description: 'CPU shares.'
custom_labels:
type: string
description: 'Custom labels.'
custom_docker_run_options:
type: string
description: 'Custom docker run options.'
post_deployment_command:
type: string
description: 'Post deployment command.'
post_deployment_command_container:
type: string
description: 'Post deployment command container.'
pre_deployment_command:
type: string
description: 'Pre deployment command.'
pre_deployment_command_container:
type: string
description: 'Pre deployment command container.'
manual_webhook_secret_github:
type: string
description: 'Manual webhook secret for Github.'
manual_webhook_secret_gitlab:
type: string
description: 'Manual webhook secret for Gitlab.'
manual_webhook_secret_bitbucket:
type: string
description: 'Manual webhook secret for Bitbucket.'
manual_webhook_secret_gitea:
type: string
description: 'Manual webhook secret for Gitea.'
redirect:
type: string
nullable: true
description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
enum: [www, non-www, both]
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
dockerfile:
type: string
description: 'The Dockerfile content.'
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. "http://app.coolify.io,https://app2.coolify.io")' } }, type: object }
watch_paths:
type: string
description: 'The watch paths.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
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.'
type: object
responses:
'200':
description: 'Application updated.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
security:
-
bearerAuth: []
'/applications/{uuid}/logs':
get:
tags:
- Applications
summary: 'Get application logs.'
description: 'Get application logs by UUID.'
operationId: get-application-logs-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
-
name: lines
in: query
description: 'Number of lines to show from the end of the logs.'
required: false
schema:
type: integer
format: int32
default: 100
responses:
'200':
description: 'Get application logs by UUID.'
content:
application/json:
schema:
properties:
logs: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/applications/{uuid}/envs':
get:
tags:
- Applications
summary: 'List Envs'
description: 'List all envs by application UUID.'
operationId: list-envs-by-application-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
responses:
'200':
description: 'All environment variables by application UUID.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/EnvironmentVariable'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
post:
tags:
- Applications
summary: 'Create Env'
description: 'Create env by application UUID.'
operationId: create-env-by-application-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
requestBody:
description: 'Env created.'
required: true
content:
application/json:
schema:
properties:
key:
type: string
description: 'The key of the environment variable.'
value:
type: string
description: 'The value of the environment variable.'
is_preview:
type: boolean
description: 'The flag to indicate if the environment variable is used in preview deployments.'
is_literal:
type: boolean
description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
is_multiline:
type: boolean
description: 'The flag to indicate if the environment variable is multiline.'
is_shown_once:
type: boolean
description: "The flag to indicate if the environment variable's value is shown on the UI."
type: object
responses:
'201':
description: 'Environment variable created.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
patch:
tags:
- Applications
summary: 'Update Env'
description: 'Update env by application UUID.'
operationId: update-env-by-application-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
requestBody:
description: 'Env updated.'
required: true
content:
application/json:
schema:
required:
- key
- value
properties:
key:
type: string
description: 'The key of the environment variable.'
value:
type: string
description: 'The value of the environment variable.'
is_preview:
type: boolean
description: 'The flag to indicate if the environment variable is used in preview deployments.'
is_literal:
type: boolean
description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
is_multiline:
type: boolean
description: 'The flag to indicate if the environment variable is multiline.'
is_shown_once:
type: boolean
description: "The flag to indicate if the environment variable's value is shown on the UI."
type: object
responses:
'201':
description: 'Environment variable updated.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Environment variable updated.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/applications/{uuid}/envs/bulk':
patch:
tags:
- Applications
summary: 'Update Envs (Bulk)'
description: 'Update multiple envs by application UUID.'
operationId: update-envs-by-application-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
requestBody:
description: 'Bulk envs updated.'
required: true
content:
application/json:
schema:
required:
- data
properties:
data:
type: array
items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object }
type: object
responses:
'201':
description: 'Environment variables updated.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/EnvironmentVariable'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/applications/{uuid}/envs/{env_uuid}':
delete:
tags:
- Applications
summary: 'Delete Env'
description: 'Delete env by UUID.'
operationId: delete-env-by-application-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
-
name: env_uuid
in: path
description: 'UUID of the environment variable.'
required: true
schema:
type: string
responses:
'200':
description: 'Environment variable deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Environment variable deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/applications/{uuid}/start':
get:
tags:
- Applications
summary: Start
description: 'Start application. `Post` request is also accepted.'
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':
get:
tags:
- Applications
summary: Stop
description: 'Stop application. `Post` request is also accepted.'
operationId: stop-application-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
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':
get:
tags:
- Applications
summary: Restart
description: 'Restart application. `Post` request is also accepted.'
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: []
/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] }, 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]
example: hetzner
description: 'The cloud provider.'
token:
type: string
example: your-api-token-here
description: 'The API token for the cloud provider.'
name:
type: string
example: 'My Hetzner Token'
description: 'A friendly name for the token.'
type: object
responses:
'201':
description: 'Cloud provider token created.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: og888os, description: 'The UUID of the token.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/cloud-tokens/{uuid}':
get:
tags:
- 'Cloud Tokens'
summary: 'Get Cloud Provider Token'
description: 'Get cloud provider token by UUID.'
operationId: get-cloud-token-by-uuid
parameters:
-
name: uuid
in: path
description: 'Token UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Get cloud provider token by UUID'
content:
application/json:
schema:
properties:
uuid: { type: string }
name: { type: string }
provider: { type: string }
team_id: { type: integer }
servers_count: { type: integer }
created_at: { type: string }
updated_at: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
delete:
tags:
- 'Cloud Tokens'
summary: 'Delete Cloud Provider Token'
description: 'Delete cloud provider token by UUID. Cannot delete if token is used by any servers.'
operationId: delete-cloud-token-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the cloud provider token.'
required: true
schema:
type: string
responses:
'200':
description: 'Cloud provider token deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Cloud provider token deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
patch:
tags:
- 'Cloud Tokens'
summary: 'Update Cloud Provider Token'
description: 'Update cloud provider token name.'
operationId: update-cloud-token-by-uuid
parameters:
-
name: uuid
in: path
description: 'Token UUID'
required: true
schema:
type: string
requestBody:
description: 'Cloud provider token updated.'
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'The friendly name for the token.'
type: object
responses:
'200':
description: 'Cloud provider token updated.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/cloud-tokens/{uuid}/validate':
post:
tags:
- 'Cloud Tokens'
summary: 'Validate Cloud Provider Token'
description: 'Validate a cloud provider token against the provider API.'
operationId: validate-cloud-token-by-uuid
parameters:
-
name: uuid
in: path
description: 'Token UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Token validation result.'
content:
application/json:
schema:
properties:
valid: { type: boolean, example: true }
message: { type: string, example: 'Token is valid.' }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/databases:
get:
tags:
- Databases
summary: List
description: 'List all databases.'
operationId: list-databases
responses:
'200':
description: 'Get all databases'
content:
application/json:
schema:
type: string
example: 'Content is very complex. Will be implemented later.'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
'/databases/{uuid}/backups':
get:
tags:
- Databases
summary: Get
description: 'Get backups details by database UUID.'
operationId: get-database-backups-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
responses:
'200':
description: 'Get all backups for a database'
content:
application/json:
schema:
type: string
example: 'Content is very complex. Will be implemented later.'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
post:
tags:
- Databases
summary: 'Create Backup'
description: 'Create a new scheduled backup configuration for a database'
operationId: create-database-backup
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
requestBody:
description: 'Backup configuration data'
required: true
content:
application/json:
schema:
required:
- frequency
properties:
frequency:
type: string
description: 'Backup frequency (cron expression or: every_minute, hourly, daily, weekly, monthly, yearly)'
enabled:
type: boolean
description: 'Whether the backup is enabled'
default: true
save_s3:
type: boolean
description: 'Whether to save backups to S3'
default: false
s3_storage_uuid:
type: string
description: 'S3 storage UUID (required if save_s3 is true)'
databases_to_backup:
type: string
description: 'Comma separated list of databases to backup'
dump_all:
type: boolean
description: 'Whether to dump all databases'
default: false
backup_now:
type: boolean
description: 'Whether to trigger backup immediately after creation'
database_backup_retention_amount_locally:
type: integer
description: 'Number of backups to retain locally'
database_backup_retention_days_locally:
type: integer
description: 'Number of days to retain backups locally'
database_backup_retention_max_storage_locally:
type: integer
description: 'Max storage (MB) 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: integer
description: 'Max storage (MB) for S3 backups'
type: object
responses:
'201':
description: 'Backup configuration created successfully'
content:
application/json:
schema:
properties:
uuid: { type: string, format: uuid, example: 550e8400-e29b-41d4-a716-446655440000 }
message: { type: string, example: 'Backup configuration created successfully.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/databases/{uuid}':
get:
tags:
- Databases
summary: Get
description: 'Get database by UUID.'
operationId: get-database-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
responses:
'200':
description: 'Get all databases'
content:
application/json:
schema:
type: string
example: 'Content is very complex. Will be implemented later.'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
delete:
tags:
- Databases
summary: Delete
description: 'Delete database by UUID.'
operationId: delete-database-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
-
name: delete_configurations
in: query
description: 'Delete configurations.'
required: false
schema:
type: boolean
default: true
-
name: delete_volumes
in: query
description: 'Delete volumes.'
required: false
schema:
type: boolean
default: true
-
name: docker_cleanup
in: query
description: 'Run docker cleanup.'
required: false
schema:
type: boolean
default: true
-
name: delete_connected_networks
in: query
description: 'Delete connected networks.'
required: false
schema:
type: boolean
default: true
responses:
'200':
description: 'Database deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Database deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
patch:
tags:
- Databases
summary: Update
description: 'Update database by UUID.'
operationId: update-database-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
limits_memory:
type: string
description: 'Memory limit of the database'
limits_memory_swap:
type: string
description: 'Memory swap limit of the database'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness of the database'
limits_memory_reservation:
type: string
description: 'Memory reservation of the database'
limits_cpus:
type: string
description: 'CPU limit of the database'
limits_cpuset:
type: string
description: 'CPU set of the database'
limits_cpu_shares:
type: integer
description: 'CPU shares of the database'
postgres_user:
type: string
description: 'PostgreSQL user'
postgres_password:
type: string
description: 'PostgreSQL password'
postgres_db:
type: string
description: 'PostgreSQL database'
postgres_initdb_args:
type: string
description: 'PostgreSQL initdb args'
postgres_host_auth_method:
type: string
description: 'PostgreSQL host auth method'
postgres_conf:
type: string
description: 'PostgreSQL conf'
clickhouse_admin_user:
type: string
description: 'Clickhouse admin user'
clickhouse_admin_password:
type: string
description: 'Clickhouse admin password'
dragonfly_password:
type: string
description: 'DragonFly password'
redis_password:
type: string
description: 'Redis password'
redis_conf:
type: string
description: 'Redis conf'
keydb_password:
type: string
description: 'KeyDB password'
keydb_conf:
type: string
description: 'KeyDB conf'
mariadb_conf:
type: string
description: 'MariaDB conf'
mariadb_root_password:
type: string
description: 'MariaDB root password'
mariadb_user:
type: string
description: 'MariaDB user'
mariadb_password:
type: string
description: 'MariaDB password'
mariadb_database:
type: string
description: 'MariaDB database'
mongo_conf:
type: string
description: 'Mongo conf'
mongo_initdb_root_username:
type: string
description: 'Mongo initdb root username'
mongo_initdb_root_password:
type: string
description: 'Mongo initdb root password'
mongo_initdb_database:
type: string
description: 'Mongo initdb init database'
mysql_root_password:
type: string
description: 'MySQL root password'
mysql_password:
type: string
description: 'MySQL password'
mysql_user:
type: string
description: 'MySQL user'
mysql_database:
type: string
description: 'MySQL database'
mysql_conf:
type: string
description: 'MySQL conf'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/databases/{uuid}/backups/{scheduled_backup_uuid}':
delete:
tags:
- Databases
summary: 'Delete backup configuration'
description: 'Deletes a backup configuration and all its executions.'
operationId: delete-backup-configuration-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database'
required: true
schema:
type: string
-
name: scheduled_backup_uuid
in: path
description: 'UUID of the backup configuration to delete'
required: true
schema:
type: string
-
name: delete_s3
in: query
description: 'Whether to delete all backup files from S3'
required: false
schema:
type: boolean
default: false
responses:
'200':
description: 'Backup configuration deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Backup configuration and all executions deleted.' }
type: object
'404':
description: 'Backup configuration not found.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Backup configuration not found.' }
type: object
security:
-
bearerAuth: []
patch:
tags:
- Databases
summary: Update
description: 'Update a specific backup configuration for a given database, identified by its UUID and the backup ID'
operationId: update-database-backup
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
-
name: scheduled_backup_uuid
in: path
description: 'UUID of the backup configuration.'
required: true
schema:
type: string
requestBody:
description: 'Database backup configuration data'
required: true
content:
application/json:
schema:
properties:
save_s3:
type: boolean
description: 'Whether data is saved in s3 or not'
s3_storage_uuid:
type: string
description: 'S3 storage UUID'
backup_now:
type: boolean
description: 'Whether to take a backup now or not'
enabled:
type: boolean
description: 'Whether the backup is enabled or not'
databases_to_backup:
type: string
description: 'Comma separated list of databases to backup'
dump_all:
type: boolean
description: 'Whether all databases are dumped or not'
frequency:
type: string
description: 'Frequency of the backup'
database_backup_retention_amount_locally:
type: integer
description: 'Retention amount of the backup locally'
database_backup_retention_days_locally:
type: integer
description: 'Retention days of the backup locally'
database_backup_retention_max_storage_locally:
type: integer
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: integer
description: 'Max storage of the backup in S3'
type: object
responses:
'200':
description: 'Database backup configuration updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/postgresql:
post:
tags:
- Databases
summary: 'Create (PostgreSQL)'
description: 'Create a new PostgreSQL database.'
operationId: create-database-postgresql
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
postgres_user:
type: string
description: 'PostgreSQL user'
postgres_password:
type: string
description: 'PostgreSQL password'
postgres_db:
type: string
description: 'PostgreSQL database'
postgres_initdb_args:
type: string
description: 'PostgreSQL initdb args'
postgres_host_auth_method:
type: string
description: 'PostgreSQL host auth method'
postgres_conf:
type: string
description: 'PostgreSQL conf'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/clickhouse:
post:
tags:
- Databases
summary: 'Create (Clickhouse)'
description: 'Create a new Clickhouse database.'
operationId: create-database-clickhouse
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
clickhouse_admin_user:
type: string
description: 'Clickhouse admin user'
clickhouse_admin_password:
type: string
description: 'Clickhouse admin password'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/dragonfly:
post:
tags:
- Databases
summary: 'Create (DragonFly)'
description: 'Create a new DragonFly database.'
operationId: create-database-dragonfly
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
dragonfly_password:
type: string
description: 'DragonFly password'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/redis:
post:
tags:
- Databases
summary: 'Create (Redis)'
description: 'Create a new Redis database.'
operationId: create-database-redis
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
redis_password:
type: string
description: 'Redis password'
redis_conf:
type: string
description: 'Redis conf'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/keydb:
post:
tags:
- Databases
summary: 'Create (KeyDB)'
description: 'Create a new KeyDB database.'
operationId: create-database-keydb
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
keydb_password:
type: string
description: 'KeyDB password'
keydb_conf:
type: string
description: 'KeyDB conf'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/mariadb:
post:
tags:
- Databases
summary: 'Create (MariaDB)'
description: 'Create a new MariaDB database.'
operationId: create-database-mariadb
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
mariadb_conf:
type: string
description: 'MariaDB conf'
mariadb_root_password:
type: string
description: 'MariaDB root password'
mariadb_user:
type: string
description: 'MariaDB user'
mariadb_password:
type: string
description: 'MariaDB password'
mariadb_database:
type: string
description: 'MariaDB database'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/mysql:
post:
tags:
- Databases
summary: 'Create (MySQL)'
description: 'Create a new MySQL database.'
operationId: create-database-mysql
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
mysql_root_password:
type: string
description: 'MySQL root password'
mysql_password:
type: string
description: 'MySQL password'
mysql_user:
type: string
description: 'MySQL user'
mysql_database:
type: string
description: 'MySQL database'
mysql_conf:
type: string
description: 'MySQL conf'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
type: object
responses:
'200':
description: 'Database updated'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/databases/mongodb:
post:
tags:
- Databases
summary: 'Create (MongoDB)'
description: 'Create a new MongoDB database.'
operationId: create-database-mongodb
requestBody:
description: 'Database data'
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
server_uuid:
type: string
description: 'UUID of the server'
project_uuid:
type: string
description: 'UUID of the project'
environment_name:
type: string
description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'
destination_uuid:
type: string
description: 'UUID of the destination if the server has multiple destinations'
mongo_conf:
type: string
description: 'MongoDB conf'
mongo_initdb_root_username:
type: string
description: 'MongoDB initdb root username'
name:
type: string
description: 'Name of the database'
description:
type: string
description: 'Description of the database'
image:
type: string
description: 'Docker Image of the database'
is_public:
type: boolean
description: 'Is the database public?'
public_port:
type: integer
description: 'Public port of the database'
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'
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}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}':
delete:
tags:
- Databases
summary: 'Delete backup execution'
description: 'Deletes a specific backup execution.'
operationId: delete-backup-execution-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database'
required: true
schema:
type: string
-
name: scheduled_backup_uuid
in: path
description: 'UUID of the backup configuration'
required: true
schema:
type: string
-
name: execution_uuid
in: path
description: 'UUID of the backup execution to delete'
required: true
schema:
type: string
-
name: delete_s3
in: query
description: 'Whether to delete the backup from S3'
required: false
schema:
type: boolean
default: false
responses:
'200':
description: 'Backup execution deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Backup execution deleted.' }
type: object
'404':
description: 'Backup execution not found.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Backup execution not found.' }
type: object
security:
-
bearerAuth: []
'/databases/{uuid}/backups/{scheduled_backup_uuid}/executions':
get:
tags:
- Databases
summary: 'List backup executions'
description: 'Get all executions for a specific backup configuration.'
operationId: list-backup-executions
parameters:
-
name: uuid
in: path
description: 'UUID of the database'
required: true
schema:
type: string
-
name: scheduled_backup_uuid
in: path
description: 'UUID of the backup configuration'
required: true
schema:
type: string
responses:
'200':
description: 'List of backup executions'
content:
application/json:
schema:
properties:
executions: { type: array, items: { properties: { uuid: { type: string }, filename: { type: string }, size: { type: integer }, created_at: { type: string }, message: { type: string }, status: { type: string } }, type: object } }
type: object
'404':
description: 'Backup configuration not found.'
security:
-
bearerAuth: []
'/databases/{uuid}/start':
get:
tags:
- Databases
summary: Start
description: 'Start database. `Post` request is also accepted.'
operationId: start-database-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
responses:
'200':
description: 'Start database.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Database starting request queued.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/databases/{uuid}/stop':
get:
tags:
- Databases
summary: Stop
description: 'Stop database. `Post` request is also accepted.'
operationId: stop-database-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
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':
get:
tags:
- Databases
summary: Restart
description: 'Restart database. `Post` request is also accepted.'
operationId: restart-database-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
responses:
'200':
description: 'Restart database.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Database restaring request queued.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/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:
get:
tags:
- Deployments
summary: Deploy
description: 'Deploy by tag or uuid. `Post` request also accepted with `uuid` and `tag` 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
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: []
/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
- api_url
- html_url
- app_id
- installation_id
- client_id
- client_secret
- private_key_uuid
properties:
name:
type: string
description: 'Name of the GitHub app.'
organization:
type: string
nullable: true
description: 'Organization to associate the app with.'
api_url:
type: string
description: 'API URL for the GitHub app (e.g., https://api.github.com).'
html_url:
type: string
description: 'HTML URL for the GitHub app (e.g., https://github.com).'
custom_user:
type: string
description: 'Custom user for SSH access (default: git).'
custom_port:
type: integer
description: 'Custom port for SSH access (default: 22).'
app_id:
type: integer
description: 'GitHub App ID from GitHub.'
installation_id:
type: integer
description: 'GitHub Installation ID.'
client_id:
type: string
description: 'GitHub OAuth App Client ID.'
client_secret:
type: string
description: 'GitHub OAuth App Client Secret.'
webhook_secret:
type: string
description: 'Webhook secret for GitHub webhooks.'
private_key_uuid:
type: string
description: 'UUID of an existing private key for GitHub App authentication.'
is_system_wide:
type: boolean
description: 'Is this app system-wide (cloud only).'
type: object
responses:
'201':
description: 'GitHub app created successfully.'
content:
application/json:
schema:
properties:
id: { type: integer }
uuid: { type: string }
name: { type: string }
organization: { type: string, nullable: true }
api_url: { type: string }
html_url: { type: string }
custom_user: { type: string }
custom_port: { type: integer }
app_id: { type: integer }
installation_id: { type: integer }
client_id: { type: string }
private_key_id: { type: integer }
is_system_wide: { type: boolean }
team_id: { type: integer }
type: object
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/github-apps/{github_app_id}/repositories':
get:
tags:
- 'GitHub Apps'
summary: 'Load Repositories for a GitHub App'
description: 'Fetch repositories from GitHub for a given GitHub app.'
operationId: load-repositories
parameters:
-
name: github_app_id
in: path
description: 'GitHub App ID'
required: true
schema:
type: integer
responses:
'200':
description: 'Repositories loaded successfully.'
content:
application/json:
schema:
properties:
repositories: { type: array, items: { type: object } }
type: object
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/github-apps/{github_app_id}/repositories/{owner}/{repo}/branches':
get:
tags:
- 'GitHub Apps'
summary: 'Load Branches for a GitHub Repository'
description: 'Fetch branches from GitHub for a given repository.'
operationId: load-branches
parameters:
-
name: github_app_id
in: path
description: 'GitHub App ID'
required: true
schema:
type: integer
-
name: owner
in: path
description: 'Repository owner'
required: true
schema:
type: string
-
name: repo
in: path
description: 'Repository name'
required: true
schema:
type: string
responses:
'200':
description: 'Branches loaded successfully.'
content:
application/json:
schema:
properties:
branches: { type: array, items: { type: object } }
type: object
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/github-apps/{github_app_id}':
delete:
tags:
- 'GitHub Apps'
summary: 'Delete GitHub App'
description: "Delete a GitHub app if it's not being used by any applications."
operationId: deleteGithubApp
parameters:
-
name: github_app_id
in: path
description: 'GitHub App ID'
required: true
schema:
type: integer
responses:
'200':
description: 'GitHub app deleted successfully'
content:
application/json:
schema:
properties:
message: { type: string, example: 'GitHub app deleted successfully' }
type: object
'401':
description: Unauthorized
'404':
description: 'GitHub app not found'
'409':
description: 'Conflict - GitHub app is in use'
content:
application/json:
schema:
properties:
message: { type: string, example: 'This GitHub app is being used by 5 application(s). Please delete all applications first.' }
type: object
security:
-
bearerAuth: []
patch:
tags:
- 'GitHub Apps'
summary: 'Update GitHub App'
description: 'Update an existing GitHub app.'
operationId: updateGithubApp
parameters:
-
name: github_app_id
in: path
description: 'GitHub App ID'
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'GitHub App name'
organization:
type: string
nullable: true
description: 'GitHub organization'
api_url:
type: string
description: 'GitHub API URL'
html_url:
type: string
description: 'GitHub HTML URL'
custom_user:
type: string
description: 'Custom user for SSH'
custom_port:
type: integer
description: 'Custom port for SSH'
app_id:
type: integer
description: 'GitHub App ID'
installation_id:
type: integer
description: 'GitHub Installation ID'
client_id:
type: string
description: 'GitHub Client ID'
client_secret:
type: string
description: 'GitHub Client Secret'
webhook_secret:
type: string
description: 'GitHub Webhook Secret'
private_key_uuid:
type: string
description: 'Private key UUID'
is_system_wide:
type: boolean
description: 'Is system wide (non-cloud instances only)'
type: object
responses:
'200':
description: 'GitHub app updated successfully'
content:
application/json:
schema:
properties:
message: { type: string, example: 'GitHub app updated successfully' }
data: { type: object, description: 'Updated GitHub app data' }
type: object
'401':
description: Unauthorized
'404':
description: 'GitHub app not found'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/hetzner/locations:
get:
tags:
- Hetzner
summary: 'Get Hetzner Locations'
description: 'Get all available Hetzner datacenter locations.'
operationId: get-hetzner-locations
parameters:
-
name: cloud_provider_token_uuid
in: query
description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
required: false
schema:
type: string
-
name: cloud_provider_token_id
in: query
description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
required: false
deprecated: true
schema:
type: string
responses:
'200':
description: 'List of Hetzner locations.'
content:
application/json:
schema:
type: array
items:
properties: { id: { type: integer }, name: { type: string }, description: { type: string }, country: { type: string }, city: { type: string }, latitude: { type: number }, longitude: { type: number } }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/hetzner/server-types:
get:
tags:
- Hetzner
summary: 'Get Hetzner Server Types'
description: 'Get all available Hetzner server types (instance sizes).'
operationId: get-hetzner-server-types
parameters:
-
name: cloud_provider_token_uuid
in: query
description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
required: false
schema:
type: string
-
name: cloud_provider_token_id
in: query
description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
required: false
deprecated: true
schema:
type: string
responses:
'200':
description: 'List of Hetzner server types.'
content:
application/json:
schema:
type: array
items:
properties: { id: { type: integer }, name: { type: string }, description: { type: string }, cores: { type: integer }, memory: { type: number }, disk: { type: integer }, prices: { type: array, items: { type: object, properties: { location: { type: string, description: 'Datacenter location name' }, price_hourly: { type: object, properties: { net: { type: string }, gross: { type: string } } }, price_monthly: { type: object, properties: { net: { type: string }, gross: { type: string } } } } } } }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/hetzner/images:
get:
tags:
- Hetzner
summary: 'Get Hetzner Images'
description: 'Get all available Hetzner system images (operating systems).'
operationId: get-hetzner-images
parameters:
-
name: cloud_provider_token_uuid
in: query
description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
required: false
schema:
type: string
-
name: cloud_provider_token_id
in: query
description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
required: false
deprecated: true
schema:
type: string
responses:
'200':
description: 'List of Hetzner images.'
content:
application/json:
schema:
type: array
items:
properties: { id: { type: integer }, name: { type: string }, description: { type: string }, type: { type: string }, os_flavor: { type: string }, os_version: { type: string }, architecture: { type: string } }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/hetzner/ssh-keys:
get:
tags:
- Hetzner
summary: 'Get Hetzner SSH Keys'
description: 'Get all SSH keys stored in the Hetzner account.'
operationId: get-hetzner-ssh-keys
parameters:
-
name: cloud_provider_token_uuid
in: query
description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
required: false
schema:
type: string
-
name: cloud_provider_token_id
in: query
description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
required: false
deprecated: true
schema:
type: string
responses:
'200':
description: 'List of Hetzner SSH keys.'
content:
application/json:
schema:
type: array
items:
properties: { id: { type: integer }, name: { type: string }, fingerprint: { type: string }, public_key: { type: string } }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/servers/hetzner:
post:
tags:
- Hetzner
summary: 'Create Hetzner Server'
description: 'Create a new server on Hetzner and register it in Coolify.'
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)'
hetzner_ssh_key_ids:
type: array
items: { type: integer }
description: 'Additional Hetzner SSH key IDs'
cloud_init_script:
type: string
description: 'Cloud-init YAML script (optional)'
instant_validate:
type: boolean
example: false
description: 'Validate server immediately after creation'
type: object
responses:
'201':
description: 'Hetzner server created.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: og888os, description: 'The UUID of the server.' }
hetzner_server_id: { type: integer, description: 'The Hetzner server ID.' }
ip: { type: string, description: 'The server IP address.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
'429':
$ref: '#/components/responses/429'
security:
-
bearerAuth: []
/version:
get:
summary: Version
description: 'Get 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: []
/enable:
get:
summary: 'Enable API'
description: 'Enable API (only with root permissions).'
operationId: enable-api
responses:
'200':
description: 'Enable API.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'API enabled.' }
type: object
'403':
description: 'You are not allowed to enable the API.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'You are not allowed to enable the API.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
/disable:
get:
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: []
/health:
get:
summary: Healthcheck
description: 'Healthcheck endpoint.'
operationId: healthcheck
responses:
'200':
description: 'Healthcheck endpoint.'
content:
text/html:
schema:
type: string
example: OK
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
/projects:
get:
tags:
- Projects
summary: List
description: 'List projects.'
operationId: list-projects
responses:
'200':
description: 'Get all projects.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Project'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
post:
tags:
- Projects
summary: Create
description: 'Create Project.'
operationId: create-project
requestBody:
description: 'Project created.'
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'The name of the project.'
description:
type: string
description: 'The description of the project.'
type: object
responses:
'201':
description: 'Project created.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: og888os, description: 'The UUID of the project.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/projects/{uuid}':
get:
tags:
- Projects
summary: Get
description: 'Get project by UUID.'
operationId: get-project-by-uuid
parameters:
-
name: uuid
in: path
description: 'Project UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Project details'
content:
application/json:
schema:
$ref: '#/components/schemas/Project'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
description: 'Project not found.'
security:
-
bearerAuth: []
delete:
tags:
- Projects
summary: Delete
description: 'Delete project by UUID.'
operationId: delete-project-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
responses:
'200':
description: 'Project deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Project deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
patch:
tags:
- Projects
summary: Update
description: 'Update Project.'
operationId: update-project-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the project.'
required: true
schema:
type: string
requestBody:
description: 'Project updated.'
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'The name of the project.'
description:
type: string
description: 'The description of the project.'
type: object
responses:
'201':
description: 'Project updated.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: og888os }
name: { type: string, example: 'Project Name' }
description: { type: string, example: 'Project Description' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/projects/{uuid}/{environment_name_or_uuid}':
get:
tags:
- Projects
summary: Environment
description: 'Get environment by name or UUID.'
operationId: get-environment-by-name-or-uuid
parameters:
-
name: uuid
in: path
description: 'Project UUID'
required: true
schema:
type: string
-
name: environment_name_or_uuid
in: path
description: 'Environment name or UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Environment details'
content:
application/json:
schema:
$ref: '#/components/schemas/Environment'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/projects/{uuid}/environments':
get:
tags:
- Projects
summary: 'List Environments'
description: 'List all environments in a project.'
operationId: get-environments
parameters:
-
name: uuid
in: path
description: 'Project UUID'
required: true
schema:
type: string
responses:
'200':
description: 'List of environments'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Environment'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
description: 'Project not found.'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
post:
tags:
- Projects
summary: 'Create Environment'
description: 'Create environment in project.'
operationId: create-environment
parameters:
-
name: uuid
in: path
description: 'Project UUID'
required: true
schema:
type: string
requestBody:
description: 'Environment created.'
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'The name of the environment.'
type: object
responses:
'201':
description: 'Environment created.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: env123, description: 'The UUID of the environment.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
description: 'Project not found.'
'409':
description: 'Environment with this name already exists.'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/projects/{uuid}/environments/{environment_name_or_uuid}':
delete:
tags:
- Projects
summary: 'Delete Environment'
description: 'Delete environment by name or UUID. Environment must be empty.'
operationId: delete-environment
parameters:
-
name: uuid
in: path
description: 'Project UUID'
required: true
schema:
type: string
-
name: environment_name_or_uuid
in: path
description: 'Environment name or UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Environment deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Environment deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
description: 'Environment has resources, so it cannot be deleted.'
'404':
description: 'Project or environment not found.'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/resources:
get:
tags:
- Resources
summary: List
description: 'Get all resources.'
operationId: list-resources
responses:
'200':
description: 'Get all resources'
content:
application/json:
schema:
type: string
example: 'Content is very complex. Will be implemented later.'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
/security/keys:
get:
tags:
- 'Private Keys'
summary: List
description: 'List all private keys.'
operationId: list-private-keys
responses:
'200':
description: 'Get all private keys.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PrivateKey'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
post:
tags:
- 'Private Keys'
summary: Create
description: 'Create a new private key.'
operationId: create-private-key
requestBody:
required: true
content:
application/json:
schema:
required:
- private_key
properties:
name:
type: string
description:
type: string
private_key:
type: string
type: object
additionalProperties: false
responses:
'201':
description: "The created private key's UUID."
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
patch:
tags:
- 'Private Keys'
summary: Update
description: 'Update a private key.'
operationId: update-private-key
requestBody:
required: true
content:
application/json:
schema:
required:
- private_key
properties:
name:
type: string
description:
type: string
private_key:
type: string
type: object
additionalProperties: false
responses:
'201':
description: "The updated private key's UUID."
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/security/keys/{uuid}':
get:
tags:
- 'Private Keys'
summary: Get
description: 'Get key by UUID.'
operationId: get-private-key-by-uuid
parameters:
-
name: uuid
in: path
description: 'Private Key UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Get all private keys.'
content:
application/json:
schema:
$ref: '#/components/schemas/PrivateKey'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
description: 'Private Key not found.'
security:
-
bearerAuth: []
delete:
tags:
- 'Private Keys'
summary: Delete
description: 'Delete a private key.'
operationId: delete-private-key-by-uuid
parameters:
-
name: uuid
in: path
description: 'Private Key UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Private Key deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Private Key deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
description: 'Private Key not found.'
'422':
description: 'Private Key is in use and cannot be deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Private Key is in use and cannot be deleted.' }
type: object
security:
-
bearerAuth: []
/servers:
get:
tags:
- Servers
summary: List
description: 'List all servers.'
operationId: list-servers
responses:
'200':
description: 'Get all servers.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Server'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
post:
tags:
- Servers
summary: Create
description: 'Create Server.'
operationId: create-server
requestBody:
description: 'Server created.'
required: true
content:
application/json:
schema:
properties:
name:
type: string
example: 'My Server'
description: 'The name of the server.'
description:
type: string
example: 'My Server Description'
description: 'The description of the server.'
ip:
type: string
example: 127.0.0.1
description: 'The IP of the server.'
port:
type: integer
example: 22
description: 'The port of the server.'
user:
type: string
example: root
description: 'The user of the server.'
private_key_uuid:
type: string
example: og888os
description: 'The UUID of the private key.'
is_build_server:
type: boolean
example: false
description: 'Is build server.'
instant_validate:
type: boolean
example: false
description: 'Instant validate.'
proxy_type:
type: string
enum: [traefik, caddy, none]
example: traefik
description: 'The proxy type.'
type: object
responses:
'201':
description: 'Server created.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: og888os, description: 'The UUID of the server.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/servers/{uuid}':
get:
tags:
- Servers
summary: Get
description: 'Get server by UUID.'
operationId: get-server-by-uuid
parameters:
-
name: uuid
in: path
description: "Server's UUID"
required: true
schema:
type: string
responses:
'200':
description: 'Get server by UUID'
content:
application/json:
schema:
$ref: '#/components/schemas/Server'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
delete:
tags:
- Servers
summary: Delete
description: 'Delete server by UUID.'
operationId: delete-server-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the server.'
required: true
schema:
type: string
responses:
'200':
description: 'Server deleted.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Server deleted.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
patch:
tags:
- Servers
summary: Update
description: 'Update Server.'
operationId: update-server-by-uuid
parameters:
-
name: uuid
in: path
description: 'Server UUID'
required: true
schema:
type: string
requestBody:
description: 'Server updated.'
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'The name of the server.'
description:
type: string
description: 'The description of the server.'
ip:
type: string
description: 'The IP of the server.'
port:
type: integer
description: 'The port of the server.'
user:
type: string
description: 'The user of the server.'
private_key_uuid:
type: string
description: 'The UUID of the private key.'
is_build_server:
type: boolean
description: 'Is build server.'
instant_validate:
type: boolean
description: 'Instant validate.'
proxy_type:
type: string
enum: [traefik, caddy, none]
description: 'The proxy type.'
type: object
responses:
'201':
description: 'Server updated.'
content:
application/json:
schema:
$ref: '#/components/schemas/Server'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/servers/{uuid}/resources':
get:
tags:
- Servers
summary: Resources
description: 'Get resources by server.'
operationId: get-resources-by-server-uuid
parameters:
-
name: uuid
in: path
description: "Server's UUID"
required: true
schema:
type: string
responses:
'200':
description: 'Get resources by server'
content:
application/json:
schema:
type: array
items:
properties: { id: { type: integer }, uuid: { type: string }, name: { type: string }, type: { type: string }, created_at: { type: string }, updated_at: { type: string }, status: { type: string } }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
'/servers/{uuid}/domains':
get:
tags:
- Servers
summary: Domains
description: 'Get domains by server.'
operationId: get-domains-by-server-uuid
parameters:
-
name: uuid
in: path
description: "Server's UUID"
required: true
schema:
type: string
responses:
'200':
description: 'Get domains by server'
content:
application/json:
schema:
type: array
items:
properties: { ip: { type: string }, domains: { type: array, items: { type: string } } }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
'/servers/{uuid}/validate':
get:
tags:
- Servers
summary: Validate
description: 'Validate server by UUID.'
operationId: validate-server-by-uuid
parameters:
-
name: uuid
in: path
description: 'Server UUID'
required: true
schema:
type: string
responses:
'201':
description: 'Server validation started.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Validation started.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/services:
get:
tags:
- Services
summary: List
description: 'List all services.'
operationId: list-services
responses:
'200':
description: 'Get all services'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Service'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
post:
tags:
- Services
summary: 'Create service'
description: 'Create a one-click / custom service'
operationId: create-service
requestBody:
required: true
content:
application/json:
schema:
required:
- server_uuid
- project_uuid
- environment_name
- environment_uuid
properties:
type:
description: 'The one-click service type (e.g. "actualbudget", "calibre-web", "gitea-with-mysql" ...)'
type: string
name:
type: string
maxLength: 255
description: 'Name of the service.'
description:
type: string
nullable: true
description: 'Description of the service.'
project_uuid:
type: string
description: 'Project UUID.'
environment_name:
type: string
description: 'Environment name. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'Environment UUID. You need to provide at least one of environment_name or environment_uuid.'
server_uuid:
type: string
description: 'Server UUID.'
destination_uuid:
type: string
description: 'Destination UUID. Required if server has multiple destinations.'
instant_deploy:
type: boolean
default: false
description: 'Start the service immediately after creation.'
docker_compose_raw:
type: string
description: 'The base64 encoded Docker Compose content.'
urls:
type: array
description: 'Array of URLs to be applied to containers of a service.'
items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, url: { type: string, description: 'Comma-separated list of domains (e.g. "http://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.'
type: object
responses:
'201':
description: 'Service created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string, description: 'Service UUID.' }
domains: { type: array, items: { type: string }, description: 'Service domains.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
'/services/{uuid}':
get:
tags:
- Services
summary: Get
description: 'Get service by UUID.'
operationId: get-service-by-uuid
parameters:
-
name: uuid
in: path
description: 'Service UUID'
required: true
schema:
type: string
responses:
'200':
description: 'Get a service by UUID.'
content:
application/json:
schema:
$ref: '#/components/schemas/Service'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
delete:
tags:
- Services
summary: Delete
description: 'Delete service by UUID.'
operationId: delete-service-by-uuid
parameters:
-
name: uuid
in: path
description: 'Service UUID'
required: true
schema:
type: string
-
name: delete_configurations
in: query
description: 'Delete configurations.'
required: false
schema:
type: boolean
default: true
-
name: delete_volumes
in: query
description: 'Delete volumes.'
required: false
schema:
type: boolean
default: true
-
name: docker_cleanup
in: query
description: 'Run docker cleanup.'
required: false
schema:
type: boolean
default: true
-
name: delete_connected_networks
in: query
description: 'Delete connected networks.'
required: false
schema:
type: boolean
default: true
responses:
'200':
description: 'Delete a service by UUID'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Service deletion request queued.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
patch:
tags:
- Services
summary: Update
description: 'Update service by UUID.'
operationId: update-service-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the service.'
required: true
schema:
type: string
requestBody:
description: 'Service updated.'
required: true
content:
application/json:
schema:
properties:
name:
type: string
description: 'The service name.'
description:
type: string
description: 'The service description.'
project_uuid:
type: string
description: 'The project UUID.'
environment_name:
type: string
description: 'The environment name.'
environment_uuid:
type: string
description: 'The environment UUID.'
server_uuid:
type: string
description: 'The server UUID.'
destination_uuid:
type: string
description: 'The destination UUID.'
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 domains (e.g. "http://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.'
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}/envs':
get:
tags:
- Services
summary: 'List Envs'
description: 'List all envs by service UUID.'
operationId: list-envs-by-service-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the service.'
required: true
schema:
type: string
responses:
'200':
description: 'All environment variables by service UUID.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/EnvironmentVariable'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
post:
tags:
- Services
summary: 'Create Env'
description: 'Create env by service UUID.'
operationId: create-env-by-service-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the service.'
required: true
schema:
type: string
requestBody:
description: 'Env created.'
required: true
content:
application/json:
schema:
properties:
key:
type: string
description: 'The key of the environment variable.'
value:
type: string
description: 'The value of the environment variable.'
is_preview:
type: boolean
description: 'The flag to indicate if the environment variable is used in preview deployments.'
is_literal:
type: boolean
description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
is_multiline:
type: boolean
description: 'The flag to indicate if the environment variable is multiline.'
is_shown_once:
type: boolean
description: "The flag to indicate if the environment variable's value is shown on the UI."
type: object
responses:
'201':
description: 'Environment variable created.'
content:
application/json:
schema:
properties:
uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
patch:
tags:
- Services
summary: 'Update Env'
description: 'Update env by service UUID.'
operationId: update-env-by-service-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the service.'
required: true
schema:
type: string
requestBody:
description: 'Env updated.'
required: true
content:
application/json:
schema:
required:
- key
- value
properties:
key:
type: string
description: 'The key of the environment variable.'
value:
type: string
description: 'The value of the environment variable.'
is_preview:
type: boolean
description: 'The flag to indicate if the environment variable is used in preview deployments.'
is_literal:
type: boolean
description: 'The flag to indicate if the environment variable is a literal, nothing espaced.'
is_multiline:
type: boolean
description: 'The flag to indicate if the environment variable is multiline.'
is_shown_once:
type: boolean
description: "The flag to indicate if the environment variable's value is shown on the UI."
type: object
responses:
'201':
description: 'Environment variable updated.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Environment variable updated.' }
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}/envs/bulk':
patch:
tags:
- Services
summary: 'Update Envs (Bulk)'
description: 'Update multiple envs by service UUID.'
operationId: update-envs-by-service-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the service.'
required: true
schema:
type: string
requestBody:
description: 'Bulk envs updated.'
required: true
content:
application/json:
schema:
required:
- data
properties:
data:
type: array
items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object }
type: object
responses:
'201':
description: 'Environment variables updated.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Environment variables updated.' }
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}/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}/start':
get:
tags:
- Services
summary: Start
description: 'Start service. `Post` request is also accepted.'
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':
get:
tags:
- Services
summary: Stop
description: 'Stop service. `Post` request is also accepted.'
operationId: stop-service-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the service.'
required: true
schema:
type: string
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':
get:
tags:
- Services
summary: Restart
description: 'Restart service. `Post` request is also accepted.'
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: []
/teams:
get:
tags:
- Teams
summary: List
description: 'Get all teams.'
operationId: list-teams
responses:
'200':
description: 'List of teams.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Team'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
'/teams/{id}':
get:
tags:
- Teams
summary: Get
description: 'Get team by TeamId.'
operationId: get-team-by-id
parameters:
-
name: id
in: path
description: 'Team ID'
required: true
schema:
type: integer
responses:
'200':
description: 'List of teams.'
content:
application/json:
schema:
$ref: '#/components/schemas/Team'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/teams/{id}/members':
get:
tags:
- Teams
summary: Members
description: 'Get members by TeamId.'
operationId: get-members-by-team-id
parameters:
-
name: id
in: path
description: 'Team ID'
required: true
schema:
type: integer
responses:
'200':
description: 'List of members.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/teams/current:
get:
tags:
- Teams
summary: 'Authenticated Team'
description: 'Get currently authenticated team.'
operationId: get-current-team
responses:
'200':
description: 'Current Team.'
content:
application/json:
schema:
$ref: '#/components/schemas/Team'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
/teams/current/members:
get:
tags:
- Teams
summary: 'Authenticated Team Members'
description: 'Get currently authenticated team members.'
operationId: get-current-team-members
responses:
'200':
description: 'Currently authenticated team members.'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
components:
schemas:
Application:
description: 'Application model'
properties:
id:
type: integer
description: 'The application identifier in the database.'
description:
type: string
nullable: true
description: 'The application description.'
repository_project_id:
type: integer
nullable: true
description: 'The repository project identifier.'
uuid:
type: string
description: 'The application UUID.'
name:
type: string
description: 'The application name.'
fqdn:
type: string
nullable: true
description: 'The application domains.'
config_hash:
type: string
description: 'Configuration hash.'
git_repository:
type: string
description: 'Git repository URL.'
git_branch:
type: string
description: 'Git branch.'
git_commit_sha:
type: string
description: 'Git commit SHA.'
git_full_url:
type: string
nullable: true
description: 'Git full URL.'
docker_registry_image_name:
type: string
nullable: true
description: 'Docker registry image name.'
docker_registry_image_tag:
type: string
nullable: true
description: 'Docker registry image tag.'
build_pack:
type: string
description: 'Build pack.'
enum:
- nixpacks
- 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.'
limits_memory:
type: string
description: 'Memory limit.'
limits_memory_swap:
type: string
description: 'Memory swap limit.'
limits_memory_swappiness:
type: integer
description: 'Memory swappiness.'
limits_memory_reservation:
type: string
description: 'Memory reservation.'
limits_cpus:
type: string
description: 'CPU limit.'
limits_cpuset:
type: string
nullable: true
description: 'CPU set.'
limits_cpu_shares:
type: integer
description: 'CPU shares.'
status:
type: string
description: 'Application status.'
preview_url_template:
type: string
description: 'Preview URL template.'
destination_type:
type: string
description: 'Destination type.'
destination_id:
type: integer
description: 'Destination identifier.'
source_id:
type: integer
nullable: true
description: 'Source identifier.'
private_key_id:
type: integer
nullable: true
description: 'Private key identifier.'
environment_id:
type: integer
description: 'Environment identifier.'
dockerfile:
type: string
nullable: true
description: 'Dockerfile content. Used for dockerfile build pack.'
dockerfile_location:
type: string
description: 'Dockerfile location.'
custom_labels:
type: string
nullable: true
description: 'Custom labels.'
dockerfile_target_build:
type: string
nullable: true
description: 'Dockerfile target build.'
manual_webhook_secret_github:
type: string
nullable: true
description: 'Manual webhook secret for GitHub.'
manual_webhook_secret_gitlab:
type: string
nullable: true
description: 'Manual webhook secret for GitLab.'
manual_webhook_secret_bitbucket:
type: string
nullable: true
description: 'Manual webhook secret for Bitbucket.'
manual_webhook_secret_gitea:
type: string
nullable: true
description: 'Manual webhook secret for Gitea.'
docker_compose_location:
type: string
description: 'Docker compose location.'
docker_compose:
type: string
nullable: true
description: 'Docker compose content. Used for docker compose build pack.'
docker_compose_raw:
type: string
nullable: true
description: 'Docker compose raw content.'
docker_compose_domains:
type: string
nullable: true
description: 'Docker compose domains.'
docker_compose_custom_start_command:
type: string
nullable: true
description: 'Docker compose custom start command.'
docker_compose_custom_build_command:
type: string
nullable: true
description: 'Docker compose custom build command.'
swarm_replicas:
type: integer
nullable: true
description: 'Swarm replicas. Only used for swarm deployments.'
swarm_placement_constraints:
type: string
nullable: true
description: 'Swarm placement constraints. Only used for swarm deployments.'
custom_docker_run_options:
type: string
nullable: true
description: 'Custom docker run options.'
post_deployment_command:
type: string
nullable: true
description: 'Post deployment command.'
post_deployment_command_container:
type: string
nullable: true
description: 'Post deployment command container.'
pre_deployment_command:
type: string
nullable: true
description: 'Pre deployment command.'
pre_deployment_command_container:
type: string
nullable: true
description: 'Pre deployment command container.'
watch_paths:
type: string
nullable: true
description: 'Watch paths.'
custom_healthcheck_found:
type: boolean
description: 'Custom healthcheck found.'
redirect:
type: string
nullable: true
description: 'How to set redirect with Traefik / Caddy. www<->non-www.'
enum:
- www
- non-www
- both
created_at:
type: string
format: date-time
description: 'The date and time when the application was created.'
updated_at:
type: string
format: date-time
description: 'The date and time when the application was last updated.'
deleted_at:
type: string
format: date-time
nullable: true
description: 'The date and time when the application was deleted.'
compose_parsing_version:
type: string
description: 'How 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'
type: object
ApplicationDeploymentQueue:
description: 'Project model'
properties:
id:
type: integer
application_id:
type: string
deployment_uuid:
type: string
pull_request_id:
type: integer
force_rebuild:
type: boolean
commit:
type: string
status:
type: string
is_webhook:
type: boolean
is_api:
type: boolean
created_at:
type: string
updated_at:
type: string
logs:
type: string
current_process_id:
type: string
restart_only:
type: boolean
git_type:
type: string
server_id:
type: integer
application_name:
type: string
server_name:
type: string
deployment_url:
type: string
destination_id:
type: string
only_this_server:
type: boolean
rollback:
type: boolean
commit_message:
type: string
type: object
Environment:
description: 'Environment model'
properties:
id:
type: integer
name:
type: string
project_id:
type: integer
created_at:
type: string
updated_at:
type: string
description:
type: string
type: object
EnvironmentVariable:
description: 'Environment Variable model'
properties:
id:
type: integer
uuid:
type: string
resourceable_type:
type: string
resourceable_id:
type: integer
is_literal:
type: boolean
is_multiline:
type: boolean
is_preview:
type: boolean
is_runtime:
type: boolean
is_buildtime:
type: boolean
is_shared:
type: boolean
is_shown_once:
type: boolean
key:
type: string
value:
type: string
real_value:
type: string
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
Server:
description: 'Server model'
properties:
id:
type: integer
description: 'The server ID.'
uuid:
type: string
description: 'The server UUID.'
name:
type: string
description: 'The server name.'
description:
type: string
description: 'The server description.'
ip:
type: string
description: 'The IP address.'
user:
type: string
description: 'The user.'
port:
type: integer
description: 'The port number.'
proxy:
type: object
description: 'The proxy configuration.'
proxy_type:
type: string
enum:
- traefik
- caddy
- none
description: 'The proxy type.'
high_disk_usage_notification_sent:
type: boolean
description: 'The flag to indicate if the high disk usage notification has been sent.'
unreachable_notification_sent:
type: boolean
description: 'The flag to indicate if the unreachable notification has been sent.'
unreachable_count:
type: integer
description: 'The unreachable count for your server.'
validation_logs:
type: string
description: 'The validation logs.'
log_drain_notification_sent:
type: boolean
description: 'The flag to indicate if the log drain notification has been sent.'
swarm_cluster:
type: string
description: 'The swarm cluster configuration.'
settings:
$ref: '#/components/schemas/ServerSetting'
type: object
ServerSetting:
description: 'Server Settings model'
properties:
id:
type: integer
concurrent_builds:
type: integer
deployment_queue_limit:
type: integer
dynamic_timeout:
type: integer
force_disabled:
type: boolean
force_server_cleanup:
type: boolean
is_build_server:
type: boolean
is_cloudflare_tunnel:
type: boolean
is_jump_server:
type: boolean
is_logdrain_axiom_enabled:
type: boolean
is_logdrain_custom_enabled:
type: boolean
is_logdrain_highlight_enabled:
type: boolean
is_logdrain_newrelic_enabled:
type: boolean
is_metrics_enabled:
type: boolean
is_reachable:
type: boolean
is_sentinel_enabled:
type: boolean
is_swarm_manager:
type: boolean
is_swarm_worker:
type: boolean
is_terminal_enabled:
type: boolean
is_usable:
type: boolean
logdrain_axiom_api_key:
type: string
logdrain_axiom_dataset_name:
type: string
logdrain_custom_config:
type: string
logdrain_custom_config_parser:
type: string
logdrain_highlight_project_id:
type: string
logdrain_newrelic_base_uri:
type: string
logdrain_newrelic_license_key:
type: string
sentinel_metrics_history_days:
type: integer
sentinel_metrics_refresh_rate_seconds:
type: integer
sentinel_token:
type: string
docker_cleanup_frequency:
type: string
docker_cleanup_threshold:
type: integer
server_id:
type: integer
wildcard_domain:
type: string
created_at:
type: string
updated_at:
type: string
delete_unused_volumes:
type: boolean
description: 'The flag to indicate if the unused volumes should be deleted.'
delete_unused_networks:
type: boolean
description: 'The flag to indicate if the unused networks should be deleted.'
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.'
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
Team:
description: 'Team model'
properties:
id:
type: integer
description: 'The unique identifier of the team.'
name:
type: string
description: 'The name of the team.'
description:
type: string
description: 'The description of the team.'
personal_team:
type: boolean
description: 'Whether the team is personal or not.'
created_at:
type: string
description: 'The date and time the team was created.'
updated_at:
type: string
description: 'The date and time the team was last updated.'
show_boarding:
type: boolean
description: 'Whether to show the boarding screen or not.'
custom_server_limit:
type: string
description: 'The custom server limit.'
members:
description: 'The members of the team.'
type: array
items:
$ref: '#/components/schemas/User'
type: object
User:
description: 'User model'
properties:
id:
type: integer
description: 'The user identifier in the database.'
name:
type: string
description: 'The user name.'
email:
type: string
description: 'The user email.'
email_verified_at:
type: string
description: 'The date when the user email was verified.'
created_at:
type: string
description: 'The date when the user was created.'
updated_at:
type: string
description: 'The date when the user was updated.'
two_factor_confirmed_at:
type: string
description: 'The date when the user two factor was confirmed.'
force_password_reset:
type: boolean
description: 'The flag to force the user to reset the password.'
marketing_emails:
type: boolean
description: 'The flag to receive marketing emails.'
type: object
responses:
'400':
description: 'Invalid token.'
content:
application/json:
schema:
properties:
message:
type: string
example: 'Invalid token.'
type: object
'401':
description: Unauthenticated.
content:
application/json:
schema:
properties:
message:
type: string
example: Unauthenticated.
type: object
'404':
description: 'Resource not found.'
content:
application/json:
schema:
properties:
message:
type: string
example: 'Resource not found.'
type: object
'422':
description: 'Validation error.'
content:
application/json:
schema:
properties:
message:
type: string
example: 'Validation error.'
errors:
type: object
example:
name: ['The name field is required.']
api_url: ['The api url field is required.', 'The api url format is invalid.']
additionalProperties:
type: array
items: { type: string }
type: object
'429':
description: 'Rate limit exceeded.'
headers:
Retry-After:
description: 'Number of seconds to wait before retrying.'
schema:
type: integer
example: 60
content:
application/json:
schema:
properties:
message:
type: string
example: 'Rate limit exceeded. Please try again later.'
type: object
securitySchemes:
bearerAuth:
type: http
description: 'Go to `Keys & Tokens` / `API tokens` and create a new token. Use the token as the bearer token.'
scheme: bearer
tags:
-
name: Applications
description: Applications
-
name: 'Cloud Tokens'
description: 'Cloud Tokens'
-
name: Databases
description: Databases
-
name: Deployments
description: Deployments
-
name: 'GitHub Apps'
description: 'GitHub Apps'
-
name: Hetzner
description: Hetzner
-
name: Projects
description: Projects
-
name: Resources
description: Resources
-
name: 'Private Keys'
description: 'Private Keys'
-
name: Servers
description: Servers
-
name: Services
description: Services
-
name: Teams
description: Teams