TurboPanel Docs
Using TurboPanelReference

Error codes

Every refusal from the client API carries a stable error code — a lower-case identifier that never changes wording — and, where it helps, a message for people and a few fields naming the thing at fault. The app maps these codes to sentences; this appendix is the same map, in one place, so a code you see in a response, a log or a deploy transcript can be looked up.

Codes are grouped by the area of the app that raises them. Each row gives the HTTP status the code is sent with; where a code can be sent with more than one status, both are listed. Chapters that explain the situation in more depth are linked at the top of each group.

Two codes appear everywhere and are not repeated in the tables: Unauthorized (401 — no session, or it expired) and Not found (404 — the record does not exist or is not visible to your organization). A plain Invalid request (400) means a body field had the wrong shape; the chapter's reference table for that route says what is expected.

Projects, environments and workspaces

See Projects and environments.

CodeStatusMeaning
project_name_in_use409Another project in the organization has this name (case-insensitive, whitespace trimmed), or the name is one of the platform's four reserved system-project names.
workspace_name_in_use409A workspace with this name already exists in the organization.
tag_name_in_use409A tag with this name already exists in the organization.
project_has_running_services409Delete refused: an environment still has running containers. Stop or destroy it first.
managed_runtime_present409Delete refused: the environment still hosts a managed database cluster. Destroy the cluster first.
environment_running409Delete refused: the environment still has a running container or a deploy in progress. Stop it, wait for it to stop, then delete it.
compose_invalid400The compose document failed validation at save; issues[] lists path and message for each finding.
source_referenced_by_compose409A repository cannot be deleted while a project's compose names it under x-turbopanel.source.
deploy_options_invalid400The deploy options on an environment (strategy, migration or related settings) are malformed or contradict each other; message names the field.

Compose, services and the docker run importer

See Writing compose.

CodeStatusMeaning
compose_service_name_read_only400composeServiceName was sent on a service update; the name is derived from the document and cannot be set on the row.
invalid_service_options400A per-service option (restart policy, health-check policy, build cache, resources) has an invalid value.
service_create_not_supported400Services are created from the compose document, not by hand.
docker_run_unsupported422The importer met a docker run option that describes the container but has no Compose expression; the option is named.

Deploying

See Deploying and running an environment, which groups these by what to do about them.

