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 URLs in a comma-separated list.' git_commit_sha: type: string description: 'The git commit SHA.' docker_registry_image_name: type: string description: 'The docker registry image name.' docker_registry_image_tag: type: string description: 'The docker registry image tag.' is_static: type: boolean description: 'The flag to indicate if the application is static.' is_spa: type: boolean description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.' is_auto_deploy_enabled: type: boolean description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.' is_force_https_enabled: type: boolean description: 'The flag to indicate if HTTPS is forced. Defaults to true.' static_image: type: string enum: ['nginx:alpine'] description: 'The static image.' install_command: type: string description: 'The install command.' build_command: type: string description: 'The build command.' start_command: type: string description: 'The start command.' ports_mappings: type: string description: 'The ports mappings.' base_directory: type: string description: 'The base directory for all commands.' publish_directory: type: string description: 'The publish directory.' health_check_enabled: type: boolean description: 'Health check enabled.' health_check_path: type: string description: 'Health check path.' health_check_port: type: string nullable: true description: 'Health check port.' health_check_host: type: string nullable: true description: 'Health check host.' health_check_method: type: string description: 'Health check method.' health_check_return_code: type: integer description: 'Health check return code.' health_check_scheme: type: string description: 'Health check scheme.' health_check_response_text: type: string nullable: true description: 'Health check response text.' health_check_interval: type: integer description: 'Health check interval in seconds.' health_check_timeout: type: integer description: 'Health check timeout in seconds.' health_check_retries: type: integer description: 'Health check retries count.' health_check_start_period: type: integer description: 'Health check start period in seconds.' limits_memory: type: string description: 'Memory limit.' limits_memory_swap: type: string description: 'Memory swap limit.' limits_memory_swappiness: type: integer description: 'Memory swappiness.' limits_memory_reservation: type: string description: 'Memory reservation.' limits_cpus: type: string description: 'CPU limit.' limits_cpuset: type: string nullable: true description: 'CPU set.' limits_cpu_shares: type: integer description: 'CPU shares.' custom_labels: type: string description: 'Custom labels.' custom_docker_run_options: type: string description: 'Custom docker run options.' post_deployment_command: type: string description: 'Post deployment command.' post_deployment_command_container: type: string description: 'Post deployment command container.' pre_deployment_command: type: string description: 'Pre deployment command.' pre_deployment_command_container: type: string description: 'Pre deployment command container.' manual_webhook_secret_github: type: string description: 'Manual webhook secret for Github.' manual_webhook_secret_gitlab: type: string description: 'Manual webhook secret for Gitlab.' manual_webhook_secret_bitbucket: type: string description: 'Manual webhook secret for Bitbucket.' manual_webhook_secret_gitea: type: string description: 'Manual webhook secret for Gitea.' redirect: type: string nullable: true description: 'How to set redirect with Traefik / Caddy. www<->non-www.' enum: [www, non-www, both] instant_deploy: type: boolean description: 'The flag to indicate if the application should be deployed instantly.' dockerfile: type: string description: 'The Dockerfile content.' dockerfile_location: type: string description: 'The Dockerfile location in the repository.' docker_compose_location: type: string description: 'The Docker Compose location.' docker_compose_custom_start_command: type: string description: 'The Docker Compose custom start command.' docker_compose_custom_build_command: type: string description: 'The Docker Compose custom build command.' docker_compose_domains: type: array description: 'Array of URLs to be applied to containers of a dockercompose application.' items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "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 URLs in a comma-separated list.' git_commit_sha: type: string description: 'The git commit SHA.' docker_registry_image_name: type: string description: 'The docker registry image name.' docker_registry_image_tag: type: string description: 'The docker registry image tag.' is_static: type: boolean description: 'The flag to indicate if the application is static.' is_spa: type: boolean description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.' is_auto_deploy_enabled: type: boolean description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.' is_force_https_enabled: type: boolean description: 'The flag to indicate if HTTPS is forced. Defaults to true.' static_image: type: string enum: ['nginx:alpine'] description: 'The static image.' install_command: type: string description: 'The install command.' build_command: type: string description: 'The build command.' start_command: type: string description: 'The start command.' ports_mappings: type: string description: 'The ports mappings.' base_directory: type: string description: 'The base directory for all commands.' publish_directory: type: string description: 'The publish directory.' health_check_enabled: type: boolean description: 'Health check enabled.' health_check_path: type: string description: 'Health check path.' health_check_port: type: string nullable: true description: 'Health check port.' health_check_host: type: string nullable: true description: 'Health check host.' health_check_method: type: string description: 'Health check method.' health_check_return_code: type: integer description: 'Health check return code.' health_check_scheme: type: string description: 'Health check scheme.' health_check_response_text: type: string nullable: true description: 'Health check response text.' health_check_interval: type: integer description: 'Health check interval in seconds.' health_check_timeout: type: integer description: 'Health check timeout in seconds.' health_check_retries: type: integer description: 'Health check retries count.' health_check_start_period: type: integer description: 'Health check start period in seconds.' limits_memory: type: string description: 'Memory limit.' limits_memory_swap: type: string description: 'Memory swap limit.' limits_memory_swappiness: type: integer description: 'Memory swappiness.' limits_memory_reservation: type: string description: 'Memory reservation.' limits_cpus: type: string description: 'CPU limit.' limits_cpuset: type: string nullable: true description: 'CPU set.' limits_cpu_shares: type: integer description: 'CPU shares.' custom_labels: type: string description: 'Custom labels.' custom_docker_run_options: type: string description: 'Custom docker run options.' post_deployment_command: type: string description: 'Post deployment command.' post_deployment_command_container: type: string description: 'Post deployment command container.' pre_deployment_command: type: string description: 'Pre deployment command.' pre_deployment_command_container: type: string description: 'Pre deployment command container.' manual_webhook_secret_github: type: string description: 'Manual webhook secret for Github.' manual_webhook_secret_gitlab: type: string description: 'Manual webhook secret for Gitlab.' manual_webhook_secret_bitbucket: type: string description: 'Manual webhook secret for Bitbucket.' manual_webhook_secret_gitea: type: string description: 'Manual webhook secret for Gitea.' redirect: type: string nullable: true description: 'How to set redirect with Traefik / Caddy. www<->non-www.' enum: [www, non-www, both] instant_deploy: type: boolean description: 'The flag to indicate if the application should be deployed instantly.' dockerfile: type: string description: 'The Dockerfile content.' dockerfile_location: type: string description: 'The Dockerfile location in the repository' docker_compose_location: type: string description: 'The Docker Compose location.' docker_compose_custom_start_command: type: string description: 'The Docker Compose custom start command.' docker_compose_custom_build_command: type: string description: 'The Docker Compose custom build command.' docker_compose_domains: type: array description: 'Array of URLs to be applied to containers of a dockercompose application.' items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "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 URLs in a comma-separated list.' git_commit_sha: type: string description: 'The git commit SHA.' docker_registry_image_name: type: string description: 'The docker registry image name.' docker_registry_image_tag: type: string description: 'The docker registry image tag.' is_static: type: boolean description: 'The flag to indicate if the application is static.' is_spa: type: boolean description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.' is_auto_deploy_enabled: type: boolean description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.' is_force_https_enabled: type: boolean description: 'The flag to indicate if HTTPS is forced. Defaults to true.' static_image: type: string enum: ['nginx:alpine'] description: 'The static image.' install_command: type: string description: 'The install command.' build_command: type: string description: 'The build command.' start_command: type: string description: 'The start command.' ports_mappings: type: string description: 'The ports mappings.' base_directory: type: string description: 'The base directory for all commands.' publish_directory: type: string description: 'The publish directory.' health_check_enabled: type: boolean description: 'Health check enabled.' health_check_path: type: string description: 'Health check path.' health_check_port: type: string nullable: true description: 'Health check port.' health_check_host: type: string nullable: true description: 'Health check host.' health_check_method: type: string description: 'Health check method.' health_check_return_code: type: integer description: 'Health check return code.' health_check_scheme: type: string description: 'Health check scheme.' health_check_response_text: type: string nullable: true description: 'Health check response text.' health_check_interval: type: integer description: 'Health check interval in seconds.' health_check_timeout: type: integer description: 'Health check timeout in seconds.' health_check_retries: type: integer description: 'Health check retries count.' health_check_start_period: type: integer description: 'Health check start period in seconds.' limits_memory: type: string description: 'Memory limit.' limits_memory_swap: type: string description: 'Memory swap limit.' limits_memory_swappiness: type: integer description: 'Memory swappiness.' limits_memory_reservation: type: string description: 'Memory reservation.' limits_cpus: type: string description: 'CPU limit.' limits_cpuset: type: string nullable: true description: 'CPU set.' limits_cpu_shares: type: integer description: 'CPU shares.' custom_labels: type: string description: 'Custom labels.' custom_docker_run_options: type: string description: 'Custom docker run options.' post_deployment_command: type: string description: 'Post deployment command.' post_deployment_command_container: type: string description: 'Post deployment command container.' pre_deployment_command: type: string description: 'Pre deployment command.' pre_deployment_command_container: type: string description: 'Pre deployment command container.' manual_webhook_secret_github: type: string description: 'Manual webhook secret for Github.' manual_webhook_secret_gitlab: type: string description: 'Manual webhook secret for Gitlab.' manual_webhook_secret_bitbucket: type: string description: 'Manual webhook secret for Bitbucket.' manual_webhook_secret_gitea: type: string description: 'Manual webhook secret for Gitea.' redirect: type: string nullable: true description: 'How to set redirect with Traefik / Caddy. www<->non-www.' enum: [www, non-www, both] instant_deploy: type: boolean description: 'The flag to indicate if the application should be deployed instantly.' dockerfile: type: string description: 'The Dockerfile content.' dockerfile_location: type: string description: 'The Dockerfile location in the repository.' docker_compose_location: type: string description: 'The Docker Compose location.' docker_compose_custom_start_command: type: string description: 'The Docker Compose custom start command.' docker_compose_custom_build_command: type: string description: 'The Docker Compose custom build command.' docker_compose_domains: type: array description: 'Array of URLs to be applied to containers of a dockercompose application.' items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "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 URLs in a comma-separated list.' docker_registry_image_name: type: string description: 'The docker registry image name.' docker_registry_image_tag: type: string description: 'The docker registry image tag.' ports_mappings: type: string description: 'The ports mappings.' base_directory: type: string description: 'The base directory for all commands.' health_check_enabled: type: boolean description: 'Health check enabled.' health_check_path: type: string description: 'Health check path.' health_check_port: type: string nullable: true description: 'Health check port.' health_check_host: type: string nullable: true description: 'Health check host.' health_check_method: type: string description: 'Health check method.' health_check_return_code: type: integer description: 'Health check return code.' health_check_scheme: type: string description: 'Health check scheme.' health_check_response_text: type: string nullable: true description: 'Health check response text.' health_check_interval: type: integer description: 'Health check interval in seconds.' health_check_timeout: type: integer description: 'Health check timeout in seconds.' health_check_retries: type: integer description: 'Health check retries count.' health_check_start_period: type: integer description: 'Health check start period in seconds.' limits_memory: type: string description: 'Memory limit.' limits_memory_swap: type: string description: 'Memory swap limit.' limits_memory_swappiness: type: integer description: 'Memory swappiness.' limits_memory_reservation: type: string description: 'Memory reservation.' limits_cpus: type: string description: 'CPU limit.' limits_cpuset: type: string nullable: true description: 'CPU set.' limits_cpu_shares: type: integer description: 'CPU shares.' custom_labels: type: string description: 'Custom labels.' custom_docker_run_options: type: string description: 'Custom docker run options.' post_deployment_command: type: string description: 'Post deployment command.' post_deployment_command_container: type: string description: 'Post deployment command container.' pre_deployment_command: type: string description: 'Pre deployment command.' pre_deployment_command_container: type: string description: 'Pre deployment command container.' manual_webhook_secret_github: type: string description: 'Manual webhook secret for Github.' manual_webhook_secret_gitlab: type: string description: 'Manual webhook secret for Gitlab.' manual_webhook_secret_bitbucket: type: string description: 'Manual webhook secret for Bitbucket.' manual_webhook_secret_gitea: type: string description: 'Manual webhook secret for Gitea.' redirect: type: string nullable: true description: 'How to set redirect with Traefik / Caddy. www<->non-www.' enum: [www, non-www, both] instant_deploy: type: boolean description: 'The flag to indicate if the application should be deployed instantly.' is_force_https_enabled: type: boolean description: 'The flag to indicate if HTTPS is forced. Defaults to true.' 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 URLs in a comma-separated list.' ports_mappings: type: string description: 'The ports mappings.' health_check_enabled: type: boolean description: 'Health check enabled.' health_check_path: type: string description: 'Health check path.' health_check_port: type: string nullable: true description: 'Health check port.' health_check_host: type: string nullable: true description: 'Health check host.' health_check_method: type: string description: 'Health check method.' health_check_return_code: type: integer description: 'Health check return code.' health_check_scheme: type: string description: 'Health check scheme.' health_check_response_text: type: string nullable: true description: 'Health check response text.' health_check_interval: type: integer description: 'Health check interval in seconds.' health_check_timeout: type: integer description: 'Health check timeout in seconds.' health_check_retries: type: integer description: 'Health check retries count.' health_check_start_period: type: integer description: 'Health check start period in seconds.' limits_memory: type: string description: 'Memory limit.' limits_memory_swap: type: string description: 'Memory swap limit.' limits_memory_swappiness: type: integer description: 'Memory swappiness.' limits_memory_reservation: type: string description: 'Memory reservation.' limits_cpus: type: string description: 'CPU limit.' limits_cpuset: type: string nullable: true description: 'CPU set.' limits_cpu_shares: type: integer description: 'CPU shares.' custom_labels: type: string description: 'Custom labels.' custom_docker_run_options: type: string description: 'Custom docker run options.' post_deployment_command: type: string description: 'Post deployment command.' post_deployment_command_container: type: string description: 'Post deployment command container.' pre_deployment_command: type: string description: 'Pre deployment command.' pre_deployment_command_container: type: string description: 'Pre deployment command container.' manual_webhook_secret_github: type: string description: 'Manual webhook secret for Github.' manual_webhook_secret_gitlab: type: string description: 'Manual webhook secret for Gitlab.' manual_webhook_secret_bitbucket: type: string description: 'Manual webhook secret for Bitbucket.' manual_webhook_secret_gitea: type: string description: 'Manual webhook secret for Gitea.' redirect: type: string nullable: true description: 'How to set redirect with Traefik / Caddy. www<->non-www.' enum: [www, non-www, both] instant_deploy: type: boolean description: 'The flag to indicate if the application should be deployed instantly.' is_force_https_enabled: type: boolean description: 'The flag to indicate if HTTPS is forced. Defaults to true.' 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)' description: 'Deprecated: Use POST /api/v1/services instead.' 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 URLs in a comma-separated list.' git_commit_sha: type: string description: 'The git commit SHA.' docker_registry_image_name: type: string description: 'The docker registry image name.' docker_registry_image_tag: type: string description: 'The docker registry image tag.' is_static: type: boolean description: 'The flag to indicate if the application is static.' is_spa: type: boolean description: 'The flag to indicate if the application is a single-page application (SPA). Only relevant when is_static is true.' is_auto_deploy_enabled: type: boolean description: 'The flag to indicate if auto-deploy is enabled on git push. Defaults to true.' is_force_https_enabled: type: boolean description: 'The flag to indicate if HTTPS is forced. Defaults to true.' install_command: type: string description: 'The install command.' build_command: type: string description: 'The build command.' start_command: type: string description: 'The start command.' ports_mappings: type: string description: 'The ports mappings.' base_directory: type: string description: 'The base directory for all commands.' publish_directory: type: string description: 'The publish directory.' health_check_enabled: type: boolean description: 'Health check enabled.' health_check_path: type: string description: 'Health check path.' health_check_port: type: string nullable: true description: 'Health check port.' health_check_host: type: string nullable: true description: 'Health check host.' health_check_method: type: string description: 'Health check method.' health_check_return_code: type: integer description: 'Health check return code.' health_check_scheme: type: string description: 'Health check scheme.' health_check_response_text: type: string nullable: true description: 'Health check response text.' health_check_interval: type: integer description: 'Health check interval in seconds.' health_check_timeout: type: integer description: 'Health check timeout in seconds.' health_check_retries: type: integer description: 'Health check retries count.' health_check_start_period: type: integer description: 'Health check start period in seconds.' limits_memory: type: string description: 'Memory limit.' limits_memory_swap: type: string description: 'Memory swap limit.' limits_memory_swappiness: type: integer description: 'Memory swappiness.' limits_memory_reservation: type: string description: 'Memory reservation.' limits_cpus: type: string description: 'CPU limit.' limits_cpuset: type: string nullable: true description: 'CPU set.' limits_cpu_shares: type: integer description: 'CPU shares.' custom_labels: type: string description: 'Custom labels.' custom_docker_run_options: type: string description: 'Custom docker run options.' post_deployment_command: type: string description: 'Post deployment command.' post_deployment_command_container: type: string description: 'Post deployment command container.' pre_deployment_command: type: string description: 'Pre deployment command.' pre_deployment_command_container: type: string description: 'Pre deployment command container.' manual_webhook_secret_github: type: string description: 'Manual webhook secret for Github.' manual_webhook_secret_gitlab: type: string description: 'Manual webhook secret for Gitlab.' manual_webhook_secret_bitbucket: type: string description: 'Manual webhook secret for Bitbucket.' manual_webhook_secret_gitea: type: string description: 'Manual webhook secret for Gitea.' redirect: type: string nullable: true description: 'How to set redirect with Traefik / Caddy. www<->non-www.' enum: [www, non-www, both] instant_deploy: type: boolean description: 'The flag to indicate if the application should be deployed instantly.' dockerfile: type: string description: 'The Dockerfile content.' dockerfile_location: type: string description: 'The Dockerfile location in the repository.' docker_compose_location: type: string description: 'The Docker Compose location.' docker_compose_custom_start_command: type: string description: 'The Docker Compose custom start command.' docker_compose_custom_build_command: type: string description: 'The Docker Compose custom build command.' docker_compose_domains: type: array description: 'Array of URLs to be applied to containers of a dockercompose application.' items: { properties: { name: { type: string, description: 'The service name as defined in docker-compose.' }, domain: { type: string, description: 'Comma-separated list of URLs (e.g. "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: $ref: '#/components/schemas/EnvironmentVariable' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/applications/{uuid}/envs/bulk': patch: tags: - Applications summary: 'Update Envs (Bulk)' description: 'Update multiple envs by application UUID.' operationId: update-envs-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string requestBody: description: 'Bulk envs updated.' required: true content: application/json: schema: required: - data properties: data: type: array items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object } type: object responses: '201': description: 'Environment variables updated.' content: application/json: schema: type: array items: $ref: '#/components/schemas/EnvironmentVariable' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/applications/{uuid}/envs/{env_uuid}': delete: tags: - Applications summary: 'Delete Env' description: 'Delete env by UUID.' operationId: delete-env-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string - name: env_uuid in: path description: 'UUID of the environment variable.' required: true schema: type: string responses: '200': description: 'Environment variable deleted.' content: application/json: schema: properties: message: { type: string, example: 'Environment variable deleted.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/applications/{uuid}/start': 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 URLs (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 URLs (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: $ref: '#/components/schemas/EnvironmentVariable' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/services/{uuid}/envs/bulk': patch: tags: - Services summary: 'Update Envs (Bulk)' description: 'Update multiple envs by service UUID.' operationId: update-envs-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string requestBody: description: 'Bulk envs updated.' required: true content: application/json: schema: required: - data properties: data: type: array items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object } type: object responses: '201': description: 'Environment variables updated.' content: application/json: schema: type: array items: $ref: '#/components/schemas/EnvironmentVariable' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/services/{uuid}/envs/{env_uuid}': delete: tags: - Services summary: 'Delete Env' description: 'Delete env by UUID.' operationId: delete-env-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string - name: env_uuid in: path description: 'UUID of the environment variable.' required: true schema: type: string responses: '200': description: 'Environment variable deleted.' content: application/json: schema: properties: message: { type: string, example: 'Environment variable deleted.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/services/{uuid}/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