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.' is_preserve_repository_enabled: type: boolean default: false description: 'Preserve repository during deployment.' type: object responses: '201': description: 'Application created successfully.' content: application/json: schema: properties: uuid: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '409': description: 'Domain conflicts detected.' content: application/json: schema: properties: message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' } warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' } conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } } type: object security: - bearerAuth: [] /applications/private-github-app: post: tags: - Applications summary: 'Create (Private - GH App)' description: 'Create new application based on a private repository through a Github App.' operationId: create-private-github-app-application requestBody: description: 'Application object that needs to be created.' required: true content: application/json: schema: required: - project_uuid - server_uuid - environment_name - environment_uuid - github_app_uuid - git_repository - git_branch - build_pack - 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.' is_preserve_repository_enabled: type: boolean default: false description: 'Preserve repository during deployment.' type: object responses: '201': description: 'Application created successfully.' content: application/json: schema: properties: uuid: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '409': description: 'Domain conflicts detected.' content: application/json: schema: properties: message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' } warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' } conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } } type: object security: - bearerAuth: [] /applications/private-deploy-key: post: tags: - Applications summary: 'Create (Private - Deploy Key)' description: 'Create new application based on a private repository through a Deploy Key.' operationId: create-private-deploy-key-application requestBody: description: 'Application object that needs to be created.' required: true content: application/json: schema: required: - project_uuid - server_uuid - environment_name - environment_uuid - private_key_uuid - git_repository - git_branch - build_pack - 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.' is_preserve_repository_enabled: type: boolean default: false description: 'Preserve repository during deployment.' type: object responses: '201': description: 'Application created successfully.' content: application/json: schema: properties: uuid: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '409': description: 'Domain conflicts detected.' content: application/json: schema: properties: message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' } warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' } conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } } type: object security: - bearerAuth: [] /applications/dockerfile: post: tags: - Applications summary: 'Create (Dockerfile without git)' description: 'Create new application based on a simple Dockerfile (without git).' operationId: create-dockerfile-application requestBody: description: 'Application object that needs to be created.' required: true content: application/json: schema: required: - project_uuid - server_uuid - environment_name - environment_uuid - dockerfile properties: project_uuid: type: string description: 'The project UUID.' server_uuid: type: string description: 'The server UUID.' environment_name: type: string description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.' dockerfile: type: string description: 'The Dockerfile content.' build_pack: type: string enum: [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.' is_preserve_repository_enabled: type: boolean description: 'Preserve git repository during application update. If false, the existing repository will be removed and replaced with the new one. If true, the existing repository will be kept and the new one will be ignored. Default is false.' type: object responses: '200': description: 'Application updated.' content: application/json: schema: properties: uuid: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '409': description: 'Domain conflicts detected.' content: application/json: schema: properties: message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' } warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' } conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } } type: object security: - bearerAuth: [] '/applications/{uuid}/logs': get: tags: - Applications summary: 'Get application logs.' description: 'Get application logs by UUID.' operationId: get-application-logs-by-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string - name: lines in: query description: 'Number of lines to show from the end of the logs.' required: false schema: type: integer format: int32 default: 100 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 - name: docker_cleanup in: query description: 'Perform docker cleanup (prune networks, volumes, etc.).' schema: type: boolean default: true responses: '200': description: 'Stop application.' content: application/json: schema: properties: message: { type: string, example: 'Application stopping request queued.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/applications/{uuid}/restart': 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: [] '/applications/{uuid}/storages': get: tags: - Applications summary: 'List Storages' description: 'List all persistent storages and file storages by application UUID.' operationId: list-storages-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string responses: '200': description: 'All storages by application UUID.' content: application/json: schema: properties: persistent_storages: { type: array, items: { type: object } } file_storages: { type: array, items: { type: object } } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] post: tags: - Applications summary: 'Create Storage' description: 'Create a persistent storage or file storage for an application.' operationId: create-storage-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string requestBody: required: true content: application/json: schema: required: - type - mount_path properties: type: type: string enum: [persistent, file] description: 'The type of storage.' name: type: string description: 'Volume name (persistent only, required for persistent).' mount_path: type: string description: 'The container mount path.' host_path: type: string nullable: true description: 'The host path (persistent only, optional).' content: type: string nullable: true description: 'File content (file only, optional).' is_directory: type: boolean description: 'Whether this is a directory mount (file only, default false).' fs_path: type: string description: 'Host directory path (required when is_directory is true).' type: object additionalProperties: false responses: '201': description: 'Storage created.' content: application/json: schema: type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] patch: tags: - Applications summary: 'Update Storage' description: 'Update a persistent storage or file storage by application UUID.' operationId: update-storage-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string requestBody: description: 'Storage updated. For read-only storages (from docker-compose or services), only is_preview_suffix_enabled can be updated.' required: true content: application/json: schema: required: - type properties: uuid: type: string description: 'The UUID of the storage (preferred).' id: type: integer description: 'The ID of the storage (deprecated, use uuid instead).' type: type: string enum: [persistent, file] description: 'The type of storage: persistent or file.' is_preview_suffix_enabled: type: boolean description: 'Whether to add -pr-N suffix for preview deployments.' name: type: string description: 'The volume name (persistent only, not allowed for read-only storages).' mount_path: type: string description: 'The container mount path (not allowed for read-only storages).' host_path: type: string nullable: true description: 'The host path (persistent only, not allowed for read-only storages).' content: type: string nullable: true description: 'The file content (file only, not allowed for read-only storages).' type: object additionalProperties: false responses: '200': description: 'Storage updated.' content: application/json: schema: type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/applications/{uuid}/storages/{storage_uuid}': delete: tags: - Applications summary: 'Delete Storage' description: 'Delete a persistent storage or file storage by application UUID.' operationId: delete-storage-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string - name: storage_uuid in: path description: 'UUID of the storage.' required: true schema: type: string responses: '200': description: 'Storage deleted.' content: application/json: schema: properties: message: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /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' timeout: type: integer description: 'Backup job timeout in seconds (min: 60, max: 36000)' default: 3600 type: object responses: '201': description: 'Backup configuration created successfully' content: application/json: schema: properties: uuid: { type: string, format: uuid, example: 550e8400-e29b-41d4-a716-446655440000 } message: { type: string, example: 'Backup configuration created successfully.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/databases/{uuid}': get: tags: - Databases summary: Get description: 'Get database by UUID.' operationId: get-database-by-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string responses: '200': description: 'Get all databases' content: application/json: schema: type: string example: 'Content is very complex. Will be implemented later.' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] delete: tags: - Databases summary: Delete description: 'Delete database by UUID.' operationId: delete-database-by-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string - name: delete_configurations in: query description: 'Delete configurations.' required: false schema: type: boolean default: true - name: delete_volumes in: query description: 'Delete volumes.' required: false schema: type: boolean default: true - name: docker_cleanup in: query description: 'Run docker cleanup.' required: false schema: type: boolean default: true - name: delete_connected_networks in: query description: 'Delete connected networks.' required: false schema: type: boolean default: true responses: '200': description: 'Database deleted.' content: application/json: schema: properties: message: { type: string, example: 'Database deleted.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] patch: tags: - Databases summary: Update description: 'Update database by UUID.' operationId: update-database-by-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string requestBody: description: 'Database data' required: true content: application/json: schema: properties: name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' postgres_user: type: string description: 'PostgreSQL user' postgres_password: type: string description: 'PostgreSQL password' postgres_db: type: string description: 'PostgreSQL database' postgres_initdb_args: type: string description: 'PostgreSQL initdb args' postgres_host_auth_method: type: string description: 'PostgreSQL host auth method' postgres_conf: type: string description: 'PostgreSQL conf' clickhouse_admin_user: type: string description: 'Clickhouse admin user' clickhouse_admin_password: type: string description: 'Clickhouse admin password' dragonfly_password: type: string description: 'DragonFly password' redis_password: type: string description: 'Redis password' redis_conf: type: string description: 'Redis conf' keydb_password: type: string description: 'KeyDB password' keydb_conf: type: string description: 'KeyDB conf' mariadb_conf: type: string description: 'MariaDB conf' mariadb_root_password: type: string description: 'MariaDB root password' mariadb_user: type: string description: 'MariaDB user' mariadb_password: type: string description: 'MariaDB password' mariadb_database: type: string description: 'MariaDB database' mongo_conf: type: string description: 'Mongo conf' mongo_initdb_root_username: type: string description: 'Mongo initdb root username' mongo_initdb_root_password: type: string description: 'Mongo initdb root password' mongo_initdb_database: type: string description: 'Mongo initdb init database' mysql_root_password: type: string description: 'MySQL root password' mysql_password: type: string description: 'MySQL password' mysql_user: type: string description: 'MySQL user' mysql_database: type: string description: 'MySQL database' mysql_conf: type: string description: 'MySQL conf' 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' timeout: type: integer description: 'Backup job timeout in seconds (min: 60, max: 36000)' default: 3600 type: object responses: '200': description: 'Database backup configuration updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/postgresql: post: tags: - Databases summary: 'Create (PostgreSQL)' description: 'Create a new PostgreSQL database.' operationId: create-database-postgresql requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' postgres_user: type: string description: 'PostgreSQL user' postgres_password: type: string description: 'PostgreSQL password' postgres_db: type: string description: 'PostgreSQL database' postgres_initdb_args: type: string description: 'PostgreSQL initdb args' postgres_host_auth_method: type: string description: 'PostgreSQL host auth method' postgres_conf: type: string description: 'PostgreSQL conf' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' type: object responses: '200': description: 'Database updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/clickhouse: post: tags: - Databases summary: 'Create (Clickhouse)' description: 'Create a new Clickhouse database.' operationId: create-database-clickhouse requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' clickhouse_admin_user: type: string description: 'Clickhouse admin user' clickhouse_admin_password: type: string description: 'Clickhouse admin password' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' type: object responses: '200': description: 'Database updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/dragonfly: post: tags: - Databases summary: 'Create (DragonFly)' description: 'Create a new DragonFly database.' operationId: create-database-dragonfly requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' dragonfly_password: type: string description: 'DragonFly password' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' type: object responses: '200': description: 'Database updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/redis: post: tags: - Databases summary: 'Create (Redis)' description: 'Create a new Redis database.' operationId: create-database-redis requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' redis_password: type: string description: 'Redis password' redis_conf: type: string description: 'Redis conf' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' type: object responses: '200': description: 'Database updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/keydb: post: tags: - Databases summary: 'Create (KeyDB)' description: 'Create a new KeyDB database.' operationId: create-database-keydb requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' keydb_password: type: string description: 'KeyDB password' keydb_conf: type: string description: 'KeyDB conf' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' type: object responses: '200': description: 'Database updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/mariadb: post: tags: - Databases summary: 'Create (MariaDB)' description: 'Create a new MariaDB database.' operationId: create-database-mariadb requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' mariadb_conf: type: string description: 'MariaDB conf' mariadb_root_password: type: string description: 'MariaDB root password' mariadb_user: type: string description: 'MariaDB user' mariadb_password: type: string description: 'MariaDB password' mariadb_database: type: string description: 'MariaDB database' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' type: object responses: '200': description: 'Database updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/mysql: post: tags: - Databases summary: 'Create (MySQL)' description: 'Create a new MySQL database.' operationId: create-database-mysql requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' mysql_root_password: type: string description: 'MySQL root password' mysql_password: type: string description: 'MySQL password' mysql_user: type: string description: 'MySQL user' mysql_database: type: string description: 'MySQL database' mysql_conf: type: string description: 'MySQL conf' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' type: object responses: '200': description: 'Database updated' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /databases/mongodb: post: tags: - Databases summary: 'Create (MongoDB)' description: 'Create a new MongoDB database.' operationId: create-database-mongodb requestBody: description: 'Database data' required: true content: application/json: schema: required: - server_uuid - project_uuid - environment_name - environment_uuid properties: server_uuid: type: string description: 'UUID of the server' project_uuid: type: string description: 'UUID of the project' environment_name: type: string description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' environment_uuid: type: string description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' destination_uuid: type: string description: 'UUID of the destination if the server has multiple destinations' mongo_conf: type: string description: 'MongoDB conf' mongo_initdb_root_username: type: string description: 'MongoDB initdb root username' name: type: string description: 'Name of the database' description: type: string description: 'Description of the database' image: type: string description: 'Docker Image of the database' is_public: type: boolean description: 'Is the database public?' public_port: type: integer description: 'Public port of the database' public_port_timeout: type: integer description: 'Public port timeout in seconds (default: 3600)' limits_memory: type: string description: 'Memory limit of the database' limits_memory_swap: type: string description: 'Memory swap limit of the database' limits_memory_swappiness: type: integer description: 'Memory swappiness of the database' limits_memory_reservation: type: string description: 'Memory reservation of the database' limits_cpus: type: string description: 'CPU limit of the database' limits_cpuset: type: string description: 'CPU set of the database' limits_cpu_shares: type: integer description: 'CPU shares of the database' instant_deploy: type: boolean description: 'Instant deploy the database' 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 - name: docker_cleanup in: query description: 'Perform docker cleanup (prune networks, volumes, etc.).' schema: type: boolean default: true responses: '200': description: 'Stop database.' content: application/json: schema: properties: message: { type: string, example: 'Database stopping request queued.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/databases/{uuid}/restart': 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: [] '/databases/{uuid}/envs': get: tags: - Databases summary: 'List Envs' description: 'List all envs by database UUID.' operationId: list-envs-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string responses: '200': description: 'Environment variables.' content: application/json: schema: type: array items: $ref: '#/components/schemas/EnvironmentVariable' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] post: tags: - Databases summary: 'Create Env' description: 'Create env by database UUID.' operationId: create-env-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string requestBody: description: 'Env created.' required: true content: application/json: schema: properties: key: type: string description: 'The key of the environment variable.' value: type: string description: 'The value of the environment variable.' is_literal: type: boolean description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' is_multiline: type: boolean description: 'The flag to indicate if the environment variable is multiline.' is_shown_once: type: boolean description: "The flag to indicate if the environment variable's value is shown on the UI." type: object responses: '201': description: 'Environment variable created.' content: application/json: schema: properties: uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] patch: tags: - Databases summary: 'Update Env' description: 'Update env by database UUID.' operationId: update-env-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string requestBody: description: 'Env updated.' required: true content: application/json: schema: required: - key - value properties: key: type: string description: 'The key of the environment variable.' value: type: string description: 'The value of the environment variable.' is_literal: type: boolean description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' is_multiline: type: boolean description: 'The flag to indicate if the environment variable is multiline.' is_shown_once: type: boolean description: "The flag to indicate if the environment variable's value is shown on the UI." type: object responses: '201': description: 'Environment variable updated.' content: application/json: schema: $ref: '#/components/schemas/EnvironmentVariable' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/databases/{uuid}/envs/bulk': patch: tags: - Databases summary: 'Update Envs (Bulk)' description: 'Update multiple envs by database UUID.' operationId: update-envs-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string requestBody: description: 'Bulk envs updated.' required: true content: application/json: schema: required: - data properties: data: type: array items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object } type: object responses: '201': description: 'Environment variables updated.' content: application/json: schema: type: array items: $ref: '#/components/schemas/EnvironmentVariable' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/databases/{uuid}/envs/{env_uuid}': delete: tags: - Databases summary: 'Delete Env' description: 'Delete env by UUID.' operationId: delete-env-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string - name: env_uuid in: path description: 'UUID of the environment variable.' required: true schema: type: string responses: '200': description: 'Environment variable deleted.' content: application/json: schema: properties: message: { type: string, example: 'Environment variable deleted.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/databases/{uuid}/storages': get: tags: - Databases summary: 'List Storages' description: 'List all persistent storages and file storages by database UUID.' operationId: list-storages-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string responses: '200': description: 'All storages by database UUID.' content: application/json: schema: properties: persistent_storages: { type: array, items: { type: object } } file_storages: { type: array, items: { type: object } } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] post: tags: - Databases summary: 'Create Storage' description: 'Create a persistent storage or file storage for a database.' operationId: create-storage-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string requestBody: required: true content: application/json: schema: required: - type - mount_path properties: type: type: string enum: [persistent, file] description: 'The type of storage.' name: type: string description: 'Volume name (persistent only, required for persistent).' mount_path: type: string description: 'The container mount path.' host_path: type: string nullable: true description: 'The host path (persistent only, optional).' content: type: string nullable: true description: 'File content (file only, optional).' is_directory: type: boolean description: 'Whether this is a directory mount (file only, default false).' fs_path: type: string description: 'Host directory path (required when is_directory is true).' type: object additionalProperties: false responses: '201': description: 'Storage created.' content: application/json: schema: type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] patch: tags: - Databases summary: 'Update Storage' description: 'Update a persistent storage or file storage by database UUID.' operationId: update-storage-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string requestBody: description: 'Storage updated. For read-only storages (from docker-compose or services), only is_preview_suffix_enabled can be updated.' required: true content: application/json: schema: required: - type properties: uuid: type: string description: 'The UUID of the storage (preferred).' id: type: integer description: 'The ID of the storage (deprecated, use uuid instead).' type: type: string enum: [persistent, file] description: 'The type of storage: persistent or file.' is_preview_suffix_enabled: type: boolean description: 'Whether to add -pr-N suffix for preview deployments.' name: type: string description: 'The volume name (persistent only, not allowed for read-only storages).' mount_path: type: string description: 'The container mount path (not allowed for read-only storages).' host_path: type: string nullable: true description: 'The host path (persistent only, not allowed for read-only storages).' content: type: string nullable: true description: 'The file content (file only, not allowed for read-only storages).' type: object additionalProperties: false responses: '200': description: 'Storage updated.' content: application/json: schema: type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/databases/{uuid}/storages/{storage_uuid}': delete: tags: - Databases summary: 'Delete Storage' description: 'Delete a persistent storage or file storage by database UUID.' operationId: delete-storage-by-database-uuid parameters: - name: uuid in: path description: 'UUID of the database.' required: true schema: type: string - name: storage_uuid in: path description: 'UUID of the storage.' required: true schema: type: string responses: '200': description: 'Storage deleted.' content: application/json: schema: properties: message: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /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 - name: pull_request_id in: query description: 'Preview deployment identifier. Alias of pr.' schema: type: integer - name: docker_tag in: query description: 'Docker image tag for Docker Image preview deployments. Requires pull_request_id.' schema: type: string responses: '200': description: "Get deployment(s) UUID's" content: application/json: schema: properties: deployments: { type: array, items: { properties: { message: { type: string }, resource_uuid: { type: string }, deployment_uuid: { type: string } }, type: object } } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' security: - bearerAuth: [] '/deployments/applications/{uuid}': get: tags: - Deployments summary: 'List application deployments' description: 'List application deployments by using the app uuid' operationId: list-deployments-by-app-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string - name: skip in: query description: 'Number of records to skip.' required: false schema: type: integer default: 0 minimum: 0 - name: take in: query description: 'Number of records to take.' required: false schema: type: integer default: 10 minimum: 1 responses: '200': description: 'List application deployments by using the app uuid.' content: application/json: schema: type: array items: $ref: '#/components/schemas/Application' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' security: - bearerAuth: [] /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: [] '/applications/{uuid}/scheduled-tasks': get: tags: - 'Scheduled Tasks' summary: 'List Tasks' description: 'List all scheduled tasks for an application.' operationId: list-scheduled-tasks-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string responses: '200': description: 'Get all scheduled tasks for an application.' content: application/json: schema: type: array items: $ref: '#/components/schemas/ScheduledTask' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] post: tags: - 'Scheduled Tasks' summary: 'Create Task' description: 'Create a new scheduled task for an application.' operationId: create-scheduled-task-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string requestBody: description: 'Scheduled task data' required: true content: application/json: schema: required: - name - command - frequency properties: name: type: string description: 'The name of the scheduled task.' command: type: string description: 'The command to execute.' frequency: type: string description: 'The frequency of the scheduled task.' container: type: string nullable: true description: 'The container where the command should be executed.' timeout: type: integer description: 'The timeout of the scheduled task in seconds.' default: 300 enabled: type: boolean description: 'The flag to indicate if the scheduled task is enabled.' default: true type: object responses: '201': description: 'Scheduled task created.' content: application/json: schema: $ref: '#/components/schemas/ScheduledTask' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/applications/{uuid}/scheduled-tasks/{task_uuid}': delete: tags: - 'Scheduled Tasks' summary: 'Delete Task' description: 'Delete a scheduled task for an application.' operationId: delete-scheduled-task-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string - name: task_uuid in: path description: 'UUID of the scheduled task.' required: true schema: type: string responses: '200': description: 'Scheduled task deleted.' content: application/json: schema: properties: message: { type: string, example: 'Scheduled task deleted.' } type: object '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] patch: tags: - 'Scheduled Tasks' summary: 'Update Task' description: 'Update a scheduled task for an application.' operationId: update-scheduled-task-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string - name: task_uuid in: path description: 'UUID of the scheduled task.' required: true schema: type: string requestBody: description: 'Scheduled task data' required: true content: application/json: schema: properties: name: type: string description: 'The name of the scheduled task.' command: type: string description: 'The command to execute.' frequency: type: string description: 'The frequency of the scheduled task.' container: type: string nullable: true description: 'The container where the command should be executed.' timeout: type: integer description: 'The timeout of the scheduled task in seconds.' default: 300 enabled: type: boolean description: 'The flag to indicate if the scheduled task is enabled.' default: true type: object responses: '200': description: 'Scheduled task updated.' content: application/json: schema: $ref: '#/components/schemas/ScheduledTask' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/applications/{uuid}/scheduled-tasks/{task_uuid}/executions': get: tags: - 'Scheduled Tasks' summary: 'List Executions' description: 'List all executions for a scheduled task on an application.' operationId: list-scheduled-task-executions-by-application-uuid parameters: - name: uuid in: path description: 'UUID of the application.' required: true schema: type: string - name: task_uuid in: path description: 'UUID of the scheduled task.' required: true schema: type: string responses: '200': description: 'Get all executions for a scheduled task.' content: application/json: schema: type: array items: $ref: '#/components/schemas/ScheduledTaskExecution' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/services/{uuid}/scheduled-tasks': get: tags: - 'Scheduled Tasks' summary: 'List Tasks' description: 'List all scheduled tasks for a service.' operationId: list-scheduled-tasks-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string responses: '200': description: 'Get all scheduled tasks for a service.' content: application/json: schema: type: array items: $ref: '#/components/schemas/ScheduledTask' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] post: tags: - 'Scheduled Tasks' summary: 'Create Task' description: 'Create a new scheduled task for a service.' operationId: create-scheduled-task-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string requestBody: description: 'Scheduled task data' required: true content: application/json: schema: required: - name - command - frequency properties: name: type: string description: 'The name of the scheduled task.' command: type: string description: 'The command to execute.' frequency: type: string description: 'The frequency of the scheduled task.' container: type: string nullable: true description: 'The container where the command should be executed.' timeout: type: integer description: 'The timeout of the scheduled task in seconds.' default: 300 enabled: type: boolean description: 'The flag to indicate if the scheduled task is enabled.' default: true type: object responses: '201': description: 'Scheduled task created.' content: application/json: schema: $ref: '#/components/schemas/ScheduledTask' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/services/{uuid}/scheduled-tasks/{task_uuid}': delete: tags: - 'Scheduled Tasks' summary: 'Delete Task' description: 'Delete a scheduled task for a service.' operationId: delete-scheduled-task-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string - name: task_uuid in: path description: 'UUID of the scheduled task.' required: true schema: type: string responses: '200': description: 'Scheduled task deleted.' content: application/json: schema: properties: message: { type: string, example: 'Scheduled task deleted.' } type: object '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] patch: tags: - 'Scheduled Tasks' summary: 'Update Task' description: 'Update a scheduled task for a service.' operationId: update-scheduled-task-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string - name: task_uuid in: path description: 'UUID of the scheduled task.' required: true schema: type: string requestBody: description: 'Scheduled task data' required: true content: application/json: schema: properties: name: type: string description: 'The name of the scheduled task.' command: type: string description: 'The command to execute.' frequency: type: string description: 'The frequency of the scheduled task.' container: type: string nullable: true description: 'The container where the command should be executed.' timeout: type: integer description: 'The timeout of the scheduled task in seconds.' default: 300 enabled: type: boolean description: 'The flag to indicate if the scheduled task is enabled.' default: true type: object responses: '200': description: 'Scheduled task updated.' content: application/json: schema: $ref: '#/components/schemas/ScheduledTask' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/services/{uuid}/scheduled-tasks/{task_uuid}/executions': get: tags: - 'Scheduled Tasks' summary: 'List Executions' description: 'List all executions for a scheduled task on a service.' operationId: list-scheduled-task-executions-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string - name: task_uuid in: path description: 'UUID of the scheduled task.' required: true schema: type: string responses: '200': description: 'Get all executions for a scheduled task.' content: application/json: schema: type: array items: $ref: '#/components/schemas/ScheduledTaskExecution' '401': $ref: '#/components/responses/401' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] /security/keys: get: tags: - 'Private Keys' summary: List description: 'List all private keys.' operationId: list-private-keys responses: '200': description: 'Get all private keys.' content: application/json: schema: type: array items: $ref: '#/components/schemas/PrivateKey' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' security: - bearerAuth: [] post: tags: - 'Private Keys' summary: Create description: 'Create a new private key.' operationId: create-private-key requestBody: required: true content: application/json: schema: required: - private_key properties: name: type: string description: type: string private_key: type: string type: object additionalProperties: false responses: '201': description: "The created private key's UUID." content: application/json: schema: properties: uuid: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] patch: tags: - 'Private Keys' summary: Update description: 'Update a private key.' operationId: update-private-key requestBody: required: true content: application/json: schema: required: - private_key properties: name: type: string description: type: string private_key: type: string type: object additionalProperties: false responses: '201': description: "The updated private key's UUID." content: application/json: schema: properties: uuid: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/security/keys/{uuid}': get: tags: - 'Private Keys' summary: Get description: 'Get key by UUID.' operationId: get-private-key-by-uuid parameters: - name: uuid in: path description: 'Private Key UUID' required: true schema: type: string responses: '200': description: 'Get all private keys.' content: application/json: schema: $ref: '#/components/schemas/PrivateKey' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': description: 'Private Key not found.' security: - bearerAuth: [] delete: tags: - 'Private Keys' summary: Delete description: 'Delete a private key.' operationId: delete-private-key-by-uuid parameters: - name: uuid in: path description: 'Private Key UUID' required: true schema: type: string responses: '200': description: 'Private Key deleted.' content: application/json: schema: properties: message: { type: string, example: 'Private Key deleted.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': description: 'Private Key not found.' '422': description: 'Private Key is in use and cannot be deleted.' content: application/json: schema: properties: message: { type: string, example: 'Private Key is in use and cannot be deleted.' } type: object security: - bearerAuth: [] /servers: get: tags: - Servers summary: List description: 'List all servers.' operationId: list-servers responses: '200': description: 'Get all servers.' content: application/json: schema: type: array items: $ref: '#/components/schemas/Server' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' security: - bearerAuth: [] post: tags: - Servers summary: Create description: 'Create Server.' operationId: create-server requestBody: description: 'Server created.' required: true content: application/json: schema: properties: name: type: string example: 'My Server' description: 'The name of the server.' description: type: string example: 'My Server Description' description: 'The description of the server.' ip: type: string example: 127.0.0.1 description: 'The IP of the server.' port: type: integer example: 22 description: 'The port of the server.' user: type: string example: root description: 'The user of the server.' private_key_uuid: type: string example: og888os description: 'The UUID of the private key.' is_build_server: type: boolean example: false description: 'Is build server.' instant_validate: type: boolean example: false description: 'Instant validate.' proxy_type: type: string enum: [traefik, caddy, none] example: traefik description: 'The proxy type.' type: object responses: '201': description: 'Server created.' content: application/json: schema: properties: uuid: { type: string, example: og888os, description: 'The UUID of the server.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/servers/{uuid}': get: tags: - Servers summary: Get description: 'Get server by UUID.' operationId: get-server-by-uuid parameters: - name: uuid in: path description: "Server's UUID" required: true schema: type: string responses: '200': description: 'Get server by UUID' content: application/json: schema: $ref: '#/components/schemas/Server' '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] delete: tags: - Servers summary: Delete description: 'Delete server by UUID.' operationId: delete-server-by-uuid parameters: - name: uuid in: path description: 'UUID of the server.' required: true schema: type: string responses: '200': description: 'Server deleted.' content: application/json: schema: properties: message: { type: string, example: 'Server deleted.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] patch: tags: - Servers summary: Update description: 'Update Server.' operationId: update-server-by-uuid parameters: - name: uuid in: path description: 'Server UUID' required: true schema: type: string requestBody: description: 'Server updated.' required: true content: application/json: schema: properties: name: type: string description: 'The name of the server.' description: type: string description: 'The description of the server.' ip: type: string description: 'The IP of the server.' port: type: integer description: 'The port of the server.' user: type: string description: 'The user of the server.' private_key_uuid: type: string description: 'The UUID of the private key.' is_build_server: type: boolean description: 'Is build server.' instant_validate: type: boolean description: 'Instant validate.' proxy_type: type: string enum: [traefik, caddy, none] description: 'The proxy type.' concurrent_builds: type: integer description: 'Number of concurrent builds.' dynamic_timeout: type: integer description: 'Deployment timeout in seconds.' deployment_queue_limit: type: integer description: 'Maximum number of queued deployments.' server_disk_usage_notification_threshold: type: integer description: 'Server disk usage notification threshold (%).' server_disk_usage_check_frequency: type: string description: 'Cron expression for disk usage check frequency.' 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.' is_container_label_escape_enabled: type: boolean default: true description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. If you want to use env variables inside the labels, turn this off.' type: object responses: '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.' is_container_label_escape_enabled: type: boolean default: true description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. If you want to use env variables inside the labels, turn this off.' type: object responses: '200': description: 'Service updated.' content: application/json: schema: properties: uuid: { type: string, description: 'Service UUID.' } domains: { type: array, items: { type: string }, description: 'Service domains.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '409': description: 'Domain conflicts detected.' content: application/json: schema: properties: message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' } warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' } conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } } type: object '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/services/{uuid}/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 - name: docker_cleanup in: query description: 'Perform docker cleanup (prune networks, volumes, etc.).' schema: type: boolean default: true responses: '200': description: 'Stop service.' content: application/json: schema: properties: message: { type: string, example: 'Service stopping request queued.' } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] '/services/{uuid}/restart': 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: [] '/services/{uuid}/storages': get: tags: - Services summary: 'List Storages' description: 'List all persistent storages and file storages by service UUID.' operationId: list-storages-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string responses: '200': description: 'All storages by service UUID.' content: application/json: schema: properties: persistent_storages: { type: array, items: { type: object } } file_storages: { type: array, items: { type: object } } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' security: - bearerAuth: [] post: tags: - Services summary: 'Create Storage' description: 'Create a persistent storage or file storage for a service sub-resource.' operationId: create-storage-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string requestBody: required: true content: application/json: schema: required: - type - mount_path - resource_uuid properties: type: type: string enum: [persistent, file] description: 'The type of storage.' resource_uuid: type: string description: 'UUID of the service application or database sub-resource.' name: type: string description: 'Volume name (persistent only, required for persistent).' mount_path: type: string description: 'The container mount path.' host_path: type: string nullable: true description: 'The host path (persistent only, optional).' content: type: string nullable: true description: 'File content (file only, optional).' is_directory: type: boolean description: 'Whether this is a directory mount (file only, default false).' fs_path: type: string description: 'Host directory path (required when is_directory is true).' type: object additionalProperties: false responses: '201': description: 'Storage created.' content: application/json: schema: type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] patch: tags: - Services summary: 'Update Storage' description: 'Update a persistent storage or file storage by service UUID.' operationId: update-storage-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string requestBody: description: 'Storage updated. For read-only storages (from docker-compose or services), only is_preview_suffix_enabled can be updated.' required: true content: application/json: schema: required: - type properties: uuid: type: string description: 'The UUID of the storage (preferred).' id: type: integer description: 'The ID of the storage (deprecated, use uuid instead).' type: type: string enum: [persistent, file] description: 'The type of storage: persistent or file.' is_preview_suffix_enabled: type: boolean description: 'Whether to add -pr-N suffix for preview deployments.' name: type: string description: 'The volume name (persistent only, not allowed for read-only storages).' mount_path: type: string description: 'The container mount path (not allowed for read-only storages).' host_path: type: string nullable: true description: 'The host path (persistent only, not allowed for read-only storages).' content: type: string nullable: true description: 'The file content (file only, not allowed for read-only storages).' type: object additionalProperties: false responses: '200': description: 'Storage updated.' content: application/json: schema: type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] '/services/{uuid}/storages/{storage_uuid}': delete: tags: - Services summary: 'Delete Storage' description: 'Delete a persistent storage or file storage by service UUID.' operationId: delete-storage-by-service-uuid parameters: - name: uuid in: path description: 'UUID of the service.' required: true schema: type: string - name: storage_uuid in: path description: 'UUID of the storage.' required: true schema: type: string responses: '200': description: 'Storage deleted.' content: application/json: schema: properties: message: { type: string } type: object '401': $ref: '#/components/responses/401' '400': $ref: '#/components/responses/400' '404': $ref: '#/components/responses/404' '422': $ref: '#/components/responses/422' security: - bearerAuth: [] /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.' health_check_type: type: string description: 'Health check type: http or cmd.' enum: - http - cmd health_check_command: type: string nullable: true description: 'Health check command for CMD type.' limits_memory: type: string description: 'Memory limit.' limits_memory_swap: type: string description: 'Memory swap limit.' limits_memory_swappiness: type: integer description: 'Memory swappiness.' limits_memory_reservation: type: string description: 'Memory reservation.' limits_cpus: type: string description: 'CPU limit.' limits_cpuset: type: string nullable: true description: 'CPU set.' limits_cpu_shares: type: integer description: 'CPU shares.' status: type: string description: 'Application status.' preview_url_template: type: string description: 'Preview URL template.' destination_type: type: string description: 'Destination type.' destination_id: type: integer description: 'Destination identifier.' source_id: type: integer nullable: true description: 'Source identifier.' private_key_id: type: integer nullable: true description: 'Private key identifier.' environment_id: type: integer description: 'Environment identifier.' dockerfile: type: string nullable: true description: 'Dockerfile content. Used for dockerfile build pack.' dockerfile_location: type: string description: 'Dockerfile location.' custom_labels: type: string nullable: true description: 'Custom labels.' dockerfile_target_build: type: string nullable: true description: 'Dockerfile target build.' manual_webhook_secret_github: type: string nullable: true description: 'Manual webhook secret for GitHub.' manual_webhook_secret_gitlab: type: string nullable: true description: 'Manual webhook secret for GitLab.' manual_webhook_secret_bitbucket: type: string nullable: true description: 'Manual webhook secret for Bitbucket.' manual_webhook_secret_gitea: type: string nullable: true description: 'Manual webhook secret for Gitea.' docker_compose_location: type: string description: 'Docker compose location.' docker_compose: type: string nullable: true description: 'Docker compose content. Used for docker compose build pack.' docker_compose_raw: type: string nullable: true description: 'Docker compose raw content.' docker_compose_domains: type: string nullable: true description: 'Docker compose domains.' docker_compose_custom_start_command: type: string nullable: true description: 'Docker compose custom start command.' docker_compose_custom_build_command: type: string nullable: true description: 'Docker compose custom build command.' swarm_replicas: type: integer nullable: true description: 'Swarm replicas. Only used for swarm deployments.' swarm_placement_constraints: type: string nullable: true description: 'Swarm placement constraints. Only used for swarm deployments.' custom_docker_run_options: type: string nullable: true description: 'Custom docker run options.' post_deployment_command: type: string nullable: true description: 'Post deployment command.' post_deployment_command_container: type: string nullable: true description: 'Post deployment command container.' pre_deployment_command: type: string nullable: true description: 'Pre deployment command.' pre_deployment_command_container: type: string nullable: true description: 'Pre deployment command container.' watch_paths: type: string nullable: true description: 'Watch paths.' custom_healthcheck_found: type: boolean description: 'Custom healthcheck found.' redirect: type: string nullable: true description: 'How to set redirect with Traefik / Caddy. www<->non-www.' enum: - www - non-www - both created_at: type: string format: date-time description: 'The date and time when the application was created.' updated_at: type: string format: date-time description: 'The date and time when the application was last updated.' deleted_at: type: string format: date-time nullable: true description: 'The date and time when the application was deleted.' compose_parsing_version: type: string description: 'How 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 docker_registry_image_tag: type: string nullable: true force_rebuild: type: boolean commit: type: string status: type: string is_webhook: type: boolean is_api: type: boolean created_at: type: string updated_at: type: string logs: type: string current_process_id: type: string restart_only: type: boolean git_type: type: string server_id: type: integer application_name: type: string server_name: type: string deployment_url: type: string destination_id: type: string only_this_server: type: boolean rollback: type: boolean commit_message: type: string type: object Environment: description: 'Environment model' properties: id: type: integer name: type: string project_id: type: integer created_at: type: string updated_at: type: string description: type: string type: object EnvironmentVariable: description: 'Environment Variable model' properties: id: type: integer uuid: type: string resourceable_type: type: string resourceable_id: type: integer is_literal: type: boolean is_multiline: type: boolean is_preview: type: boolean is_runtime: type: boolean is_buildtime: type: boolean is_shared: type: boolean is_shown_once: type: boolean key: type: string value: type: string real_value: type: string comment: type: string nullable: true version: type: string created_at: type: string updated_at: type: string type: object PrivateKey: description: 'Private Key model' properties: id: type: integer uuid: type: string name: type: string description: type: string private_key: type: string format: private-key public_key: type: string description: 'The public key of the private key.' fingerprint: type: string description: 'The fingerprint of the private key.' is_git_related: type: boolean team_id: type: integer created_at: type: string updated_at: type: string type: object Project: description: 'Project model' properties: id: type: integer uuid: type: string name: type: string description: type: string type: object ScheduledTask: description: 'Scheduled Task model' properties: id: type: integer description: 'The unique identifier of the scheduled task in the database.' uuid: type: string description: 'The unique identifier of the scheduled task.' enabled: type: boolean description: 'The flag to indicate if the scheduled task is enabled.' name: type: string description: 'The name of the scheduled task.' command: type: string description: 'The command to execute.' frequency: type: string description: 'The frequency of the scheduled task.' container: type: string nullable: true description: 'The container where the command should be executed.' timeout: type: integer description: 'The timeout of the scheduled task in seconds.' created_at: type: string format: date-time description: 'The date and time when the scheduled task was created.' updated_at: type: string format: date-time description: 'The date and time when the scheduled task was last updated.' type: object ScheduledTaskExecution: description: 'Scheduled Task Execution model' properties: uuid: type: string description: 'The unique identifier of the execution.' status: type: string enum: - success - failed - running description: 'The status of the execution.' message: type: string nullable: true description: 'The output message of the execution.' retry_count: type: integer description: 'The number of retries.' duration: type: number nullable: true description: 'Duration in seconds.' started_at: type: string format: date-time nullable: true description: 'When the execution started.' finished_at: type: string format: date-time nullable: true description: 'When the execution finished.' created_at: type: string format: date-time description: 'When the record was created.' updated_at: type: string format: date-time description: 'When the record was last updated.' type: object Server: description: 'Server model' properties: id: type: integer description: 'The server ID.' uuid: type: string description: 'The server UUID.' name: type: string description: 'The server name.' description: type: string description: 'The server description.' ip: type: string description: 'The IP address.' user: type: string description: 'The user.' port: type: integer description: 'The port number.' proxy: type: object description: 'The proxy configuration.' proxy_type: type: string enum: - traefik - caddy - none description: 'The proxy type.' high_disk_usage_notification_sent: type: boolean description: 'The flag to indicate if the high disk usage notification has been sent.' unreachable_notification_sent: type: boolean description: 'The flag to indicate if the unreachable notification has been sent.' unreachable_count: type: integer description: 'The unreachable count for your server.' validation_logs: type: string description: 'The validation logs.' log_drain_notification_sent: type: boolean description: 'The flag to indicate if the log drain notification has been sent.' swarm_cluster: type: string description: 'The swarm cluster configuration.' settings: $ref: '#/components/schemas/ServerSetting' type: object ServerSetting: description: 'Server Settings model' properties: id: type: integer concurrent_builds: type: integer deployment_queue_limit: type: integer dynamic_timeout: type: integer force_disabled: type: boolean force_server_cleanup: type: boolean is_build_server: type: boolean is_cloudflare_tunnel: type: boolean is_jump_server: type: boolean is_logdrain_axiom_enabled: type: boolean is_logdrain_custom_enabled: type: boolean is_logdrain_highlight_enabled: type: boolean is_logdrain_newrelic_enabled: type: boolean is_metrics_enabled: type: boolean is_reachable: type: boolean is_sentinel_enabled: type: boolean is_swarm_manager: type: boolean is_swarm_worker: type: boolean is_terminal_enabled: type: boolean is_usable: type: boolean logdrain_axiom_api_key: type: string logdrain_axiom_dataset_name: type: string logdrain_custom_config: type: string logdrain_custom_config_parser: type: string logdrain_highlight_project_id: type: string logdrain_newrelic_base_uri: type: string logdrain_newrelic_license_key: type: string sentinel_metrics_history_days: type: integer sentinel_metrics_refresh_rate_seconds: type: integer sentinel_token: type: string docker_cleanup_frequency: type: string docker_cleanup_threshold: type: integer server_id: type: integer wildcard_domain: type: string created_at: type: string updated_at: type: string delete_unused_volumes: type: boolean description: 'The flag to indicate if the unused volumes should be deleted.' delete_unused_networks: type: boolean description: 'The flag to indicate if the unused networks should be deleted.' 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: 'Scheduled Tasks' description: 'Scheduled Tasks' - name: 'Private Keys' description: 'Private Keys' - name: Servers description: Servers - name: Services description: Services - name: Teams description: Teams