CodeStatusMeaning
compose_empty400The merged document has no services.
invalid_deploy_hosting, invalid_deploy_storage400A hosting or storage row attached to the environment is malformed.
compose_merged_invalid422Project and overlay each saved cleanly but their merge is not valid Compose.
compose_field_unsupported422The document sets a key the platform has no behaviour for; the reason is quoted.
compose_field_requires_org_opt_in403The document uses a host-level feature — a gated field (privileged, cap_add, use_api_socket, …) or a path outside the service's directory (an absolute bind, the Docker socket, extends.file, …) — and the organization has not turned them on under Manage Organization → Compose.
compose_host_access_requires_manager403Host-level Compose features are on, but the person deploying is not an organization manager or owner.
compose_host_access_requires_approval403A Git-triggered deploy of host-level Compose content that no manager or owner has deployed in this exact form. Deploy it once from the app to approve it.
server_placement_required409No server resolves for the environment — set the pin or the project default — or the planner found no eligible server.
health_check_missing409Services with no healthcheck: required: true refuses; required: false is the warn prompt, acknowledged with acknowledgeHealthCheckWarnings: true.
resource_limit_exceeded409A service asks for more CPU or memory than the organization or server ceiling allows.
fabric_reconcile_pending409TurboFabric is still converging on a server the plan needs. Retry shortly.
fabric_reconcile_failed422TurboFabric could not converge on a server the plan needs.
hosting_route_conflict409Two hosting rows in the environment claim the same hostname and path.
hosting_hostname_conflict409A compose-declared hostname is already served by another hosting in the organization.
hosting_tls_ref_unresolved, hosting_ip_ref_unresolved422A certificateRef or ipRef names nothing the organization has.
hosting_tls_mode_unsupported422A tls.mode the platform cannot issue.
principal_alias_unknown422A service names an alias the root principals map does not declare.
principal_required_for_service_kind422A site or Node app has neither an alias nor a system user assigned.
site_principal_ambiguous, source_principal_ambiguous422No alias, and more than one system user could own the service.
site_cron_unowned, site_managed_directory_unowned422A site's cron job or managed directory has no owning account.
source_ref_unresolved422The branch does not exist in the repository, or the provider refused the lookup.
source_ref_unsupported501A ref was sent on the deploy body; omit it.
deploy_strategy_unsupported501A per-deploy strategy of bluegreen, or any per-deploy migration, was sent. inplace and sequential are accepted; blue-green is coming in 0.2.x. Omit the field and the deploy runs as the environment is configured.
variable_unresolved, variable_ref_invalid, variable_secret_interpolation422A ${KEY} reference has no value, is malformed, or interpolates a secret into a plain field.
docker_external_network_unregistered422external: true names a network not registered under Network → Docker.
datacenter_ip_required422A datacenter bind on a server with no datacenter address.
storage_location_unavailable422A storage entry's primary copy is on a server other than the one scheduled and its access mode forbids that.
binding_endpoint_unavailable422A bound managed database has no listener endpoint yet.
turbofabric_required, host_port_conflict, constraint_unsatisfiable, colocation_conflict, max_replicas_per_node_exceeded422Planner refusals: services on different servers share a non-overlay network; two services publish one host port; deploy.placement or deploy.replicas cannot be satisfied.
tls_pin_not_found, tls_pin_mismatch, tls_pin_not_ready400The pinned library certificate is gone, does not cover the hostnames, or is not ready.
acme_requires_public_bind, acme_requires_org_opt_in400Let's Encrypt needs a public bind and the organization's opt-in.
tls_material_missing400A pinned certificate row has no material to deliver.
tls_key_not_sealed, tls_decrypt_failed500The certificate's private key could not be sealed for, or unsealed by, the daemon — a control plane secrets problem, not a document one.
release_not_found404No succeeded release with that id exists for the service in this environment.
release_not_materialized409The release was not published on every server the environment deploys to, so it cannot be rolled back to.

Hosting and TLS

See Hosting.

CodeStatusMeaning
hostname_in_use409Another hosting in the organization already serves this hostname.
hosting_owned_by_compose409The row is declared in the compose document; edit it there.
hosting_bind_scope_mismatch400A public IP was picked with a non-public bind, or the IP's scope is not public.
invalid_hosting_options400A hosting field has the wrong shape.
lets_encrypt_not_enabled403The organization has not turned on Allow Let's Encrypt certificates.
wildcard_unsupported, dns_01_unsupported400A *. name, or a DNS-01 challenge, on a Let's Encrypt row.
private_hostname_unsupported400A loopback or private name (localhost, .local, .internal, .lan, a private IP) on a Let's Encrypt row.
tls_fingerprint_conflict409This certificate is already in the library.
invalid_certificate400The certificate or key you supplied could not be read; detail carries the parser's reason.
organization_ca_exists409An organization CA already exists.
organization_ca_retire_required409The current CA must be retired before a new one is minted.
ca_rotation_in_progress, no_pending_rotation, ca_rotation_not_converged409The CA rotation state machine refuses the step: one is already running, none is pending, or the servers have not yet picked up the new root.

Storage, variables and bindings

CodeStatusMeaning
storage_content_too_large400A file storage entry's content exceeds 256 KiB.
principal_project_mismatch400The storage entry's system user belongs to another project.
mount_destination_in_use409Another entry already mounts at that destination in the service.
copy_primary_exists, copy_server_provider_exists409The entry already has a primary copy, or a copy on that server with that provider.
scratch_copy_not_mountable409A scratch copy cannot be mounted.
conflict409A storage write hit a uniqueness rule not otherwise classified. (The same word appears as ?error=conflict on the OAuth link callback when the provider account is already linked to another user.)
binding_key_conflict409A variable key collides with one a database binding owns.
binding_key_prefix_in_use409Another binding in the environment already uses that key prefix.
binding_engine_defaults_in_use409The binding's default keys are already taken.
binding_owned_variable409The variable is written by a binding and cannot be edited directly.
binding_engine_unsupported400The managed database's engine does not support bindings.
database_not_found404The named database is not one of the cluster's databases.
binding_password_unavailable422The binding's database user has no stored password to deliver, so the binding was not created.
binding_not_found, binding_principal_invalid, binding_ca_unavailable, binding_cluster_invalid400The binding could not be built: it no longer exists, it does not point at a database user, the organization's certificate authority could not be made ready, or the cluster's options could not be read.
backup_target_unsupported400The storage copy cannot be backed up from where it lives; detail says why (for example it has no local folder or Docker volume on its server).

System users (principals)

CodeStatusMeaning
username_in_use409The username is taken on a server this project reaches.
username_reserved400The username is a reserved system account.
principal_scheme_locked409The organization locks the name scheme and the request asked for a different one.
username_too_long400The username exceeds the Unix limit.
invalid_password400Password outside 8–128 characters.
invalid_public_key400The SSH public key could not be parsed.
ssh_key_limit409The account already has 64 SSH keys.
ssh_key_duplicate409That SSH key is already on the account.
invalid_access, invalid_entitlements, invalid_service_ids400access is not none/sftp/ssh, an entitlement is unknown, or a service id does not belong to the project.

Git sources and repositories

CodeStatusMeaning
github_app_not_configured, gitlab_oauth_not_configured503No GitHub App or GitLab OAuth application is configured for this organization or the control plane.
gitlab_redirect_uri_unknown503The control plane's public URL is not configured, so a GitLab redirect cannot be built.
public_url_not_configured503The control plane has no public URL; the GitHub App manifest flow needs one.
webhook_origin_not_published400The application's webhook origin is not reachable from the provider.
git_app_required400The repository needs a Git application to be read.
git_app_not_writable403The application is shared and cannot be edited from an organization.
git_app_sync_failed502The provider refused or failed the sync.
git_app_sync_unsupported400Sync exists for GitHub Apps only.
forge_url_rejected400A self-managed forge URL failed the safety check: it must be https, carry no credentials, name no reserved host, and resolve to a public address.
invalid_manifest_request400The GitHub App manifest request is malformed.
installation_claimed_by_another_organization409Another organization already connected this GitHub installation.
install_authorization_required, install_not_authorizedredirect (?error=)The GitHub callback arrived without the one-shot authorization code, or the authorizing user cannot see the installation.
invalid_request, state_invalid, forbidden, conversion_failed, create_failed, unavailableredirect (?error=)Callback-flow failures the provider round trip lands on: missing parameters, a stale or tampered state, the wrong organization, or the App could not be created.
source_url_conflict409A repository with this canonical URL already exists in the organization.
source_repository_url_invalid, source_repository_url_must_be_https400The repository URL is malformed, or not https.
source_ssh_requires_credential400An SSH URL needs a deploy key.
source_scope_immutable, source_scope_not_supported400A repository's scope cannot be changed, or the scope is not offered for this provider.
source_credential_not_supported, source_credential_provider_mismatch, source_installation_provider_mismatch400The credential or installation does not fit the repository's provider.
source_refresh_not_supported400Only provider-connected repositories can be refreshed.
source_not_visible_to_connection404The connection can no longer see the repository.
source_read_failed, git_provider_request_failed502 (404 or 409 passed through when the provider answered so)The provider or the daemon-lane read failed.
ref_required400The repository records no default branch; name a ref.
invalid_list_path400listPath must be a relative path.
no_daemon_available503The repository can only be read through a connected server, and none is available.

Servers, licenses and metrics

See Servers.

CodeStatusMeaning
server_capacity_exceeded409The organization's server capacity is reached.
no_license_available409TurboPanel High Availability: no license is free for a new server.
license_has_attached_server409The license is still bound to a server.
server_has_blockers409Networks, containers or addresses still reference the server; the response counts each.
server_offline409The action needs the server's daemon connected.
live_metrics_disabled409Live metrics are turned off on this control plane.
metrics_backend_unavailable503The metrics store is not reachable.
unknown_system_component, system_component_not_provisioned, system_reconcile_unavailable400 / 404 / 503The platform's own system project on a server is unknown, not yet provisioned, or cannot be reconciled right now.
system_resource_immutable403The row belongs to the platform's system project and cannot be edited.
container_id_unavailable409The container has no id yet; the daemon has not reported it.
updates_managed409TurboPanel High Availability: daemon updates are rolled out from Admin → Updates, not per server.
control_plane_upgrade_required409Self-hosted: update the control plane from Admin → Updates before updating other servers.
upgrade_gate_unavailable503TurboPanel could not confirm that the control plane is ready for server updates. Retry shortly.

Datacenters and networking

See Datacenters and networking.

The app renders one sentence per code from these; the sentences here are the same.

CodeStatusMeaning
invalid_cidr400Enter a valid IPv4 or IPv6 CIDR.
subnet_overlaps409The subnet overlaps one already registered.
subnet_has_members409Unassign the pinned servers first.
datacenter_has_members, datacenter_has_networks409A datacenter with servers or networks cannot be deleted.
address_in_use409That address is already pinned.
address_not_in_any_subnet400The address falls outside every subnet in the datacenter.
invalid_address400The pinned address is not a valid IP address.
address_not_in_cidr400The pinned address falls outside the CIDR of the group it was pinned in.
address_cidr_unreported, address_not_reported400That server has not reported a private IP; pick one it reports.
ip_in_use, ip_address_in_use409The IP is bound to a hosting, or the address already exists in the registry.
cidr_overlaps_fabric, cidr_overlaps_fabric_pool409That range overlaps the TurboFabric range or its container pool.
cidr_overlaps_reserved, cidr_overlaps_docker_network, cidr_overlaps_gateway_advertised409That range overlaps a reserved range, a registered Docker network, or a range a gateway advertises.
network_cidr_required, network_scope_required, network_single_scope_conflict400A network needs a CIDR, a scope, or exactly one scope.
managed_network_immutable400The organization's managed network is platform-owned.
docker_network_name_required, docker_network_subnet_required, docker_network_subnet_mismatch400A Docker external network needs a name and a subnet, and the subnet must match the registered one.
docker_network_subnet_invalid, docker_network_ip_range_invalid, docker_network_gateway_invalid, docker_network_mtu_invalid400The subnet, IP range, gateway or MTU is malformed.
address_pools_invalid, address_pool_base_invalid, address_pool_size_invalid, address_pools_overlap400Docker host address pools must be base + size rows with valid CIDRs that do not overlap each other.
fabric_cidr_unavailable, fabric_container_pool_in_use, fabric_address_pool_exhausted, fabric_prefix_pool_exhausted409The TurboFabric range is taken, its container pool is in use, or it has no addresses or prefixes left.
preferred_gateway_invalid, gateway_datacenter_required, gateway_datacenter_cidr_required422A gateway relay needs a datacenter with a CIDR, and the preferred gateway must be one.
private_family_mismatch422IPv4 and IPv6 mixed where one family is required.
failover_requires_trusted_datacenter422A failover replica must sit in a trusted datacenter.

Managed databases

CodeStatusMeaning
managed_engine_unavailable400The engine is not released yet.
managed_series_immutable422A cluster's version series cannot change after provisioning.
managed_version_unsupported422The requested series or variant is not in the catalog.
managed_busy409The cluster is provisioning or applying; wait.
managed_member_exists, managed_member_is_primary, managed_primary_missing409The server already holds a member of this cluster (one member per server), the member is the primary, or the cluster has no primary.
managed_replica_not_promotable422Only a failover or read replica in a promotable state can be promoted.
managed_no_read_targets422No replica serves read traffic.
managed_listener_bind_conflict422The listener port is already bound on that server.
managed_private_port_exhausted409No private port is left in the reserved range on that server.
fabric_address_required, failover_replica_requires_datacenter_transport422A cross-server replica needs a TurboFabric address, and a failover replica needs datacenter transport.
managed_user_exists, database_exists409The user or database already exists.
managed_user_has_bindings, managed_database_has_bindings409Sever the service bindings first.
cannot_drop_root_user, cannot_drop_initial_database, cannot_rotate_replication_user, use_root_password_route400 / 409The root account, the initial database and the replication user are platform-managed; rotate root through its own route.
managed_backup_unsupported400The engine does not support backups yet.
backup_not_found404No backup with that id.
backup_policy_invalid400A backup schedule's name, keep count or enabled flag is invalid; field names it and detail says why.
backup_schedule_invalid400The schedule is not a preset or a cron expression a host can run (for example it restricts both day-of-month and day-of-week, or is @reboot); detail says why.
backup_timezone_invalid400The time zone is not an IANA zone name (plain UTC is accepted); detail says why.
backup_policy_limit409The database already has its maximum of 20 backup schedules; limit is sent.
backup_policy_not_found404No backup schedule with that id on this database (also sent when the id is not a UUID).
managed_destroy_failed502The daemon could not tear the cluster down.
managed_credential_not_sealed, root_principal_missing, managed_settings_invalid, daemon_key_unavailable500 / 503Instance-side faults — a credential could not be sealed, the root principal or the daemon key is missing, the stored settings are corrupt.
not_managed_environment400The environment is not a managed project's.

Scheduled tasks

CodeStatusMeaning
task_schedule_invalid, task_command_invalid400The schedule is not a valid cron expression, or the command contains shell syntax.
task_name_unrepresentable409The name folds to no valid unit name.
task_name_in_use409Another task on the service folds to the same unit name.
task_name_in_compose409The service's compose already declares a job with that name.
task_limit_reached409The service has reached its task limit.

Access, invitations and accounts

See Account security and Organizations, teams and access.

CodeStatusMeaning
invitation_pending409A pending invitation for that email and team already exists.
email_unavailable503The control plane cannot send email, so the invitation was not created.
email_send_failed502The verification email could not be sent. A newly created email channel is rolled back; try again.
not_an_email_channel400Resend verification was asked for a channel that is not an email channel.
already_verified409Resend verification was asked for an email channel that is already verified.
address_unreadable409Resend verification could not read the channel's stored address (it cannot be unsealed), so no link was sent.
too_soon429A verification link was already sent in the last minute; retryAfterSeconds and Retry-After say how long to wait.
Only an owner can remove an owner403A manager tried to remove an owner from the organization's Members.
grants_require_owner403Only an organization owner may attach explicit grants to an invitation.
invalid_grant400A grant names an unknown permission or an entity outside the organization.
gone410The invitation's team or organization no longer exists.
two_factor_enabled409Two-factor is already enrolled; disable it before enrolling again.
passkey_exists409That credential is already registered.
last_sign_in_method409The provider cannot be unlinked; it is the account's only way to sign in.
invitation_unavailable410The invitation link was already used, has expired or was revoked; status says which.
account_exists409The invitation's email already has an account: sign in, then accept the invitation.
reauth_required403The organization asks for confirmation before a permanent action (delete a project, environment, server or managed database, remove a member, revoke a key). The body names the action and the methods accepted; prove it with POST /auth/reauth, then repeat.
reauth_unavailable400POST /auth/reauth on an account with no password and no authenticator; sign in again.
incorrect_current_password400Change password: the current password is wrong.
password_unchanged400Change password: the new password equals the current one.
password_breached400The new password appears in a known data breach (sign-up, invitation sign-up, password reset, change password). The check fails open if the lookup is unreachable.
no_password409Change password on an account that signs in without a password.
oauth_reauth_requiredredirect (?error=)Linking a provider needs a session younger than 15 minutes.

Notifications

See Notifications.

CodeStatusMeaning
address_rejected422The channel URL failed the outbound gate; reason names the rule.
address_invalid, address_required400Not a valid address for the channel's kind.
address_not_a_member422An email channel may only name your own address or a member's account email.
label_required, label_invalid400The channel name is missing, too long, or unprintable.
signing_secret_not_applicable, signing_secret_invalid400Only a webhook signs; 1–256 characters.
rule_event_unknown, rule_severity_invalid, rules_invalid400The rule list names an unknown event or is malformed.
kind_invalid, scope_invalid400Not a channel kind that can be typed in, or not user / organization.
body_invalid, disabled_invalid400The request body is not an object, or disabled is not true or false.
digest_cadence_invalid400The digest setting is not one of the offered cadences.
quiet_hours_invalid400Quiet hours need a start and an end as 24-hour HH:MM, and they must differ.
time_zone_invalid400Not a time zone the app knows.
timing_email_only422Digests and quiet hours exist only on email channels.
time_zone_user_channels_only422A time zone can be set only on a personal channel; organization and instance channels read their windows in UTC.

Firewall

See Firewall. All of these are for organization owners and managers.

CodeStatusMeaning
firewall_policy_invalid400The organization's firewall policy is malformed; message says which part.
firewall_rule_invalid400A rule is malformed (label, action, protocol, ports or sources); message says which part.
firewall_rule_limit409The organization already has its maximum of 200 firewall rules.
firewall_mode_invalid400The mode must be observe, managed or off.
firewall_probe_unavailable503This control plane cannot run the outside reachability check.
firewall_probe_rate_limited429The outside check runs at most once every 30 seconds per server; retryAfterSeconds is sent, also as Retry-After.

Billing (TurboPanel High Availability)

See Billing and licenses.

CodeStatusMeaning
billing_not_configured503The control plane has no billing provider configured.
subscription_exists, no_subscription409The organization already has a subscription, or has none.
checkout_pending409A checkout is already in progress.
subscription_past_due409The subscription is past due; settle it in the customer portal.
billing_mutation_in_progress409Another billing change is still applying.
servers_uncovered409Reducing licenses would leave servers uncovered; the response names them and the tier they need.
licenses_in_use409More licenses are in use than would remain. Remove a server or a waiting key first.
not_an_upgrade, not_a_downgrade400The requested tier move goes the wrong way.
tier_not_purchasable400The tier has no product bound to it.
stripe_error502 / 503The billing provider refused (502) or did not answer (503); nothing was applied.

Administering the control plane

See Administering the control plane.

CodeStatusMeaning
reencrypt_in_progress409A re-encrypt sweep is already running; wait or resume it.
tier_invalid400The tier row or product patch failed validation; message names the field.
tier_exists409A tier with that label or provider product already exists.
tier_has_no_product400A custom tier has no provider product to verify.
product_verification_failed400The provider product does not match the tier's price ladder; verification lists the differences.
product_lookup_failed400The provider could not be asked about the product; status is what it answered.
invalid_settings400The control plane update settings are malformed.
upgrade_run_not_found404No update run has that id.
upgrade_run_active409An update is already pending or running, so a second one cannot start. Wait for it or cancel it. Answered before the manifest host is contacted.
upgrade_not_active409No update run is active, so there is nothing to retry or cancel.
upgrade_step_not_found, upgrade_step_not_retryable409A retry named a step that does not exist, or one that is not waiting on attention, failed or rolled back.
cert apply is not applicable on this runtime422Public-URL apply is self-hosted only.
no co-located daemon connected to apply public URLs503Apply needs the control plane's own daemon connected.
Sign-up is force-controlled by TURBOPANEL_IS_SIGNUP_ENABLED…409Clear the variable to use the app toggle.
Edit on GitHub

Last updated on

On this page